ngx-opalbytes-components 1.29.0 → 1.30.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 (27) hide show
  1. package/README.md +138 -0
  2. package/fesm2022/ngx-opalbytes-components.mjs +338 -5
  3. package/fesm2022/ngx-opalbytes-components.mjs.map +1 -1
  4. package/package.json +1 -1
  5. package/src/lib/shared/components/index.ts +4 -1
  6. package/src/lib/shared/components/popover/index.ts +3 -0
  7. package/src/lib/shared/components/popover/popover.css +149 -0
  8. package/src/lib/shared/components/popover/popover.html +44 -0
  9. package/src/lib/shared/components/popover/popover.model.ts +19 -0
  10. package/src/lib/shared/components/popover/popover.spec.ts +22 -0
  11. package/src/lib/shared/components/popover/popover.stories.ts +0 -0
  12. package/src/lib/shared/components/popover/popover.ts +312 -0
  13. package/src/lib/shared/components/progress-bar/index.ts +2 -0
  14. package/src/lib/shared/components/progress-bar/progress-bar.css +141 -0
  15. package/src/lib/shared/components/progress-bar/progress-bar.html +39 -0
  16. package/src/lib/shared/components/progress-bar/progress-bar.model.ts +8 -0
  17. package/src/lib/shared/components/progress-bar/progress-bar.spec.ts +94 -0
  18. package/src/lib/shared/components/progress-bar/progress-bar.stories.ts +53 -0
  19. package/src/lib/shared/components/progress-bar/progress-bar.ts +50 -0
  20. package/src/lib/shared/components/progress-spinner/index.ts +2 -0
  21. package/src/lib/shared/components/progress-spinner/progress-spinner.css +90 -0
  22. package/src/lib/shared/components/progress-spinner/progress-spinner.html +50 -0
  23. package/src/lib/shared/components/progress-spinner/progress-spinner.model.ts +8 -0
  24. package/src/lib/shared/components/progress-spinner/progress-spinner.spec.ts +85 -0
  25. package/src/lib/shared/components/progress-spinner/progress-spinner.stories.ts +73 -0
  26. package/src/lib/shared/components/progress-spinner/progress-spinner.ts +71 -0
  27. package/types/ngx-opalbytes-components.d.ts +181 -2
