@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.
Files changed (76) hide show
  1. package/accordion/README.md +166 -0
  2. package/alert/README.md +92 -0
  3. package/autocomplete/README.md +162 -0
  4. package/badge/README.md +126 -0
  5. package/bignumber-input/README.md +122 -0
  6. package/breadcrumb/README.md +144 -0
  7. package/button/README.md +159 -0
  8. package/calendar-mask/README.md +89 -0
  9. package/card/README.md +133 -0
  10. package/chat/README.md +130 -0
  11. package/checkbox/README.md +108 -0
  12. package/checkbox-list/README.md +149 -0
  13. package/chips/README.md +152 -0
  14. package/code-editor/README.md +149 -0
  15. package/collapse-link/README.md +128 -0
  16. package/confirm-dialog/README.md +105 -0
  17. package/content-generator/README.md +111 -0
  18. package/control-errors/README.md +92 -0
  19. package/country-phone-picker/README.md +121 -0
  20. package/currency/README.md +90 -0
  21. package/custom-fields/README.md +142 -0
  22. package/dialog/README.md +152 -0
  23. package/dynamic-form/README.md +176 -0
  24. package/editable-overlay/README.md +98 -0
  25. package/empty-state/README.md +134 -0
  26. package/esm2022/loading-state/lib/loading-state/loading-state.component.mjs +4 -4
  27. package/fesm2022/seniorsistemas-angular-components-loading-state.mjs +3 -3
  28. package/fesm2022/seniorsistemas-angular-components-loading-state.mjs.map +1 -1
  29. package/fieldset/README.md +135 -0
  30. package/file-picker/README.md +162 -0
  31. package/file-upload/README.md +23 -7
  32. package/gantt/README.md +173 -0
  33. package/global-search/README.md +151 -0
  34. package/grid-menu/README.md +123 -0
  35. package/help-popover/README.md +134 -0
  36. package/ia-insight/README.md +24 -6
  37. package/image-cropper/README.md +140 -0
  38. package/infinite-scroll/README.md +130 -0
  39. package/info-sign/README.md +111 -0
  40. package/inline-edit/README.md +139 -0
  41. package/insights/README.md +159 -0
  42. package/interactive-content/README.md +120 -0
  43. package/kanban/README.md +184 -0
  44. package/label-value/README.md +154 -0
  45. package/loading-state/README.md +141 -0
  46. package/localized-number-input/README.md +128 -0
  47. package/mouse-events/README.md +157 -0
  48. package/navigation-button/README.md +160 -0
  49. package/numeric/README.md +147 -0
  50. package/numeric-mask/README.md +170 -0
  51. package/object-card/README.md +158 -0
  52. package/package.json +1 -1
  53. package/paginator/README.md +121 -0
  54. package/panel/README.md +147 -0
  55. package/password-strength/README.md +144 -0
  56. package/picklist/README.md +170 -0
  57. package/pin-code-field/README.md +137 -0
  58. package/product-header/README.md +33 -6
  59. package/profile-picture-picker/README.md +159 -0
  60. package/progressbar/README.md +136 -0
  61. package/radio-button/README.md +117 -0
  62. package/rating-scale/README.md +154 -0
  63. package/select/README.md +147 -0
  64. package/select-button/README.md +137 -0
  65. package/sidebar/README.md +117 -0
  66. package/slide-in-bar/README.md +122 -0
  67. package/slider/README.md +127 -0
  68. package/speech-recognition/README.md +104 -0
  69. package/split-button/README.md +126 -0
  70. package/spotlight/README.md +200 -0
  71. package/star-rating/README.md +127 -0
  72. package/stats-card/README.md +135 -0
  73. package/stepper/README.md +164 -0
  74. package/switch/README.md +125 -0
  75. package/table/README.md +185 -0
  76. package/text-area-ia/README.md +17 -6
@@ -0,0 +1,108 @@
1
+ # Checkbox
2
+
3
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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
@@ -0,0 +1,152 @@
1
+ # Chips
2
+
3
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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