@dev-tcloud/tcloud-ui 6.15.0 → 6.18.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 (79) hide show
  1. package/docs/tcloud-ui-accordion.md +345 -0
  2. package/docs/tcloud-ui-actions.md +88 -0
  3. package/docs/tcloud-ui-alert-banner.md +104 -0
  4. package/docs/tcloud-ui-array-to-text.md +361 -0
  5. package/docs/tcloud-ui-breadcrumb.md +103 -0
  6. package/docs/tcloud-ui-bytes.md +109 -0
  7. package/docs/tcloud-ui-calendar.md +387 -0
  8. package/docs/tcloud-ui-card-accordion.md +266 -0
  9. package/docs/tcloud-ui-card-title.md +47 -0
  10. package/docs/tcloud-ui-card.md +40 -0
  11. package/docs/tcloud-ui-choice-issues.md +59 -0
  12. package/docs/tcloud-ui-cnpj.md +102 -0
  13. package/docs/tcloud-ui-container.md +171 -0
  14. package/docs/tcloud-ui-cpf.md +102 -0
  15. package/docs/tcloud-ui-currency.md +271 -0
  16. package/docs/tcloud-ui-data-list.md +91 -0
  17. package/docs/tcloud-ui-datebr.md +139 -0
  18. package/docs/tcloud-ui-datepicker-time.md +191 -0
  19. package/docs/tcloud-ui-datepicker.md +186 -0
  20. package/docs/tcloud-ui-dropdown-multi.md +444 -0
  21. package/docs/tcloud-ui-dropdown.md +369 -0
  22. package/docs/tcloud-ui-el-copy.md +113 -0
  23. package/docs/tcloud-ui-empty-content.md +412 -0
  24. package/docs/tcloud-ui-faq.md +496 -0
  25. package/docs/tcloud-ui-filter-bar.md +86 -0
  26. package/docs/tcloud-ui-filters.md +337 -0
  27. package/docs/tcloud-ui-hover-parent.md +467 -0
  28. package/docs/tcloud-ui-icon-button.md +104 -0
  29. package/docs/tcloud-ui-input-container.md +520 -0
  30. package/docs/tcloud-ui-input-password.md +258 -0
  31. package/docs/tcloud-ui-input-search.md +314 -0
  32. package/docs/tcloud-ui-label-token.md +286 -0
  33. package/docs/tcloud-ui-legend.md +72 -0
  34. package/docs/tcloud-ui-line-step-circle.md +98 -0
  35. package/docs/tcloud-ui-line-step-title.md +194 -0
  36. package/docs/tcloud-ui-linha-logo.md +550 -0
  37. package/docs/tcloud-ui-loading.md +88 -0
  38. package/docs/tcloud-ui-message.md +539 -0
  39. package/docs/tcloud-ui-modal.md +196 -0
  40. package/docs/tcloud-ui-monthname.md +123 -0
  41. package/docs/tcloud-ui-multi-input.md +290 -0
  42. package/docs/tcloud-ui-multi-select.md +311 -0
  43. package/docs/tcloud-ui-multiples-values.md +157 -0
  44. package/docs/tcloud-ui-not-found.md +88 -0
  45. package/docs/tcloud-ui-number-step.md +134 -0
  46. package/docs/tcloud-ui-pagination.md +579 -0
  47. package/docs/tcloud-ui-progress-bar.md +65 -0
  48. package/docs/tcloud-ui-radio.md +83 -0
  49. package/docs/tcloud-ui-reorder-items.md +418 -0
  50. package/docs/tcloud-ui-respective.md +167 -0
  51. package/docs/tcloud-ui-scroll-box.md +109 -0
  52. package/docs/tcloud-ui-search-bar.md +88 -0
  53. package/docs/tcloud-ui-search-in-object.md +143 -0
  54. package/docs/tcloud-ui-search-input.md +74 -0
  55. package/docs/tcloud-ui-skeleton-loading.md +394 -0
  56. package/docs/tcloud-ui-slide-toggle.md +210 -0
  57. package/docs/tcloud-ui-statusinfo.md +138 -0
  58. package/docs/tcloud-ui-tab-group.md +376 -0
  59. package/docs/tcloud-ui-tab-menu.md +109 -0
  60. package/docs/tcloud-ui-table.md +96 -0
  61. package/docs/tcloud-ui-tag.md +379 -0
  62. package/docs/tcloud-ui-tc-badge.md +168 -0
  63. package/docs/tcloud-ui-tc-btn.md +189 -0
  64. package/docs/tcloud-ui-tc-colors.md +204 -0
  65. package/docs/tcloud-ui-tc-form-control.md +200 -0
  66. package/docs/tcloud-ui-tc-text.md +139 -0
  67. package/docs/tcloud-ui-tc-title.md +118 -0
  68. package/docs/tcloud-ui-tcloud-form.md +55 -0
  69. package/docs/tcloud-ui-toast.md +83 -0
  70. package/docs/tcloud-ui-tooltip.md +88 -0
  71. package/docs/tcloud-ui-topology.md +232 -0
  72. package/docs/tcloud-ui-upload-area.md +195 -0
  73. package/docs/tcloud-ui-welcome.md +112 -0
  74. package/docs/tcloud-ui-wizard-steps.md +103 -0
  75. package/js/tcloud-ui-app.js +11 -0
  76. package/package.json +1 -1
  77. package/scss/tcloud-revitalizacao/components/_tcloud-ui-table.scss +95 -0
  78. package/scss/tcloud-revitalizacao/tc-rev-styles.scss +1 -1
  79. package/scss/tcloud-revitalizacao/components/_tc-rev-table.scss +0 -57
