ngx-opalbytes-components 1.19.0 → 1.20.0

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 (78) hide show
  1. package/README.md +103 -0
  2. package/cli/cao-comp.cjs +186 -0
  3. package/fesm2022/ngx-opalbytes-components.mjs +23 -7
  4. package/fesm2022/ngx-opalbytes-components.mjs.map +1 -1
  5. package/package.json +4 -1
  6. package/src/lib/shared/components/autocomplete/autocomplete.component.html +126 -0
  7. package/src/lib/shared/components/autocomplete/autocomplete.component.scss +150 -0
  8. package/src/lib/shared/components/autocomplete/autocomplete.component.ts +552 -0
  9. package/src/lib/shared/components/base-button/base-button.component.html +33 -0
  10. package/src/lib/shared/components/base-button/base-button.component.scss +14 -0
  11. package/src/lib/shared/components/base-button/base-button.component.spec.ts +64 -0
  12. package/src/lib/shared/components/base-button/base-button.component.ts +48 -0
  13. package/src/lib/shared/components/base-icon/base-icon.css +0 -0
  14. package/src/lib/shared/components/base-icon/base-icon.html +11 -0
  15. package/src/lib/shared/components/base-icon/base-icon.spec.ts +23 -0
  16. package/src/lib/shared/components/base-icon/base-icon.ts +18 -0
  17. package/src/lib/shared/components/base-input/base-input.css +193 -0
  18. package/src/lib/shared/components/base-input/base-input.html +43 -0
  19. package/src/lib/shared/components/base-input/base-input.spec.ts +146 -0
  20. package/src/lib/shared/components/base-input/base-input.ts +133 -0
  21. package/src/lib/shared/components/base-time-range/base-time-range.css +27 -0
  22. package/src/lib/shared/components/base-time-range/base-time-range.html +23 -0
  23. package/src/lib/shared/components/base-time-range/base-time-range.spec.ts +27 -0
  24. package/src/lib/shared/components/base-time-range/base-time-range.ts +61 -0
  25. package/src/lib/shared/components/base-toggle/base-toggle.component.html +28 -0
  26. package/src/lib/shared/components/base-toggle/base-toggle.component.scss +45 -0
  27. package/src/lib/shared/components/base-toggle/base-toggle.component.spec.ts +22 -0
  28. package/src/lib/shared/components/base-toggle/base-toggle.component.ts +138 -0
  29. package/src/lib/shared/components/card/card.component.css +264 -0
  30. package/src/lib/shared/components/card/card.component.html +103 -0
  31. package/src/lib/shared/components/card/card.component.ts +63 -0
  32. package/src/lib/shared/components/date-picker/date-picker.html +82 -0
  33. package/src/lib/shared/components/date-picker/date-picker.scss +8 -0
  34. package/src/lib/shared/components/date-picker/date-picker.spec.ts +23 -0
  35. package/src/lib/shared/components/date-picker/date-picker.ts +165 -0
  36. package/src/lib/shared/components/drop-down/drop-down.css +61 -0
  37. package/src/lib/shared/components/drop-down/drop-down.html +96 -0
  38. package/src/lib/shared/components/drop-down/drop-down.spec.ts +335 -0
  39. package/src/lib/shared/components/drop-down/drop-down.ts +335 -0
  40. package/src/lib/shared/components/footer/footer.css +29 -0
  41. package/src/lib/shared/components/footer/footer.html +10 -0
  42. package/src/lib/shared/components/footer/footer.spec.ts +22 -0
  43. package/src/lib/shared/components/footer/footer.ts +15 -0
  44. package/src/lib/shared/components/index.ts +19 -0
  45. package/src/lib/shared/components/kpi/kpi.css +0 -0
  46. package/src/lib/shared/components/kpi/kpi.html +11 -0
  47. package/src/lib/shared/components/kpi/kpi.spec.ts +38 -0
  48. package/src/lib/shared/components/kpi/kpi.ts +25 -0
  49. package/src/lib/shared/components/links-button/links-button.css +70 -0
  50. package/src/lib/shared/components/links-button/links-button.html +23 -0
  51. package/src/lib/shared/components/links-button/links-button.spec.ts +139 -0
  52. package/src/lib/shared/components/links-button/links-button.ts +45 -0
  53. package/src/lib/shared/components/paginator/paginator.css +0 -0
  54. package/src/lib/shared/components/paginator/paginator.html +10 -0
  55. package/src/lib/shared/components/paginator/paginator.spec.ts +23 -0
  56. package/src/lib/shared/components/paginator/paginator.ts +25 -0
  57. package/src/lib/shared/components/stepper/step/step.css +8 -0
  58. package/src/lib/shared/components/stepper/step/step.html +1 -0
  59. package/src/lib/shared/components/stepper/step/step.spec.ts +131 -0
  60. package/src/lib/shared/components/stepper/step/step.ts +14 -0
  61. package/src/lib/shared/components/stepper/stepper.css +17 -0
  62. package/src/lib/shared/components/stepper/stepper.html +11 -0
  63. package/src/lib/shared/components/stepper/stepper.spec.ts +238 -0
  64. package/src/lib/shared/components/stepper/stepper.ts +57 -0
  65. package/src/lib/shared/components/tab-group/tab-group.component.html +84 -0
  66. package/src/lib/shared/components/tab-group/tab-group.component.scss +151 -0
  67. package/src/lib/shared/components/tab-group/tab-group.spec.ts +22 -0
  68. package/src/lib/shared/components/tab-group/tab-group.ts +218 -0
  69. package/src/lib/shared/components/tab-panel/tab-content.directive.ts +7 -0
  70. package/src/lib/shared/components/tab-panel/tab-label.directive.ts +7 -0
  71. package/src/lib/shared/components/tab-panel/tab-panel.css +0 -0
  72. package/src/lib/shared/components/tab-panel/tab-panel.spec.ts +22 -0
  73. package/src/lib/shared/components/tab-panel/tab-panel.ts +31 -0
  74. package/src/lib/shared/components/time-picker/time-picker.css +84 -0
  75. package/src/lib/shared/components/time-picker/time-picker.html +21 -0
  76. package/src/lib/shared/components/time-picker/time-picker.spec.ts +23 -0
  77. package/src/lib/shared/components/time-picker/time-picker.ts +90 -0
  78. package/types/ngx-opalbytes-components.d.ts +23 -4