@@ -0,0 +1,73 @@
1
+ import { argsToTemplate, Meta, StoryObj } from '@storybook/angular-vite';
2
+
3
+ import { CaoProgressSpinnerComponent } from './progress-spinner';
4
+
5
+ const ROW = 'display:flex;gap:24px;align-items:center;flex-wrap:wrap';
6
+
7
+ const meta: Meta<CaoProgressSpinnerComponent> = {
8
+ title: 'Componentes/Progress Spinner',
9
+ component: CaoProgressSpinnerComponent,
10
+ tags: ['autodocs'],
11
+ render: (args) => ({ props: args, template: `<cao-progress-spinner ${argsToTemplate(args)} />` }),
12
+ argTypes: {
13
+ mode: { control: 'inline-radio', options: ['determinate', 'indeterminate'] },
14
+ value: { control: { type: 'range', min: 0, max: 100, step: 1 } },
15
+ diameter: { control: { type: 'number', min: 8 } },
16
+ strokeWidth: { control: { type: 'number', min: 0 }, description: '0 = automático (10% do diâmetro).' },
17
+ strokeLinecap: { control: 'inline-radio', options: ['round', 'butt', 'square'] },
18
+ color: { control: 'color' },
19
+ trackColor: { control: 'color' },
20
+ textColor: { control: 'color' },
21
+ animationDuration: { control: 'text' },
22
+ showValue: { control: 'boolean' },
23
+ ariaLabel: { control: 'text' },
24
+ },
25
+ args: {
26
+ mode: 'indeterminate',
27
+ value: 65,
28
+ diameter: 48,
29
+ strokeWidth: 0,
30
+ strokeLinecap: 'round',
31
+ showValue: false,
32
+ ariaLabel: 'Carregando',
33
+ },
34
+ };
35
+ export default meta;
36
+
37
+ type Story = StoryObj<CaoProgressSpinnerComponent>;
38
+
39
+ export const Indeterminate: Story = {};
40
+
41
+ export const Determinate: Story = { args: { mode: 'determinate', trackColor: '#e5e7eb' } };
42
+
43
+ export const WithValue: Story = {
44
+ args: { mode: 'determinate', value: 72, diameter: 96, trackColor: '#e5e7eb', showValue: true },
45
+ };
46
+
47
+ export const CustomColors: Story = {
48
+ args: { mode: 'determinate', value: 60, diameter: 80, color: '#16a34a', trackColor: '#dcfce7', showValue: true },
49
+ };
50
+
51
+ export const Sizes: Story = {
52
+ render: () => ({
53
+ template: `
54
+ <div style="${ROW}">
55
+ <cao-progress-spinner [diameter]="16" ariaLabel="Muito pequeno" />
56
+ <cao-progress-spinner [diameter]="24" ariaLabel="Pequeno" />
57
+ <cao-progress-spinner [diameter]="48" ariaLabel="Médio" />
58
+ <cao-progress-spinner [diameter]="80" ariaLabel="Grande" />
59
+ <cao-progress-spinner [diameter]="120" [strokeWidth]="6" ariaLabel="Muito grande" />
60
+ </div>`,
61
+ }),
62
+ };
63
+
64
+ export const StrokeAndLinecap: Story = {
65
+ render: () => ({
66
+ template: `
67
+ <div style="${ROW}">
68
+ <cao-progress-spinner mode="determinate" [value]="70" [diameter]="64" [strokeWidth]="3" trackColor="#e5e7eb" />
69
+ <cao-progress-spinner mode="determinate" [value]="70" [diameter]="64" [strokeWidth]="10" trackColor="#e5e7eb" />
70
+ <cao-progress-spinner mode="determinate" [value]="70" [diameter]="64" [strokeWidth]="10" strokeLinecap="butt" trackColor="#e5e7eb" />
71
+ </div>`,
72
+ }),
73
+ };
@@ -0,0 +1,71 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, numberAttribute } from '@angular/core';
2
+
3
+ import { CaoProgressSpinnerLinecap, CaoProgressSpinnerMode } from './progress-spinner.model';
4
+
5
+ const MIN_DIAMETER = 8;
6
+
7
+ const clampPercent = (value: number): number => Math.min(100, Math.max(0, Number.isFinite(value) ? value : 0));
8
+
9
+ @Component({
10
+ selector: 'cao-progress-spinner',
11
+ templateUrl: './progress-spinner.html',
12
+ styleUrl: './progress-spinner.css',
13
+ changeDetection: ChangeDetectionStrategy.OnPush,
14
+ })
15
+ export class CaoProgressSpinnerComponent {
16
+ /** Modo de exibição. Padrão: `'indeterminate'`. */
17
+ readonly mode = input<CaoProgressSpinnerMode>('indeterminate');
18
+ /** Progresso de 0 a 100 (modo `determinate`). */
19
+ readonly value = input(0, { transform: numberAttribute });
20
+ /** Diâmetro em px. */
21
+ readonly diameter = input(48, { transform: numberAttribute });
22
+ /** Espessura do traço em px. `0` = automático (10% do diâmetro). */
23
+ readonly strokeWidth = input(0, { transform: numberAttribute });
24
+ /** Formato da ponta do traço. */
25
+ readonly strokeLinecap = input<CaoProgressSpinnerLinecap>('round');
26
+
27
+ /** Cor do indicador (qualquer cor CSS). */
28
+ readonly color = input<string>('');
29
+ /** Cor do trilho (círculo de fundo). Padrão: transparente. */
30
+ readonly trackColor = input<string>('');
31
+ /** Duração de uma volta completa no modo indeterminado. */
32
+ readonly animationDuration = input<string>('');
33
+ /** Exibe o percentual no centro (modo `determinate`). */
34
+ readonly showValue = input<boolean>(false);
35
+ /** Cor do percentual. */
36
+ readonly textColor = input<string>('');
37
+
38
+ readonly ariaLabel = input<string>('');
39
+ readonly ariaLabelledBy = input<string>('');
40
+ readonly dataCy = input<string>('');
41
+
42
+ protected readonly isDeterminate = computed<boolean>(() => this.mode() === 'determinate');
43
+
44
+ protected readonly size = computed<number>(() => {
45
+ const diameter = this.diameter();
46
+ return Number.isFinite(diameter) ? Math.max(MIN_DIAMETER, diameter) : 48;
47
+ });
48
+
49
+ protected readonly stroke = computed<number>(() => {
50
+ const width = this.strokeWidth();
51
+ const raw = width > 0 ? width : this.size() * 0.1;
52
+ return Math.min(Math.max(raw, 1), this.size() / 2);
53
+ });
54
+
55
+ protected readonly center = computed<number>(() => this.size() / 2);
56
+ protected readonly radius = computed<number>(() => (this.size() - this.stroke()) / 2);
57
+ protected readonly circumference = computed<number>(() => 2 * Math.PI * this.radius());
58
+
59
+ protected readonly clampedValue = computed<number>(() => clampPercent(this.value()));
60
+
61
+ protected readonly dashOffset = computed<number | null>(() =>
62
+ this.isDeterminate() ? this.circumference() * (1 - this.clampedValue() / 100) : null,
63
+ );
64
+
65
+ protected readonly ariaValueNow = computed<number | null>(() =>
66
+ this.isDeterminate() ? Math.round(this.clampedValue()) : null,
67
+ );
68
+
69
+ protected readonly valueLabel = computed<string>(() => `${Math.round(this.clampedValue())}%`);
70
+ protected readonly fontSize = computed<number>(() => Math.max(8, Math.round(this.size() * 0.24)));
71
+ }
@@ -9,7 +9,7 @@ import { Router, ActivatedRoute, Params } from '@angular/router';
9
9
  import { PageEvent, MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';
10
10
  import { DateAdapter } from '@angular/material/core';
11
11
  import { MatTimepickerOption } from '@angular/material/timepicker';
12
- import { Overlay, OverlayRef } from '@angular/cdk/overlay';
12
+ import { ConnectedPosition, Overlay, OverlayRef } from '@angular/cdk/overlay';
13
13
  import { LiveAnnouncer } from '@angular/cdk/a11y';
14
14
  import { SelectionModel } from '@angular/cdk/collections';
15
15
  import { MatSort, Sort } from '@angular/material/sort';
@@ -1088,6 +1088,185 @@ declare class CaoBreadcrumbComponent {
1088
1088
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CaoBreadcrumbComponent, "cao-breadcrumb", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "home": { "alias": "home"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; "separatorIcon": { "alias": "separatorIcon"; "required": false; "isSignal": true; }; "isLucideSeparatorIcon": { "alias": "isLucideSeparatorIcon"; "required": false; "isSignal": true; }; "separatorIconSize": { "alias": "separatorIconSize"; "required": false; "isSignal": true; }; "separatorIconStrokeWidth": { "alias": "separatorIconStrokeWidth"; "required": false; "isSignal": true; }; "linkColor": { "alias": "linkColor"; "required": false; "isSignal": true; }; "linkHoverColor": { "alias": "linkHoverColor"; "required": false; "isSignal": true; }; "currentColor": { "alias": "currentColor"; "required": false; "isSignal": true; }; "separatorColor": { "alias": "separatorColor"; "required": false; "isSignal": true; }; "fontSize": { "alias": "fontSize"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "dataCy": { "alias": "dataCy"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; }, never, never, true, never>;
1089
1089
  }
1090
1090
 
1091
+ /**
1092
+ * Modo da barra de progresso (mesmos modos do Angular Material).
1093
+ * - `determinate`: progresso conhecido, controlado por `value`.
1094
+ * - `indeterminate`: progresso desconhecido, animação contínua.
1095
+ * - `buffer`: `value` + `bufferValue` (ex.: carregamento de mídia).
1096
+ * - `query`: indeterminado com animação invertida (ex.: aguardando resposta antes de um determinate).
1097
+ */
1098
+ type CaoProgressBarMode = 'determinate' | 'indeterminate' | 'buffer' | 'query';
1099
+
1100
+ declare class CaoProgressBarComponent {
1101
+ /** Modo de exibição. Padrão: `'determinate'`. */
1102
+ readonly mode: _angular_core.InputSignal<CaoProgressBarMode>;
1103
+ /** Progresso de 0 a 100 (modos `determinate` e `buffer`). */
1104
+ readonly value: _angular_core.InputSignalWithTransform<number, unknown>;
1105
+ /** Valor do buffer de 0 a 100 (modo `buffer`). */
1106
+ readonly bufferValue: _angular_core.InputSignalWithTransform<number, unknown>;
1107
+ /** Cor da barra de progresso (qualquer cor CSS). */
1108
+ readonly color: _angular_core.InputSignal<string>;
1109
+ /** Cor do trilho. */
1110
+ readonly trackColor: _angular_core.InputSignal<string>;
1111
+ /** Cor do buffer (modo `buffer`). */
1112
+ readonly bufferColor: _angular_core.InputSignal<string>;
1113
+ /** Altura da barra. */
1114
+ readonly height: _angular_core.InputSignal<string>;
1115
+ /** Raio da borda. Padrão: totalmente arredondada. */
1116
+ readonly borderRadius: _angular_core.InputSignal<string>;
1117
+ /** Duração do ciclo da animação nos modos indeterminado/query/buffer. */
1118
+ readonly animationDuration: _angular_core.InputSignal<string>;
1119
+ /** Exibe o percentual ao lado da barra (modos `determinate` e `buffer`). */
1120
+ readonly showValue: _angular_core.InputSignal<boolean>;
1121
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1122
+ readonly ariaLabelledBy: _angular_core.InputSignal<string>;
1123
+ readonly dataCy: _angular_core.InputSignal<string>;
1124
+ protected readonly clampedValue: _angular_core.Signal<number>;
1125
+ protected readonly clampedBuffer: _angular_core.Signal<number>;
1126
+ protected readonly hasValue: _angular_core.Signal<boolean>;
1127
+ protected readonly ariaValueNow: _angular_core.Signal<number | null>;
1128
+ protected readonly valueLabel: _angular_core.Signal<string>;
1129
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CaoProgressBarComponent, never>;
1130
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CaoProgressBarComponent, "cao-progress-bar", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "bufferValue": { "alias": "bufferValue"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "trackColor": { "alias": "trackColor"; "required": false; "isSignal": true; }; "bufferColor": { "alias": "bufferColor"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "animationDuration": { "alias": "animationDuration"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "dataCy": { "alias": "dataCy"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1131
+ }
1132
+
1133
+ /**
1134
+ * Modo do spinner de progresso (mesmos modos do Angular Material).
1135
+ * - `determinate`: progresso conhecido, controlado por `value`.
1136
+ * - `indeterminate`: progresso desconhecido, animação contínua.
1137
+ */
1138
+ type CaoProgressSpinnerMode = 'determinate' | 'indeterminate';
1139
+ type CaoProgressSpinnerLinecap = 'round' | 'butt' | 'square';
1140
+
1141
+ declare class CaoProgressSpinnerComponent {
1142
+ /** Modo de exibição. Padrão: `'indeterminate'`. */
1143
+ readonly mode: _angular_core.InputSignal<CaoProgressSpinnerMode>;
1144
+ /** Progresso de 0 a 100 (modo `determinate`). */
1145
+ readonly value: _angular_core.InputSignalWithTransform<number, unknown>;
1146
+ /** Diâmetro em px. */
1147
+ readonly diameter: _angular_core.InputSignalWithTransform<number, unknown>;
1148
+ /** Espessura do traço em px. `0` = automático (10% do diâmetro). */
1149
+ readonly strokeWidth: _angular_core.InputSignalWithTransform<number, unknown>;
1150
+ /** Formato da ponta do traço. */
1151
+ readonly strokeLinecap: _angular_core.InputSignal<CaoProgressSpinnerLinecap>;
1152
+ /** Cor do indicador (qualquer cor CSS). */
1153
+ readonly color: _angular_core.InputSignal<string>;
1154
+ /** Cor do trilho (círculo de fundo). Padrão: transparente. */
1155
+ readonly trackColor: _angular_core.InputSignal<string>;
1156
+ /** Duração de uma volta completa no modo indeterminado. */
1157
+ readonly animationDuration: _angular_core.InputSignal<string>;
1158
+ /** Exibe o percentual no centro (modo `determinate`). */
1159
+ readonly showValue: _angular_core.InputSignal<boolean>;
1160
+ /** Cor do percentual. */
1161
+ readonly textColor: _angular_core.InputSignal<string>;
1162
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1163
+ readonly ariaLabelledBy: _angular_core.InputSignal<string>;
1164
+ readonly dataCy: _angular_core.InputSignal<string>;
1165
+ protected readonly isDeterminate: _angular_core.Signal<boolean>;
1166
+ protected readonly size: _angular_core.Signal<number>;
1167
+ protected readonly stroke: _angular_core.Signal<number>;
1168
+ protected readonly center: _angular_core.Signal<number>;
1169
+ protected readonly radius: _angular_core.Signal<number>;
1170
+ protected readonly circumference: _angular_core.Signal<number>;
1171
+ protected readonly clampedValue: _angular_core.Signal<number>;
1172
+ protected readonly dashOffset: _angular_core.Signal<number | null>;
1173
+ protected readonly ariaValueNow: _angular_core.Signal<number | null>;
1174
+ protected readonly valueLabel: _angular_core.Signal<string>;
1175
+ protected readonly fontSize: _angular_core.Signal<number>;
1176
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CaoProgressSpinnerComponent, never>;
1177
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CaoProgressSpinnerComponent, "cao-progress-spinner", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "diameter": { "alias": "diameter"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "strokeLinecap": { "alias": "strokeLinecap"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "trackColor": { "alias": "trackColor"; "required": false; "isSignal": true; }; "animationDuration": { "alias": "animationDuration"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "textColor": { "alias": "textColor"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "dataCy": { "alias": "dataCy"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1178
+ }
1179
+
1180
+ /** Lado do elemento de origem em que o popover é exibido. */
1181
+ type CaoPopoverPosition = 'top' | 'bottom' | 'left' | 'right';
1182
+ /** Alinhamento do popover em relação ao elemento de origem. */
1183
+ type CaoPopoverAlign = 'start' | 'center' | 'end';
1184
+ /** Elemento de origem (âncora) do popover. */
1185
+ type CaoPopoverTarget = HTMLElement | ElementRef<HTMLElement> | null | undefined;
1186
+ interface ICaoPopoverShowOptions {
1187
+ /** Move o foco para dentro do popover ao abrir. Padrão: valor de `focusOnShow`. */
1188
+ focus?: boolean;
1189
+ }
1190
+
1191
+ declare const CAO_POPOVER_POSITION_PREFIX = "cao-popover-pos-";
1192
+ /** Posição preferida seguida das alternativas (oposta e perpendiculares) usadas quando não há espaço. */
1193
+ declare function buildPopoverPositions(position: CaoPopoverPosition, align: CaoPopoverAlign, offset: number): ConnectedPosition[];
1194
+ declare class CaoPopoverComponent {
1195
+ private readonly overlay;
1196
+ private readonly viewContainerRef;
1197
+ private readonly destroyRef;
1198
+ private readonly panelTemplate;
1199
+ private overlayRef;
1200
+ private origin;
1201
+ private subscriptions;
1202
+ private focusMoved;
1203
+ private readonly openState;
1204
+ protected readonly panelId: string;
1205
+ protected readonly placement: _angular_core.WritableSignal<CaoPopoverPosition>;
1206
+ /** Lado do elemento de origem em que o popover aparece. Se não houver espaço, o CDK escolhe outro lado. */
1207
+ readonly position: _angular_core.InputSignal<CaoPopoverPosition>;
1208
+ /** Alinhamento em relação ao elemento de origem. */
1209
+ readonly align: _angular_core.InputSignal<CaoPopoverAlign>;
1210
+ /** Distância (px) entre a origem e o popover. */
1211
+ readonly offset: _angular_core.InputSignalWithTransform<number, unknown>;
1212
+ /** Exibe a seta apontando para a origem. */
1213
+ readonly showArrow: _angular_core.InputSignalWithTransform<boolean, unknown>;
1214
+ /** Fecha ao clicar fora do popover. */
1215
+ readonly dismissable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1216
+ /** Fecha ao pressionar `Esc`. */
1217
+ readonly closeOnEscape: _angular_core.InputSignalWithTransform<boolean, unknown>;
1218
+ /** Exibe o botão de fechar no canto superior direito. */
1219
+ readonly showCloseIcon: _angular_core.InputSignalWithTransform<boolean, unknown>;
1220
+ /** Move o foco para o primeiro elemento focável do popover ao abrir (e devolve à origem ao fechar). */
1221
+ readonly focusOnShow: _angular_core.InputSignalWithTransform<boolean, unknown>;
1222
+ /** Largura fixa do popover (ex.: `'320px'`). */
1223
+ readonly width: _angular_core.InputSignal<string>;
1224
+ /** Largura máxima. */
1225
+ readonly maxWidth: _angular_core.InputSignal<string>;
1226
+ readonly bgColor: _angular_core.InputSignal<string>;
1227
+ readonly textColor: _angular_core.InputSignal<string>;
1228
+ readonly borderColor: _angular_core.InputSignal<string>;
1229
+ readonly borderRadius: _angular_core.InputSignal<string>;
1230
+ readonly padding: _angular_core.InputSignal<string>;
1231
+ /** Classe(s) CSS adicionais aplicadas ao painel do popover. */
1232
+ readonly styleClass: _angular_core.InputSignal<string>;
1233
+ /** Classe(s) CSS adicionais aplicadas ao painel do overlay (CDK). */
1234
+ readonly panelClass: _angular_core.InputSignal<string | string[]>;
1235
+ readonly role: _angular_core.InputSignal<string>;
1236
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1237
+ readonly ariaLabelledBy: _angular_core.InputSignal<string>;
1238
+ readonly closeAriaLabel: _angular_core.InputSignal<string>;
1239
+ readonly dataCy: _angular_core.InputSignal<string>;
1240
+ /** Emitido após o popover ser aberto. */
1241
+ readonly shown: _angular_core.OutputEmitterRef<void>;
1242
+ /** Emitido após o popover ser fechado. */
1243
+ readonly hidden: _angular_core.OutputEmitterRef<void>;
1244
+ /** Emitido quando o ponteiro entra/sai do painel (usado pelo gatilho `hover`). */
1245
+ readonly panelHoverChange: _angular_core.OutputEmitterRef<boolean>;
1246
+ /** `true` enquanto o popover está aberto. */
1247
+ readonly isOpen: _angular_core.Signal<boolean>;
1248
+ constructor();
1249
+ /** Abre o popover se estiver fechado (ou aberto em outra origem); fecha se já estiver aberto na mesma origem. */
1250
+ toggle(event?: Event | null, target?: CaoPopoverTarget, options?: ICaoPopoverShowOptions): void;
1251
+ /** Abre o popover ancorado em `target` (ou em `event.currentTarget`). */
1252
+ show(event?: Event | null, target?: CaoPopoverTarget, options?: ICaoPopoverShowOptions): void;
1253
+ /** Fecha o popover. */
1254
+ hide(): void;
1255
+ /** Recalcula a posição (útil se a origem mudou de lugar ou o conteúdo mudou de tamanho). */
1256
+ reposition(): void;
1257
+ /** Indica se o nó está dentro do painel do popover aberto. */
1258
+ containsNode(node: Node | null | undefined): boolean;
1259
+ protected onCloseClick(): void;
1260
+ private close;
1261
+ private dispose;
1262
+ private onPositionChange;
1263
+ private resolveOrigin;
1264
+ private focusPanel;
1265
+ private setOriginAria;
1266
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CaoPopoverComponent, never>;
1267
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CaoPopoverComponent, "cao-popover", ["caoPopover"], { "position": { "alias": "position"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "showArrow": { "alias": "showArrow"; "required": false; "isSignal": true; }; "dismissable": { "alias": "dismissable"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "showCloseIcon": { "alias": "showCloseIcon"; "required": false; "isSignal": true; }; "focusOnShow": { "alias": "focusOnShow"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "bgColor": { "alias": "bgColor"; "required": false; "isSignal": true; }; "textColor": { "alias": "textColor"; "required": false; "isSignal": true; }; "borderColor": { "alias": "borderColor"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "styleClass": { "alias": "styleClass"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; "isSignal": true; }; "dataCy": { "alias": "dataCy"; "required": false; "isSignal": true; }; }, { "shown": "shown"; "hidden": "hidden"; "panelHoverChange": "panelHoverChange"; }, never, ["*"], true, never>;
1268
+ }
1269
+
1091
1270
  type ModalType = "validation" | "finger" | "facial" | "clinic" | "graph" | "restriction" | "default";
1092
1271
  interface IModal {
1093
1272
  status: boolean;
@@ -1543,5 +1722,5 @@ declare class CaoBaseWidgetComponent<TData = unknown> {
1543
1722
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CaoBaseWidgetComponent<any>, "cao-base-widget", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "widgetIcon": { "alias": "widgetIcon"; "required": false; "isSignal": true; }; "cancelTextButton": { "alias": "cancelTextButton"; "required": false; "isSignal": true; }; "saveTextButton": { "alias": "saveTextButton"; "required": false; "isSignal": true; }; "displayActionButton": { "alias": "displayActionButton"; "required": false; "isSignal": true; }; "displaySaveButton": { "alias": "displaySaveButton"; "required": false; "isSignal": true; }; "displayCancelButton": { "alias": "displayCancelButton"; "required": false; "isSignal": true; }; "shouldCloseWhenCancel": { "alias": "shouldCloseWhenCancel"; "required": false; "isSignal": true; }; "widgetDirection": { "alias": "widgetDirection"; "required": false; "isSignal": true; }; "typeCancel": { "alias": "typeCancel"; "required": false; "isSignal": true; }; "saveDisabled": { "alias": "saveDisabled"; "required": false; "isSignal": true; }; "saveIcon": { "alias": "saveIcon"; "required": false; "isSignal": true; }; "saveIconPosition": { "alias": "saveIconPosition"; "required": false; "isSignal": true; }; "closeOnClickOutside": { "alias": "closeOnClickOutside"; "required": false; "isSignal": true; }; "confirmOnClose": { "alias": "confirmOnClose"; "required": false; "isSignal": true; }; "widgetData": { "alias": "widgetData"; "required": false; "isSignal": true; }; }, { "save": "save"; "deleted": "deleted"; "cancelEvent": "cancelEvent"; "closeRequest": "closeRequest"; }, never, ["widget-title", "*"], true, never>;
1544
1723
  }
1545
1724
 
1546
- export { BaseAlert, BaseAlertService, BaseDialog, BaseDialogService, BaseFilterTablePaginatedService, BaseFilterTableService, BaseModal, BaseModalService, BasePaginationService, BaseTable, BaseTablePaginated, BaseTableService, BaseTimeRange, CAO_ACCORDION, CaoAccordionComponent, CaoAccordionItemComponent, CaoAutocompleteComponent, CaoBaseButtonComponent, CaoBaseIcon, CaoBaseInput, CaoBaseToggleComponent, CaoBaseWidgetComponent, CaoBreadcrumbComponent, 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 };
1725
+ export { BaseAlert, BaseAlertService, BaseDialog, BaseDialogService, BaseFilterTablePaginatedService, BaseFilterTableService, BaseModal, BaseModalService, BasePaginationService, BaseTable, BaseTablePaginated, BaseTableService, BaseTimeRange, CAO_ACCORDION, CAO_POPOVER_POSITION_PREFIX, CaoAccordionComponent, CaoAccordionItemComponent, CaoAutocompleteComponent, CaoBaseButtonComponent, CaoBaseIcon, CaoBaseInput, CaoBaseToggleComponent, CaoBaseWidgetComponent, CaoBreadcrumbComponent, CaoCardComponent, CaoCheckboxComponent, CaoDropDownComponent, CaoError, CaoFormField, CaoHint, CaoKpi, CaoPopoverComponent, CaoProgressBarComponent, CaoProgressSpinnerComponent, CaoRadioButtonComponent, CaoRadioGroupComponent, CaoSkeletonComponent, CaoSlideToggleComponent, CaoTabGroup, CaoTabPanel, CaoWidgetService, DEFAULT_ERROR_STATE_MATCHER, ErrorStateMatcher, Footer, LinksButton, Paginator, ShowOnDirtyErrorStateMatcher, StepComponent, StepperComponent, TablePaginatedService, TimePicker, buildPopoverPositions, getPtBrPaginatorIntlBasePaginated, getPtBrPaginatorIntlBaseTable };
1547
1726
  export type { AlertType, CaoAccordionAlign, CaoAccordionDisplayMode, CaoAccordionTogglePosition, CaoCardVariant, CaoSkeletonVariant, CaoTypeInputs, CaoWidgetDirection, DialogType, IAlertConfig, ICaoAccordionHost, ICaoAccordionItemRef, ICaoAutoCompleteOption, ICaoCardAvatar, ICaoCardBadge, ICaoCardMeta, ICaoCheckboxChangeEvent, ICaoDropDownOption, ICaoImage, ICaoKPI, ICaoRadioChangeEvent, ICaoSlideToggleChangeEvent, ICaoTabChangeEvent, ICaoWidgetOptions, IColumnButton, IColumnConfig, IColumnPaginatedButton, IColumnPaginatedConfig, IDialogConfig, IErrorStateMatcher, IFormFieldControl, IModal, INavContent, INavLink, ITableConfig, ITablePaginatedConfig, ModalType, ModalTypeClass, ModalTypeSize };