ngx-opalbytes-components 1.26.0 → 1.28.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/README.md CHANGED
@@ -232,12 +232,14 @@ src/
232
232
  └── lib/
233
233
  └── shared/
234
234
  └── components/
235
- | ├── autocomplete/
235
+ | ├── accordion/
236
+ | ├── accordion-item/
236
237
  | ├── base-button/
237
238
  | ├── base-icon/
238
239
  | ├── base-input/
239
240
  | ├── base-time-range/
240
241
  | ├── base-toggle/
242
+ | ├── checkbox/
241
243
  | ├── drop-down/
242
244
  | ├── footer/
243
245
  | ├── kpi/
@@ -928,6 +930,205 @@ Um componente de alternância (toggle switch) que funciona com `ngModel` ou `for
928
930
  | `inputChange` | `EventEmitter<string>` | Emitido a cada mudança no input. |
929
931
  | `statusChanged` | `EventEmitter<CaoBaseToggleComponent>` | Emitido quando o toggle é alternado. |
930
932
 
933
+ ---
934
+ ### `CaoAccordionComponent` e `CaoAccordionItemComponent`
935
+
936
+ Um accordion (painéis expansíveis) acessível e totalmente customizável, inspirado na API do `CdkAccordion`, mas **sem depender do `@angular/cdk`, do Angular Material ou de qualquer outra biblioteca externa** — usa apenas `@angular/core` e `@angular/common`. Cores, posições, textos e visibilidade são configuráveis por inputs ou por CSS custom properties. A animação de abrir/fechar é feita só com CSS e respeita `prefers-reduced-motion`.
937
+
938
+ **Seletores:**
939
+ - `<cao-accordion>` — container (controla modo único/múltiplo e o tema herdado pelos itens)
940
+ - `<cao-accordion-item>` — painel individual (também pode ser usado isolado, como um cartão expansível)
941
+
942
+ #### Atributos do `CaoAccordionComponent` (Inputs)
943
+
944
+ | Atributo | Tipo | Padrão | Descrição |
945
+ | --- | --- | --- | --- |
946
+ | `multi` | `boolean` | `false` | Permite vários itens expandidos ao mesmo tempo. No modo único, expandir um item recolhe os demais. |
947
+ | `displayMode` | `'default' \| 'flat' \| 'separated'` | `'default'` | `default`: painéis unidos em um único contorno arredondado; `flat`: unidos, sem bordas laterais/cantos; `separated`: cada painel é um cartão separado por `gap`. |
948
+ | `hideToggle` | `boolean` | `false` | Oculta o ícone de expandir/recolher em todos os itens. |
949
+ | `isVisible` | `boolean` | `true` | Exibe ou oculta o accordion inteiro. |
950
+ | `togglePosition` | `'before' \| 'after'` | `'after'` | Posição do ícone em relação ao texto do cabeçalho. |
951
+ | `headerAlign` | `'start' \| 'center' \| 'end'` | `'start'` | Alinhamento do texto do cabeçalho. |
952
+ | `contentAlign` | `'start' \| 'center' \| 'end'` | `'start'` | Alinhamento do texto do conteúdo. |
953
+ | `headerBgColor` | `string` | `#ffffff` | Cor de fundo do cabeçalho. |
954
+ | `headerTextColor` | `string` | `#111827` | Cor do texto do cabeçalho. |
955
+ | `headerHoverBgColor` | `string` | `#f3f4f6` | Cor de fundo do cabeçalho ao passar o mouse. |
956
+ | `headerActiveBgColor` | `string` | cor do cabeçalho | Cor de fundo do cabeçalho do item expandido. |
957
+ | `activeColor` | `string` | `#4f46e5` | Cor do texto/ícone do cabeçalho do item expandido. |
958
+ | `contentBgColor` | `string` | `#ffffff` | Cor de fundo do conteúdo. |
959
+ | `contentTextColor` | `string` | `#374151` | Cor do texto do conteúdo. |
960
+ | `borderColor` | `string` | `#e5e7eb` | Cor das bordas e divisórias. |
961
+ | `disabledColor` | `string` | `#9ca3af` | Cor do texto de itens desabilitados. |
962
+ | `focusRingColor` | `string` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco do teclado. |
963
+ | `iconColor` | `string` | `currentColor` | Cor do ícone de expandir/recolher. |
964
+ | `borderRadius` | `string` | `8px` | Raio da borda. |
965
+ | `gap` | `string` | `8px` | Espaçamento entre os itens (modo `separated`). |
966
+ | `headerPadding` | `string` | `12px 16px` | Padding do cabeçalho. |
967
+ | `contentPadding` | `string` | `16px` | Padding do conteúdo. |
968
+ | `animationDuration` | `string` | `250ms` | Duração da animação. |
969
+ | `dataCy` | `string` | `''` | Atributo `data-cy` para testes E2E. |
970
+
971
+ #### Métodos do `CaoAccordionComponent`
972
+
973
+ | Método | Descrição |
974
+ | --- | --- |
975
+ | `openAll()` | Expande todos os itens. Só tem efeito quando `multi` está ativo. |
976
+ | `closeAll()` | Recolhe todos os itens. |
977
+
978
+ #### Atributos do `CaoAccordionItemComponent` (Inputs)
979
+
980
+ | Atributo | Tipo | Padrão | Descrição |
981
+ | --- | --- | --- | --- |
982
+ | `label` | `string` | `''` | Texto do cabeçalho. |
983
+ | `description` | `string` | `''` | Texto secundário exibido abaixo do `label`. |
984
+ | `expanded` | `boolean` | `false` | Estado de expansão. Suporta two-way binding: `[(expanded)]`. |
985
+ | `isDisabled` | `boolean` | `false` | Desabilita a interação do usuário com o item. |
986
+ | `isVisible` | `boolean` | `true` | Exibe ou oculta o item. |
987
+ | `headingLevel` | `number` | `3` | Nível do heading (`aria-level`) do cabeçalho. |
988
+ | `hideToggle` | `boolean` | herda do accordion | Oculta o ícone neste item. |
989
+ | `togglePosition` | `'before' \| 'after'` | herda do accordion | Posição do ícone neste item. |
990
+ | `headerAlign` | `'start' \| 'center' \| 'end'` | herda do accordion | Alinhamento do cabeçalho neste item. |
991
+ | `headerBgColor` | `string` | herda do accordion | Cor de fundo do cabeçalho deste item. |
992
+ | `headerTextColor` | `string` | herda do accordion | Cor do texto do cabeçalho deste item. |
993
+ | `headerActiveBgColor` | `string` | herda do accordion | Cor de fundo do cabeçalho quando expandido. |
994
+ | `activeColor` | `string` | herda do accordion | Cor do texto/ícone quando expandido. |
995
+ | `contentBgColor` | `string` | herda do accordion | Cor de fundo do conteúdo. |
996
+ | `contentTextColor` | `string` | herda do accordion | Cor do texto do conteúdo. |
997
+ | `borderColor` | `string` | herda do accordion | Cor das bordas. |
998
+ | `iconColor` | `string` | herda do accordion | Cor do ícone. |
999
+ | `dataCy` | `string` | `''` | Atributo `data-cy` para testes E2E (veja abaixo). |
1000
+
1001
+ #### Eventos do `CaoAccordionItemComponent` (Outputs)
1002
+
1003
+ | Evento | Tipo | Descrição |
1004
+ | --- | --- | --- |
1005
+ | `opened` | `output<void>` | Emitido quando o item é expandido. |
1006
+ | `closed` | `output<void>` | Emitido quando o item é recolhido. |
1007
+ | `expandedChange` | `output<boolean>` | Emitido a cada mudança de estado (usado pelo `[(expanded)]`). |
1008
+
1009
+ #### Métodos do `CaoAccordionItemComponent`
1010
+
1011
+ | Método | Descrição |
1012
+ | --- | --- |
1013
+ | `toggle()` | Alterna o estado (ignorado se o item estiver desabilitado). |
1014
+ | `open()` | Expande o item. |
1015
+ | `close()` | Recolhe o item. |
1016
+
1017
+ #### Projeção de conteúdo
1018
+
1019
+ | Recurso | Descrição |
1020
+ | --- | --- |
1021
+ | Slot padrão (`<ng-content />`) | Conteúdo do painel. |
1022
+ | `[caoAccordionHeader]` | Conteúdo extra projetado no cabeçalho, abaixo do `label`/`description` (ex.: badges, status). |
1023
+
1024
+ #### `data-cy` para testes E2E
1025
+
1026
+ Ao informar `dataCy="faq"` em um item, são gerados automaticamente os seletores:
1027
+
1028
+ | Elemento | Atributo |
1029
+ | --- | --- |
1030
+ | Item (host) | `data-cy="faq"` |
1031
+ | Botão do cabeçalho | `data-cy="faq-header"` |
1032
+ | Painel de conteúdo | `data-cy="faq-content"` |
1033
+
1034
+ ```typescript
1035
+ cy.get('[data-cy="faq-header"]').click();
1036
+ cy.get('[data-cy="faq-content"]').should('be.visible');
1037
+ ```
1038
+
1039
+ #### CSS Custom Properties
1040
+
1041
+ Podem ser definidas globalmente, por accordion ou por item (têm precedência sobre os valores padrão, e os inputs equivalentes as definem automaticamente).
1042
+
1043
+ | Propriedade | Padrão | Descrição |
1044
+ | --- | --- | --- |
1045
+ | `--cao-accordion-header-bg` | `#ffffff` | Fundo do cabeçalho. |
1046
+ | `--cao-accordion-header-text` | `#111827` | Texto do cabeçalho. |
1047
+ | `--cao-accordion-header-hover-bg` | `#f3f4f6` | Fundo do cabeçalho no hover. |
1048
+ | `--cao-accordion-header-active-bg` | `var(--cao-accordion-header-bg)` | Fundo do cabeçalho expandido. |
1049
+ | `--cao-accordion-active-color` | `#4f46e5` | Texto/ícone do cabeçalho expandido. |
1050
+ | `--cao-accordion-content-bg` | `#ffffff` | Fundo do conteúdo. |
1051
+ | `--cao-accordion-content-text` | `#374151` | Texto do conteúdo. |
1052
+ | `--cao-accordion-border-color` | `#e5e7eb` | Bordas e divisórias. |
1053
+ | `--cao-accordion-disabled-color` | `#9ca3af` | Texto desabilitado. |
1054
+ | `--cao-accordion-focus-ring` | `rgba(79, 70, 229, 0.35)` | Anel de foco. |
1055
+ | `--cao-accordion-icon-color` | `currentColor` | Cor do ícone. |
1056
+ | `--cao-accordion-radius` | `8px` | Raio da borda. |
1057
+ | `--cao-accordion-gap` | `8px` | Espaço entre itens (`separated`). |
1058
+ | `--cao-accordion-header-padding` | `12px 16px` | Padding do cabeçalho. |
1059
+ | `--cao-accordion-content-padding` | `16px` | Padding do conteúdo. |
1060
+ | `--cao-accordion-header-align` | `start` | Alinhamento do texto do cabeçalho. |
1061
+ | `--cao-accordion-content-align` | `start` | Alinhamento do texto do conteúdo. |
1062
+ | `--cao-accordion-duration` | `250ms` | Duração da animação. |
1063
+
1064
+ **Exemplo básico:**
1065
+
1066
+ ```typescript
1067
+ import { Component } from '@angular/core';
1068
+ import { CaoAccordionComponent, CaoAccordionItemComponent } from 'ngx-opalbytes-components';
1069
+
1070
+ @Component({
1071
+ selector: 'app-faq',
1072
+ imports: [CaoAccordionComponent, CaoAccordionItemComponent],
1073
+ template: `
1074
+ <cao-accordion dataCy="faq-accordion">
1075
+ <cao-accordion-item label="Como funciona?" dataCy="faq-1" [expanded]="true">
1076
+ Conteúdo da primeira pergunta.
1077
+ </cao-accordion-item>
1078
+ <cao-accordion-item label="Posso cancelar?" description="Sem multa" dataCy="faq-2">
1079
+ Conteúdo da segunda pergunta.
1080
+ </cao-accordion-item>
1081
+ </cao-accordion>
1082
+ `,
1083
+ })
1084
+ export class FaqComponent {}
1085
+ ```
1086
+
1087
+ **Exemplo com múltiplos itens abertos, cores, ícone antes do texto e controle externo:**
1088
+
1089
+ ```html
1090
+ <cao-accordion
1091
+ #acc
1092
+ [multi]="true"
1093
+ displayMode="separated"
1094
+ togglePosition="before"
1095
+ headerAlign="center"
1096
+ headerBgColor="#eef2ff"
1097
+ headerTextColor="#312e81"
1098
+ activeColor="#16a34a"
1099
+ contentBgColor="#ffffff"
1100
+ borderColor="#c7d2fe"
1101
+ borderRadius="12px"
1102
+ animationDuration="400ms"
1103
+ dataCy="meu-accordion">
1104
+
1105
+ <cao-accordion-item label="Dados pessoais" [(expanded)]="dadosAbertos" (opened)="onAbriu()" (closed)="onFechou()">
1106
+ ...
1107
+ </cao-accordion-item>
1108
+
1109
+ <cao-accordion-item label="Pagamento" [isDisabled]="semPermissao" headerBgColor="#fef3c7">
1110
+ <span caoAccordionHeader>Pendente</span>
1111
+ ...
1112
+ </cao-accordion-item>
1113
+
1114
+ <cao-accordion-item label="Somente admin" [isVisible]="ehAdmin" [hideToggle]="true">
1115
+ ...
1116
+ </cao-accordion-item>
1117
+ </cao-accordion>
1118
+
1119
+ <cao-button buttonText="Abrir todos" (buttonClick)="acc.openAll()"></cao-button>
1120
+ <cao-button buttonText="Fechar todos" (buttonClick)="acc.closeAll()"></cao-button>
1121
+ ```
1122
+
1123
+ **Observações:**
1124
+
1125
+ - Sem dependências externas: não usa `@angular/cdk`, `@angular/material`, `@lucide/angular` nem `ngx-mask`; o ícone é um SVG inline.
1126
+ - Acessibilidade: o cabeçalho é um `<button>` dentro de um `role="heading"`, com `aria-expanded`, `aria-controls` e painel `role="region"` com `aria-labelledby`. Painéis recolhidos ficam fora da ordem de tabulação e do leitor de tela.
1127
+ - Teclado: `Enter`/`Espaço` alternam o item; `↑`/`↓` movem o foco entre cabeçalhos; `Home`/`End` vão ao primeiro/último.
1128
+ - Itens definidos como `isDisabled` bloqueiam apenas a interação do usuário; `open()`, `close()` e `[expanded]` continuam funcionando programaticamente.
1129
+ - Os inputs do `<cao-accordion-item>` sobrescrevem os do `<cao-accordion>` apenas naquele item.
1130
+ - Fora de um `<cao-accordion>`, o item se comporta como um cartão expansível independente.
1131
+
931
1132
  ---
