@dev-tcloud/tcloud-ui 6.15.0 → 6.17.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.
- package/docs/tcloud-ui-accordion.md +345 -0
- package/docs/tcloud-ui-actions.md +88 -0
- package/docs/tcloud-ui-alert-banner.md +104 -0
- package/docs/tcloud-ui-array-to-text.md +361 -0
- package/docs/tcloud-ui-breadcrumb.md +103 -0
- package/docs/tcloud-ui-bytes.md +109 -0
- package/docs/tcloud-ui-calendar.md +387 -0
- package/docs/tcloud-ui-card-accordion.md +266 -0
- package/docs/tcloud-ui-card-title.md +47 -0
- package/docs/tcloud-ui-card.md +40 -0
- package/docs/tcloud-ui-choice-issues.md +59 -0
- package/docs/tcloud-ui-cnpj.md +102 -0
- package/docs/tcloud-ui-container.md +171 -0
- package/docs/tcloud-ui-cpf.md +102 -0
- package/docs/tcloud-ui-currency.md +271 -0
- package/docs/tcloud-ui-data-list.md +91 -0
- package/docs/tcloud-ui-datebr.md +139 -0
- package/docs/tcloud-ui-datepicker-time.md +191 -0
- package/docs/tcloud-ui-datepicker.md +186 -0
- package/docs/tcloud-ui-dropdown-multi.md +444 -0
- package/docs/tcloud-ui-dropdown.md +369 -0
- package/docs/tcloud-ui-el-copy.md +113 -0
- package/docs/tcloud-ui-empty-content.md +412 -0
- package/docs/tcloud-ui-faq.md +496 -0
- package/docs/tcloud-ui-filter-bar.md +86 -0
- package/docs/tcloud-ui-filters.md +337 -0
- package/docs/tcloud-ui-hover-parent.md +467 -0
- package/docs/tcloud-ui-icon-button.md +104 -0
- package/docs/tcloud-ui-input-container.md +520 -0
- package/docs/tcloud-ui-input-password.md +258 -0
- package/docs/tcloud-ui-input-search.md +314 -0
- package/docs/tcloud-ui-label-token.md +286 -0
- package/docs/tcloud-ui-legend.md +72 -0
- package/docs/tcloud-ui-line-step-circle.md +98 -0
- package/docs/tcloud-ui-line-step-title.md +194 -0
- package/docs/tcloud-ui-linha-logo.md +550 -0
- package/docs/tcloud-ui-loading.md +88 -0
- package/docs/tcloud-ui-message.md +539 -0
- package/docs/tcloud-ui-modal.md +196 -0
- package/docs/tcloud-ui-monthname.md +123 -0
- package/docs/tcloud-ui-multi-input.md +290 -0
- package/docs/tcloud-ui-multi-select.md +311 -0
- package/docs/tcloud-ui-multiples-values.md +157 -0
- package/docs/tcloud-ui-not-found.md +88 -0
- package/docs/tcloud-ui-number-step.md +134 -0
- package/docs/tcloud-ui-pagination.md +579 -0
- package/docs/tcloud-ui-progress-bar.md +65 -0
- package/docs/tcloud-ui-radio.md +83 -0
- package/docs/tcloud-ui-reorder-items.md +418 -0
- package/docs/tcloud-ui-respective.md +167 -0
- package/docs/tcloud-ui-scroll-box.md +109 -0
- package/docs/tcloud-ui-search-bar.md +88 -0
- package/docs/tcloud-ui-search-in-object.md +143 -0
- package/docs/tcloud-ui-search-input.md +74 -0
- package/docs/tcloud-ui-skeleton-loading.md +394 -0
- package/docs/tcloud-ui-slide-toggle.md +210 -0
- package/docs/tcloud-ui-statusinfo.md +138 -0
- package/docs/tcloud-ui-tab-group.md +376 -0
- package/docs/tcloud-ui-tab-menu.md +109 -0
- package/docs/tcloud-ui-table.md +96 -0
- package/docs/tcloud-ui-tag.md +379 -0
- package/docs/tcloud-ui-tc-badge.md +168 -0
- package/docs/tcloud-ui-tc-btn.md +189 -0
- package/docs/tcloud-ui-tc-colors.md +204 -0
- package/docs/tcloud-ui-tc-form-control.md +200 -0
- package/docs/tcloud-ui-tc-text.md +139 -0
- package/docs/tcloud-ui-tc-title.md +118 -0
- package/docs/tcloud-ui-tcloud-form.md +55 -0
- package/docs/tcloud-ui-toast.md +83 -0
- package/docs/tcloud-ui-tooltip.md +88 -0
- package/docs/tcloud-ui-topology.md +232 -0
- package/docs/tcloud-ui-upload-area.md +195 -0
- package/docs/tcloud-ui-welcome.md +112 -0
- package/docs/tcloud-ui-wizard-steps.md +103 -0
- package/js/tcloud-ui-app.js +11 -0
- package/package.json +1 -1
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
# Message
|
|
2
|
+
|
|
3
|
+
## Características
|
|
4
|
+
|
|
5
|
+
O componente `tcloud-ui-message` é um componente de mensagem de feedback que exibe notificações ao usuário em quatro tipos diferentes: sucesso, erro, informação e aviso. Cada tipo possui ícone e paleta de cores específicos para comunicar claramente o tipo de mensagem.
|
|
6
|
+
|
|
7
|
+
## Instalação
|
|
8
|
+
|
|
9
|
+
Para utilizar o componente Message, importe o módulo `TCloudUiModule`:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
13
|
+
import { Component } from '@angular/core';
|
|
14
|
+
|
|
15
|
+
@Component({
|
|
16
|
+
selector: 'app-example',
|
|
17
|
+
standalone: true,
|
|
18
|
+
imports: [TCloudUiModule],
|
|
19
|
+
template: `
|
|
20
|
+
<tcloud-ui-message
|
|
21
|
+
message="Operação concluída com sucesso!"
|
|
22
|
+
type="success">
|
|
23
|
+
</tcloud-ui-message>
|
|
24
|
+
`
|
|
25
|
+
})
|
|
26
|
+
export class ExampleComponent {}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Ou importe diretamente o componente:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { TCloudUiMessageComponent } from '@tcloud-ui/lib';
|
|
33
|
+
|
|
34
|
+
@Component({
|
|
35
|
+
selector: 'app-example',
|
|
36
|
+
standalone: true,
|
|
37
|
+
imports: [TCloudUiMessageComponent],
|
|
38
|
+
template: `...`
|
|
39
|
+
})
|
|
40
|
+
export class ExampleComponent {}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Propriedades (API)
|
|
44
|
+
|
|
45
|
+
### Inputs
|
|
46
|
+
|
|
47
|
+
| Nome | Tipo | Descrição | Valor Default |
|
|
48
|
+
|------|------|-----------|---------------|
|
|
49
|
+
| `message` | `string` | Texto da mensagem a ser exibida | `''` (vazio) |
|
|
50
|
+
| `type` | `'success' \| 'error' \| 'info' \| 'warning'` | Tipo da mensagem que determina estilo e ícone | `'info'` |
|
|
51
|
+
|
|
52
|
+
## Tipos de Mensagem
|
|
53
|
+
|
|
54
|
+
### Success (Sucesso)
|
|
55
|
+
- **Ícone**: ✓ Check
|
|
56
|
+
- **Cor de Fundo**: Verde claro (`var(--c-success-300)`)
|
|
57
|
+
- **Cor do Texto**: Verde (`var(--c-success-500)`)
|
|
58
|
+
- **Uso**: Confirmar ações bem-sucedidas
|
|
59
|
+
|
|
60
|
+
### Error (Erro)
|
|
61
|
+
- **Ícone**: ✕ Times
|
|
62
|
+
- **Cor de Fundo**: Vermelho claro (`var(--c-danger-300)`)
|
|
63
|
+
- **Cor do Texto**: Vermelho (`var(--c-danger-500)`)
|
|
64
|
+
- **Uso**: Indicar erros e problemas
|
|
65
|
+
|
|
66
|
+
### Info (Informação)
|
|
67
|
+
- **Ícone**: ⓘ Info Circle
|
|
68
|
+
- **Cor de Fundo**: Azul claro (`var(--c-info-300)`)
|
|
69
|
+
- **Cor do Texto**: Azul (`var(--c-info-500)`)
|
|
70
|
+
- **Uso**: Exibir informações gerais
|
|
71
|
+
|
|
72
|
+
### Warning (Aviso)
|
|
73
|
+
- **Ícone**: ⚠ Exclamation Triangle
|
|
74
|
+
- **Cor de Fundo**: Laranja claro (`var(--c-alert-300)`)
|
|
75
|
+
- **Cor do Texto**: Laranja (`var(--c-alert-500)`)
|
|
76
|
+
- **Uso**: Alertar o usuário sobre ações importantes
|
|
77
|
+
|
|
78
|
+
## Exemplos de Uso
|
|
79
|
+
|
|
80
|
+
### Uso Básico
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { Component } from '@angular/core';
|
|
84
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
85
|
+
|
|
86
|
+
@Component({
|
|
87
|
+
selector: 'app-basic-message',
|
|
88
|
+
standalone: true,
|
|
89
|
+
imports: [TCloudUiModule],
|
|
90
|
+
template: `
|
|
91
|
+
<tcloud-ui-message
|
|
92
|
+
message="Ação realizada com sucesso!"
|
|
93
|
+
type="success">
|
|
94
|
+
</tcloud-ui-message>
|
|
95
|
+
|
|
96
|
+
<tcloud-ui-message
|
|
97
|
+
message="Ocorreu um erro ao processar"
|
|
98
|
+
type="error">
|
|
99
|
+
</tcloud-ui-message>
|
|
100
|
+
|
|
101
|
+
<tcloud-ui-message
|
|
102
|
+
message="Esta é uma mensagem informativa"
|
|
103
|
+
type="info">
|
|
104
|
+
</tcloud-ui-message>
|
|
105
|
+
|
|
106
|
+
<tcloud-ui-message
|
|
107
|
+
message="Tenha cuidado ao prosseguir"
|
|
108
|
+
type="warning">
|
|
109
|
+
</tcloud-ui-message>
|
|
110
|
+
`
|
|
111
|
+
})
|
|
112
|
+
export class BasicMessageComponent {}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Mensagens Dinâmicas
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { Component, signal } from '@angular/core';
|
|
119
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
120
|
+
import { CommonModule } from '@angular/common';
|
|
121
|
+
|
|
122
|
+
@Component({
|
|
123
|
+
selector: 'app-dynamic-message',
|
|
124
|
+
standalone: true,
|
|
125
|
+
imports: [CommonModule, TCloudUiModule],
|
|
126
|
+
template: `
|
|
127
|
+
<div class="message-demo">
|
|
128
|
+
<button (click)="showSuccess()">Mostrar Sucesso</button>
|
|
129
|
+
<button (click)="showError()">Mostrar Erro</button>
|
|
130
|
+
<button (click)="showWarning()">Mostrar Aviso</button>
|
|
131
|
+
<button (click)="clear()">Limpar</button>
|
|
132
|
+
|
|
133
|
+
@if (currentMessage()) {
|
|
134
|
+
<tcloud-ui-message
|
|
135
|
+
[message]="currentMessage()"
|
|
136
|
+
[type]="currentType()">
|
|
137
|
+
</tcloud-ui-message>
|
|
138
|
+
}
|
|
139
|
+
</div>
|
|
140
|
+
`,
|
|
141
|
+
styles: [`
|
|
142
|
+
.message-demo {
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
145
|
+
gap: 1rem;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
button {
|
|
149
|
+
padding: 0.5rem 1rem;
|
|
150
|
+
background: var(--c-primary-500);
|
|
151
|
+
color: white;
|
|
152
|
+
border: none;
|
|
153
|
+
border-radius: var(--bor-radius-4);
|
|
154
|
+
cursor: pointer;
|
|
155
|
+
font-weight: 600;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
button:hover {
|
|
159
|
+
background: var(--c-primary-600);
|
|
160
|
+
}
|
|
161
|
+
`]
|
|
162
|
+
})
|
|
163
|
+
export class DynamicMessageComponent {
|
|
164
|
+
currentMessage = signal<string>('');
|
|
165
|
+
currentType = signal<'success' | 'error' | 'info' | 'warning'>('info');
|
|
166
|
+
|
|
167
|
+
showSuccess() {
|
|
168
|
+
this.currentMessage.set('Operação concluída com sucesso!');
|
|
169
|
+
this.currentType.set('success');
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
showError() {
|
|
173
|
+
this.currentMessage.set('Ocorreu um erro ao processar sua solicitação');
|
|
174
|
+
this.currentType.set('error');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
showWarning() {
|
|
178
|
+
this.currentMessage.set('Altere a senha para aumentar a segurança');
|
|
179
|
+
this.currentType.set('warning');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
clear() {
|
|
183
|
+
this.currentMessage.set('');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Validação de Formulário
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
import { Component, signal } from '@angular/core';
|
|
192
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
193
|
+
import { CommonModule } from '@angular/common';
|
|
194
|
+
import { FormsModule } from '@angular/forms';
|
|
195
|
+
|
|
196
|
+
@Component({
|
|
197
|
+
selector: 'app-form-validation-message',
|
|
198
|
+
standalone: true,
|
|
199
|
+
imports: [CommonModule, TCloudUiModule, FormsModule],
|
|
200
|
+
template: `
|
|
201
|
+
<div class="form">
|
|
202
|
+
<input
|
|
203
|
+
type="email"
|
|
204
|
+
[(ngModel)]="email"
|
|
205
|
+
(blur)="validateEmail()"
|
|
206
|
+
placeholder="Digite seu email"
|
|
207
|
+
class="input"
|
|
208
|
+
/>
|
|
209
|
+
|
|
210
|
+
@if (emailError()) {
|
|
211
|
+
<tcloud-ui-message
|
|
212
|
+
[message]="emailError()"
|
|
213
|
+
type="error">
|
|
214
|
+
</tcloud-ui-message>
|
|
215
|
+
} @else if (emailValid()) {
|
|
216
|
+
<tcloud-ui-message
|
|
217
|
+
message="Email válido!"
|
|
218
|
+
type="success">
|
|
219
|
+
</tcloud-ui-message>
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
<input
|
|
223
|
+
type="password"
|
|
224
|
+
[(ngModel)]="password"
|
|
225
|
+
(change)="validatePassword()"
|
|
226
|
+
placeholder="Senha"
|
|
227
|
+
class="input"
|
|
228
|
+
/>
|
|
229
|
+
|
|
230
|
+
@if (passwordMessage()) {
|
|
231
|
+
<tcloud-ui-message
|
|
232
|
+
[message]="passwordMessage()"
|
|
233
|
+
[type]="passwordStrength() > 2 ? 'success' : 'warning'">
|
|
234
|
+
</tcloud-ui-message>
|
|
235
|
+
}
|
|
236
|
+
</div>
|
|
237
|
+
`,
|
|
238
|
+
styles: [`
|
|
239
|
+
.form {
|
|
240
|
+
display: flex;
|
|
241
|
+
flex-direction: column;
|
|
242
|
+
gap: 1rem;
|
|
243
|
+
max-width: 400px;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.input {
|
|
247
|
+
padding: 0.75rem;
|
|
248
|
+
border: 1px solid var(--c-neutral-300);
|
|
249
|
+
border-radius: var(--bor-radius-4);
|
|
250
|
+
font-size: 1rem;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.input:focus {
|
|
254
|
+
outline: none;
|
|
255
|
+
border-color: var(--c-primary-500);
|
|
256
|
+
}
|
|
257
|
+
`]
|
|
258
|
+
})
|
|
259
|
+
export class FormValidationMessageComponent {
|
|
260
|
+
email = signal<string>('');
|
|
261
|
+
password = signal<string>('');
|
|
262
|
+
emailError = signal<string>('');
|
|
263
|
+
emailValid = signal<boolean>(false);
|
|
264
|
+
passwordMessage = signal<string>('');
|
|
265
|
+
passwordStrength = signal<number>(0);
|
|
266
|
+
|
|
267
|
+
validateEmail() {
|
|
268
|
+
const email = this.email();
|
|
269
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
270
|
+
|
|
271
|
+
if (!email) {
|
|
272
|
+
this.emailError.set('Email é obrigatório');
|
|
273
|
+
this.emailValid.set(false);
|
|
274
|
+
} else if (!emailRegex.test(email)) {
|
|
275
|
+
this.emailError.set('Email inválido');
|
|
276
|
+
this.emailValid.set(false);
|
|
277
|
+
} else {
|
|
278
|
+
this.emailError.set('');
|
|
279
|
+
this.emailValid.set(true);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
validatePassword() {
|
|
284
|
+
const pwd = this.password();
|
|
285
|
+
let strength = 0;
|
|
286
|
+
let message = '';
|
|
287
|
+
|
|
288
|
+
if (pwd.length < 8) {
|
|
289
|
+
message = '❌ Muito curta (minuto 8 caracteres)';
|
|
290
|
+
} else {
|
|
291
|
+
strength++;
|
|
292
|
+
if (/[A-Z]/.test(pwd)) strength++;
|
|
293
|
+
if (/[0-9]/.test(pwd)) strength++;
|
|
294
|
+
if (/[^A-Za-z0-9]/.test(pwd)) strength++;
|
|
295
|
+
|
|
296
|
+
const messages = [
|
|
297
|
+
'Senha fraca',
|
|
298
|
+
'Senha regular',
|
|
299
|
+
'Senha boa',
|
|
300
|
+
'Senha forte'
|
|
301
|
+
];
|
|
302
|
+
message = messages[strength - 1] || 'Senha muito forte';
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
this.passwordStrength.set(strength);
|
|
306
|
+
this.passwordMessage.set(message);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Notificações de Status
|
|
312
|
+
|
|
313
|
+
```typescript
|
|
314
|
+
import { Component, signal } from '@angular/core';
|
|
315
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
316
|
+
import { CommonModule } from '@angular/common';
|
|
317
|
+
|
|
318
|
+
@Component({
|
|
319
|
+
selector: 'app-status-notification',
|
|
320
|
+
standalone: true,
|
|
321
|
+
imports: [CommonModule, TCloudUiModule],
|
|
322
|
+
template: `
|
|
323
|
+
<div class="status-container">
|
|
324
|
+
<h3>Status das Operações</h3>
|
|
325
|
+
|
|
326
|
+
@for (operation of operations(); track operation.id) {
|
|
327
|
+
<div class="operation">
|
|
328
|
+
<span>{{ operation.name }}</span>
|
|
329
|
+
<tcloud-ui-message
|
|
330
|
+
[message]="operation.message"
|
|
331
|
+
[type]="operation.type">
|
|
332
|
+
</tcloud-ui-message>
|
|
333
|
+
</div>
|
|
334
|
+
}
|
|
335
|
+
</div>
|
|
336
|
+
`,
|
|
337
|
+
styles: [`
|
|
338
|
+
.status-container {
|
|
339
|
+
max-width: 500px;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.operation {
|
|
343
|
+
display: grid;
|
|
344
|
+
grid-template-columns: 200px 1fr;
|
|
345
|
+
align-items: center;
|
|
346
|
+
gap: 1rem;
|
|
347
|
+
margin-bottom: 1rem;
|
|
348
|
+
padding-bottom: 1rem;
|
|
349
|
+
border-bottom: 1px solid var(--c-neutral-200);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
span {
|
|
353
|
+
font-weight: 600;
|
|
354
|
+
color: var(--c-neutral-700);
|
|
355
|
+
}
|
|
356
|
+
`]
|
|
357
|
+
})
|
|
358
|
+
export class StatusNotificationComponent {
|
|
359
|
+
operations = signal([
|
|
360
|
+
{ id: 1, name: 'Download', message: 'Arquivo baixado com sucesso', type: 'success' as const },
|
|
361
|
+
{ id: 2, name: 'Upload', message: 'Erro ao fazer upload do arquivo', type: 'error' as const },
|
|
362
|
+
{ id: 3, name: 'Sincronização', message: 'Sincronizando dados...', type: 'info' as const },
|
|
363
|
+
{ id: 4, name: 'Atualização', message: 'Atualização importante disponível', type: 'warning' as const }
|
|
364
|
+
]);
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Mensagens com Ações
|
|
369
|
+
|
|
370
|
+
```typescript
|
|
371
|
+
import { Component, signal } from '@angular/core';
|
|
372
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
373
|
+
import { CommonModule } from '@angular/common';
|
|
374
|
+
|
|
375
|
+
@Component({
|
|
376
|
+
selector: 'app-message-with-action',
|
|
377
|
+
standalone: true,
|
|
378
|
+
imports: [CommonModule, TCloudUiModule],
|
|
379
|
+
template: `
|
|
380
|
+
<div class="message-container">
|
|
381
|
+
@if (sessionExpiring()) {
|
|
382
|
+
<div class="message-wrapper">
|
|
383
|
+
<tcloud-ui-message
|
|
384
|
+
message="Sua sessão expirará em 2 minutos. Deseja continuar?"
|
|
385
|
+
type="warning">
|
|
386
|
+
</tcloud-ui-message>
|
|
387
|
+
<div class="actions">
|
|
388
|
+
<button (click)="continueSession()" class="btn-primary">
|
|
389
|
+
Continuar
|
|
390
|
+
</button>
|
|
391
|
+
<button (click)="logout()" class="btn-secondary">
|
|
392
|
+
Sair
|
|
393
|
+
</button>
|
|
394
|
+
</div>
|
|
395
|
+
</div>
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
@if (deleteConfirm()) {
|
|
399
|
+
<div class="message-wrapper">
|
|
400
|
+
<tcloud-ui-message
|
|
401
|
+
message="Tem certeza que deseja deletar este item? Esta ação é irreversível."
|
|
402
|
+
type="error">
|
|
403
|
+
</tcloud-ui-message>
|
|
404
|
+
<div class="actions">
|
|
405
|
+
<button (click)="confirmDelete()" class="btn-danger">
|
|
406
|
+
Deletar
|
|
407
|
+
</button>
|
|
408
|
+
<button (click)="cancelDelete()" class="btn-secondary">
|
|
409
|
+
Cancelar
|
|
410
|
+
</button>
|
|
411
|
+
</div>
|
|
412
|
+
</div>
|
|
413
|
+
}
|
|
414
|
+
</div>
|
|
415
|
+
`,
|
|
416
|
+
styles: [`
|
|
417
|
+
.message-wrapper {
|
|
418
|
+
padding: 1.5rem;
|
|
419
|
+
border: 1px solid var(--c-neutral-300);
|
|
420
|
+
border-radius: var(--bor-radius-8);
|
|
421
|
+
background: white;
|
|
422
|
+
margin-bottom: 1rem;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.actions {
|
|
426
|
+
display: flex;
|
|
427
|
+
gap: 1rem;
|
|
428
|
+
margin-top: 1rem;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
button {
|
|
432
|
+
padding: 0.5rem 1rem;
|
|
433
|
+
border: none;
|
|
434
|
+
border-radius: var(--bor-radius-4);
|
|
435
|
+
cursor: pointer;
|
|
436
|
+
font-weight: 600;
|
|
437
|
+
transition: background 200ms;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.btn-primary {
|
|
441
|
+
background: var(--c-primary-500);
|
|
442
|
+
color: white;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.btn-primary:hover {
|
|
446
|
+
background: var(--c-primary-600);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.btn-danger {
|
|
450
|
+
background: var(--c-danger-500);
|
|
451
|
+
color: white;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
.btn-danger:hover {
|
|
455
|
+
background: var(--c-danger-600);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.btn-secondary {
|
|
459
|
+
background: var(--c-neutral-200);
|
|
460
|
+
color: var(--c-neutral-700);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.btn-secondary:hover {
|
|
464
|
+
background: var(--c-neutral-300);
|
|
465
|
+
}
|
|
466
|
+
`]
|
|
467
|
+
})
|
|
468
|
+
export class MessageWithActionComponent {
|
|
469
|
+
sessionExpiring = signal(false);
|
|
470
|
+
deleteConfirm = signal(false);
|
|
471
|
+
|
|
472
|
+
continueSession() {
|
|
473
|
+
this.sessionExpiring.set(false);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
logout() {
|
|
477
|
+
console.log('Logout...');
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
confirmDelete() {
|
|
481
|
+
console.log('Item deletado');
|
|
482
|
+
this.deleteConfirm.set(false);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
cancelDelete() {
|
|
486
|
+
this.deleteConfirm.set(false);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
## Estilos Padrão
|
|
492
|
+
|
|
493
|
+
- **Padding**: 0.75rem vertical, 1rem horizontal
|
|
494
|
+
- **Border Radius**: 6px
|
|
495
|
+
- **Font Size**: 14px
|
|
496
|
+
- **Margin Vertical**: 8px
|
|
497
|
+
- **Display**: Flex com align-items center
|
|
498
|
+
- **Gap entre ícone e texto**: 0.5rem
|
|
499
|
+
- **Ícone Font Size**: 16px
|
|
500
|
+
|
|
501
|
+
## Comportamentos
|
|
502
|
+
|
|
503
|
+
- O componente só renderiza se `message` não estiver vazio
|
|
504
|
+
- Usa `ChangeDetectionStrategy.OnPush` para melhor performance
|
|
505
|
+
- Suporta renderização condicional com `*ngIf`
|
|
506
|
+
- Ícones vêm da biblioteca FontAwesome (classes fas)
|
|
507
|
+
|
|
508
|
+
## Casos de Uso
|
|
509
|
+
|
|
510
|
+
- Feedback de ações do usuário
|
|
511
|
+
- Validação de formulários
|
|
512
|
+
- Notificações de sistema
|
|
513
|
+
- Erros de conexão
|
|
514
|
+
- Avisos de segurança
|
|
515
|
+
- Confirmação de ações
|
|
516
|
+
- Status de operações
|
|
517
|
+
- Mensagens de sucesso
|
|
518
|
+
- Alertas de atualização
|
|
519
|
+
- Feedback de upload/download
|
|
520
|
+
|
|
521
|
+
## Performance
|
|
522
|
+
|
|
523
|
+
- Usa `ChangeDetectionStrategy.OnPush` para renderização otimizada
|
|
524
|
+
- Renderização condicional com `*ngIf` evita elementos desnecessários
|
|
525
|
+
- Suporta signals para reatividade eficiente
|
|
526
|
+
|
|
527
|
+
## Acessibilidade
|
|
528
|
+
|
|
529
|
+
- Ícones semânticos indicam tipo de mensagem
|
|
530
|
+
- Cores seguem padrão de contraste adequado
|
|
531
|
+
- Texto descreve claramente a mensagem
|
|
532
|
+
- Suporta leitura de tela com `role="alert"` (recomendado adicionar)
|
|
533
|
+
|
|
534
|
+
## Dicas de Customização
|
|
535
|
+
|
|
536
|
+
1. **Auto-fechar**: Kombine com `setTimeout` para auto-fechar após 3-5 segundos
|
|
537
|
+
2. **Animação**: Adicione transição CSS para efeito fade in/out
|
|
538
|
+
3. **Múltiplas**: Empilhe vários componentes para exibir múltiplas mensagens
|
|
539
|
+
4. **Personalizado**: Use com `<ng-content>` para conteúdo customizado
|