@dev-tcloud/tcloud-ui 6.14.3 → 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
- package/scss/tcloud-ui/styles/_claus-badge.scss +117 -0
- package/scss/tcloud-ui/styles/_claus-btn.scss +207 -0
- package/scss/tcloud-ui/styles/_claus-card.scss +12 -0
- package/scss/tcloud-ui/styles/_claus-colors.scss +192 -0
- package/scss/tcloud-ui/styles/_claus-form.scss +88 -0
- package/scss/tcloud-ui/styles/_claus-sizes.scss +28 -0
- package/scss/tcloud-ui/styles/_claus-spacers.scss +49 -0
- package/scss/tcloud-ui/styles/_claus-themes.scss +36 -0
- package/scss/tcloud-ui/styles/_claus-title.scss +24 -0
- package/scss/tcloud-ui/styles/_claus-typography.scss +70 -0
- package/scss/tcloud-ui/styles/_claus-variables.scss +131 -0
- package/scss/tcloud-ui/styles/_colors.scss +123 -0
- package/scss/tcloud-ui/styles/_tc-btn.scss +210 -0
- package/scss/tcloud-ui/styles/_tc-card.scss +7 -0
- package/scss/tcloud-ui/styles/_tc-title.scss +49 -0
- package/scss/tcloud-ui/styles.scss +35 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
# Input Container
|
|
2
|
+
|
|
3
|
+
## Características
|
|
4
|
+
|
|
5
|
+
O componente `tcloud-ui-input-container` é um wrapper visual que envolve inputs, checkboxes, radios e outros elementos de formulário, fornecendo um label customizável com posicionamento flexível. Ideal para criar layouts de formulário consistentes e acessíveis.
|
|
6
|
+
|
|
7
|
+
## Instalação
|
|
8
|
+
|
|
9
|
+
Para utilizar o componente Input Container, 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-input-container label="Nome" labelPosition="top">
|
|
21
|
+
<input type="text" placeholder="Digite seu nome">
|
|
22
|
+
</tcloud-ui-input-container>
|
|
23
|
+
`
|
|
24
|
+
})
|
|
25
|
+
export class ExampleComponent {}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Ou importe diretamente o componente:
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { TCloudUiInputContainerComponent } from '@tcloud-ui/lib';
|
|
32
|
+
|
|
33
|
+
@Component({
|
|
34
|
+
selector: 'app-example',
|
|
35
|
+
standalone: true,
|
|
36
|
+
imports: [TCloudUiInputContainerComponent],
|
|
37
|
+
template: `...`
|
|
38
|
+
})
|
|
39
|
+
export class ExampleComponent {}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Propriedades (API)
|
|
43
|
+
|
|
44
|
+
### Inputs
|
|
45
|
+
|
|
46
|
+
| Nome | Tipo | Descrição | Valor Default |
|
|
47
|
+
|------|------|-----------|---------------|
|
|
48
|
+
| `label` | `string` | Texto do label exibido com o input | `''` (vazio) |
|
|
49
|
+
| `inputId` | `string` | ID do input para associação com label via atributo `for` | `''` |
|
|
50
|
+
| `labelPosition` | `'top' \| 'right' \| 'bottom' \| 'left'` | Posição do label em relação ao input | `'top'` |
|
|
51
|
+
| `required` | `boolean` | Exibe asterisco vermelho indicando campo obrigatório | `false` |
|
|
52
|
+
| `fullWidth` | `boolean` | Faz o container ocupar 100% da largura disponível | `false` |
|
|
53
|
+
|
|
54
|
+
## Características Técnicas
|
|
55
|
+
|
|
56
|
+
- **Flexbox Layout**: Utiliza flexbox para posicionamento flexível do label
|
|
57
|
+
- **ng-content**: Aceita qualquer elemento HTML como conteúdo
|
|
58
|
+
- **Label Acessível**: Suporta associação com input via atributo `for` quando `inputId` é fornecido
|
|
59
|
+
- **Indicador Obrigatório**: Asterisco customizável para campos requeridos
|
|
60
|
+
- **Responsive**: Adapta-se a diferentes tamanhos de viewport
|
|
61
|
+
|
|
62
|
+
## Exemplos de Uso
|
|
63
|
+
|
|
64
|
+
### Uso Básico
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import { Component } from '@angular/core';
|
|
68
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
69
|
+
|
|
70
|
+
@Component({
|
|
71
|
+
selector: 'app-basic-input-container',
|
|
72
|
+
standalone: true,
|
|
73
|
+
imports: [TCloudUiModule],
|
|
74
|
+
template: `
|
|
75
|
+
<tcloud-ui-input-container
|
|
76
|
+
label="Nome"
|
|
77
|
+
inputId="name-input"
|
|
78
|
+
labelPosition="top">
|
|
79
|
+
<input id="name-input" type="text" placeholder="Digite seu nome">
|
|
80
|
+
</tcloud-ui-input-container>
|
|
81
|
+
|
|
82
|
+
<tcloud-ui-input-container
|
|
83
|
+
label="Email"
|
|
84
|
+
inputId="email-input"
|
|
85
|
+
labelPosition="top"
|
|
86
|
+
[required]="true">
|
|
87
|
+
<input id="email-input" type="email" placeholder="Digite seu email">
|
|
88
|
+
</tcloud-ui-input-container>
|
|
89
|
+
`
|
|
90
|
+
})
|
|
91
|
+
export class BasicInputContainerComponent {}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Posições do Label
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { Component } from '@angular/core';
|
|
98
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
99
|
+
|
|
100
|
+
@Component({
|
|
101
|
+
selector: 'app-label-positions',
|
|
102
|
+
standalone: true,
|
|
103
|
+
imports: [TCloudUiModule],
|
|
104
|
+
template: `
|
|
105
|
+
<div class="position-examples">
|
|
106
|
+
<!-- Label Acima (TOP) -->
|
|
107
|
+
<tcloud-ui-input-container
|
|
108
|
+
label="Acima"
|
|
109
|
+
labelPosition="top">
|
|
110
|
+
<input type="text" placeholder="Label no topo">
|
|
111
|
+
</tcloud-ui-input-container>
|
|
112
|
+
|
|
113
|
+
<!-- Label à Direita (RIGHT) -->
|
|
114
|
+
<tcloud-ui-input-container
|
|
115
|
+
label="Direita"
|
|
116
|
+
labelPosition="right">
|
|
117
|
+
<input type="text" placeholder="Label à direita">
|
|
118
|
+
</tcloud-ui-input-container>
|
|
119
|
+
|
|
120
|
+
<!-- Label Abaixo (BOTTOM) -->
|
|
121
|
+
<tcloud-ui-input-container
|
|
122
|
+
label="Abaixo"
|
|
123
|
+
labelPosition="bottom">
|
|
124
|
+
<input type="text" placeholder="Label abaixo">
|
|
125
|
+
</tcloud-ui-input-container>
|
|
126
|
+
|
|
127
|
+
<!-- Label à Esquerda (LEFT) -->
|
|
128
|
+
<tcloud-ui-input-container
|
|
129
|
+
label="Esquerda"
|
|
130
|
+
labelPosition="left">
|
|
131
|
+
<input type="text" placeholder="Label à esquerda">
|
|
132
|
+
</tcloud-ui-input-container>
|
|
133
|
+
</div>
|
|
134
|
+
`,
|
|
135
|
+
styles: [`
|
|
136
|
+
.position-examples {
|
|
137
|
+
display: grid;
|
|
138
|
+
grid-template-columns: repeat(2, 1fr);
|
|
139
|
+
gap: 2rem;
|
|
140
|
+
}
|
|
141
|
+
`]
|
|
142
|
+
})
|
|
143
|
+
export class LabelPositionsComponent {}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Com Checkboxes
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
import { Component } from '@angular/core';
|
|
150
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
151
|
+
import { CommonModule } from '@angular/common';
|
|
152
|
+
|
|
153
|
+
@Component({
|
|
154
|
+
selector: 'app-checkbox-container',
|
|
155
|
+
standalone: true,
|
|
156
|
+
imports: [CommonModule, TCloudUiModule],
|
|
157
|
+
template: `
|
|
158
|
+
<div class="checkbox-group">
|
|
159
|
+
<tcloud-ui-input-container
|
|
160
|
+
label="Concordo com os termos"
|
|
161
|
+
labelPosition="left">
|
|
162
|
+
<input type="checkbox" id="terms">
|
|
163
|
+
</tcloud-ui-input-container>
|
|
164
|
+
|
|
165
|
+
<tcloud-ui-input-container
|
|
166
|
+
label="Receber notificações"
|
|
167
|
+
labelPosition="left">
|
|
168
|
+
<input type="checkbox" id="notifications">
|
|
169
|
+
</tcloud-ui-input-container>
|
|
170
|
+
|
|
171
|
+
<tcloud-ui-input-container
|
|
172
|
+
label="Ativar autenticação 2FA"
|
|
173
|
+
labelPosition="left"
|
|
174
|
+
[required]="true">
|
|
175
|
+
<input type="checkbox" id="2fa">
|
|
176
|
+
</tcloud-ui-input-container>
|
|
177
|
+
</div>
|
|
178
|
+
`,
|
|
179
|
+
styles: [`
|
|
180
|
+
.checkbox-group {
|
|
181
|
+
display: flex;
|
|
182
|
+
flex-direction: column;
|
|
183
|
+
gap: 1rem;
|
|
184
|
+
}
|
|
185
|
+
`]
|
|
186
|
+
})
|
|
187
|
+
export class CheckboxContainerComponent {}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Com Radio Buttons
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
import { Component } from '@angular/core';
|
|
194
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
195
|
+
|
|
196
|
+
@Component({
|
|
197
|
+
selector: 'app-radio-container',
|
|
198
|
+
standalone: true,
|
|
199
|
+
imports: [TCloudUiModule],
|
|
200
|
+
template: `
|
|
201
|
+
<div class="radio-group">
|
|
202
|
+
<tcloud-ui-input-container
|
|
203
|
+
label="Opção 1"
|
|
204
|
+
labelPosition="left">
|
|
205
|
+
<input type="radio" name="options" id="option1" value="opt1">
|
|
206
|
+
</tcloud-ui-input-container>
|
|
207
|
+
|
|
208
|
+
<tcloud-ui-input-container
|
|
209
|
+
label="Opção 2"
|
|
210
|
+
labelPosition="left">
|
|
211
|
+
<input type="radio" name="options" id="option2" value="opt2">
|
|
212
|
+
</tcloud-ui-input-container>
|
|
213
|
+
|
|
214
|
+
<tcloud-ui-input-container
|
|
215
|
+
label="Opção 3"
|
|
216
|
+
labelPosition="left">
|
|
217
|
+
<input type="radio" name="options" id="option3" value="opt3">
|
|
218
|
+
</tcloud-ui-input-container>
|
|
219
|
+
</div>
|
|
220
|
+
`,
|
|
221
|
+
styles: [`
|
|
222
|
+
.radio-group {
|
|
223
|
+
display: flex;
|
|
224
|
+
flex-direction: column;
|
|
225
|
+
gap: 1rem;
|
|
226
|
+
}
|
|
227
|
+
`]
|
|
228
|
+
})
|
|
229
|
+
export class RadioContainerComponent {}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Campos Obrigatórios
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
import { Component, signal } from '@angular/core';
|
|
236
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
237
|
+
import { CommonModule } from '@angular/common';
|
|
238
|
+
|
|
239
|
+
@Component({
|
|
240
|
+
selector: 'app-required-fields',
|
|
241
|
+
standalone: true,
|
|
242
|
+
imports: [CommonModule, TCloudUiModule],
|
|
243
|
+
template: `
|
|
244
|
+
<form class="form-group">
|
|
245
|
+
<tcloud-ui-input-container
|
|
246
|
+
label="Nome Completo"
|
|
247
|
+
inputId="full-name"
|
|
248
|
+
labelPosition="top"
|
|
249
|
+
[required]="true">
|
|
250
|
+
<input
|
|
251
|
+
id="full-name"
|
|
252
|
+
type="text"
|
|
253
|
+
placeholder="Digite seu nome completo"
|
|
254
|
+
[(ngModel)]="formData.fullName"
|
|
255
|
+
(ngModelChange)="validateField('fullName')">
|
|
256
|
+
</tcloud-ui-input-container>
|
|
257
|
+
|
|
258
|
+
<tcloud-ui-input-container
|
|
259
|
+
label="Email"
|
|
260
|
+
inputId="email"
|
|
261
|
+
labelPosition="top"
|
|
262
|
+
[required]="true">
|
|
263
|
+
<input
|
|
264
|
+
id="email"
|
|
265
|
+
type="email"
|
|
266
|
+
placeholder="Digite seu email"
|
|
267
|
+
[(ngModel)]="formData.email"
|
|
268
|
+
(ngModelChange)="validateField('email')">
|
|
269
|
+
</tcloud-ui-input-container>
|
|
270
|
+
|
|
271
|
+
<tcloud-ui-input-container
|
|
272
|
+
label="Telefone"
|
|
273
|
+
inputId="phone"
|
|
274
|
+
labelPosition="top">
|
|
275
|
+
<input
|
|
276
|
+
id="phone"
|
|
277
|
+
type="tel"
|
|
278
|
+
placeholder="Digite seu telefone">
|
|
279
|
+
</tcloud-ui-input-container>
|
|
280
|
+
|
|
281
|
+
<button (click)="submitForm()">Enviar</button>
|
|
282
|
+
</form>
|
|
283
|
+
`,
|
|
284
|
+
styles: [`
|
|
285
|
+
.form-group {
|
|
286
|
+
display: flex;
|
|
287
|
+
flex-direction: column;
|
|
288
|
+
gap: 1.5rem;
|
|
289
|
+
max-width: 500px;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
button {
|
|
293
|
+
padding: 0.75rem 1.5rem;
|
|
294
|
+
background: var(--c-primary-500);
|
|
295
|
+
color: white;
|
|
296
|
+
border: none;
|
|
297
|
+
border-radius: var(--bor-radius-4);
|
|
298
|
+
cursor: pointer;
|
|
299
|
+
font-weight: 600;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
button:hover {
|
|
303
|
+
background: var(--c-primary-600);
|
|
304
|
+
}
|
|
305
|
+
`]
|
|
306
|
+
})
|
|
307
|
+
export class RequiredFieldsComponent {
|
|
308
|
+
formData = {
|
|
309
|
+
fullName: '',
|
|
310
|
+
email: '',
|
|
311
|
+
phone: ''
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
validateField(fieldName: string): void {
|
|
315
|
+
console.log(`Validando campo: ${fieldName}`);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
submitForm(): void {
|
|
319
|
+
console.log('Form data:', this.formData);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Largura Completa
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
import { Component } from '@angular/core';
|
|
328
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
329
|
+
|
|
330
|
+
@Component({
|
|
331
|
+
selector: 'app-full-width-form',
|
|
332
|
+
standalone: true,
|
|
333
|
+
imports: [TCloudUiModule],
|
|
334
|
+
template: `
|
|
335
|
+
<form class="form-container">
|
|
336
|
+
<tcloud-ui-input-container
|
|
337
|
+
label="Nome"
|
|
338
|
+
inputId="name"
|
|
339
|
+
labelPosition="top"
|
|
340
|
+
[fullWidth]="true">
|
|
341
|
+
<input id="name" type="text" placeholder="Seu nome">
|
|
342
|
+
</tcloud-ui-input-container>
|
|
343
|
+
|
|
344
|
+
<tcloud-ui-input-container
|
|
345
|
+
label="Descrição"
|
|
346
|
+
inputId="description"
|
|
347
|
+
labelPosition="top"
|
|
348
|
+
[fullWidth]="true">
|
|
349
|
+
<textarea id="description" placeholder="Descreva..."></textarea>
|
|
350
|
+
</tcloud-ui-input-container>
|
|
351
|
+
|
|
352
|
+
<tcloud-ui-input-container
|
|
353
|
+
label="Qual é sua experiência?"
|
|
354
|
+
labelPosition="top"
|
|
355
|
+
[fullWidth]="true">
|
|
356
|
+
<select>
|
|
357
|
+
<option>Iniciante</option>
|
|
358
|
+
<option>Intermediário</option>
|
|
359
|
+
<option>Avançado</option>
|
|
360
|
+
</select>
|
|
361
|
+
</tcloud-ui-input-container>
|
|
362
|
+
</form>
|
|
363
|
+
`,
|
|
364
|
+
styles: [`
|
|
365
|
+
.form-container {
|
|
366
|
+
display: flex;
|
|
367
|
+
flex-direction: column;
|
|
368
|
+
gap: 1.5rem;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
input, textarea, select {
|
|
372
|
+
width: 100%;
|
|
373
|
+
padding: 0.75rem;
|
|
374
|
+
border: 1px solid var(--c-neutral-300);
|
|
375
|
+
border-radius: var(--bor-radius-4);
|
|
376
|
+
font-family: var(--f-family);
|
|
377
|
+
}
|
|
378
|
+
`]
|
|
379
|
+
})
|
|
380
|
+
export class FullWidthFormComponent {}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Form Complexo com Layout
|
|
384
|
+
|
|
385
|
+
```typescript
|
|
386
|
+
import { Component } from '@angular/core';
|
|
387
|
+
import { TCloudUiModule } from '@tcloud-ui/lib';
|
|
388
|
+
import { CommonModule } from '@angular/common';
|
|
389
|
+
|
|
390
|
+
@Component({
|
|
391
|
+
selector: 'app-complex-form',
|
|
392
|
+
standalone: true,
|
|
393
|
+
imports: [CommonModule, TCloudUiModule],
|
|
394
|
+
template: `
|
|
395
|
+
<form class="complex-form">
|
|
396
|
+
<section class="form-section">
|
|
397
|
+
<h3>Informações Pessoais</h3>
|
|
398
|
+
|
|
399
|
+
<div class="form-row">
|
|
400
|
+
<tcloud-ui-input-container
|
|
401
|
+
label="Primeiro Nome"
|
|
402
|
+
labelPosition="top"
|
|
403
|
+
[fullWidth]="true">
|
|
404
|
+
<input type="text" placeholder="João">
|
|
405
|
+
</tcloud-ui-input-container>
|
|
406
|
+
|
|
407
|
+
<tcloud-ui-input-container
|
|
408
|
+
label="Último Nome"
|
|
409
|
+
labelPosition="top"
|
|
410
|
+
[fullWidth]="true">
|
|
411
|
+
<input type="text" placeholder="Silva">
|
|
412
|
+
</tcloud-ui-input-container>
|
|
413
|
+
</div>
|
|
414
|
+
|
|
415
|
+
<tcloud-ui-input-container
|
|
416
|
+
label="Email"
|
|
417
|
+
inputId="email"
|
|
418
|
+
labelPosition="top"
|
|
419
|
+
[required]="true"
|
|
420
|
+
[fullWidth]="true">
|
|
421
|
+
<input id="email" type="email" placeholder="seu@email.com">
|
|
422
|
+
</tcloud-ui-input-container>
|
|
423
|
+
</section>
|
|
424
|
+
|
|
425
|
+
<section class="form-section">
|
|
426
|
+
<h3>Preferências</h3>
|
|
427
|
+
|
|
428
|
+
<tcloud-ui-input-container
|
|
429
|
+
label="Receber newsletter"
|
|
430
|
+
labelPosition="left">
|
|
431
|
+
<input type="checkbox">
|
|
432
|
+
</tcloud-ui-input-container>
|
|
433
|
+
|
|
434
|
+
<tcloud-ui-input-container
|
|
435
|
+
label="Receber notificações por email"
|
|
436
|
+
labelPosition="left">
|
|
437
|
+
<input type="checkbox" checked>
|
|
438
|
+
</tcloud-ui-input-container>
|
|
439
|
+
</section>
|
|
440
|
+
</form>
|
|
441
|
+
`,
|
|
442
|
+
styles: [`
|
|
443
|
+
.complex-form {
|
|
444
|
+
max-width: 600px;
|
|
445
|
+
padding: 2rem;
|
|
446
|
+
border: 1px solid var(--c-neutral-200);
|
|
447
|
+
border-radius: var(--bor-radius-8);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
.form-section {
|
|
451
|
+
margin-bottom: 2rem;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
.form-section h3 {
|
|
455
|
+
margin: 0 0 1rem 0;
|
|
456
|
+
font-size: var(--f-size-18);
|
|
457
|
+
font-weight: var(--f-weight-700);
|
|
458
|
+
color: var(--c-neutral-900);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
.form-row {
|
|
462
|
+
display: grid;
|
|
463
|
+
grid-template-columns: 1fr 1fr;
|
|
464
|
+
gap: 1rem;
|
|
465
|
+
margin-bottom: 1.5rem;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
@media (max-width: 600px) {
|
|
469
|
+
.form-row {
|
|
470
|
+
grid-template-columns: 1fr;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
input, textarea, select {
|
|
475
|
+
width: 100%;
|
|
476
|
+
padding: 0.75rem;
|
|
477
|
+
border: 1px solid var(--c-neutral-300);
|
|
478
|
+
border-radius: var(--bor-radius-4);
|
|
479
|
+
font-family: var(--f-family);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
tcloud-ui-input-container {
|
|
483
|
+
margin-bottom: 1.5rem;
|
|
484
|
+
}
|
|
485
|
+
`]
|
|
486
|
+
})
|
|
487
|
+
export class ComplexFormComponent {}
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
## Boas Práticas
|
|
491
|
+
|
|
492
|
+
1. **Sempre use inputId**: Quando possível, forneça o atributo `inputId` para melhor acessibilidade
|
|
493
|
+
2. **Posição apropriada**: Escolha a posição do label baseado no contexto:
|
|
494
|
+
- `top`: Padrão para inputs texto (email, senha, etc.)
|
|
495
|
+
- `left`: Ideal para checkboxes e radio buttons
|
|
496
|
+
- `right`: Menos comum, use com cuidado
|
|
497
|
+
- `bottom`: Raro, evite usar
|
|
498
|
+
|
|
499
|
+
3. **Marque campos obrigatórios**: Use `required="true"` para indicar visualmente campos obrigatórios
|
|
500
|
+
4. **Use fullWidth com moderação**: Ideal em formulários verticais mas pode quebrar layouts horizontais
|
|
501
|
+
|
|
502
|
+
## Acessibilidade
|
|
503
|
+
|
|
504
|
+
- O componente suporta o atributo `for` no label quando `inputId` é fornecido
|
|
505
|
+
- Labels descritivos melhoram a usabilidade e acessibilidade
|
|
506
|
+
- Asterisco para campos obrigatórios melhora a compreensão
|
|
507
|
+
|
|
508
|
+
## Responsividade
|
|
509
|
+
|
|
510
|
+
O componente é totalmente responsivo e se adapta a diferentes tamanhos de tela através do Flexbox.
|
|
511
|
+
|
|
512
|
+
## Compatibilidade
|
|
513
|
+
|
|
514
|
+
- **Angular**: 16+
|
|
515
|
+
- **Browsers**: Todos os navegadores modernos
|
|
516
|
+
- **CSS Variables**: Utiliza variáveis CSS do sistema de design
|
|
517
|
+
|
|
518
|
+
## Suporte
|
|
519
|
+
|
|
520
|
+
Para reportar problemas, sugestões ou criar pull requests, visite o repositório oficial do projeto.
|