ngx-opalbytes-components 1.27.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,7 +232,8 @@ 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/
@@ -929,6 +930,205 @@ Um componente de alternância (toggle switch) que funciona com `ngModel` ou `for
929
930
  | `inputChange` | `EventEmitter<string>` | Emitido a cada mudança no input. |
930
931
  | `statusChanged` | `EventEmitter<CaoBaseToggleComponent>` | Emitido quando o toggle é alternado. |
931
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
+
932
1132
  ---
933
1133
 
934
1134
  ### `CaoSlideToggleComponent`
@@ -1,7 +1,7 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, ElementRef, input, computed, forwardRef, HostListener, HostBinding, ChangeDetectionStrategy, Component, DestroyRef, model, output, effect, untracked, EventEmitter, Input, Output, ViewChild, ChangeDetectorRef, Renderer2, ViewContainerRef, ViewEncapsulation, NgModule, ContentChildren, Directive, TemplateRef, ContentChild, signal, PLATFORM_ID, ViewChildren, Optional, Inject, Injectable } from '@angular/core';
1
3
  import * as i1 from '@angular/common';
2
4
  import { CommonModule, isPlatformBrowser, NgTemplateOutlet, NgOptimizedImage } from '@angular/common';
3
- import * as i0 from '@angular/core';
4
- import { EventEmitter, Input, Output, Component, ViewChild, inject, ElementRef, ChangeDetectorRef, Renderer2, ViewContainerRef, forwardRef, HostListener, ChangeDetectionStrategy, ViewEncapsulation, NgModule, ContentChildren, Directive, TemplateRef, ContentChild, signal, PLATFORM_ID, ViewChildren, HostBinding, input, computed, Optional, Inject, Injectable, output, DestroyRef } from '@angular/core';
5
5
  import * as i3 from '@angular/material/tooltip';
6
6
  import { MatTooltipModule, MatTooltip } from '@angular/material/tooltip';
7
7
  import { LucideDynamicIcon } from '@lucide/angular';
@@ -60,6 +60,297 @@ import { MatTreeModule } from '@angular/material/tree';
60
60
  import { LiveAnnouncer } from '@angular/cdk/a11y';
61
61
  import { SelectionModel } from '@angular/cdk/collections';
62
62
 
63
+ const CAO_ACCORDION = new InjectionToken('CAO_ACCORDION');
64
+
65
+ const HEADER_SELECTOR = '.cao-accordion-item__header:not(:disabled)';
66
+ /**
67
+ * Container de `<cao-accordion-item>`. Controla o modo de expansão (único ou múltiplo),
68
+ * a navegação por teclado e o tema (cores, posições e visibilidade) herdado pelos itens.
69
+ */
70
+ class CaoAccordionComponent {
71
+ host = inject(ElementRef);
72
+ items = new Set();
73
+ // ----- Comportamento -----
74
+ /** Permite vários itens expandidos ao mesmo tempo. */
75
+ multi = input(false, ...(ngDevMode ? [{ debugName: "multi" }] : []));
76
+ /** Oculta o ícone de expandir/recolher em todos os itens (cada item pode sobrescrever). */
77
+ hideToggle = input(false, ...(ngDevMode ? [{ debugName: "hideToggle" }] : []));
78
+ /** Exibe ou oculta o accordion inteiro. */
79
+ isVisible = input(true, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
80
+ /** Atributo `data-cy` para testes E2E. */
81
+ dataCy = input('', ...(ngDevMode ? [{ debugName: "dataCy" }] : []));
82
+ // ----- Posição / layout -----
83
+ togglePosition = input('after', ...(ngDevMode ? [{ debugName: "togglePosition" }] : []));
84
+ headerAlign = input('start', ...(ngDevMode ? [{ debugName: "headerAlign" }] : []));
85
+ contentAlign = input('start', ...(ngDevMode ? [{ debugName: "contentAlign" }] : []));
86
+ displayMode = input('default', ...(ngDevMode ? [{ debugName: "displayMode" }] : []));
87
+ // ----- Cores -----
88
+ headerBgColor = input('', ...(ngDevMode ? [{ debugName: "headerBgColor" }] : []));
89
+ headerTextColor = input('', ...(ngDevMode ? [{ debugName: "headerTextColor" }] : []));
90
+ headerHoverBgColor = input('', ...(ngDevMode ? [{ debugName: "headerHoverBgColor" }] : []));
91
+ headerActiveBgColor = input('', ...(ngDevMode ? [{ debugName: "headerActiveBgColor" }] : []));
92
+ activeColor = input('', ...(ngDevMode ? [{ debugName: "activeColor" }] : []));
93
+ contentBgColor = input('', ...(ngDevMode ? [{ debugName: "contentBgColor" }] : []));
94
+ contentTextColor = input('', ...(ngDevMode ? [{ debugName: "contentTextColor" }] : []));
95
+ borderColor = input('', ...(ngDevMode ? [{ debugName: "borderColor" }] : []));
96
+ disabledColor = input('', ...(ngDevMode ? [{ debugName: "disabledColor" }] : []));
97
+ focusRingColor = input('', ...(ngDevMode ? [{ debugName: "focusRingColor" }] : []));
98
+ iconColor = input('', ...(ngDevMode ? [{ debugName: "iconColor" }] : []));
99
+ // ----- Dimensões / animação -----
100
+ borderRadius = input('', ...(ngDevMode ? [{ debugName: "borderRadius" }] : []));
101
+ gap = input('', ...(ngDevMode ? [{ debugName: "gap" }] : []));
102
+ headerPadding = input('', ...(ngDevMode ? [{ debugName: "headerPadding" }] : []));
103
+ contentPadding = input('', ...(ngDevMode ? [{ debugName: "contentPadding" }] : []));
104
+ animationDuration = input('', ...(ngDevMode ? [{ debugName: "animationDuration" }] : []));
105
+ hostStyle = computed(() => ({
106
+ '--cao-accordion-header-bg': this.headerBgColor() || null,
107
+ '--cao-accordion-header-text': this.headerTextColor() || null,
108
+ '--cao-accordion-header-hover-bg': this.headerHoverBgColor() || null,
109
+ '--cao-accordion-header-active-bg': this.headerActiveBgColor() || null,
110
+ '--cao-accordion-active-color': this.activeColor() || null,
111
+ '--cao-accordion-content-bg': this.contentBgColor() || null,
112
+ '--cao-accordion-content-text': this.contentTextColor() || null,
113
+ '--cao-accordion-border-color': this.borderColor() || null,
114
+ '--cao-accordion-disabled-color': this.disabledColor() || null,
115
+ '--cao-accordion-focus-ring': this.focusRingColor() || null,
116
+ '--cao-accordion-icon-color': this.iconColor() || null,
117
+ '--cao-accordion-radius': this.borderRadius() || null,
118
+ '--cao-accordion-gap': this.gap() || null,
119
+ '--cao-accordion-header-padding': this.headerPadding() || null,
120
+ '--cao-accordion-content-padding': this.contentPadding() || null,
121
+ '--cao-accordion-duration': this.animationDuration() || null,
122
+ '--cao-accordion-content-align': this.contentAlign(),
123
+ }), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
124
+ get styleBinding() {
125
+ return this.hostStyle();
126
+ }
127
+ get dataCyAttr() {
128
+ return this.dataCy() || null;
129
+ }
130
+ get hiddenClass() {
131
+ return !this.isVisible();
132
+ }
133
+ get defaultModeClass() {
134
+ return this.displayMode() === 'default';
135
+ }
136
+ get flatModeClass() {
137
+ return this.displayMode() === 'flat';
138
+ }
139
+ get separatedModeClass() {
140
+ return this.displayMode() === 'separated';
141
+ }
142
+ /** Expande todos os itens. Só tem efeito quando `multi` está ativo. */
143
+ openAll() {
144
+ if (!this.multi()) {
145
+ return;
146
+ }
147
+ this.items.forEach((item) => item.open());
148
+ }
149
+ /** Recolhe todos os itens. */
150
+ closeAll() {
151
+ this.items.forEach((item) => item.close());
152
+ }
153
+ register(item) {
154
+ this.items.add(item);
155
+ }
156
+ unregister(item) {
157
+ this.items.delete(item);
158
+ }
159
+ /** Chamado pelos itens ao expandir: no modo único, recolhe os demais. */
160
+ notifyOpened(item) {
161
+ if (this.multi()) {
162
+ return;
163
+ }
164
+ this.items.forEach((other) => {
165
+ if (other !== item && other.expanded()) {
166
+ other.close();
167
+ }
168
+ });
169
+ }
170
+ /** Navegação por teclado entre cabeçalhos: ↑ ↓ Home End. */
171
+ onKeydown(event) {
172
+ const root = this.host.nativeElement;
173
+ const target = event.target;
174
+ if (!target?.classList.contains('cao-accordion-item__header') || target.closest('cao-accordion') !== root) {
175
+ return;
176
+ }
177
+ const headers = Array.from(root.querySelectorAll(HEADER_SELECTOR)).filter((header) => header.closest('cao-accordion') === root && !header.closest('.cao-accordion-item--hidden'));
178
+ const current = headers.indexOf(target);
179
+ const last = headers.length - 1;
180
+ let next;
181
+ switch (event.key) {
182
+ case 'ArrowDown':
183
+ next = current >= last ? 0 : current + 1;
184
+ break;
185
+ case 'ArrowUp':
186
+ next = current <= 0 ? last : current - 1;
187
+ break;
188
+ case 'Home':
189
+ next = 0;
190
+ break;
191
+ case 'End':
192
+ next = last;
193
+ break;
194
+ default:
195
+ return;
196
+ }
197
+ event.preventDefault();
198
+ headers[next]?.focus();
199
+ }
200
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
201
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: CaoAccordionComponent, isStandalone: true, selector: "cao-accordion", inputs: { multi: { classPropertyName: "multi", publicName: "multi", isSignal: true, isRequired: false, transformFunction: null }, hideToggle: { classPropertyName: "hideToggle", publicName: "hideToggle", isSignal: true, isRequired: false, transformFunction: null }, isVisible: { classPropertyName: "isVisible", publicName: "isVisible", isSignal: true, isRequired: false, transformFunction: null }, dataCy: { classPropertyName: "dataCy", publicName: "dataCy", isSignal: true, isRequired: false, transformFunction: null }, togglePosition: { classPropertyName: "togglePosition", publicName: "togglePosition", isSignal: true, isRequired: false, transformFunction: null }, headerAlign: { classPropertyName: "headerAlign", publicName: "headerAlign", isSignal: true, isRequired: false, transformFunction: null }, contentAlign: { classPropertyName: "contentAlign", publicName: "contentAlign", isSignal: true, isRequired: false, transformFunction: null }, displayMode: { classPropertyName: "displayMode", publicName: "displayMode", isSignal: true, isRequired: false, transformFunction: null }, headerBgColor: { classPropertyName: "headerBgColor", publicName: "headerBgColor", isSignal: true, isRequired: false, transformFunction: null }, headerTextColor: { classPropertyName: "headerTextColor", publicName: "headerTextColor", isSignal: true, isRequired: false, transformFunction: null }, headerHoverBgColor: { classPropertyName: "headerHoverBgColor", publicName: "headerHoverBgColor", isSignal: true, isRequired: false, transformFunction: null }, headerActiveBgColor: { classPropertyName: "headerActiveBgColor", publicName: "headerActiveBgColor", isSignal: true, isRequired: false, transformFunction: null }, activeColor: { classPropertyName: "activeColor", publicName: "activeColor", isSignal: true, isRequired: false, transformFunction: null }, contentBgColor: { classPropertyName: "contentBgColor", publicName: "contentBgColor", isSignal: true, isRequired: false, transformFunction: null }, contentTextColor: { classPropertyName: "contentTextColor", publicName: "contentTextColor", isSignal: true, isRequired: false, transformFunction: null }, borderColor: { classPropertyName: "borderColor", publicName: "borderColor", isSignal: true, isRequired: false, transformFunction: null }, disabledColor: { classPropertyName: "disabledColor", publicName: "disabledColor", isSignal: true, isRequired: false, transformFunction: null }, focusRingColor: { classPropertyName: "focusRingColor", publicName: "focusRingColor", isSignal: true, isRequired: false, transformFunction: null }, iconColor: { classPropertyName: "iconColor", publicName: "iconColor", isSignal: true, isRequired: false, transformFunction: null }, borderRadius: { classPropertyName: "borderRadius", publicName: "borderRadius", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, headerPadding: { classPropertyName: "headerPadding", publicName: "headerPadding", isSignal: true, isRequired: false, transformFunction: null }, contentPadding: { classPropertyName: "contentPadding", publicName: "contentPadding", isSignal: true, isRequired: false, transformFunction: null }, animationDuration: { classPropertyName: "animationDuration", publicName: "animationDuration", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "style": "this.styleBinding", "attr.data-cy": "this.dataCyAttr", "class.cao-accordion--hidden": "this.hiddenClass", "class.cao-accordion--default": "this.defaultModeClass", "class.cao-accordion--flat": "this.flatModeClass", "class.cao-accordion--separated": "this.separatedModeClass" } }, providers: [{ provide: CAO_ACCORDION, useExisting: forwardRef(() => CaoAccordionComponent) }], ngImport: i0, template: "<ng-content />", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host(.cao-accordion--hidden){display:none}:host(.cao-accordion--default){gap:1px;background:var(--cao-accordion-border-color, #e5e7eb);border:1px solid var(--cao-accordion-border-color, #e5e7eb);border-radius:var(--cao-accordion-radius, 8px);overflow:hidden}:host(.cao-accordion--flat){gap:1px;background:var(--cao-accordion-border-color, #e5e7eb);border-top:1px solid var(--cao-accordion-border-color, #e5e7eb);border-bottom:1px solid var(--cao-accordion-border-color, #e5e7eb)}:host(.cao-accordion--separated){gap:var(--cao-accordion-gap, 8px)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
202
+ }
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoAccordionComponent, decorators: [{
204
+ type: Component,
205
+ args: [{ selector: 'cao-accordion', changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: CAO_ACCORDION, useExisting: forwardRef(() => CaoAccordionComponent) }], template: "<ng-content />", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host(.cao-accordion--hidden){display:none}:host(.cao-accordion--default){gap:1px;background:var(--cao-accordion-border-color, #e5e7eb);border:1px solid var(--cao-accordion-border-color, #e5e7eb);border-radius:var(--cao-accordion-radius, 8px);overflow:hidden}:host(.cao-accordion--flat){gap:1px;background:var(--cao-accordion-border-color, #e5e7eb);border-top:1px solid var(--cao-accordion-border-color, #e5e7eb);border-bottom:1px solid var(--cao-accordion-border-color, #e5e7eb)}:host(.cao-accordion--separated){gap:var(--cao-accordion-gap, 8px)}\n"] }]
206
+ }], propDecorators: { multi: [{ type: i0.Input, args: [{ isSignal: true, alias: "multi", required: false }] }], hideToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideToggle", required: false }] }], isVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "isVisible", required: false }] }], dataCy: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataCy", required: false }] }], togglePosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "togglePosition", required: false }] }], headerAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerAlign", required: false }] }], contentAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentAlign", required: false }] }], displayMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayMode", required: false }] }], headerBgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerBgColor", required: false }] }], headerTextColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTextColor", required: false }] }], headerHoverBgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerHoverBgColor", required: false }] }], headerActiveBgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerActiveBgColor", required: false }] }], activeColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeColor", required: false }] }], contentBgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentBgColor", required: false }] }], contentTextColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentTextColor", required: false }] }], borderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderColor", required: false }] }], disabledColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledColor", required: false }] }], focusRingColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusRingColor", required: false }] }], iconColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconColor", required: false }] }], borderRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderRadius", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], headerPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerPadding", required: false }] }], contentPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPadding", required: false }] }], animationDuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "animationDuration", required: false }] }], styleBinding: [{
207
+ type: HostBinding,
208
+ args: ['style']
209
+ }], dataCyAttr: [{
210
+ type: HostBinding,
211
+ args: ['attr.data-cy']
212
+ }], hiddenClass: [{
213
+ type: HostBinding,
214
+ args: ['class.cao-accordion--hidden']
215
+ }], defaultModeClass: [{
216
+ type: HostBinding,
217
+ args: ['class.cao-accordion--default']
218
+ }], flatModeClass: [{
219
+ type: HostBinding,
220
+ args: ['class.cao-accordion--flat']
221
+ }], separatedModeClass: [{
222
+ type: HostBinding,
223
+ args: ['class.cao-accordion--separated']
224
+ }], onKeydown: [{
225
+ type: HostListener,
226
+ args: ['keydown', ['$event']]
227
+ }] } });
228
+
229
+ let nextId = 0;
230
+ /**
231
+ * Item do accordion. Pode ser usado dentro de `<cao-accordion>` ou isolado (como um cartão expansível).
232
+ * Os inputs de cor/posição, quando informados, sobrescrevem os valores definidos no accordion.
233
+ */
234
+ class CaoAccordionItemComponent {
235
+ accordion = inject(CAO_ACCORDION, { optional: true });
236
+ destroyRef = inject(DestroyRef);
237
+ previousExpanded = null;
238
+ headerId = `cao-accordion-header-${nextId}`;
239
+ panelId = `cao-accordion-panel-${nextId++}`;
240
+ // ----- Conteúdo -----
241
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
242
+ description = input('', ...(ngDevMode ? [{ debugName: "description" }] : []));
243
+ /** Nível do heading (aria-level) do cabeçalho. */
244
+ headingLevel = input(3, ...(ngDevMode ? [{ debugName: "headingLevel" }] : []));
245
+ // ----- Estado -----
246
+ /** Estado de expansão. Suporta two-way binding: `[(expanded)]`. */
247
+ expanded = model(false, ...(ngDevMode ? [{ debugName: "expanded" }] : []));
248
+ isDisabled = input(false, ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
249
+ /** Exibe ou oculta o item. */
250
+ isVisible = input(true, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
251
+ dataCy = input('', ...(ngDevMode ? [{ debugName: "dataCy" }] : []));
252
+ // ----- Posição (sobrescreve o accordion quando informado) -----
253
+ hideToggle = input(undefined, ...(ngDevMode ? [{ debugName: "hideToggle" }] : []));
254
+ togglePosition = input(undefined, ...(ngDevMode ? [{ debugName: "togglePosition" }] : []));
255
+ headerAlign = input(undefined, ...(ngDevMode ? [{ debugName: "headerAlign" }] : []));
256
+ // ----- Cores (sobrescrevem o accordion quando informadas) -----
257
+ headerBgColor = input('', ...(ngDevMode ? [{ debugName: "headerBgColor" }] : []));
258
+ headerTextColor = input('', ...(ngDevMode ? [{ debugName: "headerTextColor" }] : []));
259
+ headerActiveBgColor = input('', ...(ngDevMode ? [{ debugName: "headerActiveBgColor" }] : []));
260
+ activeColor = input('', ...(ngDevMode ? [{ debugName: "activeColor" }] : []));
261
+ contentBgColor = input('', ...(ngDevMode ? [{ debugName: "contentBgColor" }] : []));
262
+ contentTextColor = input('', ...(ngDevMode ? [{ debugName: "contentTextColor" }] : []));
263
+ borderColor = input('', ...(ngDevMode ? [{ debugName: "borderColor" }] : []));
264
+ iconColor = input('', ...(ngDevMode ? [{ debugName: "iconColor" }] : []));
265
+ // ----- Eventos -----
266
+ opened = output();
267
+ closed = output();
268
+ toggleHidden = computed(() => this.hideToggle() ?? this.accordion?.hideToggle() ?? false, ...(ngDevMode ? [{ debugName: "toggleHidden" }] : []));
269
+ togglePos = computed(() => this.togglePosition() ?? this.accordion?.togglePosition() ?? 'after', ...(ngDevMode ? [{ debugName: "togglePos" }] : []));
270
+ align = computed(() => this.headerAlign() ?? this.accordion?.headerAlign() ?? 'start', ...(ngDevMode ? [{ debugName: "align" }] : []));
271
+ isCard = computed(() => (this.accordion?.displayMode() ?? 'separated') === 'separated', ...(ngDevMode ? [{ debugName: "isCard" }] : []));
272
+ headerDataCy = computed(() => (this.dataCy() ? `${this.dataCy()}-header` : null), ...(ngDevMode ? [{ debugName: "headerDataCy" }] : []));
273
+ panelDataCy = computed(() => (this.dataCy() ? `${this.dataCy()}-content` : null), ...(ngDevMode ? [{ debugName: "panelDataCy" }] : []));
274
+ hostStyle = computed(() => ({
275
+ '--cao-accordion-header-bg': this.headerBgColor() || null,
276
+ '--cao-accordion-header-text': this.headerTextColor() || null,
277
+ '--cao-accordion-header-active-bg': this.headerActiveBgColor() || null,
278
+ '--cao-accordion-active-color': this.activeColor() || null,
279
+ '--cao-accordion-content-bg': this.contentBgColor() || null,
280
+ '--cao-accordion-content-text': this.contentTextColor() || null,
281
+ '--cao-accordion-border-color': this.borderColor() || null,
282
+ '--cao-accordion-icon-color': this.iconColor() || null,
283
+ '--cao-accordion-header-align': this.align(),
284
+ }), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
285
+ get styleBinding() {
286
+ return this.hostStyle();
287
+ }
288
+ get dataCyAttr() {
289
+ return this.dataCy() || null;
290
+ }
291
+ get hiddenClass() {
292
+ return !this.isVisible();
293
+ }
294
+ get expandedClass() {
295
+ return this.expanded();
296
+ }
297
+ get cardClass() {
298
+ return this.isCard();
299
+ }
300
+ constructor() {
301
+ this.accordion?.register(this);
302
+ this.destroyRef.onDestroy(() => this.accordion?.unregister(this));
303
+ effect(() => {
304
+ const isExpanded = this.expanded();
305
+ untracked(() => this.handleExpandedChange(isExpanded));
306
+ });
307
+ }
308
+ /** Alterna o estado (ignorado quando o item está desabilitado). */
309
+ toggle() {
310
+ if (this.isDisabled()) {
311
+ return;
312
+ }
313
+ this.expanded.update((value) => !value);
314
+ }
315
+ open() {
316
+ this.expanded.set(true);
317
+ }
318
+ close() {
319
+ this.expanded.set(false);
320
+ }
321
+ handleExpandedChange(isExpanded) {
322
+ if (isExpanded) {
323
+ this.accordion?.notifyOpened(this);
324
+ }
325
+ if (this.previousExpanded !== null && this.previousExpanded !== isExpanded) {
326
+ const event = isExpanded ? this.opened : this.closed;
327
+ event.emit();
328
+ }
329
+ this.previousExpanded = isExpanded;
330
+ }
331
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoAccordionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
332
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: CaoAccordionItemComponent, isStandalone: true, selector: "cao-accordion-item", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, headingLevel: { classPropertyName: "headingLevel", publicName: "headingLevel", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, isDisabled: { classPropertyName: "isDisabled", publicName: "isDisabled", isSignal: true, isRequired: false, transformFunction: null }, isVisible: { classPropertyName: "isVisible", publicName: "isVisible", isSignal: true, isRequired: false, transformFunction: null }, dataCy: { classPropertyName: "dataCy", publicName: "dataCy", isSignal: true, isRequired: false, transformFunction: null }, hideToggle: { classPropertyName: "hideToggle", publicName: "hideToggle", isSignal: true, isRequired: false, transformFunction: null }, togglePosition: { classPropertyName: "togglePosition", publicName: "togglePosition", isSignal: true, isRequired: false, transformFunction: null }, headerAlign: { classPropertyName: "headerAlign", publicName: "headerAlign", isSignal: true, isRequired: false, transformFunction: null }, headerBgColor: { classPropertyName: "headerBgColor", publicName: "headerBgColor", isSignal: true, isRequired: false, transformFunction: null }, headerTextColor: { classPropertyName: "headerTextColor", publicName: "headerTextColor", isSignal: true, isRequired: false, transformFunction: null }, headerActiveBgColor: { classPropertyName: "headerActiveBgColor", publicName: "headerActiveBgColor", isSignal: true, isRequired: false, transformFunction: null }, activeColor: { classPropertyName: "activeColor", publicName: "activeColor", isSignal: true, isRequired: false, transformFunction: null }, contentBgColor: { classPropertyName: "contentBgColor", publicName: "contentBgColor", isSignal: true, isRequired: false, transformFunction: null }, contentTextColor: { classPropertyName: "contentTextColor", publicName: "contentTextColor", isSignal: true, isRequired: false, transformFunction: null }, borderColor: { classPropertyName: "borderColor", publicName: "borderColor", isSignal: true, isRequired: false, transformFunction: null }, iconColor: { classPropertyName: "iconColor", publicName: "iconColor", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expanded: "expandedChange", opened: "opened", closed: "closed" }, host: { properties: { "style": "this.styleBinding", "attr.data-cy": "this.dataCyAttr", "class.cao-accordion-item--hidden": "this.hiddenClass", "class.cao-accordion-item--expanded": "this.expandedClass", "class.cao-accordion-item--card": "this.cardClass" } }, ngImport: i0, template: "<div class=\"cao-accordion-item\">\n <div class=\"cao-accordion-item__heading\" role=\"heading\" [attr.aria-level]=\"headingLevel()\">\n <button\n type=\"button\"\n class=\"cao-accordion-item__header\"\n [class.cao-accordion-item__header--toggle-before]=\"togglePos() === 'before'\"\n [id]=\"headerId\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"panelId\"\n [attr.data-cy]=\"headerDataCy()\"\n (click)=\"toggle()\">\n <span class=\"cao-accordion-item__text\">\n <span class=\"cao-accordion-item__label\">{{ label() }}</span>\n @if (description()) {\n <span class=\"cao-accordion-item__description\">{{ description() }}</span>\n }\n <ng-content select=\"[caoAccordionHeader]\" />\n </span>\n\n @if (!toggleHidden()) {\n <svg\n class=\"cao-accordion-item__icon\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n }\n </button>\n </div>\n\n <div\n class=\"cao-accordion-item__panel\"\n role=\"region\"\n [id]=\"panelId\"\n [attr.aria-labelledby]=\"headerId\"\n [attr.data-cy]=\"panelDataCy()\">\n <div class=\"cao-accordion-item__panel-inner\">\n <div class=\"cao-accordion-item__content\">\n <ng-content />\n </div>\n </div>\n </div>\n</div>", styles: [":host{display:block;box-sizing:border-box;min-width:0}:host(.cao-accordion-item--hidden){display:none}.cao-accordion-item{background:var(--cao-accordion-content-bg, #ffffff);color:var(--cao-accordion-content-text, #374151);overflow:hidden}:host(.cao-accordion-item--card) .cao-accordion-item{border:1px solid var(--cao-accordion-border-color, #e5e7eb);border-radius:var(--cao-accordion-radius, 8px)}.cao-accordion-item__heading{margin:0}.cao-accordion-item__header{display:flex;align-items:center;gap:12px;box-sizing:border-box;width:100%;min-height:48px;margin:0;padding:var(--cao-accordion-header-padding, 12px 16px);border:0;border-radius:0;background:var(--cao-accordion-header-bg, #ffffff);color:var(--cao-accordion-header-text, #111827);font:inherit;text-align:start;cursor:pointer;transition:background-color var(--cao-accordion-duration, .25s) ease,color var(--cao-accordion-duration, .25s) ease}.cao-accordion-item__header:hover:not(:disabled){background:var(--cao-accordion-header-hover-bg, #f3f4f6)}.cao-accordion-item__header:focus-visible{outline:2px solid var(--cao-accordion-focus-ring, rgba(79, 70, 229, .35));outline-offset:-2px}.cao-accordion-item__header:disabled{color:var(--cao-accordion-disabled-color, #9ca3af);cursor:not-allowed}:host(.cao-accordion-item--expanded) .cao-accordion-item__header{background:var(--cao-accordion-header-active-bg, var(--cao-accordion-header-bg, #ffffff));color:var(--cao-accordion-active-color, #4f46e5)}:host(.cao-accordion-item--expanded) .cao-accordion-item__header:disabled{color:var(--cao-accordion-disabled-color, #9ca3af)}.cao-accordion-item__text{display:flex;flex:1 1 auto;flex-direction:column;gap:2px;min-width:0;text-align:var(--cao-accordion-header-align, start)}.cao-accordion-item__label{font-weight:600;overflow-wrap:anywhere}.cao-accordion-item__description{font-size:.8125rem;font-weight:400;opacity:.75}.cao-accordion-item__icon{flex:0 0 auto;color:var(--cao-accordion-icon-color, currentColor);transition:transform var(--cao-accordion-duration, .25s) ease}.cao-accordion-item__header--toggle-before .cao-accordion-item__icon{order:-1}:host(.cao-accordion-item--expanded) .cao-accordion-item__icon{transform:rotate(180deg)}.cao-accordion-item__panel{display:grid;grid-template-rows:0fr;visibility:hidden;transition:grid-template-rows var(--cao-accordion-duration, .25s) ease,visibility var(--cao-accordion-duration, .25s)}:host(.cao-accordion-item--expanded) .cao-accordion-item__panel{grid-template-rows:1fr;visibility:visible}.cao-accordion-item__panel-inner{min-height:0;overflow:hidden}.cao-accordion-item__content{padding:var(--cao-accordion-content-padding, 16px);border-top:1px solid var(--cao-accordion-border-color, #e5e7eb);text-align:var(--cao-accordion-content-align, start)}@media(prefers-reduced-motion:reduce){.cao-accordion-item__header,.cao-accordion-item__icon,.cao-accordion-item__panel{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
333
+ }
334
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CaoAccordionItemComponent, decorators: [{
335
+ type: Component,
336
+ args: [{ selector: 'cao-accordion-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cao-accordion-item\">\n <div class=\"cao-accordion-item__heading\" role=\"heading\" [attr.aria-level]=\"headingLevel()\">\n <button\n type=\"button\"\n class=\"cao-accordion-item__header\"\n [class.cao-accordion-item__header--toggle-before]=\"togglePos() === 'before'\"\n [id]=\"headerId\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"panelId\"\n [attr.data-cy]=\"headerDataCy()\"\n (click)=\"toggle()\">\n <span class=\"cao-accordion-item__text\">\n <span class=\"cao-accordion-item__label\">{{ label() }}</span>\n @if (description()) {\n <span class=\"cao-accordion-item__description\">{{ description() }}</span>\n }\n <ng-content select=\"[caoAccordionHeader]\" />\n </span>\n\n @if (!toggleHidden()) {\n <svg\n class=\"cao-accordion-item__icon\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n }\n </button>\n </div>\n\n <div\n class=\"cao-accordion-item__panel\"\n role=\"region\"\n [id]=\"panelId\"\n [attr.aria-labelledby]=\"headerId\"\n [attr.data-cy]=\"panelDataCy()\">\n <div class=\"cao-accordion-item__panel-inner\">\n <div class=\"cao-accordion-item__content\">\n <ng-content />\n </div>\n </div>\n </div>\n</div>", styles: [":host{display:block;box-sizing:border-box;min-width:0}:host(.cao-accordion-item--hidden){display:none}.cao-accordion-item{background:var(--cao-accordion-content-bg, #ffffff);color:var(--cao-accordion-content-text, #374151);overflow:hidden}:host(.cao-accordion-item--card) .cao-accordion-item{border:1px solid var(--cao-accordion-border-color, #e5e7eb);border-radius:var(--cao-accordion-radius, 8px)}.cao-accordion-item__heading{margin:0}.cao-accordion-item__header{display:flex;align-items:center;gap:12px;box-sizing:border-box;width:100%;min-height:48px;margin:0;padding:var(--cao-accordion-header-padding, 12px 16px);border:0;border-radius:0;background:var(--cao-accordion-header-bg, #ffffff);color:var(--cao-accordion-header-text, #111827);font:inherit;text-align:start;cursor:pointer;transition:background-color var(--cao-accordion-duration, .25s) ease,color var(--cao-accordion-duration, .25s) ease}.cao-accordion-item__header:hover:not(:disabled){background:var(--cao-accordion-header-hover-bg, #f3f4f6)}.cao-accordion-item__header:focus-visible{outline:2px solid var(--cao-accordion-focus-ring, rgba(79, 70, 229, .35));outline-offset:-2px}.cao-accordion-item__header:disabled{color:var(--cao-accordion-disabled-color, #9ca3af);cursor:not-allowed}:host(.cao-accordion-item--expanded) .cao-accordion-item__header{background:var(--cao-accordion-header-active-bg, var(--cao-accordion-header-bg, #ffffff));color:var(--cao-accordion-active-color, #4f46e5)}:host(.cao-accordion-item--expanded) .cao-accordion-item__header:disabled{color:var(--cao-accordion-disabled-color, #9ca3af)}.cao-accordion-item__text{display:flex;flex:1 1 auto;flex-direction:column;gap:2px;min-width:0;text-align:var(--cao-accordion-header-align, start)}.cao-accordion-item__label{font-weight:600;overflow-wrap:anywhere}.cao-accordion-item__description{font-size:.8125rem;font-weight:400;opacity:.75}.cao-accordion-item__icon{flex:0 0 auto;color:var(--cao-accordion-icon-color, currentColor);transition:transform var(--cao-accordion-duration, .25s) ease}.cao-accordion-item__header--toggle-before .cao-accordion-item__icon{order:-1}:host(.cao-accordion-item--expanded) .cao-accordion-item__icon{transform:rotate(180deg)}.cao-accordion-item__panel{display:grid;grid-template-rows:0fr;visibility:hidden;transition:grid-template-rows var(--cao-accordion-duration, .25s) ease,visibility var(--cao-accordion-duration, .25s)}:host(.cao-accordion-item--expanded) .cao-accordion-item__panel{grid-template-rows:1fr;visibility:visible}.cao-accordion-item__panel-inner{min-height:0;overflow:hidden}.cao-accordion-item__content{padding:var(--cao-accordion-content-padding, 16px);border-top:1px solid var(--cao-accordion-border-color, #e5e7eb);text-align:var(--cao-accordion-content-align, start)}@media(prefers-reduced-motion:reduce){.cao-accordion-item__header,.cao-accordion-item__icon,.cao-accordion-item__panel{transition:none}}\n"] }]
337
+ }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], headingLevel: [{ type: i0.Input, args: [{ isSignal: true, alias: "headingLevel", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }], isDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDisabled", required: false }] }], isVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "isVisible", required: false }] }], dataCy: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataCy", required: false }] }], hideToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideToggle", required: false }] }], togglePosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "togglePosition", required: false }] }], headerAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerAlign", required: false }] }], headerBgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerBgColor", required: false }] }], headerTextColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTextColor", required: false }] }], headerActiveBgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerActiveBgColor", required: false }] }], activeColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeColor", required: false }] }], contentBgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentBgColor", required: false }] }], contentTextColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentTextColor", required: false }] }], borderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderColor", required: false }] }], iconColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconColor", required: false }] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], styleBinding: [{
338
+ type: HostBinding,
339
+ args: ['style']
340
+ }], dataCyAttr: [{
341
+ type: HostBinding,
342
+ args: ['attr.data-cy']
343
+ }], hiddenClass: [{
344
+ type: HostBinding,
345
+ args: ['class.cao-accordion-item--hidden']
346
+ }], expandedClass: [{
347
+ type: HostBinding,
348
+ args: ['class.cao-accordion-item--expanded']
349
+ }], cardClass: [{
350
+ type: HostBinding,
351
+ args: ['class.cao-accordion-item--card']
352
+ }] } });
353
+
63
354
  class CaoBaseButtonComponent {
64
355
  buttonClick = new EventEmitter();
65
356
  buttonText = "Clique!";
@@ -4511,5 +4802,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
4511
4802
  * Generated bundle index. Do not edit.
4512
4803
  */
4513
4804
 
4514
- export { BaseAlert, BaseAlertService, BaseDialog, BaseDialogService, BaseFilterTablePaginatedService, BaseFilterTableService, BaseModal, BaseModalService, BasePaginationService, BaseTable, BaseTablePaginated, BaseTableService, BaseTimeRange, CaoAutocompleteComponent, CaoBaseButtonComponent, CaoBaseIcon, CaoBaseInput, CaoBaseToggleComponent, CaoBaseWidgetComponent, CaoCardComponent, CaoCheckboxComponent, CaoDropDownComponent, CaoError, CaoFormField, CaoHint, CaoKpi, CaoRadioButtonComponent, CaoRadioGroupComponent, CaoSkeletonComponent, CaoSlideToggleComponent, CaoTabGroup, CaoTabPanel, CaoWidgetService, DEFAULT_ERROR_STATE_MATCHER, ErrorStateMatcher, Footer, LinksButton, Paginator, ShowOnDirtyErrorStateMatcher, StepComponent, StepperComponent, TablePaginatedService, TimePicker, getPtBrPaginatorIntlBasePaginated, getPtBrPaginatorIntlBaseTable };
4805
+ export { BaseAlert, BaseAlertService, BaseDialog, BaseDialogService, BaseFilterTablePaginatedService, BaseFilterTableService, BaseModal, BaseModalService, BasePaginationService, BaseTable, BaseTablePaginated, BaseTableService, BaseTimeRange, CAO_ACCORDION, CaoAccordionComponent, CaoAccordionItemComponent, CaoAutocompleteComponent, CaoBaseButtonComponent, CaoBaseIcon, CaoBaseInput, CaoBaseToggleComponent, CaoBaseWidgetComponent, CaoCardComponent, CaoCheckboxComponent, CaoDropDownComponent, CaoError, CaoFormField, CaoHint, CaoKpi, CaoRadioButtonComponent, CaoRadioGroupComponent, CaoSkeletonComponent, CaoSlideToggleComponent, CaoTabGroup, CaoTabPanel, CaoWidgetService, DEFAULT_ERROR_STATE_MATCHER, ErrorStateMatcher, Footer, LinksButton, Paginator, ShowOnDirtyErrorStateMatcher, StepComponent, StepperComponent, TablePaginatedService, TimePicker, getPtBrPaginatorIntlBasePaginated, getPtBrPaginatorIntlBaseTable };
4515
4806
  //# sourceMappingURL=ngx-opalbytes-components.mjs.map