ngx-opalbytes-components 1.25.1 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/README.md +497 -0
  2. package/fesm2022/ngx-opalbytes-components.mjs +890 -2
  3. package/fesm2022/ngx-opalbytes-components.mjs.map +1 -1
  4. package/package.json +1 -1
  5. package/src/lib/shared/components/checkbox/checkbox.component.css +131 -0
  6. package/src/lib/shared/components/checkbox/checkbox.component.html +84 -0
  7. package/src/lib/shared/components/checkbox/checkbox.component.spec.ts +344 -0
  8. package/src/lib/shared/components/checkbox/checkbox.component.ts +258 -0
  9. package/src/lib/shared/components/checkbox/checkbox.stories.ts +240 -0
  10. package/src/lib/shared/components/index.ts +4 -0
  11. package/src/lib/shared/components/radio/radio-button.component.css +95 -0
  12. package/src/lib/shared/components/radio/radio-button.component.html +32 -0
  13. package/src/lib/shared/components/radio/radio-button.component.ts +133 -0
  14. package/src/lib/shared/components/radio/radio-button.stories.ts +94 -0
  15. package/src/lib/shared/components/radio/radio-group.component.css +21 -0
  16. package/src/lib/shared/components/radio/radio-group.component.ts +216 -0
  17. package/src/lib/shared/components/radio/radio.component.spec.ts +128 -0
  18. package/src/lib/shared/components/radio/radio.stories.ts +128 -0
  19. package/src/lib/shared/components/slide-toggle/slide-toggle.component.css +135 -0
  20. package/src/lib/shared/components/slide-toggle/slide-toggle.component.html +48 -0
  21. package/src/lib/shared/components/slide-toggle/slide-toggle.component.spec.ts +155 -0
  22. package/src/lib/shared/components/slide-toggle/slide-toggle.component.ts +233 -0
  23. package/src/lib/shared/components/slide-toggle/slide-toggle.stories.ts +165 -0
  24. package/types/ngx-opalbytes-components.d.ts +228 -2
package/README.md CHANGED
@@ -238,12 +238,15 @@ src/
238
238
  | ├── base-input/
239
239
  | ├── base-time-range/
240
240
  | ├── base-toggle/
241
+ | ├── checkbox/
241
242
  | ├── drop-down/
242
243
  | ├── footer/
243
244
  | ├── kpi/
244
245
  | ├── links-button/
245
246
  | ├── paginator/
247
+ | ├── radio/
246
248
  | ├── skeleton/
249
+ | ├── slide-toggle/
247
250
  | ├── stepper/
248
251
  | ├── tab-group/
249
252
  | ├── tab-panel/