932
1133
 
933
1134
  ### `CaoSlideToggleComponent`
@@ -1256,6 +1457,174 @@ compararUsuarios(a: Usuario | null, b: Usuario | null): boolean {
1256
1457
 
1257
1458
  ---
1258
1459
 
1460
+ ### `CaoCheckboxComponent`
1461
+
1462
+ 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.
1463
+
1464
+ **Seletor:** `<cao-checkbox>`
1465
+
1466
+ **Interface `ICaoCheckboxChangeEvent`**
1467
+
1468
+ | Propriedade | Tipo | Descrição |
1469
+ | --- | --- | --- |
1470
+ | `checked` | `boolean` | Novo estado do checkbox. |
1471
+ | `source` | `CaoCheckboxComponent` | Instância que originou o evento. |
1472
+
1473
+ **Atributos (Inputs)**
1474
+
1475
+ | Atributo | Tipo | Padrão | Descrição |
1476
+ | --- | --- | --- | --- |
1477
+ | `checked` | `boolean` | `false` | Estado inicial/atual do checkbox. |
1478
+ | `indeterminate` | `boolean` | `false` | Exibe o estado indeterminado (traço). Tem prioridade sobre `checked`. |
1479
+ | `isDisabled` | `boolean` | `false` | Desabilita o componente. |
1480
+ | `disabled` | `boolean` | `false` | Alias de `isDisabled` (mesmo comportamento). |
1481
+ | `required` | `boolean` | `false` | Marca o input nativo como obrigatório. |
1482
+ | `label` | `string` | `''` | Texto do label. Também aceita conteúdo projetado (`<ng-content>`). |
1483
+ | `labelPosition` | `'before' \| 'after'` | `'after'` | Posição do label em relação ao checkbox. |
1484
+ | `name` | `string` | `''` | Atributo `name` do input nativo. |
1485
+ | `id` | `string` | gerado automaticamente | Atributo `id` do input nativo. |
1486
+ | `ariaLabel` | `string` | `''` | Atributo `aria-label` do input. |
1487
+ | `ariaLabelledBy` | `string` | `''` | Atributo `aria-labelledby` do input. |
1488
+ | `dataCy` | `string` | `''` | Atributo para testes E2E com Cypress. |
1489
+ | `control` | `AbstractControl \| null` | `undefined` | O `FormControl` associado. Usado para exibir os estados de validação. |
1490
+ | `errorMessage` | `string` | `''` | Mensagem de erro. Quando preenchida, aplica o estilo inválido. |
1491
+ | `color` | `string` | `#4f46e5` | Cor de fundo/borda do checkbox marcado ou indeterminado. |
1492
+ | `uncheckedColor` | `string` | `#6b7280` | Cor da borda quando desmarcado. |
1493
+ | `disabledColor` | `string` | `#d1d5db` | Cor do checkbox desabilitado. |
1494
+ | `labelColor` | `string` | `#111827` | Cor do label. |
1495
+ | `disabledLabelColor` | `string` | `#9ca3af` | Cor do label desabilitado. |
1496
+ | `focusRingColor` | `string` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco. |
1497
+ | `size` | `string` | `20px` | Tamanho do checkbox. |
1498
+ | `borderRadius` | `string` | `4px` | Raio da borda do checkbox. |
1499
+ | `animationDuration` | `string` | `200ms` | Duração das animações. |
1500
+ | `checkedIcon` | `string` | `''` | Ícone exibido quando marcado. Se vazio, usa um check SVG padrão. |
1501
+ | `uncheckedIcon` | `string` | `''` | Ícone exibido quando desmarcado. Se vazio, nenhum ícone é exibido. |
1502
+ | `indeterminateIcon` | `string` | `''` | Ícone exibido no estado indeterminado. Se vazio, usa um traço SVG padrão. |
1503
+ | `isLucideIcon` | `boolean` | `false` | Interpreta os ícones como nomes Lucide. Quando `false`, usa `<img>` (URL ou data URI). |
1504
+ | `iconColor` | `string` | `''` | Cor dos ícones Lucide (fallback para todos os estados). |
1505
+ | `checkedIconColor` | `string` | `''` | Cor do ícone quando marcado. Se vazio, usa `iconColor`. |
1506
+ | `uncheckedIconColor` | `string` | `''` | Cor do ícone quando desmarcado. Se vazio, usa `iconColor`. |
1507
+ | `iconSize` | `string \| number` | `14` | Tamanho do ícone. Números são convertidos para `px`. |
1508
+ | `iconStrokeWidth` | `string \| number` | `2.5` | Espessura do traço dos ícones Lucide. |
1509
+
1510
+ **Eventos (Outputs)**
1511
+
1512
+ | Evento | Tipo | Descrição |
1513
+ | --- | --- | --- |
1514
+ | `checkedChange` | `EventEmitter<boolean>` | Emitido quando o estado marcado muda. |
1515
+ | `indeterminateChange` | `EventEmitter<boolean>` | Emitido quando o estado indeterminado muda. |
1516
+ | `checkboxChange` | `EventEmitter<ICaoCheckboxChangeEvent>` | Emitido com o novo estado e a origem. |
1517
+
1518
+ **Métodos**
1519
+
1520
+ | Método | Descrição |
1521
+ | --- | --- |
1522
+ | `toggle()` | Alterna o estado, se não estiver desabilitado. |
1523
+ | `setChecked(value: boolean, emit = true)` | Define o estado programaticamente e limpa `indeterminate`. Passe `false` em `emit` para não disparar os eventos. |
1524
+ | `setIndeterminate(value: boolean)` | Define o estado indeterminado. |
1525
+ | `enable()` | Habilita o componente. |
1526
+ | `disable()` | Desabilita o componente. |
1527
+ | `writeValue(value)` | Implementação de `ControlValueAccessor`. |
1528
+ | `setDisabledState(isDisabled)` | Implementação de `ControlValueAccessor`. |
1529
+
1530
+ **CSS Custom Properties**
1531
+
1532
+ | Propriedade | Padrão | Descrição |
1533
+ | --- | --- | --- |
1534
+ | `--cao-checkbox-color` | `#4f46e5` | Cor do checkbox marcado/indeterminado. |
1535
+ | `--cao-checkbox-unselected` | `#6b7280` | Cor da borda desmarcada. |
1536
+ | `--cao-checkbox-disabled` | `#d1d5db` | Cor do checkbox desabilitado. |
1537
+ | `--cao-checkbox-label` | `#111827` | Cor do label. |
1538
+ | `--cao-checkbox-label-disabled` | `#9ca3af` | Cor do label desabilitado. |
1539
+ | `--cao-checkbox-focus-ring` | `rgba(79, 70, 229, 0.35)` | Cor do anel de foco. |
1540
+ | `--cao-checkbox-size` | `20px` | Tamanho do checkbox. |
1541
+ | `--cao-checkbox-radius` | `4px` | Raio da borda. |
1542
+ | `--cao-checkbox-duration` | `200ms` | Duração das animações. |
1543
+ | `--cao-checkbox-icon-size` | `14px` | Tamanho do ícone. |
1544
+ | `--cao-checkbox-icon-color` | `#ffffff` | Cor do ícone. |
1545
+
1546
+ **Exemplo com `ngModel`:**
1547
+
1548
+ ```html
1549
+ <cao-checkbox
1550
+ label="Aceito os termos"
1551
+ [(ngModel)]="aceitoTermos"
1552
+ (checkedChange)="onCheckedChange($event)">
1553
+ </cao-checkbox>
1554
+ ```
1555
+
1556
+ **Exemplo com formulário reativo, validação e estado indeterminado:**
1557
+
1558
+ ```html
1559
+ <cao-checkbox
1560
+ label="Selecionar todos"
1561
+ [formControl]="selecionarTodos"
1562
+ [indeterminate]="algunsSelecionados"
1563
+ [control]="selecionarTodos"
1564
+ errorMessage="Selecione ao menos uma opção">
1565
+ </cao-checkbox>
1566
+ ```
1567
+
1568
+ ```typescript
1569
+ selecionarTodos = new FormControl(false, { validators: Validators.requiredTrue });
1570
+ algunsSelecionados = false;
1571
+ ```
1572
+
1573
+ **Exemplo com cores customizadas e label antes:**
1574
+
1575
+ ```html
1576
+ <cao-checkbox
1577
+ label="Modo escuro"
1578
+ labelPosition="before"
1579
+ color="#16a34a"
1580
+ uncheckedColor="#94a3b8"
1581
+ labelColor="#166534"
1582
+ size="24px"
1583
+ borderRadius="6px">
1584
+ </cao-checkbox>
1585
+ ```
1586
+
1587
+ **Exemplo com ícones Lucide:**
1588
+
1589
+ ```html
1590
+ <cao-checkbox
1591
+ label="Notificações"
1592
+ [(ngModel)]="notificacoesAtivas"
1593
+ checkedIcon="check"
1594
+ indeterminateIcon="minus"
1595
+ uncheckedIcon="x"
1596
+ [isLucideIcon]="true"
1597
+ iconColor="#6b7280"
1598
+ checkedIconColor="#16a34a"
1599
+ [iconSize]="16"
1600
+ [iconStrokeWidth]="2.5">
1601
+ </cao-checkbox>
1602
+ ```
1603
+
1604
+ **Exemplo com imagem/data URI nos ícones:**
1605
+
1606
+ ```html
1607
+ <cao-checkbox
1608
+ label="Ícone customizado"
1609
+ [(ngModel)]="customizado"
1610
+ checkedIcon="assets/icone-marcado.svg"
1611
+ indeterminateIcon="assets/icone-indeterminado.svg"
1612
+ [isLucideIcon]="false"
1613
+ [iconSize]="12">
1614
+ </cao-checkbox>
1615
+ ```
1616
+
1617
+ **Observações:**
1618
+
1619
+ - Usa um `input type="checkbox"` nativo oculto, mantendo clique no label, foco, navegação por teclado e suporte a leitores de tela.
1620
+ - O estado `indeterminate` tem prioridade visual sobre `checked`; ao alternar o checkbox, `indeterminate` é limpo e `indeterminateChange(false)` é emitido.
1621
+ - Funciona com `ngModel`, `formControlName` e `FormControl.disable()`.
1622
+ - 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.
1623
+ - 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`.
1624
+ - As cores e dimensões podem ser definidas por inputs ou sobrescritas via CSS custom properties.
1625
+
1626
+ ---
1627
+
1259
1628
  ### `DropDown`
1260
1629
  Um menu suspenso (dropdown) com busca, que funciona com `ngModel` ou `formControlName`.
1261
1630