@seniorsistemas/angular-components 19.3.3 → 19.3.4
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/accordion/README.md +166 -0
- package/alert/README.md +92 -0
- package/autocomplete/README.md +162 -0
- package/badge/README.md +126 -0
- package/bignumber-input/README.md +122 -0
- package/breadcrumb/README.md +144 -0
- package/button/README.md +159 -0
- package/calendar-mask/README.md +89 -0
- package/card/README.md +133 -0
- package/chat/README.md +130 -0
- package/checkbox/README.md +108 -0
- package/checkbox-list/README.md +149 -0
- package/chips/README.md +152 -0
- package/code-editor/README.md +149 -0
- package/collapse-link/README.md +128 -0
- package/confirm-dialog/README.md +105 -0
- package/content-generator/README.md +111 -0
- package/control-errors/README.md +92 -0
- package/country-phone-picker/README.md +121 -0
- package/currency/README.md +90 -0
- package/custom-fields/README.md +142 -0
- package/dialog/README.md +152 -0
- package/dynamic-form/README.md +176 -0
- package/editable-overlay/README.md +98 -0
- package/empty-state/README.md +134 -0
- package/esm2022/loading-state/lib/loading-state/loading-state.component.mjs +4 -4
- package/fesm2022/seniorsistemas-angular-components-loading-state.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-loading-state.mjs.map +1 -1
- package/fieldset/README.md +135 -0
- package/file-picker/README.md +162 -0
- package/file-upload/README.md +23 -7
- package/gantt/README.md +173 -0
- package/global-search/README.md +151 -0
- package/grid-menu/README.md +123 -0
- package/help-popover/README.md +134 -0
- package/ia-insight/README.md +24 -6
- package/image-cropper/README.md +140 -0
- package/infinite-scroll/README.md +130 -0
- package/info-sign/README.md +111 -0
- package/inline-edit/README.md +139 -0
- package/insights/README.md +159 -0
- package/interactive-content/README.md +120 -0
- package/kanban/README.md +184 -0
- package/label-value/README.md +154 -0
- package/loading-state/README.md +141 -0
- package/localized-number-input/README.md +128 -0
- package/mouse-events/README.md +157 -0
- package/navigation-button/README.md +160 -0
- package/numeric/README.md +147 -0
- package/numeric-mask/README.md +170 -0
- package/object-card/README.md +158 -0
- package/package.json +1 -1
- package/paginator/README.md +121 -0
- package/panel/README.md +147 -0
- package/password-strength/README.md +144 -0
- package/picklist/README.md +170 -0
- package/pin-code-field/README.md +137 -0
- package/product-header/README.md +33 -6
- package/profile-picture-picker/README.md +159 -0
- package/progressbar/README.md +136 -0
- package/radio-button/README.md +117 -0
- package/rating-scale/README.md +154 -0
- package/select/README.md +147 -0
- package/select-button/README.md +137 -0
- package/sidebar/README.md +117 -0
- package/slide-in-bar/README.md +122 -0
- package/slider/README.md +127 -0
- package/speech-recognition/README.md +104 -0
- package/split-button/README.md +126 -0
- package/spotlight/README.md +200 -0
- package/star-rating/README.md +127 -0
- package/stats-card/README.md +135 -0
- package/stepper/README.md +164 -0
- package/switch/README.md +125 -0
- package/table/README.md +185 -0
- package/text-area-ia/README.md +17 -6
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Checkbox
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de caixa de seleção com suporte a três estados: marcado, desmarcado e indeterminado. Implementa `ControlValueAccessor` para integração com Reactive Forms e Template-driven Forms do Angular.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Aceite de termos e condições
|
|
10
|
+
- Seleção de múltiplos itens independentes em uma lista
|
|
11
|
+
- Ativação ou desativação de funcionalidades opcionais
|
|
12
|
+
- Checkbox "selecionar todos" com estado indeterminado para controlar grupos
|
|
13
|
+
|
|
14
|
+
## Quando não usar
|
|
15
|
+
|
|
16
|
+
- Quando apenas uma opção de um grupo pode ser selecionada — use `RadioButton` em vez disso
|
|
17
|
+
- Quando o valor é um toggle visual de estado ativo/inativo — use `Switch` em vez disso
|
|
18
|
+
- Para seleção hierárquica com múltiplos níveis — use `CheckboxList`
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';
|
|
24
|
+
|
|
25
|
+
@Component({ standalone: true, imports: [CheckboxComponent] })
|
|
26
|
+
export class MeuComponent {}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Uso básico
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<s-checkbox label="Aceito os termos de uso" [(checked)]="aceito" />
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## API
|
|
36
|
+
|
|
37
|
+
### Inputs
|
|
38
|
+
|
|
39
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
40
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
41
|
+
| `label` | `string` | `''` | não | Texto exibido ao lado do checkbox |
|
|
42
|
+
| `checked` | `boolean` | `false` | não | Estado atual (two-way binding via `[(checked)]`) |
|
|
43
|
+
| `disabled` | `boolean` | `false` | não | Desabilita o checkbox (two-way binding via `[(disabled)]`) |
|
|
44
|
+
| `indeterminate` | `boolean` | `false` | não | Estado indeterminado (traço) — descartado na primeira interação |
|
|
45
|
+
| `ariaLabel` | `string` | `undefined` | não | Rótulo acessível para leitores de tela |
|
|
46
|
+
| `ariaLabelledBy` | `string` | `undefined` | não | ID do elemento que descreve o checkbox |
|
|
47
|
+
|
|
48
|
+
### Outputs
|
|
49
|
+
|
|
50
|
+
| Evento | Tipo | Descrição |
|
|
51
|
+
|--------|------|-----------|
|
|
52
|
+
| `checkedChange` | `OutputEmitterRef<boolean>` | Emitido quando o valor é alterado pelo usuário |
|
|
53
|
+
|
|
54
|
+
## Exemplos
|
|
55
|
+
|
|
56
|
+
### Uso com ngModel
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
<s-checkbox label="Receber newsletter" [(checked)]="receberNewsletter"></s-checkbox>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Uso com Reactive Forms
|
|
63
|
+
|
|
64
|
+
```html
|
|
65
|
+
<form [formGroup]="form">
|
|
66
|
+
<s-checkbox formControlName="newsletter" label="Receber newsletter"></s-checkbox>
|
|
67
|
+
<s-checkbox formControlName="termos" label="Aceito os termos de uso"></s-checkbox>
|
|
68
|
+
<s-checkbox formControlName="notificacoes" label="Ativar notificações" [disabled]="true"></s-checkbox>
|
|
69
|
+
</form>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Padrão "selecionar todos" com estado indeterminado
|
|
73
|
+
|
|
74
|
+
```html
|
|
75
|
+
<s-checkbox
|
|
76
|
+
label="Selecionar todos"
|
|
77
|
+
[checked]="todosMarcados"
|
|
78
|
+
[indeterminate]="algunsMarcados"
|
|
79
|
+
(checkedChange)="alternarTodos()">
|
|
80
|
+
</s-checkbox>
|
|
81
|
+
|
|
82
|
+
<div style="margin-left: 28px;">
|
|
83
|
+
@for (item of itens; track item.id) {
|
|
84
|
+
<s-checkbox
|
|
85
|
+
[label]="item.label"
|
|
86
|
+
[checked]="item.checked"
|
|
87
|
+
(checkedChange)="alternarItem(item.id)">
|
|
88
|
+
</s-checkbox>
|
|
89
|
+
}
|
|
90
|
+
</div>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Desabilitado (somente leitura)
|
|
94
|
+
|
|
95
|
+
```html
|
|
96
|
+
<s-checkbox label="Opção obrigatória" [checked]="true" [disabled]="true"></s-checkbox>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Acessibilidade
|
|
100
|
+
|
|
101
|
+
- O elemento recebe `role="checkbox"` com `aria-checked` (`true`, `false` ou `"mixed"` para indeterminado)
|
|
102
|
+
- Totalmente navegável por teclado: **Tab** para focar, **Space** para alternar
|
|
103
|
+
- Use `ariaLabel` quando não houver `label` visível (ex.: checkbox em cabeçalho de tabela)
|
|
104
|
+
|
|
105
|
+
## Componentes relacionados
|
|
106
|
+
|
|
107
|
+
- [`CheckboxList`](../checkbox-list/README.md) — quando a seleção é hierárquica com múltiplos níveis de pai/filho
|
|
108
|
+
- [`Switch`](../switch/README.md) — alternador visual de estado ativo/inativo
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# CheckboxList
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de lista de checkboxes com suporte a hierarquia multinível. Gerencia automaticamente os estados indeterminado e marcado do nó pai com base nos filhos selecionados. Implementa `ControlValueAccessor` para integração completa com Angular Forms.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Seleção múltipla de opções agrupadas por categoria (ex.: frutas, verduras, legumes)
|
|
10
|
+
- Permissões agrupadas por módulo com seleção em cascata
|
|
11
|
+
- Filtros com múltiplos níveis de refinamento
|
|
12
|
+
- Estruturas organizacionais hierárquicas com seleção em árvore
|
|
13
|
+
|
|
14
|
+
## Quando não usar
|
|
15
|
+
|
|
16
|
+
- Para seleção de itens simples sem hierarquia — use `Checkbox` individual ou um grupo de checkboxes
|
|
17
|
+
- Para seleção única em uma lista — use `RadioButton` ou `RadioButtonGroup`
|
|
18
|
+
- Quando os dados não têm relação hierárquica entre si
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { CheckboxListModule } from '@seniorsistemas/angular-components/checkbox-list';
|
|
24
|
+
|
|
25
|
+
@NgModule({
|
|
26
|
+
imports: [CheckboxListModule],
|
|
27
|
+
})
|
|
28
|
+
export class MeuModule {}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Uso básico
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<form [formGroup]="form">
|
|
35
|
+
<s-checkbox-list [data]="estrutura" formControlName="selecao"></s-checkbox-list>
|
|
36
|
+
</form>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## API
|
|
40
|
+
|
|
41
|
+
### Inputs
|
|
42
|
+
|
|
43
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
44
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
45
|
+
| `data` | `CheckboxListData` | — | **sim** | Estrutura de dados da árvore de checkboxes |
|
|
46
|
+
|
|
47
|
+
### Tipos
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
interface CheckboxListData {
|
|
51
|
+
label: string; // Texto do checkbox (obrigatório)
|
|
52
|
+
children?: CheckboxListData[]; // Filhos da hierarquia (opcional)
|
|
53
|
+
renderType?: 'inline' | 'block'; // Layout dos filhos — padrão: 'inline'
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface CheckboxListState {
|
|
57
|
+
checked: boolean; // Se o nó está marcado
|
|
58
|
+
indeterminate?: boolean; // Se o nó está em estado parcial
|
|
59
|
+
disabled?: boolean; // Se o nó está desabilitado
|
|
60
|
+
children?: CheckboxListChildren; // Estado dos filhos (chave = label do filho)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type CheckboxListChildren = Record<string, CheckboxListState>;
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Exemplos
|
|
67
|
+
|
|
68
|
+
### Lista simples com pai e filhos
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// Component
|
|
72
|
+
estrutura: CheckboxListData = {
|
|
73
|
+
label: 'Opções',
|
|
74
|
+
children: [
|
|
75
|
+
{ label: 'Opção 1' },
|
|
76
|
+
{ label: 'Opção 2' },
|
|
77
|
+
{ label: 'Opção 3' },
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
form = new FormGroup({
|
|
82
|
+
selecao: new FormControl(null),
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<form [formGroup]="form">
|
|
88
|
+
<s-checkbox-list [data]="estrutura" formControlName="selecao"></s-checkbox-list>
|
|
89
|
+
</form>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Com estado inicial (todos marcados)
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
estadoInicial: CheckboxListState = {
|
|
96
|
+
checked: true,
|
|
97
|
+
children: {
|
|
98
|
+
'Opção 1': { checked: true, children: {} },
|
|
99
|
+
'Opção 2': { checked: true, children: {} },
|
|
100
|
+
'Opção 3': { checked: true, children: {} },
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
form = new FormGroup({
|
|
105
|
+
selecao: new FormControl(this.estadoInicial),
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Hierarquia de dois níveis
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
estrutura: CheckboxListData = {
|
|
113
|
+
label: 'Categorias',
|
|
114
|
+
children: [
|
|
115
|
+
{
|
|
116
|
+
label: 'Frutas',
|
|
117
|
+
children: [{ label: 'Maçã' }, { label: 'Banana' }, { label: 'Laranja' }],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
label: 'Verduras',
|
|
121
|
+
children: [{ label: 'Alface' }, { label: 'Espinafre' }],
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Com itens desabilitados
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
estadoComDesabilitados: CheckboxListState = {
|
|
131
|
+
checked: false,
|
|
132
|
+
indeterminate: true,
|
|
133
|
+
children: {
|
|
134
|
+
'Opção 1': { checked: true, disabled: true, children: {} },
|
|
135
|
+
'Opção 2': { checked: false, children: {} },
|
|
136
|
+
'Opção 3': { checked: true, disabled: true, children: {} },
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Acessibilidade
|
|
142
|
+
|
|
143
|
+
- Cada checkbox recebe `role="checkbox"` com `aria-checked` correto (incluindo `"mixed"` para indeterminado)
|
|
144
|
+
- Navegação por **Tab** entre checkboxes; **Space** para marcar/desmarcar
|
|
145
|
+
- A propagação automática de estados pai/filho é refletida nos atributos ARIA em tempo real
|
|
146
|
+
|
|
147
|
+
## Componentes relacionados
|
|
148
|
+
|
|
149
|
+
- [`Checkbox`](../checkbox/README.md) — checkbox individual sem hierarquia, para casos simples
|
package/chips/README.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Chips
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente para entrada de múltiplos valores em formato de chips/tags removíveis. Permite adicionar e remover itens de texto livremente, com suporte a limite de itens, prevenção de duplicatas, filtro de teclas e template personalizado. Implementa `ControlValueAccessor` para uso em formulários Angular.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Tags ou palavras-chave editáveis em formulários
|
|
10
|
+
- Campo de destinatários de e-mail com múltiplos endereços
|
|
11
|
+
- Filtros de busca onde o usuário adiciona múltiplos termos
|
|
12
|
+
- Listas de valores editáveis onde cada item pode ser removido individualmente
|
|
13
|
+
|
|
14
|
+
## Quando não usar
|
|
15
|
+
|
|
16
|
+
- Para exibir chips não editáveis (somente leitura) — use `Badge` ou `TokenList`
|
|
17
|
+
- Para seleção de opções de uma lista predefinida com busca — use `Autocomplete` com `multiple: true`
|
|
18
|
+
- Quando apenas um valor é esperado — use `Input` simples
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { ChipsModule } from '@seniorsistemas/angular-components/chips';
|
|
24
|
+
|
|
25
|
+
@NgModule({
|
|
26
|
+
imports: [ChipsModule],
|
|
27
|
+
})
|
|
28
|
+
export class MeuModule {}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Uso básico
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<s-chips placeholder="Adicionar tag..." [(value)]="tags" />
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## API
|
|
38
|
+
|
|
39
|
+
### Inputs
|
|
40
|
+
|
|
41
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
42
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
43
|
+
| `value` | `string[] \| any[]` | `[]` | não | Lista de chips exibidos |
|
|
44
|
+
| `placeholder` | `string` | `undefined` | não | Texto de placeholder do campo |
|
|
45
|
+
| `field` | `string` | `''` | não | Chave do objeto para exibição quando `value` é array de objetos |
|
|
46
|
+
| `disabled` | `boolean` | `false` | não | Desabilita adição e remoção de chips |
|
|
47
|
+
| `max` | `number` | `Infinity` | não | Número máximo de chips permitidos |
|
|
48
|
+
| `maxLength` | `number` | `Infinity` | não | Comprimento máximo do texto de cada chip |
|
|
49
|
+
| `allowDuplicated` | `boolean` | `true` | não | Permite chips com valor duplicado |
|
|
50
|
+
| `caseSensitiveDuplication` | `boolean` | `false` | não | Distingue maiúsculas na verificação de duplicatas |
|
|
51
|
+
| `addOnTab` | `boolean` | `true` | não | Adiciona chip ao pressionar Tab |
|
|
52
|
+
| `addOnBlur` | `boolean` | `true` | não | Adiciona chip ao perder o foco |
|
|
53
|
+
| `separator` | `string` | `''` | não | Caractere que confirma adição de chip ao ser digitado |
|
|
54
|
+
| `autofocus` | `boolean` | `false` | não | Foca automaticamente o campo ao renderizar |
|
|
55
|
+
| `infoLabel` | `string` | `''` | não | Texto informativo exibido abaixo do campo |
|
|
56
|
+
| `keyFilter` | `RegExp \| KeyFilterPattern` | `undefined` | não | Filtro de teclas para restringir caracteres aceitos |
|
|
57
|
+
| `showTooltip` | `boolean` | `true` | não | Exibe tooltip em chips com texto truncado |
|
|
58
|
+
| `maxLengthRenderWithoutTooltip` | `number` | `20` | não | Caracteres exibidos antes de truncar o chip |
|
|
59
|
+
| `inputId` | `string` | `chips-{hash}` | não | ID do `<input>` interno |
|
|
60
|
+
|
|
61
|
+
### Outputs
|
|
62
|
+
|
|
63
|
+
| Evento | Tipo | Descrição |
|
|
64
|
+
|--------|------|-----------|
|
|
65
|
+
| `added` | `EventEmitter<ChipAddEvent>` | Emitido quando um chip é adicionado |
|
|
66
|
+
| `removed` | `EventEmitter<ChipRemoveEvent>` | Emitido quando um chip é removido |
|
|
67
|
+
| `chipClicked` | `EventEmitter<ChipClickEvent>` | Emitido ao clicar em um chip |
|
|
68
|
+
| `focused` | `EventEmitter<FocusEvent>` | Emitido quando o campo recebe foco |
|
|
69
|
+
| `focusLost` | `EventEmitter<FocusEvent>` | Emitido quando o campo perde foco |
|
|
70
|
+
| `valueChange` | `EventEmitter<string[] \| any[]>` | Emitido quando a lista de chips é alterada |
|
|
71
|
+
|
|
72
|
+
### Tipos
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
type ChipAddEvent = { value: any };
|
|
76
|
+
type ChipRemoveEvent = { originalEvent: Event; value: any };
|
|
77
|
+
type ChipClickEvent = { originalEvent: Event; value: any };
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Exemplos
|
|
81
|
+
|
|
82
|
+
### Tags básicas
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
<s-chips
|
|
86
|
+
placeholder="Adicione países..."
|
|
87
|
+
[value]="['Brasil', 'Argentina', 'Chile']">
|
|
88
|
+
</s-chips>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Sem duplicatas, com separador por vírgula
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<s-chips
|
|
95
|
+
placeholder="Digite emails separados por vírgula..."
|
|
96
|
+
[value]="emails"
|
|
97
|
+
[allowDuplicated]="false"
|
|
98
|
+
separator=","
|
|
99
|
+
infoLabel="Adicione múltiplos emails separados por vírgula">
|
|
100
|
+
</s-chips>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Com limite de itens
|
|
104
|
+
|
|
105
|
+
```html
|
|
106
|
+
<s-chips
|
|
107
|
+
placeholder="Máximo 5 tags..."
|
|
108
|
+
[value]="tags"
|
|
109
|
+
[max]="5"
|
|
110
|
+
infoLabel="Você pode adicionar até 5 tags">
|
|
111
|
+
</s-chips>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Com objetos complexos
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<s-chips
|
|
118
|
+
placeholder="Adicione países..."
|
|
119
|
+
[value]="paises"
|
|
120
|
+
field="nome">
|
|
121
|
+
</s-chips>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
paises = [
|
|
126
|
+
{ id: 1, nome: 'Brasil', codigo: 'BR' },
|
|
127
|
+
{ id: 2, nome: 'Argentina', codigo: 'AR' },
|
|
128
|
+
];
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Reagindo a eventos
|
|
132
|
+
|
|
133
|
+
```html
|
|
134
|
+
<s-chips
|
|
135
|
+
[value]="tags"
|
|
136
|
+
(added)="onAdicionado($event)"
|
|
137
|
+
(removed)="onRemovido($event)"
|
|
138
|
+
(chipClicked)="onCliqueChip($event)">
|
|
139
|
+
</s-chips>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Acessibilidade
|
|
143
|
+
|
|
144
|
+
- O campo de entrada é um `<input>` acessível via teclado
|
|
145
|
+
- **Enter** confirma adição do chip; **Tab** também pode confirmar (configurável)
|
|
146
|
+
- Os botões de remoção de cada chip são acessíveis via teclado
|
|
147
|
+
- Use `aria-label` ou `<label for="...">` apontando para `inputId` para associar um rótulo ao campo
|
|
148
|
+
|
|
149
|
+
## Componentes relacionados
|
|
150
|
+
|
|
151
|
+
- [`Autocomplete`](../autocomplete/README.md) com `multiple: true` — quando os chips devem ser selecionados de uma lista predefinida com busca
|
|
152
|
+
- [`Badge`](../badge/README.md) — para exibir chips não editáveis (somente leitura)
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# CodeEditor
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de editor de código com syntax highlighting, construído sobre CodeMirror 6. Suporta configuração de linguagem e tema via `editorOptions`. Implementa `ControlValueAccessor` para integração com Angular Forms.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Edição de configurações em formato JSON
|
|
10
|
+
- Campos de script ou regra com syntax highlighting (ex.: cálculo tributário)
|
|
11
|
+
- Formulários com área de código onde a validação de sintaxe é necessária
|
|
12
|
+
- Visualização e edição de payloads de API ou configurações avançadas
|
|
13
|
+
|
|
14
|
+
## Quando não usar
|
|
15
|
+
|
|
16
|
+
- Para entrada de texto simples sem necessidade de syntax highlighting — use `TextArea`
|
|
17
|
+
- Para exibição de código sem edição — use um bloco `<pre><code>` estilizado
|
|
18
|
+
- Quando o ambiente não suporta o carregamento assíncrono do CodeMirror
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { CodeEditorModule } from '@seniorsistemas/angular-components/code-editor';
|
|
24
|
+
|
|
25
|
+
@NgModule({
|
|
26
|
+
imports: [CodeEditorModule],
|
|
27
|
+
})
|
|
28
|
+
export class MeuModule {}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Uso básico
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<s-code-editor
|
|
35
|
+
[editorOptions]="{ language: 'Json', theme: 'SDSLight' }"
|
|
36
|
+
[(code)]="codigoAtual"
|
|
37
|
+
(codeChange)="onAlteracao($event)">
|
|
38
|
+
</s-code-editor>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## API
|
|
42
|
+
|
|
43
|
+
### Inputs
|
|
44
|
+
|
|
45
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
46
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
47
|
+
| `editorOptions` | `EditorOptions` | `undefined` | não | Configurações do editor (linguagem, tema) |
|
|
48
|
+
| `code` | `string` | `''` | não | Conteúdo textual do editor (two-way binding via `[(code)]`) |
|
|
49
|
+
| `isCodeValid` | `boolean` | `false` | não | Indica se o código atual é válido (two-way binding via `[(isCodeValid)]`) |
|
|
50
|
+
| `payload` | `string` | `undefined` | não | Payload adicional para contexto de autocompletar ou validações específicas |
|
|
51
|
+
|
|
52
|
+
### Outputs
|
|
53
|
+
|
|
54
|
+
| Evento | Tipo | Descrição |
|
|
55
|
+
|--------|------|-----------|
|
|
56
|
+
| `codeChange` | `EventEmitter<string>` | Emitido a cada alteração no conteúdo |
|
|
57
|
+
| `isCodeValidChange` | `EventEmitter<boolean>` | Emitido quando o estado de validade muda |
|
|
58
|
+
| `onComponentFinishLoad` | `EventEmitter<void>` | Emitido quando o editor termina de carregar |
|
|
59
|
+
| `onCodeChange` | `EventEmitter<string>` | **Descontinuado** — use `codeChange` em novos projetos |
|
|
60
|
+
|
|
61
|
+
### Tipos
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
interface EditorOptions {
|
|
65
|
+
language?: Languages; // 'Json' | 'TaxCalculation'
|
|
66
|
+
theme?: Themes; // 'SDSLight'
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
enum Languages {
|
|
70
|
+
TaxCalculation = 'TaxCalculation',
|
|
71
|
+
Json = 'Json',
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
enum Themes {
|
|
75
|
+
SDSLight = 'SDSLight',
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Exemplos
|
|
80
|
+
|
|
81
|
+
### Editor JSON
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<div style="height: 300px;">
|
|
85
|
+
<s-code-editor
|
|
86
|
+
[editorOptions]="{ language: 'Json', theme: 'SDSLight' }"
|
|
87
|
+
[(code)]="json"
|
|
88
|
+
[(isCodeValid)]="jsonValido"
|
|
89
|
+
(codeChange)="onAlteracao($event)">
|
|
90
|
+
</s-code-editor>
|
|
91
|
+
</div>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Editor de cálculo tributário
|
|
95
|
+
|
|
96
|
+
```html
|
|
97
|
+
<div style="height: 300px;">
|
|
98
|
+
<s-code-editor
|
|
99
|
+
[editorOptions]="{ language: 'TaxCalculation', theme: 'SDSLight' }"
|
|
100
|
+
[(code)]="regra"
|
|
101
|
+
(codeChange)="onAlteracao($event)">
|
|
102
|
+
</s-code-editor>
|
|
103
|
+
</div>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Integrado com Reactive Forms
|
|
107
|
+
|
|
108
|
+
```html
|
|
109
|
+
<form [formGroup]="form">
|
|
110
|
+
<div style="height: 300px;">
|
|
111
|
+
<s-code-editor
|
|
112
|
+
formControlName="script"
|
|
113
|
+
[editorOptions]="editorOptions"
|
|
114
|
+
(codeChange)="onAlteracao($event)">
|
|
115
|
+
</s-code-editor>
|
|
116
|
+
</div>
|
|
117
|
+
</form>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
form = new FormGroup({
|
|
122
|
+
script: new FormControl(''),
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
editorOptions: EditorOptions = {
|
|
126
|
+
language: Languages.Json,
|
|
127
|
+
theme: Themes.SDSLight,
|
|
128
|
+
};
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Reagindo ao carregamento do editor
|
|
132
|
+
|
|
133
|
+
```html
|
|
134
|
+
<s-code-editor
|
|
135
|
+
[editorOptions]="editorOptions"
|
|
136
|
+
[(code)]="codigo"
|
|
137
|
+
(onComponentFinishLoad)="editorPronto()">
|
|
138
|
+
</s-code-editor>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Acessibilidade
|
|
142
|
+
|
|
143
|
+
- O editor é construído sobre CodeMirror 6, que oferece suporte a navegação por teclado dentro do código
|
|
144
|
+
- Use `aria-label` ou um `<label>` associado via `id` para descrever o editor ao usuário
|
|
145
|
+
- O campo aceita foco via Tab e suporta a maioria dos atalhos de edição de texto padrão do sistema operacional
|
|
146
|
+
|
|
147
|
+
## Componentes relacionados
|
|
148
|
+
|
|
149
|
+
- [`TextArea`](../text-area/README.md) — área de texto simples sem syntax highlighting, para casos onde formatação de código não é necessária
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# CollapseLink
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de link de expansão/recolhimento com animação suave. Exibe um botão que alterna entre recolhido e expandido, controlando a visibilidade do conteúdo projetado via `ng-content`. Suporta labels personalizados para cada estado e controle programático.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Seções de conteúdo extenso que podem ser ocultadas por padrão (ex.: descrição longa, detalhes adicionais)
|
|
10
|
+
- FAQ com respostas que expandem ao clicar
|
|
11
|
+
- Filtros avançados que ficam ocultos até o usuário solicitar
|
|
12
|
+
- Formulários com campos opcionais agrupados e recolhíveis
|
|
13
|
+
|
|
14
|
+
## Quando não usar
|
|
15
|
+
|
|
16
|
+
- Para painéis com cabeçalho independente e múltiplos itens — use `Accordion`
|
|
17
|
+
- Para ocultar/exibir conteúdo sem animação ou sem um botão de toggle visível
|
|
18
|
+
- Quando o conteúdo nunca deve ser recolhido
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { CollapseLinkModule } from '@seniorsistemas/angular-components/collapse-link';
|
|
24
|
+
|
|
25
|
+
@NgModule({
|
|
26
|
+
imports: [CollapseLinkModule],
|
|
27
|
+
})
|
|
28
|
+
export class MeuModule {}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Uso básico
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<s-collapse-link>
|
|
35
|
+
<p>Conteúdo que será expandido ou recolhido ao clicar no link.</p>
|
|
36
|
+
</s-collapse-link>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## API
|
|
40
|
+
|
|
41
|
+
### Inputs
|
|
42
|
+
|
|
43
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
44
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
45
|
+
| `buttonId` | `string` | `s-collapse-button-{n}` | não | ID do botão de toggle (gerado automaticamente se omitido) |
|
|
46
|
+
| `expandedLabel` | `string` | `'Mostrar menos'` | não | Texto exibido quando o conteúdo está expandido |
|
|
47
|
+
| `collapsedLabel` | `string` | `'Mostrar mais'` | não | Texto exibido quando o conteúdo está recolhido |
|
|
48
|
+
| `disabled` | `boolean` | `false` | não | Desabilita o botão impedindo a alternância de estado |
|
|
49
|
+
| `collapse` | `boolean` | `true` | não | Estado atual — `true` = recolhido, `false` = expandido |
|
|
50
|
+
|
|
51
|
+
## Exemplos
|
|
52
|
+
|
|
53
|
+
### Padrão (recolhido inicialmente)
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<s-collapse-link>
|
|
57
|
+
<p>Este conteúdo fica oculto até o usuário clicar em "Mostrar mais".</p>
|
|
58
|
+
<p>Pode conter qualquer conteúdo HTML projetado via ng-content.</p>
|
|
59
|
+
</s-collapse-link>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Iniciando expandido
|
|
63
|
+
|
|
64
|
+
```html
|
|
65
|
+
<s-collapse-link [collapse]="false">
|
|
66
|
+
<p>Este conteúdo já aparece visível ao carregar a página.</p>
|
|
67
|
+
</s-collapse-link>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Com labels personalizados
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<s-collapse-link
|
|
74
|
+
collapsedLabel="Ver detalhes completos"
|
|
75
|
+
expandedLabel="Ocultar detalhes">
|
|
76
|
+
<p>Detalhes adicionais do produto...</p>
|
|
77
|
+
</s-collapse-link>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Desabilitado
|
|
81
|
+
|
|
82
|
+
```html
|
|
83
|
+
<s-collapse-link [disabled]="true" [collapse]="false">
|
|
84
|
+
<p>Conteúdo visível, mas o botão não permite recolher.</p>
|
|
85
|
+
</s-collapse-link>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Controle programático
|
|
89
|
+
|
|
90
|
+
```html
|
|
91
|
+
<button (click)="recolhido = !recolhido">Alternar externamente</button>
|
|
92
|
+
|
|
93
|
+
<s-collapse-link [collapse]="recolhido">
|
|
94
|
+
<p>Conteúdo controlado pelo componente pai.</p>
|
|
95
|
+
</s-collapse-link>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
recolhido = true;
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Em formulário com campos opcionais
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<form [formGroup]="form">
|
|
106
|
+
<s-collapse-link collapsedLabel="Mostrar campos opcionais" expandedLabel="Ocultar campos opcionais">
|
|
107
|
+
<div formGroupName="opcionais">
|
|
108
|
+
<label for="apelido">Apelido</label>
|
|
109
|
+
<input id="apelido" formControlName="apelido" />
|
|
110
|
+
|
|
111
|
+
<label for="site">Site pessoal</label>
|
|
112
|
+
<input id="site" formControlName="site" />
|
|
113
|
+
</div>
|
|
114
|
+
</s-collapse-link>
|
|
115
|
+
</form>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Acessibilidade
|
|
119
|
+
|
|
120
|
+
- O botão de toggle possui `aria-expanded` refletindo o estado atual (`true` quando expandido)
|
|
121
|
+
- O botão recebe `aria-controls` apontando para a região do conteúdo projetado
|
|
122
|
+
- Totalmente acessível por teclado: **Tab** para focar o botão, **Enter** ou **Space** para alternar
|
|
123
|
+
- Quando `disabled`, o botão recebe o atributo `disabled` nativo, impedindo interação por teclado e mouse
|
|
124
|
+
- A animação de 400ms usa `cubic-bezier` para transição suave sem comprometer a acessibilidade
|
|
125
|
+
|
|
126
|
+
## Componentes relacionados
|
|
127
|
+
|
|
128
|
+
- [`Accordion`](../accordion/README.md) — quando há múltiplos painéis com cabeçalhos independentes e suporte a abertura múltipla ou exclusiva
|