@@ -928,6 +931,500 @@ Um componente de alternância (toggle switch) que funciona com `ngModel` ou `for
928
931
 
929
932
  ---
930
933
 
934
+ ### `CaoSlideToggleComponent`
935
+
936
+ Um switch (slide toggle) acessível e customizável, com suporte a `ngModel` e formulários reativos via `ControlValueAccessor`. O visual é construído com trilho e thumb animados, sem depender do Material em runtime.
937
+
938
+ **Seletor:** `<cao-slide-toggle>`
939
+
940
+ **Interface `ICaoSlideToggleChangeEvent`**
941
+
942
+ | Propriedade | Tipo | Descrição |
943
+ | --- | --- | --- |
944
+ | `checked` | `boolean` | Novo estado do switch. |
945
+ | `source` | `CaoSlideToggleComponent` | Instância que originou o evento. |
946
+
947
+ **Atributos (Inputs)**
948
+
949
+ | Atributo | Tipo | Padrão | Descrição |
950
+ | --- | --- | --- | --- |
951
+ | `checked` | `boolean` | `false` | Estado inicial/atual do switch. |
952
+ | `isDisabled` | `boolean` | `false` | Desabilita o componente. |
953
+ | `disabled` | `boolean` | `false` | Alias de `isDisabled` (mesmo comportamento). |
954
+ | `label` | `string` | `''` | Texto do label. Também aceita conteúdo projetado (`<ng-content>`). |
955
+ | `labelPosition` | `'before' \| 'after'` | `'after'` | Posição do label em relação ao switch. |
956
+ | `name` | `string` | `''` | Atributo `name` do input nativo. |
957
+ | `id` | `string` | `''` | Atributo `id` do input nativo. |
958
+ | `ariaLabel` | `string` | `''` | Atributo `aria-label` do switch. |
959
+ | `required` | `boolean` | `false` | Marca o input como obrigatório. |
960
+ | `dataCy` | `string` | `''` | Atributo para testes E2E com Cypress. |
961
+ | `trackColor` | `string` | `#d1d5db` | Cor do trilho desligado. |
962
+ | `trackCheckedColor` | `string` | `#4f46e5` | Cor do trilho ligado. |
963
+ | `thumbColor` | `string` | `#ffffff` | Cor do thumb desligado. |
964
+ | `thumbCheckedColor` | `string` | `#ffffff` | Cor do thumb ligado. |
965
+ | `disabledTrackColor` | `string` | `#e5e7eb` | Cor do trilho desabilitado. |
966
+ | `disabledThumbColor` | `string` | `#f3f4f6` | Cor do thumb desabilitado. |
967
+ | `labelColor` | `string` | `#111827` | Cor do label. |
968
+ | `disabledLabelColor` | `string` | `#9ca3af` | Cor do label desabilitado. |
969
+ | `focusRingColor` | `string` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco. |
970
+ | `trackWidth` | `string` | `36px` | Largura do trilho. |
971
+ | `trackHeight` | `string` | `20px` | Altura do trilho. |
972
+ | `thumbSize` | `string` | `16px` | Tamanho do thumb. |
973
+ | `animationDuration` | `string` | `200ms` | Duração da animação. |
974
+ | `thumbIcon` | `string` | `''` | Ícone exibido no thumb desligado. Pode ser um nome Lucide ou uma URL de imagem. |
975
+ | `thumbCheckedIcon` | `string` | `''` | Ícone exibido no thumb ligado. Se vazio, usa `thumbIcon`. |
976
+ | `isLucideThumbIcon` | `boolean` | `false` | Interpreta os ícones do thumb como nomes Lucide. Quando `false`, usa `<img>`. |
977
+ | `thumbIconColor` | `string` | `''` | Cor do ícone Lucide no estado desligado. |
978
+ | `thumbCheckedIconColor` | `string` | `''` | Cor do ícone Lucide no estado ligado. Se vazio, usa `thumbIconColor`. |
979
+ | `thumbIconSize` | `string \| number` | `12` | Tamanho do ícone do thumb. |
980
+ | `thumbIconStrokeWidth` | `string \| number` | `2` | Espessura do traço do ícone Lucide. |
981
+
982
+ **Eventos (Outputs)**
983
+
984
+ | Evento | Tipo | Descrição |
985
+ | --- | --- | --- |
986
+ | `checkedChange` | `EventEmitter<boolean>` | Emitido quando o estado muda. |
987
+ | `toggleChange` | `EventEmitter<ICaoSlideToggleChangeEvent>` | Emitido com o novo estado e a origem. |
988
+
989
+ **Métodos**
990
+
991
+ | Método | Descrição |
992
+ | --- | --- |
993
+ | `toggle()` | Alterna o estado, se não estiver desabilitado. |
994
+ | `setChecked(value: boolean)` | Define o estado programaticamente, se não estiver desabilitado. |
995
+ | `enable()` | Habilita o componente. |
996
+ | `disable()` | Desabilita o componente. |
997
+ | `writeValue(value)` | Implementação de `ControlValueAccessor`. |
998
+ | `setDisabledState(isDisabled)` | Implementação de `ControlValueAccessor`. |
999
+
1000
+ **CSS Custom Properties**
1001
+
1002
+ | Propriedade | Padrão | Descrição |
1003
+ | --- | --- | --- |
1004
+ | `--cao-slide-toggle-track` | `#d1d5db` | Cor do trilho desligado. |
1005
+ | `--cao-slide-toggle-track-checked` | `#4f46e5` | Cor do trilho ligado. |
1006
+ | `--cao-slide-toggle-thumb` | `#ffffff` | Cor do thumb desligado. |
1007
+ | `--cao-slide-toggle-thumb-checked` | `#ffffff` | Cor do thumb ligado. |
1008
+ | `--cao-slide-toggle-track-disabled` | `#e5e7eb` | Cor do trilho desabilitado. |
1009
+ | `--cao-slide-toggle-thumb-disabled` | `#f3f4f6` | Cor do thumb desabilitado. |
1010
+ | `--cao-slide-toggle-label` | `#111827` | Cor do label. |
1011
+ | `--cao-slide-toggle-label-disabled` | `#9ca3af` | Cor do label desabilitado. |
1012
+ | `--cao-slide-toggle-focus-ring` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco. |
1013
+ | `--cao-slide-toggle-track-width` | `36px` | Largura do trilho. |
1014
+ | `--cao-slide-toggle-track-height` | `20px` | Altura do trilho. |
1015
+ | `--cao-slide-toggle-thumb-size` | `16px` | Tamanho do thumb. |
1016
+ | `--cao-slide-toggle-duration` | `200ms` | Duração da animação. |
1017
+
1018
+ **Exemplo com `ngModel`:**
1019
+
1020
+ ```html
1021
+ <cao-slide-toggle
1022
+ label="Ativar notificações"
1023
+ [(ngModel)]="notificacoesAtivas"
1024
+ (checkedChange)="onCheckedChange($event)">
1025
+ </cao-slide-toggle>
1026
+ ```
1027
+
1028
+ **Exemplo com formulário reativo e cores customizadas:**
1029
+
1030
+ ```html
1031
+ <cao-slide-toggle
1032
+ label="Modo escuro"
1033
+ [formControl]="modoEscuro"
1034
+ trackCheckedColor="#16a34a"
1035
+ thumbCheckedColor="#ffffff"
1036
+ trackColor="#fca5a5"
1037
+ labelColor="#166534"
1038
+ labelPosition="before">
1039
+ </cao-slide-toggle>
1040
+ ```
1041
+
1042
+ **Exemplo com ícones Lucide no thumb:**
1043
+
1044
+ ```html
1045
+ <cao-slide-toggle
1046
+ label="Notificações"
1047
+ [(ngModel)]="notificacoesAtivas"
1048
+ thumbIcon="x"
1049
+ thumbCheckedIcon="check"
1050
+ [isLucideThumbIcon]="true"
1051
+ thumbIconColor="#6b7280"
1052
+ thumbCheckedIconColor="#16a34a"
1053
+ [thumbIconSize]="12"
1054
+ [thumbIconStrokeWidth]="2.5">
1055
+ </cao-slide-toggle>
1056
+ ```
1057
+
1058
+ **Exemplo com imagem no thumb:**
1059
+
1060
+ ```html
1061
+ <cao-slide-toggle
1062
+ label="Ícone customizado"
1063
+ [(ngModel)]="ativo"
1064
+ thumbIcon="assets/icone-desligado.svg"
1065
+ thumbCheckedIcon="assets/icone-ligado.svg"
1066
+ [isLucideThumbIcon]="false"
1067
+ [thumbIconSize]="10">
1068
+ </cao-slide-toggle>
1069
+ ```
1070
+
1071
+ Se `thumbCheckedIcon` não for informado, o componente reutiliza `thumbIcon` no estado ligado.
1072
+
1073
+ **Exemplo desabilitado programaticamente:**
1074
+
1075
+ ```typescript
1076
+ @ViewChild(CaoSlideToggleComponent)
1077
+ slideToggle!: CaoSlideToggleComponent;
1078
+
1079
+ bloquear(): void {
1080
+ this.slideToggle.disable();
1081
+ }
1082
+
1083
+ liberar(): void {
1084
+ this.slideToggle.enable();
1085
+ }
1086
+ ```
1087
+
1088
+ **Observações:**
1089
+
1090
+ - Usa um `input type="checkbox"` com `role="switch"`, com suporte a `Espaço`, `Enter`, foco visível e leitores de tela.
1091
+ - Funciona com `ngModel`, `formControlName` e `FormControl.disable()`.
1092
+ - As cores podem ser definidas por inputs ou por CSS custom properties.
1093
+
1094
+ ---
1095
+
1096
+ ### `CaoRadioGroupComponent` e `CaoRadioButtonComponent`
1097
+
1098
+ Sistema de radio buttons no estilo do Material, com navegação por teclado, suporte a formulários e customização de cores. O grupo é o dono do valor selecionado; os botões apenas declaram seu `value` e o label.
1099
+
1100
+ **Seletores:**
1101
+ - `<cao-radio-group>` — container do grupo
1102
+ - `<cao-radio-button>` — opção individual (deve ficar dentro do grupo)
1103
+
1104
+ **Interface `ICaoRadioChangeEvent`**
1105
+
1106
+ | Propriedade | Tipo | Descrição |
1107
+ | --- | --- | --- |
1108
+ | `value` | `unknown` | Valor recém-selecionado. |
1109
+ | `source` | `CaoRadioButtonComponent` | Botão que originou o evento. |
1110
+
1111
+ #### Atributos do `CaoRadioGroupComponent` (Inputs)
1112
+
1113
+ | Atributo | Tipo | Padrão | Descrição |
1114
+ | --- | --- | --- | --- |
1115
+ | `value` | `any` | `undefined` | Valor selecionado. Também funciona via `ngModel`/`formControlName`. |
1116
+ | `name` | `string` | gerado automaticamente | Nome compartilhado pelos inputs nativos do grupo. |
1117
+ | `isDisabled` | `boolean` | `false` | Desabilita todas as opções. |
1118
+ | `disabled` | `boolean` | `false` | Alias de `isDisabled`. |
1119
+ | `required` | `boolean` | `false` | Marca o grupo como obrigatório. |
1120
+ | `orientation` | `'vertical' \| 'horizontal'` | `'vertical'` | Direção do layout. |
1121
+ | `labelPosition` | `'before' \| 'after'` | `'after'` | Posição padrão dos labels. |
1122
+ | `color` | `string` | `#4f46e5` | Cor da opção selecionada (borda e ponto). |
1123
+ | `unselectedColor` | `string` | `#6b7280` | Cor da borda da opção não selecionada. |
1124
+ | `disabledColor` | `string` | `#d1d5db` | Cor da opção desabilitada. |
1125
+ | `labelColor` | `string` | `#111827` | Cor dos labels. |
1126
+ | `disabledLabelColor` | `string` | `#9ca3af` | Cor dos labels desabilitados. |
1127
+ | `focusRingColor` | `string` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco. |
1128
+ | `size` | `string` | `20px` | Tamanho do círculo. |
1129
+ | `animationDuration` | `string` | `200ms` | Duração das animações. |
1130
+ | `gap` | `string` | `8px` | Espaçamento entre as opções. |
1131
+ | `compareWith` | `(option, value) => boolean` | `===` | Comparador customizado de valores. |
1132
+ | `ariaLabel` | `string` | `''` | Atributo `aria-label` do grupo. |
1133
+ | `ariaLabelledBy` | `string` | `''` | Atributo `aria-labelledby` do grupo. |
1134
+ | `dataCy` | `string` | `''` | Atributo para testes E2E. |
1135
+
1136
+ #### Eventos do `CaoRadioGroupComponent` (Outputs)
1137
+
1138
+ | Evento | Tipo | Descrição |
1139
+ | --- | --- | --- |
1140
+ | `valueChange` | `EventEmitter<any>` | Emitido quando o valor selecionado muda. |
1141
+ | `selectionChange` | `EventEmitter<ICaoRadioChangeEvent>` | Emitido com o valor e o botão de origem. |
1142
+
1143
+ #### Métodos do `CaoRadioGroupComponent`
1144
+
1145
+ | Método | Descrição |
1146
+ | --- | --- |
1147
+ | `enable()` | Habilita o grupo e todas as opções. |
1148
+ | `disable()` | Desabilita o grupo e todas as opções. |
1149
+ | `isValueSelected(value)` | Verifica se um valor está selecionado usando `compareWith`. |
1150
+ | `markAsTouched()` | Marca o controle como tocado. |
1151
+ | `writeValue(value)` | Implementação de `ControlValueAccessor`. |
1152
+ | `setDisabledState(isDisabled)` | Implementação de `ControlValueAccessor`. |
1153
+
1154
+ #### Atributos do `CaoRadioButtonComponent` (Inputs)
1155
+
1156
+ | Atributo | Tipo | Padrão | Descrição |
1157
+ | --- | --- | --- | --- |
1158
+ | `value` | `any` | `undefined` | **Obrigatório.** Valor único da opção dentro do grupo. |
1159
+ | `label` | `string` | `''` | Texto do label. Também aceita conteúdo projetado. |
1160
+ | `isDisabled` | `boolean` | `false` | Desabilita apenas esta opção. |
1161
+ | `disabled` | `boolean` | `false` | Alias de `isDisabled`. |
1162
+ | `labelPosition` | `'before' \| 'after'` | herda do grupo | Posição do label desta opção. |
1163
+ | `name` | `string` | herda do grupo | Sobrescreve o nome do grupo para esta opção. |
1164
+ | `id` | `string` | gerado automaticamente | Atributo `id` do input. |
1165
+ | `ariaLabel` | `string` | `''` | Atributo `aria-label` da opção. |
1166
+ | `ariaLabelledBy` | `string` | `''` | Atributo `aria-labelledby` da opção. |
1167
+ | `dataCy` | `string` | `''` | Atributo para testes E2E. |
1168
+ | `color` | `string` | herda do grupo | Cor da opção selecionada. |
1169
+ | `unselectedColor` | `string` | herda do grupo | Cor da borda não selecionada. |
1170
+ | `disabledColor` | `string` | herda do grupo | Cor da opção desabilitada. |
1171
+ | `labelColor` | `string` | herda do grupo | Cor do label. |
1172
+ | `disabledLabelColor` | `string` | herda do grupo | Cor do label desabilitado. |
1173
+ | `focusRingColor` | `string` | herda do grupo | Cor do anel de foco. |
1174
+ | `size` | `string` | herda do grupo | Tamanho do círculo. |
1175
+ | `animationDuration` | `string` | herda do grupo | Duração das animações. |
1176
+
1177
+ #### Métodos do `CaoRadioButtonComponent`
1178
+
1179
+ | Método | Descrição |
1180
+ | --- | --- |
1181
+ | `select()` | Seleciona a opção no grupo, se estiver habilitada. |
1182
+ | `enable()` | Habilita apenas esta opção. |
1183
+ | `disable()` | Desabilita apenas esta opção. |
1184
+
1185
+ **CSS Custom Properties**
1186
+
1187
+ | Propriedade | Padrão | Descrição |
1188
+ | --- | --- | --- |
1189
+ | `--cao-radio-color` | `#4f46e5` | Cor da opção selecionada. |
1190
+ | `--cao-radio-unselected` | `#6b7280` | Cor da borda não selecionada. |
1191
+ | `--cao-radio-disabled` | `#d1d5db` | Cor da opção desabilitada. |
1192
+ | `--cao-radio-label` | `#111827` | Cor do label. |
1193
+ | `--cao-radio-label-disabled` | `#9ca3af` | Cor do label desabilitado. |
1194
+ | `--cao-radio-focus-ring` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco. |
1195
+ | `--cao-radio-size` | `20px` | Tamanho do círculo. |
1196
+ | `--cao-radio-duration` | `200ms` | Duração das animações. |
1197
+ | `--cao-radio-gap` | `8px` | Espaçamento entre opções. |
1198
+
1199
+ **Exemplo com `ngModel`:**
1200
+
1201
+ ```html
1202
+ <cao-radio-group [(ngModel)]="planoSelecionado" ariaLabel="Escolha um plano">
1203
+ <cao-radio-button value="basico" label="Básico"></cao-radio-button>
1204
+ <cao-radio-button value="profissional" label="Profissional"></cao-radio-button>
1205
+ <cao-radio-button value="empresarial" label="Empresarial"></cao-radio-button>
1206
+ </cao-radio-group>
1207
+ ```
1208
+
1209
+ **Exemplo com formulário reativo, layout horizontal e cores customizadas:**
1210
+
1211
+ ```html
1212
+ <cao-radio-group
1213
+ [formControl]="periodo"
1214
+ orientation="horizontal"
1215
+ gap="16px"
1216
+ color="#16a34a"
1217
+ unselectedColor="#94a3b8"
1218
+ labelColor="#166534">
1219
+ <cao-radio-button value="manha" label="Manhã"></cao-radio-button>
1220
+ <cao-radio-button value="tarde" label="Tarde"></cao-radio-button>
1221
+ <cao-radio-button value="noite" label="Noite"></cao-radio-button>
1222
+ </cao-radio-group>
1223
+ ```
1224
+
1225
+ **Exemplo com disabled geral e por opção:**
1226
+
1227
+ ```html
1228
+ <cao-radio-group [(ngModel)]="opcao" [isDisabled]="formularioBloqueado">
1229
+ <cao-radio-button value="a" label="Disponível"></cao-radio-button>
1230
+ <cao-radio-button value="b" label="Indisponível" [isDisabled]="true"></cao-radio-button>
1231
+ </cao-radio-group>
1232
+ ```
1233
+
1234
+ **Exemplo com `compareWith` para valores objetos:**
1235
+
1236
+ ```html
1237
+ <cao-radio-group [(ngModel)]="usuarioSelecionado" [compareWith]="compararUsuarios">
1238
+ @for (usuario of usuarios; track usuario.id) {
1239
+ <cao-radio-button [value]="usuario" [label]="usuario.nome"></cao-radio-button>
1240
+ }
1241
+ </cao-radio-group>
1242
+ ```
1243
+
1244
+ ```typescript
1245
+ compararUsuarios(a: Usuario | null, b: Usuario | null): boolean {
1246
+ return a?.id === b?.id;
1247
+ }
1248
+ ```
1249
+
1250
+ **Observações:**
1251
+
1252
+ - Cada `<cao-radio-button>` deve estar dentro de um `<cao-radio-group>`.
1253
+ - O grupo usa `role="radiogroup"` e inputs nativos `type="radio"` com o mesmo `name`, garantindo navegação por setas, foco e leitores de tela.
1254
+ - `FormControl.disable()` desabilita o grupo inteiro, assim como `isDisabled`/`disabled`.
1255
+ - Cores e tamanhos podem ser definidos no grupo (herdados por todas as opções) ou individualmente em cada botão.
1256
+ - Métodos `enable()`/`disable()` permitem controlar o estado programaticamente.
1257
+
1258
+ ---
1259
+
1260
+ ### `CaoCheckboxComponent`
1261
+
1262
+ Um checkbox acessível e customizável no estilo do Material, com suporte a `ngModel` e formulários reativos via `ControlValueAccessor`. Possui os estados marcado, desmarcado e indeterminado, ícones customizáveis e cores configuráveis por inputs ou CSS custom properties. O visual é construído sobre um `input type="checkbox"` nativo oculto, sem depender do Angular Material em runtime.
1263
+
1264
+ **Seletor:** `<cao-checkbox>`
1265
+
1266
+ **Interface `ICaoCheckboxChangeEvent`**
1267
+
1268
+ | Propriedade | Tipo | Descrição |
1269
+ | --- | --- | --- |
1270
+ | `checked` | `boolean` | Novo estado do checkbox. |
1271
+ | `source` | `CaoCheckboxComponent` | Instância que originou o evento. |
1272
+
1273
+ **Atributos (Inputs)**
1274
+
1275
+ | Atributo | Tipo | Padrão | Descrição |
1276
+ | --- | --- | --- | --- |
1277
+ | `checked` | `boolean` | `false` | Estado inicial/atual do checkbox. |
1278
+ | `indeterminate` | `boolean` | `false` | Exibe o estado indeterminado (traço). Tem prioridade sobre `checked`. |
1279
+ | `isDisabled` | `boolean` | `false` | Desabilita o componente. |
1280
+ | `disabled` | `boolean` | `false` | Alias de `isDisabled` (mesmo comportamento). |
1281
+ | `required` | `boolean` | `false` | Marca o input nativo como obrigatório. |
1282
+ | `label` | `string` | `''` | Texto do label. Também aceita conteúdo projetado (`<ng-content>`). |
1283
+ | `labelPosition` | `'before' \| 'after'` | `'after'` | Posição do label em relação ao checkbox. |
1284
+ | `name` | `string` | `''` | Atributo `name` do input nativo. |
1285
+ | `id` | `string` | gerado automaticamente | Atributo `id` do input nativo. |
1286
+ | `ariaLabel` | `string` | `''` | Atributo `aria-label` do input. |
1287
+ | `ariaLabelledBy` | `string` | `''` | Atributo `aria-labelledby` do input. |
1288
+ | `dataCy` | `string` | `''` | Atributo para testes E2E com Cypress. |
1289
+ | `control` | `AbstractControl \| null` | `undefined` | O `FormControl` associado. Usado para exibir os estados de validação. |
1290
+ | `errorMessage` | `string` | `''` | Mensagem de erro. Quando preenchida, aplica o estilo inválido. |
1291
+ | `color` | `string` | `#4f46e5` | Cor de fundo/borda do checkbox marcado ou indeterminado. |
1292
+ | `uncheckedColor` | `string` | `#6b7280` | Cor da borda quando desmarcado. |
1293
+ | `disabledColor` | `string` | `#d1d5db` | Cor do checkbox desabilitado. |
1294
+ | `labelColor` | `string` | `#111827` | Cor do label. |
1295
+ | `disabledLabelColor` | `string` | `#9ca3af` | Cor do label desabilitado. |
1296
+ | `focusRingColor` | `string` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco. |
1297
+ | `size` | `string` | `20px` | Tamanho do checkbox. |
1298
+ | `borderRadius` | `string` | `4px` | Raio da borda do checkbox. |
1299
+ | `animationDuration` | `string` | `200ms` | Duração das animações. |
1300
+ | `checkedIcon` | `string` | `''` | Ícone exibido quando marcado. Se vazio, usa um check SVG padrão. |
1301
+ | `uncheckedIcon` | `string` | `''` | Ícone exibido quando desmarcado. Se vazio, nenhum ícone é exibido. |
1302
+ | `indeterminateIcon` | `string` | `''` | Ícone exibido no estado indeterminado. Se vazio, usa um traço SVG padrão. |
1303
+ | `isLucideIcon` | `boolean` | `false` | Interpreta os ícones como nomes Lucide. Quando `false`, usa `<img>` (URL ou data URI). |
1304
+ | `iconColor` | `string` | `''` | Cor dos ícones Lucide (fallback para todos os estados). |
1305
+ | `checkedIconColor` | `string` | `''` | Cor do ícone quando marcado. Se vazio, usa `iconColor`. |
1306
+ | `uncheckedIconColor` | `string` | `''` | Cor do ícone quando desmarcado. Se vazio, usa `iconColor`. |
1307
+ | `iconSize` | `string \| number` | `14` | Tamanho do ícone. Números são convertidos para `px`. |
1308
+ | `iconStrokeWidth` | `string \| number` | `2.5` | Espessura do traço dos ícones Lucide. |
1309
+
1310
+ **Eventos (Outputs)**
1311
+
1312
+ | Evento | Tipo | Descrição |
1313
+ | --- | --- | --- |
1314
+ | `checkedChange` | `EventEmitter<boolean>` | Emitido quando o estado marcado muda. |
1315
+ | `indeterminateChange` | `EventEmitter<boolean>` | Emitido quando o estado indeterminado muda. |
1316
+ | `checkboxChange` | `EventEmitter<ICaoCheckboxChangeEvent>` | Emitido com o novo estado e a origem. |
1317
+
1318
+ **Métodos**
1319
+
1320
+ | Método | Descrição |
1321
+ | --- | --- |
1322
+ | `toggle()` | Alterna o estado, se não estiver desabilitado. |
1323
+ | `setChecked(value: boolean, emit = true)` | Define o estado programaticamente e limpa `indeterminate`. Passe `false` em `emit` para não disparar os eventos. |
1324
+ | `setIndeterminate(value: boolean)` | Define o estado indeterminado. |
1325
+ | `enable()` | Habilita o componente. |
1326
+ | `disable()` | Desabilita o componente. |
1327
+ | `writeValue(value)` | Implementação de `ControlValueAccessor`. |
1328
+ | `setDisabledState(isDisabled)` | Implementação de `ControlValueAccessor`. |
1329
+
1330
+ **CSS Custom Properties**
1331
+
1332
+ | Propriedade | Padrão | Descrição |
1333
+ | --- | --- | --- |
1334
+ | `--cao-checkbox-color` | `#4f46e5` | Cor do checkbox marcado/indeterminado. |
1335
+ | `--cao-checkbox-unselected` | `#6b7280` | Cor da borda desmarcada. |
1336
+ | `--cao-checkbox-disabled` | `#d1d5db` | Cor do checkbox desabilitado. |
1337
+ | `--cao-checkbox-label` | `#111827` | Cor do label. |
1338
+ | `--cao-checkbox-label-disabled` | `#9ca3af` | Cor do label desabilitado. |
1339
+ | `--cao-checkbox-focus-ring` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco. |
1340
+ | `--cao-checkbox-size` | `20px` | Tamanho do checkbox. |
1341
+ | `--cao-checkbox-radius` | `4px` | Raio da borda. |
1342
+ | `--cao-checkbox-duration` | `200ms` | Duração das animações. |
1343
+ | `--cao-checkbox-icon-size` | `14px` | Tamanho do ícone. |
1344
+ | `--cao-checkbox-icon-color` | `#ffffff` | Cor do ícone. |
1345
+
1346
+ **Exemplo com `ngModel`:**
1347
+
1348
+ ```html
1349
+ <cao-checkbox
1350
+ label="Aceito os termos"
1351
+ [(ngModel)]="aceitoTermos"
1352
+ (checkedChange)="onCheckedChange($event)">
1353
+ </cao-checkbox>
1354
+ ```
1355
+
1356
+ **Exemplo com formulário reativo, validação e estado indeterminado:**
1357
+
1358
+ ```html
1359
+ <cao-checkbox
1360
+ label="Selecionar todos"
1361
+ [formControl]="selecionarTodos"
1362
+ [indeterminate]="algunsSelecionados"
1363
+ [control]="selecionarTodos"
1364
+ errorMessage="Selecione ao menos uma opção">
1365
+ </cao-checkbox>
1366
+ ```
1367
+
1368
+ ```typescript
1369
+ selecionarTodos = new FormControl(false, { validators: Validators.requiredTrue });
1370
+ algunsSelecionados = false;
1371
+ ```
1372
+
1373
+ **Exemplo com cores customizadas e label antes:**
1374
+
1375
+ ```html
1376
+ <cao-checkbox
1377
+ label="Modo escuro"
1378
+ labelPosition="before"
1379
+ color="#16a34a"
1380
+ uncheckedColor="#94a3b8"
1381
+ labelColor="#166534"
1382
+ size="24px"
1383
+ borderRadius="6px">
1384
+ </cao-checkbox>
1385
+ ```
1386
+
1387
+ **Exemplo com ícones Lucide:**
1388
+
1389
+ ```html
1390
+ <cao-checkbox
1391
+ label="Notificações"
1392
+ [(ngModel)]="notificacoesAtivas"
1393
+ checkedIcon="check"
1394
+ indeterminateIcon="minus"
1395
+ uncheckedIcon="x"
1396
+ [isLucideIcon]="true"
1397
+ iconColor="#6b7280"
1398
+ checkedIconColor="#16a34a"
1399
+ [iconSize]="16"
1400
+ [iconStrokeWidth]="2.5">
1401
+ </cao-checkbox>
1402
+ ```
1403
+
1404
+ **Exemplo com imagem/data URI nos ícones:**
1405
+
1406
+ ```html
1407
+ <cao-checkbox
1408
+ label="Ícone customizado"
1409
+ [(ngModel)]="customizado"
1410
+ checkedIcon="assets/icone-marcado.svg"
1411
+ indeterminateIcon="assets/icone-indeterminado.svg"
1412
+ [isLucideIcon]="false"
1413
+ [iconSize]="12">
1414
+ </cao-checkbox>
1415
+ ```
1416
+
1417
+ **Observações:**
1418
+
1419
+ - Usa um `input type="checkbox"` nativo oculto, mantendo clique no label, foco, navegação por teclado e suporte a leitores de tela.
1420
+ - O estado `indeterminate` tem prioridade visual sobre `checked`; ao alternar o checkbox, `indeterminate` é limpo e `indeterminateChange(false)` é emitido.
1421
+ - Funciona com `ngModel`, `formControlName` e `FormControl.disable()`.
1422
+ - Os estados `--invalid` e `--valid` são aplicados quando `control.touched` e o controle está inválido/válido; `errorMessage` também força o estilo inválido.
1423
+ - Para ícones Lucide, registre os ícones usados com `provideLucideIcons` (de `@lucide/angular`). Para imagens, informe uma URL ou data URI e mantenha `isLucideIcon` como `false`.
1424
+ - As cores e dimensões podem ser definidas por inputs ou sobrescritas via CSS custom properties.
1425
+
1426
+ ---
1427
+
931
1428
  ### `DropDown`
932
1429
  Um menu suspenso (dropdown) com busca, que funciona com `ngModel` ou `formControlName`.
933
1430