package/README.md CHANGED
@@ -72,6 +72,59 @@ export class ExemploComponent {
72
72
 
73
73
  ---
74
74
 
75
+ ## Comandos CLI
76
+
77
+ A biblioteca disponibiliza uma CLI (`cao-comp`) para copiar o código-fonte de um componente da `ngx-opalbytes-components` para qualquer projeto. Isso é útil quando você precisa customizar o código-fonte de um componente internamente, sem depender apenas da API pública.
78
+
79
+ ### Instalação global
80
+
81
+ Para utilizar o comando `cao-comp` de qualquer lugar, instale a biblioteca globalmente:
82
+
83
+ ```bash
84
+ npm install -g ngx-opalbytes-components
85
+ ```
86
+
87
+ Para desenvolvimento local, a partir da pasta `projects/ngx-opalbytes-components`:
88
+
89
+ ```bash
90
+ npm link
91
+ ```
92
+
93
+ > Caso não queira instalar, também é possível executar o script diretamente:
94
+ > `node ./node_modules/ngx-opalbytes-components/cli/cao-comp.cjs ...`
95
+
96
+ ### Uso
97
+
98
+ ```bash
99
+ cao-comp <componente> <destino> [opcoes]
100
+ ```
101
+
102
+ **Argumentos:**
103
+
104
+ | Argumento | Descrição |
105
+ | --- | --- |
106
+ | `<componente>` | Nome da pasta do componente em `shared/components` (ex: `base-button`). |
107
+ | `<destino>` | Pasta de destino onde os arquivos serão gerados (criada se não existir). |
108
+
109
+ **Opções:**
110
+
111
+ | Opção | Descrição |
112
+ | --- | --- |
113
+ | `-h, --help` | Exibe a ajuda. |
114
+ | `-l, --list` | Lista os componentes disponíveis para cópia. |
115
+ | `-f, --force` | Sobrescreve arquivos existentes no destino. |
116
+ | `-v, --version` | Exibe a versão. |
117
+
118
+ **Exemplos:**
119
+
120
+ ```bash
121
+ cao-comp base-button ./src/app/components
122
+ cao-comp stepper ./src/app/components --force
123
+ cao-comp --list
124
+ ```
125
+
126
+ ---
127
+
75
128
  ## Organização de Pastas
76
129
 
77
130
  Dentro da pasta `src/lib/`, os componentes são organizados em `shared/components/` e cada componente reside em sua própria pasta, contendo seus arquivos (`.ts`, `.html`, `.css`, `.spec.ts`).
@@ -89,6 +142,7 @@ src/
89
142
  | ├── base-toggle/
90
143
  | ├── drop-down/
91
144
  | ├── footer/
145
+ | ├── kpi/
92
146
  | ├── links-button/
93
147
  | ├── paginator/
94
148
  | ├── stepper/
@@ -816,6 +870,55 @@ Um rodapé simples para a aplicação.
816
870
 
817
871
  ---
818
872
 
873
+ ### `CaoKpi`
874
+
875
+ Um componente de KPI (Key Performance Indicator) que exibe um cartão com ícone, valor, título, cor de texto e cor de borda configuráveis.
876
+
877
+ **Seletor:** `<cao-kpi>`
878
+
879
+ **Interface `ICaoKPI`**
880
+
881
+ | Propriedade | Tipo | Descrição |
882
+ | --- | --- | --- |
883
+ | `title` | `string` | O título do KPI. |
884
+ | `value` | `string` | O valor exibido (ex: `"R$ 12.345"`). |
885
+ | `textColor` | `string` | Cor do texto (valor e título). |
886
+ | `borderColor` | `string` | Cor da borda do cartão. |
887
+ | `icon` | `ICaoImage` | O ícone exibido no canto superior direito. |
888
+
889
+ **Interface `ICaoImage`**
890
+
891
+ | Propriedade | Tipo | Descrição |
892
+ | --- | --- | --- |
893
+ | `src` | `string` | Caminho ou URL da imagem do ícone. |
894
+ | `alt` | `string` | Texto alternativo (acessibilidade) da imagem. |
895
+
896
+ **Atributos (Inputs)**
897
+
898
+ | Atributo | Tipo | Padrão | Descrição |
899
+ | --- | --- | --- | --- |
900
+ | `kpiData` | `ICaoKPI` | — (obrigatório) | Dados do KPI, recebidos via `input.required`. |
901
+
902
+ **Exemplo de uso:**
903
+
904
+ ```html
905
+ <cao-kpi [kpiData]="meuKpi"></cao-kpi>
906
+ ```
907
+
908
+ ```typescript
909
+ import { CaoKpi, ICaoKPI } from 'ngx-opalbytes-components';
910
+
911
+ meuKpi: ICaoKPI = {
912
+ title: 'Total de Vendas',
913
+ value: 'R$ 12.345',
914
+ textColor: '#16a34a',
915
+ borderColor: '#16a34a',
916
+ icon: { src: 'assets/icon-vendas.svg', alt: 'Vendas' }
917
+ };
918
+ ```
919
+
920
+ ---
921
+
819
922
  ### `LinksButton`
820
923
  Exibe uma lista de links de navegação como botões.
821
924
 
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+
7
+ const USAGE = `cao-comp — Copia um componente da lib ngx-opalbytes-components para qualquer projeto
8
+
9
+ Uso:
10
+ cao-comp <componente> <destino> [opcoes]
11
+
12
+ Argumentos:
13
+ <componente> Nome da pasta do componente em shared/components (ex: base-button)
14
+ <destino> Pasta de destino onde os arquivos serao gerados (criada se nao existir)
15
+
16
+ Opcoes:
17
+ -h, --help Exibe esta ajuda
18
+ -l, --list Lista os componentes disponiveis para copia
19
+ -f, --force Sobrescreve arquivos existentes no destino
20
+ -v, --version Exibe a versao
21
+
22
+ Exemplos:
23
+ cao-comp base-button ./src/app/components
24
+ cao-comp stepper ./src/app/components --force
25
+ cao-comp --list
26
+ `;
27
+
28
+ function resolveTemplatesDir() {
29
+ const candidates = [
30
+ path.join(__dirname, '..', 'templates'),
31
+ path.join(__dirname, '..', 'src', 'lib', 'shared', 'components'),
32
+ path.join(__dirname, '..', '..', 'src', 'lib', 'shared', 'components'),
33
+ ];
34
+ for (const dir of candidates) {
35
+ if (fs.existsSync(dir) && fs.statSync(dir).isDirectory()) {
36
+ return dir;
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+
42
+ function resolvePackageVersion() {
43
+ const candidates = [
44
+ path.join(__dirname, '..', 'package.json'),
45
+ path.join(__dirname, '..', '..', 'package.json'),
46
+ path.join(__dirname, '..', '..', '..', 'package.json'),
47
+ ];
48
+ for (const file of candidates) {
49
+ if (fs.existsSync(file)) {
50
+ try {
51
+ const pkg = JSON.parse(fs.readFileSync(file, 'utf8'));
52
+ if (pkg && pkg.version) {
53
+ return pkg.version;
54
+ }
55
+ } catch (_) {
56
+ /* ignore */
57
+ }
58
+ }
59
+ }
60
+ return 'desconhecida';
61
+ }
62
+
63
+ function listComponents(templatesDir) {
64
+ return fs
65
+ .readdirSync(templatesDir, { withFileTypes: true })
66
+ .filter((e) => e.isDirectory())
67
+ .map((e) => e.name)
68
+ .sort();
69
+ }
70
+
71
+ function copyRecursive(src, dest, force, conflicts) {
72
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
73
+ const srcPath = path.join(src, entry.name);
74
+ const destPath = path.join(dest, entry.name);
75
+ if (entry.isDirectory()) {
76
+ fs.mkdirSync(destPath, { recursive: true });
77
+ copyRecursive(srcPath, destPath, force, conflicts);
78
+ } else {
79
+ if (fs.existsSync(destPath) && !force) {
80
+ conflicts.push(destPath);
81
+ continue;
82
+ }
83
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
84
+ fs.copyFileSync(srcPath, destPath);
85
+ }
86
+ }
87
+ }
88
+
89
+ function parseArgs(argv) {
90
+ const positionals = [];
91
+ const flags = { help: false, list: false, force: false, version: false };
92
+ for (let i = 0; i < argv.length; i++) {
93
+ const arg = argv[i];
94
+ switch (arg) {
95
+ case '-h':
96
+ case '--help':
97
+ flags.help = true;
98
+ break;
99
+ case '-l':
100
+ case '--list':
101
+ flags.list = true;
102
+ break;
103
+ case '-f':
104
+ case '--force':
105
+ flags.force = true;
106
+ break;
107
+ case '-v':
108
+ case '--version':
109
+ flags.version = true;
110
+ break;
111
+ default:
112
+ positionals.push(arg);
113
+ }
114
+ }
115
+ return { positionals, flags };
116
+ }
117
+
118
+ function main() {
119
+ const argv = process.argv.slice(2);
120
+ const { positionals, flags } = parseArgs(argv);
121
+
122
+ if (flags.help) {
123
+ process.stdout.write(USAGE + '\n');
124
+ return 0;
125
+ }
126
+
127
+ if (flags.version) {
128
+ process.stdout.write(`cao-comp ${resolvePackageVersion()}\n`);
129
+ return 0;
130
+ }
131
+
132
+ const templatesDir = resolveTemplatesDir();
133
+ if (!templatesDir) {
134
+ process.stderr.write(
135
+ 'Erro: nao foi possivel localizar a pasta de templates dos componentes.\n'
136
+ );
137
+ return 1;
138
+ }
139
+
140
+ if (flags.list) {
141
+ const components = listComponents(templatesDir);
142
+ process.stdout.write('Componentes disponiveis:\n');
143
+ for (const c of components) {
144
+ process.stdout.write(` - ${c}\n`);
145
+ }
146
+ return 0;
147
+ }
148
+
149
+ const [component, destination] = positionals;
150
+ if (!component || !destination) {
151
+ process.stderr.write(
152
+ 'Erro: informe o componente e o destino.\n\n' + USAGE + '\n'
153
+ );
154
+ return 1;
155
+ }
156
+
157
+ const sourceDir = path.join(templatesDir, component);
158
+ if (!fs.existsSync(sourceDir) || !fs.statSync(sourceDir).isDirectory()) {
159
+ const available = listComponents(templatesDir).join(', ');
160
+ process.stderr.write(
161
+ `Erro: componente "${component}" nao encontrado.\n` +
162
+ `Componentes disponiveis: ${available}\n`
163
+ );
164
+ return 1;
165
+ }
166
+
167
+ fs.mkdirSync(destination, { recursive: true });
168
+ const conflicts = [];
169
+ copyRecursive(sourceDir, destination, flags.force, conflicts);
170
+
171
+ if (conflicts.length) {
172
+ process.stderr.write(
173
+ `Erro: os seguintes arquivos ja existem no destino (use --force para sobrescrever):\n` +
174
+ conflicts.map((c) => ` - ${c}`).join('\n') +
175
+ '\n'
176
+ );
177
+ return 1;
178
+ }
179
+
180
+ process.stdout.write(
181
+ `Componente "${component}" copiado para "${destination}".\n`
182
+ );
183
+ return 0;
184
+ }
185
+
186
+ process.exit(main());
@@ -1,7 +1,7 @@
1
1
  import * as i1 from '@angular/common';
2
2
  import { CommonModule, isPlatformBrowser, NgTemplateOutlet, NgOptimizedImage } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { EventEmitter, Input, Output, Component, ViewChild, inject, ElementRef, ChangeDetectorRef, Renderer2, ViewContainerRef, forwardRef, HostListener, ChangeDetectionStrategy, ViewEncapsulation, NgModule, ContentChildren, Directive, TemplateRef, ContentChild, signal, PLATFORM_ID, ViewChildren, HostBinding, Injectable } from '@angular/core';
4
+ import { EventEmitter, Input, Output, Component, ViewChild, inject, ElementRef, ChangeDetectorRef, Renderer2, ViewContainerRef, forwardRef, HostListener, ChangeDetectionStrategy, ViewEncapsulation, NgModule, ContentChildren, Directive, TemplateRef, ContentChild, signal, PLATFORM_ID, ViewChildren, HostBinding, input, Injectable } from '@angular/core';
5
5
  import * as i3 from '@angular/material/tooltip';
6
6
  import { MatTooltipModule } from '@angular/material/tooltip';
7
7
  import { LucideDynamicIcon } from '@lucide/angular';
@@ -75,6 +75,7 @@ class CaoBaseButtonComponent {
75
75
  iconColor;
76
76
  strokeWidthIcon = 1;
77
77
  minTextToTooltip = 20;
78
+ iconSize = 24;
78
79
  ngOnInit() {
79
80
  if (!this.dataCy) {
80
81
  this.dataCy = `btn-${this.buttonText.replace(/\s+/g, '-').toLowerCase()}`;
@@ -89,11 +90,11 @@ class CaoBaseButtonComponent {
89
90
  }
90
91
  }
91
92
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoBaseButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
92
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: CaoBaseButtonComponent, isStandalone: true, selector: "cao-button", inputs: { buttonText: "buttonText", isDarkMode: "isDarkMode", isDisabled: "isDisabled", isLoading: "isLoading", btnClass: "btnClass", tooltip: "tooltip", trailingIcon: "trailingIcon", leadingIcon: "leadingIcon", isLucideIcon: "isLucideIcon", dataCy: "dataCy", iconColor: "iconColor", strokeWidthIcon: "strokeWidthIcon", minTextToTooltip: "minTextToTooltip" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"base-button\"\n matTooltipPosition=\"below\"\n matTooltipClass=\"custom-arrow-tooltip\"\n [matTooltip]=\"tooltip\"\n [matTooltipDisabled]=\"!tooltip\"\n [class.dark-mode]=\"isDarkMode\"\n [class.disabled]=\"isDisabled\"\n [class.loading]=\"isLoading\"\n [disabled]=\"isDisabled || isLoading\"\n [attr.data-cy]=\"dataCy\"\n (click)=\"onClick()\">\n @if (leadingIcon) {\n <span class=\"leading-icon\">\n @if (isLucideIcon) {\n <svg [lucideIcon]=\"leadingIcon\" [style.color]=\"iconColor\" [strokeWidth]=\"strokeWidthIcon\"></svg>\n } @else {\n <img alt=\"icon\" [src]=\"leadingIcon\" />\n }\n </span>\n } {{ buttonText }} @if (trailingIcon) {\n <span class=\"trailing-icon\">\n @if (isLucideIcon) {\n <svg [lucideIcon]=\"trailingIcon\" [style.color]=\"iconColor\" [strokeWidth]=\"strokeWidthIcon\"></svg>\n } @else {\n <img alt=\"icon\" [src]=\"trailingIcon\" />\n }\n </span>\n } @if (isLoading) {\n <span class=\"loader\"></span>\n }\n</button>\n", styles: [".base-button{display:flex;gap:5px;width:100%;align-items:center;justify-content:center;cursor:pointer}.base-button.disabled{cursor:not-allowed}.base-button.loading{cursor:progress}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }] });
93
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: CaoBaseButtonComponent, isStandalone: true, selector: "cao-button", inputs: { buttonText: "buttonText", isDarkMode: "isDarkMode", isDisabled: "isDisabled", isLoading: "isLoading", btnClass: "btnClass", tooltip: "tooltip", trailingIcon: "trailingIcon", leadingIcon: "leadingIcon", isLucideIcon: "isLucideIcon", dataCy: "dataCy", iconColor: "iconColor", strokeWidthIcon: "strokeWidthIcon", minTextToTooltip: "minTextToTooltip", iconSize: "iconSize" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"base-button\"\n matTooltipPosition=\"below\"\n matTooltipClass=\"custom-arrow-tooltip\"\n [matTooltip]=\"tooltip\"\n [matTooltipDisabled]=\"!tooltip\"\n [class.dark-mode]=\"isDarkMode\"\n [class.disabled]=\"isDisabled\"\n [class.loading]=\"isLoading\"\n [disabled]=\"isDisabled || isLoading\"\n [attr.data-cy]=\"dataCy\"\n (click)=\"onClick()\">\n @if (leadingIcon) {\n <span class=\"leading-icon\">\n @if (isLucideIcon) {\n <svg [lucideIcon]=\"leadingIcon\" [size]=\"iconSize\" [style.color]=\"iconColor\" [strokeWidth]=\"strokeWidthIcon\"></svg>\n } @else {\n <img alt=\"icon\" [src]=\"leadingIcon\" [style.width]=\"iconSize\" />\n }\n </span>\n } {{ buttonText }} @if (trailingIcon) {\n <span class=\"trailing-icon\">\n @if (isLucideIcon) {\n <svg [lucideIcon]=\"trailingIcon\" [size]=\"iconSize\" [style.color]=\"iconColor\" [strokeWidth]=\"strokeWidthIcon\"></svg>\n } @else {\n <img alt=\"icon\" [src]=\"trailingIcon\" [style.width]=\"iconSize\" />\n }\n </span>\n } @if (isLoading) {\n <span class=\"loader\"></span>\n }\n</button>\n", styles: [".base-button{display:flex;gap:5px;width:100%;align-items:center;justify-content:center;cursor:pointer}.base-button.disabled{cursor:not-allowed}.base-button.loading{cursor:progress}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }] });
93
94
  }
94
95
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoBaseButtonComponent, decorators: [{
95
96
  type: Component,
96
- args: [{ standalone: true, selector: "cao-button", imports: [CommonModule, MatTooltipModule, LucideDynamicIcon], template: "<button\n type=\"button\"\n class=\"base-button\"\n matTooltipPosition=\"below\"\n matTooltipClass=\"custom-arrow-tooltip\"\n [matTooltip]=\"tooltip\"\n [matTooltipDisabled]=\"!tooltip\"\n [class.dark-mode]=\"isDarkMode\"\n [class.disabled]=\"isDisabled\"\n [class.loading]=\"isLoading\"\n [disabled]=\"isDisabled || isLoading\"\n [attr.data-cy]=\"dataCy\"\n (click)=\"onClick()\">\n @if (leadingIcon) {\n <span class=\"leading-icon\">\n @if (isLucideIcon) {\n <svg [lucideIcon]=\"leadingIcon\" [style.color]=\"iconColor\" [strokeWidth]=\"strokeWidthIcon\"></svg>\n } @else {\n <img alt=\"icon\" [src]=\"leadingIcon\" />\n }\n </span>\n } {{ buttonText }} @if (trailingIcon) {\n <span class=\"trailing-icon\">\n @if (isLucideIcon) {\n <svg [lucideIcon]=\"trailingIcon\" [style.color]=\"iconColor\" [strokeWidth]=\"strokeWidthIcon\"></svg>\n } @else {\n <img alt=\"icon\" [src]=\"trailingIcon\" />\n }\n </span>\n } @if (isLoading) {\n <span class=\"loader\"></span>\n }\n</button>\n", styles: [".base-button{display:flex;gap:5px;width:100%;align-items:center;justify-content:center;cursor:pointer}.base-button.disabled{cursor:not-allowed}.base-button.loading{cursor:progress}\n"] }]
97
+ args: [{ standalone: true, selector: "cao-button", imports: [CommonModule, MatTooltipModule, LucideDynamicIcon], template: "<button\n type=\"button\"\n class=\"base-button\"\n matTooltipPosition=\"below\"\n matTooltipClass=\"custom-arrow-tooltip\"\n [matTooltip]=\"tooltip\"\n [matTooltipDisabled]=\"!tooltip\"\n [class.dark-mode]=\"isDarkMode\"\n [class.disabled]=\"isDisabled\"\n [class.loading]=\"isLoading\"\n [disabled]=\"isDisabled || isLoading\"\n [attr.data-cy]=\"dataCy\"\n (click)=\"onClick()\">\n @if (leadingIcon) {\n <span class=\"leading-icon\">\n @if (isLucideIcon) {\n <svg [lucideIcon]=\"leadingIcon\" [size]=\"iconSize\" [style.color]=\"iconColor\" [strokeWidth]=\"strokeWidthIcon\"></svg>\n } @else {\n <img alt=\"icon\" [src]=\"leadingIcon\" [style.width]=\"iconSize\" />\n }\n </span>\n } {{ buttonText }} @if (trailingIcon) {\n <span class=\"trailing-icon\">\n @if (isLucideIcon) {\n <svg [lucideIcon]=\"trailingIcon\" [size]=\"iconSize\" [style.color]=\"iconColor\" [strokeWidth]=\"strokeWidthIcon\"></svg>\n } @else {\n <img alt=\"icon\" [src]=\"trailingIcon\" [style.width]=\"iconSize\" />\n }\n </span>\n } @if (isLoading) {\n <span class=\"loader\"></span>\n }\n</button>\n", styles: [".base-button{display:flex;gap:5px;width:100%;align-items:center;justify-content:center;cursor:pointer}.base-button.disabled{cursor:not-allowed}.base-button.loading{cursor:progress}\n"] }]
97
98
  }], propDecorators: { buttonClick: [{
98
99
  type: Output
99
100
  }], buttonText: [{
@@ -122,6 +123,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
122
123
  type: Input
123
124
  }], minTextToTooltip: [{
124
125
  type: Input
126
+ }], iconSize: [{
127
+ type: Input
125
128
  }] } });
126
129
 
127
130
  class CaoBaseInput {
@@ -373,6 +376,7 @@ class CaoAutocompleteComponent {
373
376
  strokeWidthIcon = 1;
374
377
  isDisabled = false;
375
378
  inputHeigth = '50px';
379
+ iconSize = 24;
376
380
  checkIcon = '✓';
377
381
  showCheckIcon = true;
378
382
  isLucideCheckIcon = false;
@@ -768,13 +772,13 @@ class CaoAutocompleteComponent {
768
772
  this.renderer.setStyle(this.el.nativeElement, "--form-field-height", this.inputHeigth);
769
773
  }
770
774
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
771
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: CaoAutocompleteComponent, isStandalone: true, selector: "cao-autocomplete", inputs: { label: "label", placeholder: "placeholder", options: "options", control: "control", dataCy: "dataCy", controlName: "controlName", isLucideIcon: "isLucideIcon", iconColor: "iconColor", _leadingIcon: "_leadingIcon", _trailingIcon: "_trailingIcon", optionIcon: "optionIcon", optionIConColor: "optionIConColor", isLucideOptionIcon: "isLucideOptionIcon", autocompleteBgColor: "autocompleteBgColor", strokeWidthIcon: "strokeWidthIcon", isDisabled: "isDisabled", inputHeigth: "inputHeigth", checkIcon: "checkIcon", showCheckIcon: "showCheckIcon", isLucideCheckIcon: "isLucideCheckIcon" }, outputs: { itemSelected: "itemSelected", blurEvent: "blurEvent", focusEvent: "focusEvent", leadingIconClick: "leadingIconClick", trailingIconClick: "trailingIconClick" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
775
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: CaoAutocompleteComponent, isStandalone: true, selector: "cao-autocomplete", inputs: { label: "label", placeholder: "placeholder", options: "options", control: "control", dataCy: "dataCy", controlName: "controlName", isLucideIcon: "isLucideIcon", iconColor: "iconColor", _leadingIcon: "_leadingIcon", _trailingIcon: "_trailingIcon", optionIcon: "optionIcon", optionIConColor: "optionIConColor", isLucideOptionIcon: "isLucideOptionIcon", autocompleteBgColor: "autocompleteBgColor", strokeWidthIcon: "strokeWidthIcon", isDisabled: "isDisabled", inputHeigth: "inputHeigth", iconSize: "iconSize", checkIcon: "checkIcon", showCheckIcon: "showCheckIcon", isLucideCheckIcon: "isLucideCheckIcon" }, outputs: { itemSelected: "itemSelected", blurEvent: "blurEvent", focusEvent: "focusEvent", leadingIconClick: "leadingIconClick", trailingIconClick: "trailingIconClick" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
772
776
  {
773
777
  provide: NG_VALUE_ACCESSOR,
774
778
  useExisting: forwardRef(() => CaoAutocompleteComponent),
775
779
  multi: true,
776
780
  },
777
- ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true }, { propertyName: "wrapperEl", first: true, predicate: ["wrapper"], descendants: true, static: true }, { propertyName: "panelTemplate", first: true, predicate: ["panel"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-field\">\n @if (label) {\n <label [for]=\"dataCy\">{{ label }}</label>\n }\n\n <div class=\"rnv-autocomplete-field autocomplete\">\n <div\n #wrapper\n class=\"input-wrapper\"\n [class.has-leading-icon]=\"_leadingIcon\"\n [class.has-trailing-icon]=\"_trailingIcon\"\n [class.focused]=\"isFocused\"\n [class.invalid]=\"control?.touched && control?.invalid\"\n [class.valid]=\"control?.touched && control?.valid && control?.value\">\n\n @if (_leadingIcon) {\n @if (isLucideIcon) {\n <div class=\"icon\"\n tabindex=\"0\"\n (click)=\"onLeadingIconClick($event)\"\n (keydown.enter)=\"onLeadingIconClick($event)\">\n <svg [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"_leadingIcon\" [style.color]=\"iconColor\"></svg>\n </div>\n } @else {\n <div class=\"icon\"\n tabindex=\"0\"\n (click)=\"onLeadingIconClick($event)\"\n (keydown.enter)=\"onLeadingIconClick($event)\">\n <img alt=\"\u00EDcone de in\u00EDcio\" [src]=\"_leadingIcon\" />\n </div>\n }\n }\n\n <input\n #inputEl\n type=\"text\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isPanelOpen\"\n [attr.aria-controls]=\"isPanelOpen ? listboxId : null\"\n [attr.aria-activedescendant]=\"activeOptionId\"\n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled\"\n [formControl]=\"internalControl\"\n [attr.data-cy]=\"dataCy\"\n [id]=\"dataCy\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (input)=\"onUserInput()\"\n (keydown)=\"onInputKeydown($event)\" />\n\n @if (_trailingIcon) {\n @if (isLucideIcon) {\n <div\n tabindex=\"0\"\n class=\"icon trailing-icon\"\n (click)=\"onTrailingIconClick($event)\"\n (keydown.enter)=\"onTrailingIconClick($event)\">\n <svg [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"_trailingIcon\" [style.color]=\"iconColor\"></svg>\n </div>\n } @else {\n <div\n tabindex=\"0\"\n class=\"icon trailing-icon\"\n (click)=\"onTrailingIconClick($event)\"\n (keydown.enter)=\"onTrailingIconClick($event)\">\n <img alt=\"\u00EDcone de fim\" [src]=\"_trailingIcon\" />\n </div>\n }\n }\n </div>\n\n @if (errorText) {\n <span class=\"error-text\">{{ errorText }}</span>\n }\n </div>\n</div>\n\n<ng-template #panel>\n <div\n class=\"autocomplete-panel\"\n cdkScrollable\n role=\"listbox\"\n [id]=\"listboxId\"\n [style.width]=\"'100%'\"\n [style.max-height]=\"'260px'\"\n [style.background]=\"autocompleteBgColor\">\n \n @if (!filteredOptionsList.length) {\n <div class=\"empty-state\">Nenhum resultado encontrado</div>\n }\n\n @for (option of filteredOptionsList; track trackByOptionId($index, option)) {\n <div\n class=\"option-item\"\n role=\"option\"\n [id]=\"optionId(option)\"\n [class.active]=\"$index === activeIndex\"\n [class.selected]=\"isOptionSelected(option)\"\n [attr.aria-selected]=\"$index === activeIndex\"\n (mousedown)=\"$event.preventDefault(); selectOption(option)\"\n (mouseenter)=\"activeIndex = $index\">\n <span>{{ option.nome }}</span>\n\n <div class=\"option-item-icons\">\n @if (showCheckIcon && isOptionSelected(option)) {\n @if (isLucideCheckIcon) {\n <svg class=\"check-icon\" [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"checkIcon\" [style.color]=\"iconColor\"></svg>\n } @else {\n <span class=\"check-icon\">{{ checkIcon }}</span>\n }\n }\n\n @if (optionIcon) {\n @if (isLucideOptionIcon) {\n <svg [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"optionIcon\" [style.color]=\"optionIConColor || iconColor\"></svg>\n } @else {\n <img alt=\"\" [src]=\"optionIcon\" />\n }\n }\n </div>\n </div>\n }\n </div>\n</ng-template>", styles: [":host{display:block;position:relative;--autocomplete-bg-color: white}.form-field{display:flex;flex-direction:column;width:100%;height:100%}label{font-size:12px;font-weight:700;text-transform:uppercase;white-space:nowrap;flex-shrink:0}.rnv-autocomplete-field{width:100%;flex:1;min-height:0;display:flex;flex-direction:column}.input-wrapper{position:relative;width:100%;height:var(--form-field-height, 44px);display:flex;align-items:center;background-color:var(--autocomplete-bg-color, white);border:1px solid transparent;border-radius:4px;box-sizing:border-box}.input-wrapper.invalid{border-color:#d32f2f}.input-wrapper.valid{border-color:#2e7d32}input{width:100%;height:100%;border:none;outline:none;background:transparent;padding:12px;font-size:1rem;box-sizing:border-box}input:disabled{opacity:.5;cursor:not-allowed}.input-wrapper.has-leading-icon input{padding-left:36px}.input-wrapper.has-trailing-icon input{padding-right:28px}.icon{position:absolute;top:50%;left:6px;transform:translateY(-50%);width:auto;height:auto;z-index:1;cursor:pointer}.trailing-icon{left:auto;right:6px}.error-text{color:#d32f2f;font-size:11px;margin-top:2px}.autocomplete-panel{background:var(--autocomplete-bg-color, white);border-radius:8px;padding:6px;box-shadow:0 2px 10px #00000026;max-height:260px;overflow-y:auto;box-sizing:border-box}.empty-state{padding:8px 12px;font-size:.9rem;color:#00000080}.option-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;font-size:1rem;text-transform:uppercase;border-radius:4px;cursor:pointer;position:relative}.option-item:hover,.option-item.active{background-color:#0000000f}.option-item.selected{background-color:#1976d21f;font-weight:600}.option-item.selected.active{background-color:#1976d233}.option-item-icons{display:flex;align-items:center;gap:6px;flex-shrink:0}.check-icon{font-weight:700;font-size:.95rem;line-height:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2$2.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
781
+ ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true }, { propertyName: "wrapperEl", first: true, predicate: ["wrapper"], descendants: true, static: true }, { propertyName: "panelTemplate", first: true, predicate: ["panel"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-field\">\n @if (label) {\n <label [for]=\"dataCy\">{{ label }}</label>\n }\n\n <div class=\"rnv-autocomplete-field autocomplete\">\n <div\n #wrapper\n class=\"input-wrapper\"\n [class.has-leading-icon]=\"_leadingIcon\"\n [class.has-trailing-icon]=\"_trailingIcon\"\n [class.focused]=\"isFocused\"\n [class.invalid]=\"control?.touched && control?.invalid\"\n [class.valid]=\"control?.touched && control?.valid && control?.value\">\n\n @if (_leadingIcon) {\n @if (isLucideIcon) {\n <div class=\"icon\"\n tabindex=\"0\"\n (click)=\"onLeadingIconClick($event)\"\n (keydown.enter)=\"onLeadingIconClick($event)\">\n <svg [strokeWidth]=\"strokeWidthIcon\" [size]=\"iconSize\" [lucideIcon]=\"_leadingIcon\" [style.color]=\"iconColor\"></svg>\n </div>\n } @else {\n <div class=\"icon\"\n tabindex=\"0\"\n (click)=\"onLeadingIconClick($event)\"\n (keydown.enter)=\"onLeadingIconClick($event)\">\n <img alt=\"\u00EDcone de in\u00EDcio\" [style.width]=\"iconSize\" [src]=\"_leadingIcon\" />\n </div>\n }\n }\n\n <input\n #inputEl\n type=\"text\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isPanelOpen\"\n [attr.aria-controls]=\"isPanelOpen ? listboxId : null\"\n [attr.aria-activedescendant]=\"activeOptionId\"\n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled\"\n [formControl]=\"internalControl\"\n [attr.data-cy]=\"dataCy\"\n [id]=\"dataCy\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (input)=\"onUserInput()\"\n (keydown)=\"onInputKeydown($event)\" />\n\n @if (_trailingIcon) {\n @if (isLucideIcon) {\n <div\n tabindex=\"0\"\n class=\"icon trailing-icon\"\n (click)=\"onTrailingIconClick($event)\"\n (keydown.enter)=\"onTrailingIconClick($event)\">\n <svg [strokeWidth]=\"strokeWidthIcon\" [size]=\"iconSize\" [lucideIcon]=\"_trailingIcon\" [style.color]=\"iconColor\"></svg>\n </div>\n } @else {\n <div\n tabindex=\"0\"\n class=\"icon trailing-icon\"\n (click)=\"onTrailingIconClick($event)\"\n (keydown.enter)=\"onTrailingIconClick($event)\">\n <img alt=\"\u00EDcone de fim\" [style.width]=\"iconSize\" [src]=\"_trailingIcon\" />\n </div>\n }\n }\n </div>\n\n @if (errorText) {\n <span class=\"error-text\">{{ errorText }}</span>\n }\n </div>\n</div>\n\n<ng-template #panel>\n <div\n class=\"autocomplete-panel\"\n cdkScrollable\n role=\"listbox\"\n [id]=\"listboxId\"\n [style.width]=\"'100%'\"\n [style.max-height]=\"'260px'\"\n [style.background]=\"autocompleteBgColor\">\n \n @if (!filteredOptionsList.length) {\n <div class=\"empty-state\">Nenhum resultado encontrado</div>\n }\n\n @for (option of filteredOptionsList; track trackByOptionId($index, option)) {\n <div\n class=\"option-item\"\n role=\"option\"\n [id]=\"optionId(option)\"\n [class.active]=\"$index === activeIndex\"\n [class.selected]=\"isOptionSelected(option)\"\n [attr.aria-selected]=\"$index === activeIndex\"\n (mousedown)=\"$event.preventDefault(); selectOption(option)\"\n (mouseenter)=\"activeIndex = $index\">\n <span>{{ option.nome }}</span>\n\n <div class=\"option-item-icons\">\n @if (showCheckIcon && isOptionSelected(option)) {\n @if (isLucideCheckIcon) {\n <svg class=\"check-icon\" [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"checkIcon\" [style.color]=\"iconColor\"></svg>\n } @else {\n <span class=\"check-icon\">{{ checkIcon }}</span>\n }\n }\n\n @if (optionIcon) {\n @if (isLucideOptionIcon) {\n <svg [strokeWidth]=\"strokeWidthIcon\" [size]=\"iconSize\" [lucideIcon]=\"optionIcon\" [style.color]=\"optionIConColor || iconColor\"></svg>\n } @else {\n <img alt=\"\" [src]=\"optionIcon\" />\n }\n }\n </div>\n </div>\n }\n </div>\n</ng-template>", styles: [":host{display:block;position:relative;--autocomplete-bg-color: white}.form-field{display:flex;flex-direction:column;width:100%;height:100%}label{font-size:12px;font-weight:700;text-transform:uppercase;white-space:nowrap;flex-shrink:0}.rnv-autocomplete-field{width:100%;flex:1;min-height:0;display:flex;flex-direction:column}.input-wrapper{position:relative;width:100%;height:var(--form-field-height, 44px);display:flex;align-items:center;background-color:var(--autocomplete-bg-color, white);border:1px solid transparent;border-radius:4px;box-sizing:border-box}.input-wrapper.invalid{border-color:#d32f2f}.input-wrapper.valid{border-color:#2e7d32}input{width:100%;height:100%;border:none;outline:none;background:transparent;padding:12px;font-size:1rem;box-sizing:border-box}input:disabled{opacity:.5;cursor:not-allowed}.input-wrapper.has-leading-icon input{padding-left:36px}.input-wrapper.has-trailing-icon input{padding-right:28px}.icon{position:absolute;top:50%;left:6px;transform:translateY(-50%);width:auto;height:auto;z-index:1;cursor:pointer}.trailing-icon{left:auto;right:6px}.error-text{color:#d32f2f;font-size:11px;margin-top:2px}.autocomplete-panel{background:var(--autocomplete-bg-color, white);border-radius:8px;padding:6px;box-shadow:0 2px 10px #00000026;max-height:260px;overflow-y:auto;box-sizing:border-box}.empty-state{padding:8px 12px;font-size:.9rem;color:#00000080}.option-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;font-size:1rem;text-transform:uppercase;border-radius:4px;cursor:pointer;position:relative}.option-item:hover,.option-item.active{background-color:#0000000f}.option-item.selected{background-color:#1976d21f;font-weight:600}.option-item.selected.active{background-color:#1976d233}.option-item-icons{display:flex;align-items:center;gap:6px;flex-shrink:0}.check-icon{font-weight:700;font-size:.95rem;line-height:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2$2.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
778
782
  }
779
783
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoAutocompleteComponent, decorators: [{
780
784
  type: Component,
@@ -790,7 +794,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
790
794
  useExisting: forwardRef(() => CaoAutocompleteComponent),
791
795
  multi: true,
792
796
  },
793
- ], template: "<div class=\"form-field\">\n @if (label) {\n <label [for]=\"dataCy\">{{ label }}</label>\n }\n\n <div class=\"rnv-autocomplete-field autocomplete\">\n <div\n #wrapper\n class=\"input-wrapper\"\n [class.has-leading-icon]=\"_leadingIcon\"\n [class.has-trailing-icon]=\"_trailingIcon\"\n [class.focused]=\"isFocused\"\n [class.invalid]=\"control?.touched && control?.invalid\"\n [class.valid]=\"control?.touched && control?.valid && control?.value\">\n\n @if (_leadingIcon) {\n @if (isLucideIcon) {\n <div class=\"icon\"\n tabindex=\"0\"\n (click)=\"onLeadingIconClick($event)\"\n (keydown.enter)=\"onLeadingIconClick($event)\">\n <svg [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"_leadingIcon\" [style.color]=\"iconColor\"></svg>\n </div>\n } @else {\n <div class=\"icon\"\n tabindex=\"0\"\n (click)=\"onLeadingIconClick($event)\"\n (keydown.enter)=\"onLeadingIconClick($event)\">\n <img alt=\"\u00EDcone de in\u00EDcio\" [src]=\"_leadingIcon\" />\n </div>\n }\n }\n\n <input\n #inputEl\n type=\"text\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isPanelOpen\"\n [attr.aria-controls]=\"isPanelOpen ? listboxId : null\"\n [attr.aria-activedescendant]=\"activeOptionId\"\n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled\"\n [formControl]=\"internalControl\"\n [attr.data-cy]=\"dataCy\"\n [id]=\"dataCy\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (input)=\"onUserInput()\"\n (keydown)=\"onInputKeydown($event)\" />\n\n @if (_trailingIcon) {\n @if (isLucideIcon) {\n <div\n tabindex=\"0\"\n class=\"icon trailing-icon\"\n (click)=\"onTrailingIconClick($event)\"\n (keydown.enter)=\"onTrailingIconClick($event)\">\n <svg [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"_trailingIcon\" [style.color]=\"iconColor\"></svg>\n </div>\n } @else {\n <div\n tabindex=\"0\"\n class=\"icon trailing-icon\"\n (click)=\"onTrailingIconClick($event)\"\n (keydown.enter)=\"onTrailingIconClick($event)\">\n <img alt=\"\u00EDcone de fim\" [src]=\"_trailingIcon\" />\n </div>\n }\n }\n </div>\n\n @if (errorText) {\n <span class=\"error-text\">{{ errorText }}</span>\n }\n </div>\n</div>\n\n<ng-template #panel>\n <div\n class=\"autocomplete-panel\"\n cdkScrollable\n role=\"listbox\"\n [id]=\"listboxId\"\n [style.width]=\"'100%'\"\n [style.max-height]=\"'260px'\"\n [style.background]=\"autocompleteBgColor\">\n \n @if (!filteredOptionsList.length) {\n <div class=\"empty-state\">Nenhum resultado encontrado</div>\n }\n\n @for (option of filteredOptionsList; track trackByOptionId($index, option)) {\n <div\n class=\"option-item\"\n role=\"option\"\n [id]=\"optionId(option)\"\n [class.active]=\"$index === activeIndex\"\n [class.selected]=\"isOptionSelected(option)\"\n [attr.aria-selected]=\"$index === activeIndex\"\n (mousedown)=\"$event.preventDefault(); selectOption(option)\"\n (mouseenter)=\"activeIndex = $index\">\n <span>{{ option.nome }}</span>\n\n <div class=\"option-item-icons\">\n @if (showCheckIcon && isOptionSelected(option)) {\n @if (isLucideCheckIcon) {\n <svg class=\"check-icon\" [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"checkIcon\" [style.color]=\"iconColor\"></svg>\n } @else {\n <span class=\"check-icon\">{{ checkIcon }}</span>\n }\n }\n\n @if (optionIcon) {\n @if (isLucideOptionIcon) {\n <svg [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"optionIcon\" [style.color]=\"optionIConColor || iconColor\"></svg>\n } @else {\n <img alt=\"\" [src]=\"optionIcon\" />\n }\n }\n </div>\n </div>\n }\n </div>\n</ng-template>", styles: [":host{display:block;position:relative;--autocomplete-bg-color: white}.form-field{display:flex;flex-direction:column;width:100%;height:100%}label{font-size:12px;font-weight:700;text-transform:uppercase;white-space:nowrap;flex-shrink:0}.rnv-autocomplete-field{width:100%;flex:1;min-height:0;display:flex;flex-direction:column}.input-wrapper{position:relative;width:100%;height:var(--form-field-height, 44px);display:flex;align-items:center;background-color:var(--autocomplete-bg-color, white);border:1px solid transparent;border-radius:4px;box-sizing:border-box}.input-wrapper.invalid{border-color:#d32f2f}.input-wrapper.valid{border-color:#2e7d32}input{width:100%;height:100%;border:none;outline:none;background:transparent;padding:12px;font-size:1rem;box-sizing:border-box}input:disabled{opacity:.5;cursor:not-allowed}.input-wrapper.has-leading-icon input{padding-left:36px}.input-wrapper.has-trailing-icon input{padding-right:28px}.icon{position:absolute;top:50%;left:6px;transform:translateY(-50%);width:auto;height:auto;z-index:1;cursor:pointer}.trailing-icon{left:auto;right:6px}.error-text{color:#d32f2f;font-size:11px;margin-top:2px}.autocomplete-panel{background:var(--autocomplete-bg-color, white);border-radius:8px;padding:6px;box-shadow:0 2px 10px #00000026;max-height:260px;overflow-y:auto;box-sizing:border-box}.empty-state{padding:8px 12px;font-size:.9rem;color:#00000080}.option-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;font-size:1rem;text-transform:uppercase;border-radius:4px;cursor:pointer;position:relative}.option-item:hover,.option-item.active{background-color:#0000000f}.option-item.selected{background-color:#1976d21f;font-weight:600}.option-item.selected.active{background-color:#1976d233}.option-item-icons{display:flex;align-items:center;gap:6px;flex-shrink:0}.check-icon{font-weight:700;font-size:.95rem;line-height:1}\n"] }]
797
+ ], template: "<div class=\"form-field\">\n @if (label) {\n <label [for]=\"dataCy\">{{ label }}</label>\n }\n\n <div class=\"rnv-autocomplete-field autocomplete\">\n <div\n #wrapper\n class=\"input-wrapper\"\n [class.has-leading-icon]=\"_leadingIcon\"\n [class.has-trailing-icon]=\"_trailingIcon\"\n [class.focused]=\"isFocused\"\n [class.invalid]=\"control?.touched && control?.invalid\"\n [class.valid]=\"control?.touched && control?.valid && control?.value\">\n\n @if (_leadingIcon) {\n @if (isLucideIcon) {\n <div class=\"icon\"\n tabindex=\"0\"\n (click)=\"onLeadingIconClick($event)\"\n (keydown.enter)=\"onLeadingIconClick($event)\">\n <svg [strokeWidth]=\"strokeWidthIcon\" [size]=\"iconSize\" [lucideIcon]=\"_leadingIcon\" [style.color]=\"iconColor\"></svg>\n </div>\n } @else {\n <div class=\"icon\"\n tabindex=\"0\"\n (click)=\"onLeadingIconClick($event)\"\n (keydown.enter)=\"onLeadingIconClick($event)\">\n <img alt=\"\u00EDcone de in\u00EDcio\" [style.width]=\"iconSize\" [src]=\"_leadingIcon\" />\n </div>\n }\n }\n\n <input\n #inputEl\n type=\"text\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isPanelOpen\"\n [attr.aria-controls]=\"isPanelOpen ? listboxId : null\"\n [attr.aria-activedescendant]=\"activeOptionId\"\n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled\"\n [formControl]=\"internalControl\"\n [attr.data-cy]=\"dataCy\"\n [id]=\"dataCy\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (input)=\"onUserInput()\"\n (keydown)=\"onInputKeydown($event)\" />\n\n @if (_trailingIcon) {\n @if (isLucideIcon) {\n <div\n tabindex=\"0\"\n class=\"icon trailing-icon\"\n (click)=\"onTrailingIconClick($event)\"\n (keydown.enter)=\"onTrailingIconClick($event)\">\n <svg [strokeWidth]=\"strokeWidthIcon\" [size]=\"iconSize\" [lucideIcon]=\"_trailingIcon\" [style.color]=\"iconColor\"></svg>\n </div>\n } @else {\n <div\n tabindex=\"0\"\n class=\"icon trailing-icon\"\n (click)=\"onTrailingIconClick($event)\"\n (keydown.enter)=\"onTrailingIconClick($event)\">\n <img alt=\"\u00EDcone de fim\" [style.width]=\"iconSize\" [src]=\"_trailingIcon\" />\n </div>\n }\n }\n </div>\n\n @if (errorText) {\n <span class=\"error-text\">{{ errorText }}</span>\n }\n </div>\n</div>\n\n<ng-template #panel>\n <div\n class=\"autocomplete-panel\"\n cdkScrollable\n role=\"listbox\"\n [id]=\"listboxId\"\n [style.width]=\"'100%'\"\n [style.max-height]=\"'260px'\"\n [style.background]=\"autocompleteBgColor\">\n \n @if (!filteredOptionsList.length) {\n <div class=\"empty-state\">Nenhum resultado encontrado</div>\n }\n\n @for (option of filteredOptionsList; track trackByOptionId($index, option)) {\n <div\n class=\"option-item\"\n role=\"option\"\n [id]=\"optionId(option)\"\n [class.active]=\"$index === activeIndex\"\n [class.selected]=\"isOptionSelected(option)\"\n [attr.aria-selected]=\"$index === activeIndex\"\n (mousedown)=\"$event.preventDefault(); selectOption(option)\"\n (mouseenter)=\"activeIndex = $index\">\n <span>{{ option.nome }}</span>\n\n <div class=\"option-item-icons\">\n @if (showCheckIcon && isOptionSelected(option)) {\n @if (isLucideCheckIcon) {\n <svg class=\"check-icon\" [strokeWidth]=\"strokeWidthIcon\" [lucideIcon]=\"checkIcon\" [style.color]=\"iconColor\"></svg>\n } @else {\n <span class=\"check-icon\">{{ checkIcon }}</span>\n }\n }\n\n @if (optionIcon) {\n @if (isLucideOptionIcon) {\n <svg [strokeWidth]=\"strokeWidthIcon\" [size]=\"iconSize\" [lucideIcon]=\"optionIcon\" [style.color]=\"optionIConColor || iconColor\"></svg>\n } @else {\n <img alt=\"\" [src]=\"optionIcon\" />\n }\n }\n </div>\n </div>\n }\n </div>\n</ng-template>", styles: [":host{display:block;position:relative;--autocomplete-bg-color: white}.form-field{display:flex;flex-direction:column;width:100%;height:100%}label{font-size:12px;font-weight:700;text-transform:uppercase;white-space:nowrap;flex-shrink:0}.rnv-autocomplete-field{width:100%;flex:1;min-height:0;display:flex;flex-direction:column}.input-wrapper{position:relative;width:100%;height:var(--form-field-height, 44px);display:flex;align-items:center;background-color:var(--autocomplete-bg-color, white);border:1px solid transparent;border-radius:4px;box-sizing:border-box}.input-wrapper.invalid{border-color:#d32f2f}.input-wrapper.valid{border-color:#2e7d32}input{width:100%;height:100%;border:none;outline:none;background:transparent;padding:12px;font-size:1rem;box-sizing:border-box}input:disabled{opacity:.5;cursor:not-allowed}.input-wrapper.has-leading-icon input{padding-left:36px}.input-wrapper.has-trailing-icon input{padding-right:28px}.icon{position:absolute;top:50%;left:6px;transform:translateY(-50%);width:auto;height:auto;z-index:1;cursor:pointer}.trailing-icon{left:auto;right:6px}.error-text{color:#d32f2f;font-size:11px;margin-top:2px}.autocomplete-panel{background:var(--autocomplete-bg-color, white);border-radius:8px;padding:6px;box-shadow:0 2px 10px #00000026;max-height:260px;overflow-y:auto;box-sizing:border-box}.empty-state{padding:8px 12px;font-size:.9rem;color:#00000080}.option-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;font-size:1rem;text-transform:uppercase;border-radius:4px;cursor:pointer;position:relative}.option-item:hover,.option-item.active{background-color:#0000000f}.option-item.selected{background-color:#1976d21f;font-weight:600}.option-item.selected.active{background-color:#1976d233}.option-item-icons{display:flex;align-items:center;gap:6px;flex-shrink:0}.check-icon{font-weight:700;font-size:.95rem;line-height:1}\n"] }]
794
798
  }], propDecorators: { label: [{
795
799
  type: Input
796
800
  }], placeholder: [{
@@ -825,6 +829,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
825
829
  type: Input
826
830
  }], inputHeigth: [{
827
831
  type: Input
832
+ }], iconSize: [{
833
+ type: Input
828
834
  }], checkIcon: [{
829
835
  type: Input
830
836
  }], showCheckIcon: [{
@@ -1862,6 +1868,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
1862
1868
  type: Input
1863
1869
  }] } });
1864
1870
 
1871
+ class CaoKpi {
1872
+ kpiData = input.required(...(ngDevMode ? [{ debugName: "kpiData" }] : []));
1873
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoKpi, deps: [], target: i0.ɵɵFactoryTarget.Component });
1874
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: CaoKpi, isStandalone: true, selector: "cao-kpi", inputs: { kpiData: { classPropertyName: "kpiData", publicName: "kpiData", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"flex flex-col py-2 pt-2.25 px-3.75 rounded-card border-b w-46.25 bg-(--color-white)\"\n [style.border-color]=\"kpiData().borderColor\">\n <div class=\"flex w-full justify-end\">\n <img class=\"w-6 h-6 mr-2\" [src]=\"kpiData().icon.src\" [alt]=\"kpiData().icon.alt\" />\n </div>\n <div class=\"flex flex-col pl-1.5\">\n <p class=\"text-2xl\" [style.color]=\"kpiData().textColor\">{{ kpiData().value }}</p>\n <h3 class=\"text-base\" [style.color]=\"kpiData().textColor\">{{ kpiData().title }}</h3>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
1875
+ }
1876
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoKpi, decorators: [{
1877
+ type: Component,
1878
+ args: [{ selector: "cao-kpi", imports: [CommonModule], standalone: true, template: "<div\n class=\"flex flex-col py-2 pt-2.25 px-3.75 rounded-card border-b w-46.25 bg-(--color-white)\"\n [style.border-color]=\"kpiData().borderColor\">\n <div class=\"flex w-full justify-end\">\n <img class=\"w-6 h-6 mr-2\" [src]=\"kpiData().icon.src\" [alt]=\"kpiData().icon.alt\" />\n </div>\n <div class=\"flex flex-col pl-1.5\">\n <p class=\"text-2xl\" [style.color]=\"kpiData().textColor\">{{ kpiData().value }}</p>\n <h3 class=\"text-base\" [style.color]=\"kpiData().textColor\">{{ kpiData().title }}</h3>\n </div>\n</div>\n" }]
1879
+ }], propDecorators: { kpiData: [{ type: i0.Input, args: [{ isSignal: true, alias: "kpiData", required: true }] }] } });
1880
+
1865
1881
  class BaseModalService {
1866
1882
  constructor() { }
1867
1883
  toggleModalEvent = new EventEmitter();
@@ -2987,5 +3003,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
2987
3003
  * Generated bundle index. Do not edit.
2988
3004
  */
2989
3005
 
2990
- export { BaseAlert, BaseAlertService, BaseDialog, BaseDialogService, BaseFilterTablePaginatedService, BaseFilterTableService, BaseModal, BaseModalService, BasePaginationService, BaseTable, BaseTablePaginated, BaseTableService, BaseTimeRange, CaoAutocompleteComponent, CaoBaseButtonComponent, CaoBaseIcon, CaoBaseInput, CaoDropDownComponent, CaoTabGroup, CaoTabPanel, Footer, LinksButton, Paginator, StepComponent, StepperComponent, TablePaginatedService, TimePicker, getPtBrPaginatorIntlBasePaginated, getPtBrPaginatorIntlBaseTable };
3006
+ export { BaseAlert, BaseAlertService, BaseDialog, BaseDialogService, BaseFilterTablePaginatedService, BaseFilterTableService, BaseModal, BaseModalService, BasePaginationService, BaseTable, BaseTablePaginated, BaseTableService, BaseTimeRange, CaoAutocompleteComponent, CaoBaseButtonComponent, CaoBaseIcon, CaoBaseInput, CaoDropDownComponent, CaoKpi, CaoTabGroup, CaoTabPanel, Footer, LinksButton, Paginator, StepComponent, StepperComponent, TablePaginatedService, TimePicker, getPtBrPaginatorIntlBasePaginated, getPtBrPaginatorIntlBaseTable };
2991
3007
  //# sourceMappingURL=ngx-opalbytes-components.mjs.map