@@ -0,0 +1,258 @@
1
+ # Input Password
2
+
3
+ ## Características
4
+ - Componente standalone para entrada de senhas com validação robusta.
5
+ - Suporta validação customizável: letras maiúsculas, minúsculas, caracteres especiais, comprimento mínimo.
6
+ - Regex de validação gerado dinamicamente baseado nas propriedades de configuração.
7
+ - Ações integradas: visualizar/ocultar senha, gerar senha aleatória, copiar para clipboard.
8
+ - Feedback visual de cópia: ícone muda para checkmark por 3 segundos ao copiar.
9
+ - Toggle entre modo password (mascarado) e text (visível).
10
+ - Integração com ngModel (two-way binding) via ControlValueAccessor.
11
+ - Suporte a padrão HTML5 pattern para validação.
12
+
13
+ ## Instalação
14
+ ```ts
15
+ import { TCloudUiInputPasswordComponent } from 'projects/tcloud-ui/src/public-api';
16
+
17
+ @Component({
18
+ selector: 'app-example',
19
+ standalone: true,
20
+ imports: [TCloudUiInputPasswordComponent],
21
+ template: `<tcloud-ui-input-password [(ngModel)]="password"></tcloud-ui-input-password>`
22
+ })
23
+ export class ExampleComponent {
24
+ password: string = '';
25
+ }
26
+ ```
27
+
28
+ ## Propriedades (API)
29
+ ### Inputs
30
+ | Nome | Tipo | Descrição | Valor Default |
31
+ | --- | --- | --- | --- |
32
+ | actionView | boolean | Se true, exibe botão para visualizar/ocultar a senha. | true |
33
+ | actionCopy | boolean | Se true, exibe botão para copiar a senha ao clipboard. | true |
34
+ | actionGeneratePassword | boolean | Se true, exibe botão para gerar uma senha aleatória. | true |
35
+ | numberOfCharacter | number | Comprimento mínimo da senha (e tamanho base para geração). | 14 |
36
+ | atLeastOneUppercaseLetter | boolean | Se true, valida presença de pelo menos uma letra maiúscula. | true |
37
+ | atLeastOneLowercaseLetter | boolean | Se true, valida presença de pelo menos uma letra minúscula. | true |
38
+ | atLeastOneSpecialCharacter | boolean | Se true, valida presença de pelo menos um caractere especial. | true |
39
+ | ngModel | string | Valor da senha (two-way binding). | '' |
40
+
41
+ ### Outputs
42
+ | Nome | Tipo de Evento | Descrição |
43
+ | --- | --- | --- |
44
+ | ngModelChange | EventEmitter<string> | Emite quando a senha é alterada. |
45
+
46
+ ## Exemplos de Uso
47
+ ### Uso Básico
48
+ ```html
49
+ <tcloud-ui-input-password [(ngModel)]="password"></tcloud-ui-input-password>
50
+
51
+ <p>Senha: {{ password }}</p>
52
+ ```
53
+
54
+ Componente:
55
+ ```ts
56
+ export class ExampleComponent {
57
+ password: string = '';
58
+ }
59
+ ```
60
+
61
+ ### Sem Ação de Gerar Senha
62
+ ```html
63
+ <tcloud-ui-input-password
64
+ [(ngModel)]="password"
65
+ [actionGeneratePassword]="false">
66
+ </tcloud-ui-input-password>
67
+ ```
68
+
69
+ ### Com Apenas Ação de Visualizar
70
+ ```html
71
+ <tcloud-ui-input-password
72
+ [(ngModel)]="password"
73
+ [actionCopy]="false"
74
+ [actionGeneratePassword]="false">
75
+ </tcloud-ui-input-password>
76
+ ```
77
+
78
+ ### Sem Nenhuma Ação (apenas input)
79
+ ```html
80
+ <tcloud-ui-input-password
81
+ [(ngModel)]="password"
82
+ [actionView]="false"
83
+ [actionCopy]="false"
84
+ [actionGeneratePassword]="false">
85
+ </tcloud-ui-input-password>
86
+ ```
87
+
88
+ ### Customizando Validação - Sem Requisitos Especiais
89
+ ```html
90
+ <tcloud-ui-input-password
91
+ [(ngModel)]="password"
92
+ [numberOfCharacter]="8"
93
+ [atLeastOneUppercaseLetter]="false"
94
+ [atLeastOneSpecialCharacter]="false">
95
+ </tcloud-ui-input-password>
96
+ ```
97
+
98
+ ## Uso Avançado
99
+ ### Validação Rigorosa - Apenas Maiúsculas, Minúsculas e Números
100
+ ```html
101
+ <tcloud-ui-input-password
102
+ [(ngModel)]="password"
103
+ [numberOfCharacter]="12"
104
+ [atLeastOneUppercaseLetter]="true"
105
+ [atLeastOneLowercaseLetter]="true"
106
+ [atLeastOneSpecialCharacter]="false">
107
+ </tcloud-ui-input-password>
108
+ ```
109
+
110
+ ### Comprimento Customizado
111
+ ```html
112
+ <!-- Senha curta (8 caracteres) -->
113
+ <tcloud-ui-input-password
114
+ [(ngModel)]="shortPassword"
115
+ [numberOfCharacter]="8">
116
+ </tcloud-ui-input-password>
117
+
118
+ <!-- Senha alongada (20 caracteres) -->
119
+ <tcloud-ui-input-password
120
+ [(ngModel)]="longPassword"
121
+ [numberOfCharacter]="20">
122
+ </tcloud-ui-input-password>
123
+ ```
124
+
125
+ ### Em Formulário com Validação
126
+ ```html
127
+ <form #passwordForm="ngForm">
128
+ <div>
129
+ <label>Nova Senha:</label>
130
+ <tcloud-ui-input-password
131
+ name="password"
132
+ [(ngModel)]="password"
133
+ (ngModelChange)="onPasswordChange($event)">
134
+ </tcloud-ui-input-password>
135
+ </div>
136
+
137
+ <div *ngIf="password && !isPasswordValid()">
138
+ <p class="error">Senha não atende aos requisitos</p>
139
+ </div>
140
+
141
+ <button [disabled]="!passwordForm.valid">Salvar</button>
142
+ </form>
143
+ ```
144
+
145
+ Componente:
146
+ ```ts
147
+ export class PasswordFormComponent {
148
+ password: string = '';
149
+ numberOfCharacter: number = 14;
150
+ atLeastOneUppercaseLetter: boolean = true;
151
+ atLeastOneLowercaseLetter: boolean = true;
152
+ atLeastOneSpecialCharacter: boolean = true;
153
+
154
+ onPasswordChange(newPassword: string) {
155
+ console.log('Senha alterada:', newPassword);
156
+ }
157
+
158
+ isPasswordValid(): boolean {
159
+ if (this.password.length < this.numberOfCharacter) return false;
160
+ if (this.atLeastOneUppercaseLetter && !/[A-Z]/.test(this.password)) return false;
161
+ if (this.atLeastOneLowercaseLetter && !/[a-z]/.test(this.password)) return false;
162
+ if (this.atLeastOneSpecialCharacter && !/[!@#$%^&*()_+{}[\]:;<>,.?/~]/.test(this.password)) return false;
163
+ return true;
164
+ }
165
+ }
166
+ ```
167
+
168
+ ### Gerador de Senha com Customização
169
+ ```ts
170
+ export class PasswordGeneratorComponent {
171
+ generatedPassword: string = '';
172
+ passwordLength: number = 16;
173
+
174
+ generateNewPassword() {
175
+ // Aciona o gerador via botão no componente
176
+ // Ou manualmente:
177
+ const uppercaseLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
178
+ const lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';
179
+ const numbers = '0123456789';
180
+ const specialCharacters = '!@#$%^&*()_+{}[]:;<>,.?/~';
181
+ const allCharacters = uppercaseLetters + lowercaseLetters + numbers + specialCharacters;
182
+
183
+ let password = '';
184
+ password += uppercaseLetters[Math.floor(Math.random() * uppercaseLetters.length)];
185
+ password += lowercaseLetters[Math.floor(Math.random() * lowercaseLetters.length)];
186
+ password += specialCharacters[Math.floor(Math.random() * specialCharacters.length)];
187
+
188
+ for (let i = password.length; i < this.passwordLength; i++) {
189
+ password += allCharacters[Math.floor(Math.random() * allCharacters.length)];
190
+ }
191
+
192
+ this.generatedPassword = password.split('').sort(() => Math.random() - 0.5).join('');
193
+ }
194
+ }
195
+ ```
196
+
197
+ ```html
198
+ <div>
199
+ <label>Comprimento da Senha:</label>
200
+ <input type="number" [(ngModel)]="passwordLength" min="8" max="32">
201
+
202
+ <button (click)="generateNewPassword()">Gerar Nova Senha</button>
203
+
204
+ <tcloud-ui-input-password
205
+ [(ngModel)]="generatedPassword"
206
+ [numberOfCharacter]="passwordLength"
207
+ readonly>
208
+ </tcloud-ui-input-password>
209
+ </div>
210
+ ```
211
+
212
+ ### Com Múltiplos Níveis de Segurança
213
+ ```ts
214
+ export class PasswordSecurityComponent {
215
+ password: string = '';
216
+ securityLevel: 'low' | 'medium' | 'high' = 'high';
217
+
218
+ getPasswordConfig() {
219
+ const configs = {
220
+ low: { numberOfCharacter: 6, atLeastOneUppercaseLetter: false, atLeastOneSpecialCharacter: false },
221
+ medium: { numberOfCharacter: 10, atLeastOneUppercaseLetter: true, atLeastOneSpecialCharacter: false },
222
+ high: { numberOfCharacter: 14, atLeastOneUppercaseLetter: true, atLeastOneSpecialCharacter: true }
223
+ };
224
+ return configs[this.securityLevel];
225
+ }
226
+ }
227
+ ```
228
+
229
+ ```html
230
+ <div>
231
+ <label>Nível de Segurança:</label>
232
+ <select [(ngModel)]="securityLevel">
233
+ <option value="low">Baixo (6 caracteres)</option>
234
+ <option value="medium">Médio (10 caracteres, maiúsculas)</option>
235
+ <option value="high">Alto (14 caracteres, maiúsculas, especiais)</option>
236
+ </select>
237
+
238
+ <tcloud-ui-input-password
239
+ [(ngModel)]="password"
240
+ [numberOfCharacter]="getPasswordConfig().numberOfCharacter"
241
+ [atLeastOneUppercaseLetter]="getPasswordConfig().atLeastOneUppercaseLetter"
242
+ [atLeastOneSpecialCharacter]="getPasswordConfig().atLeastOneSpecialCharacter">
243
+ </tcloud-ui-input-password>
244
+ </div>
245
+ ```
246
+
247
+ ## Validação
248
+ A senha é validada através de um regex dinâmico com as seguintes regras:
249
+ - **Comprimento mínimo**: Configurável via `numberOfCharacter`
250
+ - **Letra maiúscula**: Validada se `atLeastOneUppercaseLetter=true`
251
+ - **Letra minúscula**: Validada se `atLeastOneLowercaseLetter=true`
252
+ - **Caractere especial**: Validada se `atLeastOneSpecialCharacter=true`
253
+ - Caracteres especiais reconhecidos: `!@#$%^&*()_+{}[]:;<>,.?/~`
254
+
255
+ Exemplos de regex gerados:
256
+ - Com todos os requisitos (14+ caracteres): `^(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*\(\)_+\{\}\[\]:;<>,.?\/~])(?!.*\s).{14,}$`
257
+ - Sem caracteres especiais: `^(?=.*[A-Z])(?=.*[a-z]).{14,}$`
258
+ - Comprimento mínimo apenas: `^.{14,}$`
@@ -0,0 +1,314 @@
1
+ # Input Search
2
+
3
+ ## Características
4
+ - Componente standalone para busca full-text em arrays de objetos.
5
+ - Suporta dois modos: **mirror** (exibe todos os itens, filtrando visualmente) e **não mirror** (exibe apenas resultados encontrados).
6
+ - Normalização automática: ignora maiúsculas, minúsculas, acentos e caracteres especiais.
7
+ - Busca em todos os campos do objeto ou apenas em campos selecionados.
8
+ - Suporte a busca em dados aninhados e datas.
9
+ - Botões integrados: ícone de busca (quando vazio) e ícone de limpeza (quando preenchido).
10
+ - Placeholder customizável.
11
+ - Emite resultados através do evento `found`.
12
+
13
+ ## Instalação
14
+ ```ts
15
+ import { TCloudUiInputSearchComponent } from 'projects/tcloud-ui/src/public-api';
16
+
17
+ @Component({
18
+ selector: 'app-example',
19
+ standalone: true,
20
+ imports: [TCloudUiInputSearchComponent],
21
+ template: `
22
+ <tcloud-ui-input-search
23
+ [base_object]="items"
24
+ (found)="searchResult = $event">
25
+ </tcloud-ui-input-search>
26
+ `
27
+ })
28
+ export class ExampleComponent {
29
+ items: any[] = [...];
30
+ searchResult: any[] = [];
31
+ }
32
+ ```
33
+
34
+ ## Propriedades (API)
35
+ ### Inputs
36
+ | Nome | Tipo | Descrição | Valor Default |
37
+ | --- | --- | --- | --- |
38
+ | base_object | any[] | Array de objetos ou dados simples a serem pesquisados. | undefined |
39
+ | placeholder | string | Texto exibido no input quando vazio. | 'Procurar...' |
40
+ | mirror | boolean | Se true, exibe todos os itens espelhados (com destaque). Se false, exibe apenas os resultados encontrados. | true |
41
+
42
+ ### Outputs
43
+ | Nome | Tipo de Evento | Descrição |
44
+ | --- | --- | --- |
45
+ | found | EventEmitter<any[]> | Emite o array de resultados encontrados. |
46
+
47
+ ## Exemplos de Uso
48
+ ### Uso Básico com Array de Objetos
49
+ ```ts
50
+ export class ExampleComponent {
51
+ items = [
52
+ { id: 1, name: 'João Silva', city: 'São Paulo' },
53
+ { id: 2, name: 'Maria Santos', city: 'Rio de Janeiro' },
54
+ { id: 3, name: 'Pedro Oliveira', city: 'São Paulo' }
55
+ ];
56
+
57
+ searchResult: any[] = [];
58
+ }
59
+ ```
60
+
61
+ ```html
62
+ <tcloud-ui-input-search
63
+ [base_object]="items"
64
+ placeholder="Buscar por nome ou cidade..."
65
+ (found)="searchResult = $event">
66
+ </tcloud-ui-input-search>
67
+
68
+ <div *ngFor="let item of searchResult">
69
+ <p>{{ item.name }} - {{ item.city }}</p>
70
+ </div>
71
+ ```
72
+
73
+ ### Modo Espelho (Mirror) - Padrão
74
+ ```html
75
+ <!-- Todos os itens são exibidos, mas apenas os encontrados são destacados -->
76
+ <tcloud-ui-input-search
77
+ [base_object]="items"
78
+ [mirror]="true"
79
+ placeholder="Procurar...">
80
+ </tcloud-ui-input-search>
81
+ ```
82
+
83
+ ### Modo Sem Espelho
84
+ ```html
85
+ <!-- Apenas os itens encontrados são exibidos -->
86
+ <tcloud-ui-input-search
87
+ [base_object]="items"
88
+ [mirror]="false"
89
+ placeholder="Procurar...">
90
+ </tcloud-ui-input-search>
91
+ ```
92
+
93
+ ### Com Array Simples
94
+ ```ts
95
+ export class ExampleComponent {
96
+ countries = ['Brasil', 'Argentina', 'Uruguai', 'Paraguai', 'Chile'];
97
+ searchResult: string[] = [];
98
+ }
99
+ ```
100
+
101
+ ```html
102
+ <tcloud-ui-input-search
103
+ [base_object]="countries"
104
+ placeholder="Buscar país..."
105
+ (found)="searchResult = $event">
106
+ </tcloud-ui-input-search>
107
+
108
+ <ul>
109
+ <li *ngFor="let country of searchResult">{{ country }}</li>
110
+ </ul>
111
+ ```
112
+
113
+ ## Uso Avançado
114
+ ### Com Objetos Complexos e Aninhados
115
+ ```ts
116
+ export class ExampleComponent {
117
+ products = [
118
+ {
119
+ id: 1,
120
+ name: 'Notebook Dell',
121
+ category: { name: 'Eletrônicos', subcategory: 'Computadores' },
122
+ price: 3500,
123
+ stock: true,
124
+ supplier: { name: 'Fornecedor A', city: 'São Paulo' }
125
+ },
126
+ {
127
+ id: 2,
128
+ name: 'Mouse Logitech',
129
+ category: { name: 'Eletrônicos', subcategory: 'Periféricos' },
130
+ price: 150,
131
+ stock: true,
132
+ supplier: { name: 'Fornecedor B', city: 'Rio de Janeiro' }
133
+ }
134
+ ];
135
+
136
+ searchResult: any[] = [];
137
+ }
138
+ ```
139
+
140
+ ```html
141
+ <tcloud-ui-input-search
142
+ [base_object]="products"
143
+ placeholder="Buscar por nome, categoria, fornecedor..."
144
+ [mirror]="false"
145
+ (found)="searchResult = $event">
146
+ </tcloud-ui-input-search>
147
+
148
+ <table>
149
+ <thead>
150
+ <tr>
151
+ <th>Nome</th>
152
+ <th>Categoria</th>
153
+ <th>Preço</th>
154
+ <th>Fornecedor</th>
155
+ </tr>
156
+ </thead>
157
+ <tbody>
158
+ <tr *ngFor="let product of searchResult">
159
+ <td>{{ product.name }}</td>
160
+ <td>{{ product.category.name }}</td>
161
+ <td>{{ product.price | currency }}</td>
162
+ <td>{{ product.supplier.name }}</td>
163
+ </tr>
164
+ </tbody>
165
+ </table>
166
+ ```
167
+
168
+ ### Com Busca e Tabela de Resultados
169
+ ```ts
170
+ export class SearchTableComponent {
171
+ employees = [
172
+ { id: 1, name: 'Alice Johnson', department: 'TI', role: 'Desenvolvedor', hired: new Date(2020, 0, 15) },
173
+ { id: 2, name: 'Bob Smith', department: 'RH', role: 'Gerente', hired: new Date(2019, 5, 20) },
174
+ { id: 3, name: 'Carol White', department: 'TI', role: 'Analista', hired: new Date(2021, 2, 10) },
175
+ { id: 4, name: 'David Brown', department: 'Vendas', role: 'Vendedor', hired: new Date(2022, 8, 5) }
176
+ ];
177
+
178
+ searchResult: any[] = [];
179
+
180
+ ngOnInit() {
181
+ // Inicial com todos os itens
182
+ this.searchResult = this.employees;
183
+ }
184
+ }
185
+ ```
186
+
187
+ ```html
188
+ <div class="search-container">
189
+ <h2>Buscar Funcionários</h2>
190
+ <tcloud-ui-input-search
191
+ [base_object]="employees"
192
+ placeholder="Nome, departamento, cargo..."
193
+ [mirror]="false"
194
+ (found)="searchResult = $event">
195
+ </tcloud-ui-input-search>
196
+ </div>
197
+
198
+ <table class="table">
199
+ <thead>
200
+ <tr>
201
+ <th>ID</th>
202
+ <th>Nome</th>
203
+ <th>Departamento</th>
204
+ <th>Cargo</th>
205
+ <th>Data Admissão</th>
206
+ </tr>
207
+ </thead>
208
+ <tbody>
209
+ <tr *ngFor="let employee of searchResult">
210
+ <td>{{ employee.id }}</td>
211
+ <td>{{ employee.name }}</td>
212
+ <td>{{ employee.department }}</td>
213
+ <td>{{ employee.role }}</td>
214
+ <td>{{ employee.hired | date: 'dd/MM/yyyy' }}</td>
215
+ </tr>
216
+ </tbody>
217
+ </table>
218
+
219
+ <div *ngIf="searchResult.length === 0">
220
+ <p>Nenhum resultado encontrado.</p>
221
+ </div>
222
+ ```
223
+
224
+ ### Com Dupla Busca (Cascade)
225
+ ```ts
226
+ export class CascadeSearchComponent {
227
+ companies = [
228
+ { id: 1, name: 'Tech Solutions', city: 'São Paulo', employees: [...] },
229
+ { id: 2, name: 'Data Corp', city: 'Rio de Janeiro', employees: [...] }
230
+ ];
231
+
232
+ selectedCompany: any = null;
233
+ companyResults: any[] = [];
234
+ employeeResults: any[] = [];
235
+ }
236
+ ```
237
+
238
+ ```html
239
+ <div class="search-cascade">
240
+ <h3>Buscar Empresa</h3>
241
+ <tcloud-ui-input-search
242
+ [base_object]="companies"
243
+ placeholder="Nome da empresa, cidade..."
244
+ [mirror]="false"
245
+ (found)="companyResults = $event">
246
+ </tcloud-ui-input-search>
247
+
248
+ <h3>Empresas Encontradas</h3>
249
+ <div *ngFor="let company of companyResults" (click)="selectedCompany = company">
250
+ <p>{{ company.name }} - {{ company.city }}</p>
251
+ </div>
252
+
253
+ <div *ngIf="selectedCompany">
254
+ <h3>Buscar Funcionário em {{ selectedCompany.name }}</h3>
255
+ <tcloud-ui-input-search
256
+ [base_object]="selectedCompany.employees"
257
+ placeholder="Nome do funcionário..."
258
+ [mirror]="false"
259
+ (found)="employeeResults = $event">
260
+ </tcloud-ui-input-search>
261
+
262
+ <div *ngFor="let employee of employeeResults">
263
+ <p>{{ employee.name }}</p>
264
+ </div>
265
+ </div>
266
+ </div>
267
+ ```
268
+
269
+ ### Customização Visual com Resultados
270
+ ```html
271
+ <div class="search-wrapper">
272
+ <tcloud-ui-input-search
273
+ [base_object]="items"
274
+ placeholder="Digite para buscar..."
275
+ [mirror]="false"
276
+ (found)="searchResult = $event">
277
+ </tcloud-ui-input-search>
278
+
279
+ <div class="results-info">
280
+ <span *ngIf="searchResult.length > 0">
281
+ {{ searchResult.length }} resultado(s) encontrado(s)
282
+ </span>
283
+ <span *ngIf="searchResult.length === 0">
284
+ Nenhum resultado encontrado
285
+ </span>
286
+ </div>
287
+
288
+ <ul class="results-list">
289
+ <li *ngFor="let item of searchResult" class="result-item">
290
+ <span class="result-title">{{ item.title }}</span>
291
+ <span class="result-description">{{ item.description }}</span>
292
+ </li>
293
+ </ul>
294
+ </div>
295
+ ```
296
+
297
+ ## Normalização de Busca
298
+ O componente normaliza automaticamente o texto de busca:
299
+ - Converte para minúsculas
300
+ - Remove acentos e caracteres especiais
301
+ - Remove espaços em branco
302
+ - Formata datas para busca (DD/MM/YYYY e formato médio)
303
+
304
+ Exemplos de buscas equivalentes:
305
+ - `João` = `joao` = `JOÃO` = `jõão`
306
+ - `São Paulo` = `sao paulo` = `SÃO PAULO`
307
+ - `15/03/2024` buscará por qualquer data nesse formato
308
+
309
+ ## Casos de Uso
310
+ - **Tabelas dinâmicas**: Filtrar registros enquanto digita
311
+ - **Listas de produtos**: Buscar por nome, categoria, fornecedor
312
+ - **Diretórios**: Localizar contatos por nome, departamento, cidade
313
+ - **Relatórios**: Filtrar dados dinâmicamente
314
+ - **Autocomplete**: Implementar sugestões baseadas em busca em tempo real