@careonbrasil/dashboard 14.0.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 ADDED
@@ -0,0 +1,355 @@
1
+ # @careonbrasil/dashboard
2
+
3
+ Biblioteca oficial de Dashboard de Recrutamento Institucional desenvolvida para o ecossistema CareOn.
4
+
5
+ Fornece uma solucao analitica completa de metricas de atracao e selecao de profissionais de saude, reunindo indicadores-chave (KPIs), analise qualitativa de desempenho com ondas vetoriais, aprofundamento individual por vaga, comparativos de mercado e alertas operacionais acionaveis.
6
+
7
+ Construida para projetos Angular 14 com suporte nativo a `ChangeDetectionStrategy.OnPush`, renderizacao vetorial SVG e integracao direta com `@careonbrasil/ng-charts`.
8
+
9
+ ---
10
+
11
+ ## Sumario
12
+
13
+ 1. [Instalacao](#1-instalacao)
14
+ 2. [Configuracao](#2-configuracao)
15
+ 3. [Componentes](#3-componentes)
16
+ - [Dashboard Principal (`<careon-dashboard>`)](#1-dashboard-principal-careon-dashboard)
17
+ - [Esqueleto de Carregamento (`<careon-dashboard-skeleton>`)](#2-esqueleto-de-carregamento-careon-dashboard-skeleton)
18
+ - [Onda de Performance (`<careon-performance-wave>`)](#3-onda-de-performance-careon-performance-wave)
19
+ 4. [Modelos de Dados](#4-modelos-de-dados)
20
+ - [DashboardOverviewData](#dashboardoverviewdata)
21
+ - [DashboardKpiSummary](#dashboardkpisummary)
22
+ - [DashboardAttentionItem](#dashboardattentionitem)
23
+ - [DashboardPerformanceAnalysis](#dashboardperformanceanalysis)
24
+ - [DashboardDutyAnalysis](#dashboarddutyanalysis)
25
+ - [DashboardDutySalaryComparison](#dashboarddutysalarycomparison)
26
+ - [Enums do Pacote](#enums-do-pacote)
27
+ 5. [Compilacao e Publicacao](#5-compilacao-e-publicacao)
28
+
29
+ ---
30
+
31
+ ## 1. Instalacao
32
+
33
+ Instale o pacote e sua biblioteca de graficos par via NPM ou Yarn:
34
+
35
+ ```bash
36
+ npm install @careonbrasil/dashboard @careonbrasil/ng-charts
37
+ ```
38
+
39
+ ### Dependencias de Peer
40
+
41
+ O pacote foi desenhado para Angular 14 e requer as seguintes dependencias:
42
+
43
+ | Dependencia | Versao compativel | Finalidade |
44
+ | :--- | :--- | :--- |
45
+ | `@angular/core` | `>=14.0.0 <15.0.0` | Nucleo do Angular |
46
+ | `@angular/common` | `>=14.0.0 <15.0.0` | Diretivas comuns e pipes |
47
+ | `@careonbrasil/ng-charts` | `^14.0.6` | Biblioteca de graficos SVG CareOn |
48
+ | `tslib` | `^2.3.0` | Runtime helpers do TypeScript |
49
+
50
+ > **Nota de Estilo**: O dashboard utiliza tipografia corporativa padrao Montserrat. Recomenda-se carregar a fonte no projeto hospedeiro (`font-family: 'Montserrat', sans-serif`).
51
+
52
+ ---
53
+
54
+ ## 2. Configuracao
55
+
56
+ Importe o modulo `CareonDashboardModule` no seu modulo Angular (ex: `AppModule` ou modulo de feature):
57
+
58
+ ```typescript
59
+ import { NgModule } from '@angular/core';
60
+ import { BrowserModule } from '@angular/platform-browser';
61
+ import { CareonDashboardModule } from '@careonbrasil/dashboard';
62
+
63
+ import { AppComponent } from './app.component';
64
+
65
+ @NgModule({
66
+ declarations: [AppComponent],
67
+ imports: [
68
+ BrowserModule,
69
+ CareonDashboardModule
70
+ ],
71
+ bootstrap: [AppComponent]
72
+ })
73
+ export class AppModule { }
74
+ ```
75
+
76
+ ---
77
+
78
+ ## 3. Componentes
79
+
80
+ ### 1. Dashboard Principal (`<careon-dashboard>`)
81
+
82
+ Componente central que orquestra a visualizacao analitica completa. E estruturado nas seguintes secoes funcionais:
83
+
84
+ 1. **Cabecalho com Filtros**: Titulo, subtitulo e alternador de periodo reativo (`Hoje`, `Semana`, `Mes`).
85
+ 2. **Cards de Indicadores-Chave (KPIs)**: Vagas Publicadas, Candidatos Inscritos, Curriculos para Avaliar, Media de Candidatos por Vaga e Balanco de Status (Abertas vs. Encerradas) com badges de variacao comparativa.
86
+ 3. **Secao "Precisa da sua atencao"**: Listagem de vagas prioritarias (sem candidatos ou com prazo expirando), com atalho para contato consultivo.
87
+ 4. **Secao "Analise de Desempenho"**: Indicador de engajamento institucional por meio de curva de ondas vetorial (`PerformanceLevel`), status descritivo e recomendacoes praticas.
88
+ 5. **Secao "Analise por Vaga"**: Seletor dropdown para inspecao de vaga individual com linha do tempo de candidaturas, taxa de conversao (grafico donut), funil de atracao e comparativo salarial regional.
89
+ 6. **Secao "Candidaturas por Vaga"**: Grafico comparativo de barras verticais com linha de tendencia destacando a distribuicao de candidatos entre vagas ativas.
90
+
91
+ #### Inputs e Outputs
92
+
93
+ | Propriedade | Tipo | Padrao | Descricao |
94
+ | :--- | :--- | :--- | :--- |
95
+ | `[data]` | `DashboardOverviewData` | `undefined` | Conjunto completo de dados analiticos para alimentar o dashboard. |
96
+ | `[loading]` | `boolean` | `false` | Quando `true`, exibe o esqueleto de carregamento com animacao shimmer. |
97
+ | `[currentPeriod]` | `DashboardPeriod` | `DashboardPeriod.Week` | Periodo temporal ativo (`Today`, `Week`, `Month`). |
98
+ | `[title]` | `string` | `'Dashboard'` | Titulo principal exibido no cabecalho. |
99
+ | `[subtitle]` | `string` | `'Visao geral de recrutamento'` | Subtitulo ou nome da unidade no cabecalho. |
100
+ | `[emptyMessage]` | `string` | `'Nenhum dado registrado para o periodo selecionado.'` | Mensagem do estado vazio quando nao ha dados. |
101
+ | `[consultantPhone]` | `string` | `'5547996569707'` | Numero de telefone para o redirecionamento ao WhatsApp de consultoria. |
102
+ | `[consultantMessage]` | `string` | `''` | Mensagem inicial pre-formatada para o WhatsApp. |
103
+ | `[zeroStateMode]` | `'publish' \| 'basic'` | `'publish'` | Modo de estado vazio das secoes: `'publish'` exibe chamada para publicacao; `'basic'` exibe aviso informativo. |
104
+ | `(periodChange)` | `EventEmitter<DashboardPeriod>` | — | Disparado quando o usuario clica em um filtro de periodo (`Hoje`, `Semana`, `Mes`). |
105
+ | `(attentionItemSelected)` | `EventEmitter<DashboardAttentionItem>` | — | Disparado ao clicar em um item da lista de atencao. |
106
+ | `(dutySelected)` | `EventEmitter<DashboardDutyAnalysis>` | — | Disparado ao selecionar uma vaga no dropdown da secao "Analise por Vaga". |
107
+ | `(publishDuty)` | `EventEmitter<string \| void>` | — | Disparado ao clicar nos botoes "Publicar Vaga" das areas de estado zero (emite o nome da secao de origem). |
108
+ | `(consultantClick)` | `EventEmitter<string>` | — | Disparado ao clicar nos links de suporte "Fale com um consultor" (emite a secao de origem). |
109
+ | `(itemSelected)` | `EventEmitter<DashboardItemSelectedEvent>` | — | Disparado ao selecionar elementos interativos dos graficos integrados. |
110
+
111
+ #### Exemplo de Uso
112
+
113
+ ```html
114
+ <careon-dashboard
115
+ [data]="dashboardData"
116
+ [loading]="isLoading"
117
+ [currentPeriod]="selectedPeriod"
118
+ [title]="'Painel Institucional'"
119
+ [subtitle]="'Hospital Central'"
120
+ (periodChange)="onPeriodChange($event)"
121
+ (attentionItemSelected)="onAttentionItemClick($event)"
122
+ (dutySelected)="onDutyChange($event)"
123
+ (publishDuty)="onPublishDutyClick($event)"
124
+ (consultantClick)="onConsultantClick($event)"
125
+ ></careon-dashboard>
126
+ ```
127
+
128
+ ```typescript
129
+ import { Component, OnInit } from '@angular/core';
130
+ import {
131
+ DashboardOverviewData,
132
+ DashboardPeriod,
133
+ DashboardAttentionItem,
134
+ DashboardDutyAnalysis
135
+ } from '@careonbrasil/dashboard';
136
+
137
+ @Component({
138
+ selector: 'app-analytics-page',
139
+ templateUrl: './analytics-page.component.html'
140
+ })
141
+ export class AnalyticsPageComponent implements OnInit {
142
+ dashboardData?: DashboardOverviewData;
143
+ isLoading = false;
144
+ selectedPeriod: DashboardPeriod = DashboardPeriod.Week;
145
+
146
+ ngOnInit(): void {
147
+ this.loadData(this.selectedPeriod);
148
+ }
149
+
150
+ loadData(period: DashboardPeriod): void {
151
+ this.isLoading = true;
152
+ this.selectedPeriod = period;
153
+ // Exemplo: chamada a servico de dados
154
+ }
155
+
156
+ onPeriodChange(period: DashboardPeriod): void {
157
+ this.loadData(period);
158
+ }
159
+
160
+ onAttentionItemClick(item: DashboardAttentionItem): void {
161
+ console.log('Navegar para vaga com atencao:', item.dutyId);
162
+ }
163
+
164
+ onDutyChange(duty: DashboardDutyAnalysis): void {
165
+ console.log('Vaga selecionada na analise:', duty.title);
166
+ }
167
+
168
+ onPublishDutyClick(section?: string | void): void {
169
+ console.log('Abrir fluxo de publicacao a partir de:', section);
170
+ }
171
+
172
+ onConsultantClick(section: string): void {
173
+ console.log('Contato com consultor acionado em:', section);
174
+ }
175
+ }
176
+ ```
177
+
178
+ ---
179
+
180
+ ### 2. Esqueleto de Carregamento (`<careon-dashboard-skeleton>`)
181
+
182
+ Componente visual independente que replica a disposicao geometrica dos cards de KPIs, listas de atencao e paineis de graficos do dashboard com animacao suave de shimmer. Util para telas com transicoes assincronas de carregamento.
183
+
184
+ ```html
185
+ <careon-dashboard-skeleton></careon-dashboard-skeleton>
186
+ ```
187
+
188
+ ---
189
+
190
+ ### 3. Onda de Performance (`<careon-performance-wave>`)
191
+
192
+ Componente vetorial SVG inline responsavel por desenhar as curvas caracteristicas de desempenho institucional. Pode ser utilizado separadamente em outros contextos institucionais:
193
+
194
+ #### Inputs
195
+
196
+ | Propriedade | Tipo | Padrao | Descricao |
197
+ | :--- | :--- | :--- | :--- |
198
+ | `[level]` | `PerformanceLevel` | `PerformanceLevel.Blue` | Nivel de performance que define a curvatura e as cores do gradiente (`Blue`, `Orange`, `Red`). |
199
+
200
+ #### Exemplo de Uso
201
+
202
+ ```html
203
+ <careon-performance-wave [level]="PerformanceLevel.Orange"></careon-performance-wave>
204
+ ```
205
+
206
+ ---
207
+
208
+ ## 4. Modelos de Dados
209
+
210
+ ### `DashboardOverviewData`
211
+
212
+ Contrato mestre que alimenta o componente principal:
213
+
214
+ ```typescript
215
+ export interface DashboardOverviewData {
216
+ /** Identificador unico da instituicao. */
217
+ institutionId?: number;
218
+ /** Razao social ou nome de exibicao da instituicao. */
219
+ institutionName?: string;
220
+ /** Rotulo do periodo ativo (ex: 'Hoje', 'Semana', 'Mes'). */
221
+ period?: string;
222
+ /** Data inicial do intervalo temporal coberto pelas metricas. */
223
+ startDate?: string | Date;
224
+ /** Data final do intervalo temporal coberto pelas metricas. */
225
+ endDate?: string | Date;
226
+ /** Resumo numerico dos KPIs superiores. */
227
+ kpis?: DashboardKpiSummary;
228
+ /** Pontos para o grafico de linha do tempo de candidaturas. */
229
+ timeline?: TimelinePoint[];
230
+ /** Dados para o grafico de barras comparativas entre vagas. */
231
+ comparison?: ComparisonItem[];
232
+ /** Distribuicao de candidaturas por categoria para grafico donut. */
233
+ distribution?: DonutChartItem[];
234
+ /** Distribuicao de status das vagas (abertas vs. encerradas). */
235
+ dutiesStatus?: StackedBarItem[];
236
+ /** Etapas do funil geral de recrutamento. */
237
+ recruitmentFunnel?: FunnelBarItem[];
238
+ /** Relacao de vagas prioritarias que requerem atencao imediata. */
239
+ attentionItems?: DashboardAttentionItem[];
240
+ /** Diagnostico qualitativo de performance geral com curva de ondas. */
241
+ performanceAnalysis?: DashboardPerformanceAnalysis;
242
+ /** Relacao de vagas detalhadas com metricas individuais para o seletor. */
243
+ vacanciesAnalysis?: DashboardDutyAnalysis[];
244
+ }
245
+ ```
246
+
247
+ ### `DashboardKpiSummary`
248
+
249
+ ```typescript
250
+ export interface DashboardKpiSummary {
251
+ registeredVacancies?: number;
252
+ registeredVacanciesPrevious?: number;
253
+ registeredVacanciesDifference?: number;
254
+
255
+ candidateApplications?: number;
256
+ candidateApplicationsPrevious?: number;
257
+ candidateApplicationsDifference?: number;
258
+
259
+ pendingReviews?: number;
260
+ pendingReviewsPrevious?: number;
261
+ pendingReviewsDifference?: number;
262
+
263
+ averageCandidatesPerVacancy?: number;
264
+ averageCandidatesPerVacancyPrevious?: number;
265
+ averageCandidatesDifference?: number;
266
+
267
+ openVacancies?: number;
268
+ closedVacancies?: number;
269
+ totalVacancies?: number;
270
+ }
271
+ ```
272
+
273
+ ### `DashboardAttentionItem`
274
+
275
+ ```typescript
276
+ export interface DashboardAttentionItem {
277
+ dutyId: number;
278
+ title: string;
279
+ subtitle: string;
280
+ candidatesCount?: number;
281
+ pendingReviewsCount?: number;
282
+ daysOpen?: number;
283
+ hoursOpen?: number;
284
+ isFixedJob?: boolean;
285
+ }
286
+ ```
287
+
288
+ ### `DashboardPerformanceAnalysis`
289
+
290
+ ```typescript
291
+ export interface DashboardPerformanceAnalysis {
292
+ averageConversionRate?: number;
293
+ level?: PerformanceLevel | number;
294
+ highlightTitle?: string;
295
+ description?: string;
296
+ totalVacanciesInPeriod?: number;
297
+ }
298
+ ```
299
+
300
+ ### `DashboardDutyAnalysis`
301
+
302
+ ```typescript
303
+ export interface DashboardDutyAnalysis {
304
+ dutyId: number;
305
+ title: string;
306
+ subtitle: string;
307
+ candidatesCount: number;
308
+ viewsCount: number;
309
+ conversionRate: number;
310
+ timelinePoints: TimelinePoint[];
311
+ conversionDonut?: DonutChartItem[];
312
+ funnelItems?: FunnelBarItem[];
313
+ salaryComparison?: DashboardDutySalaryComparison;
314
+ }
315
+ ```
316
+
317
+ ### `DashboardDutySalaryComparison`
318
+
319
+ ```typescript
320
+ export interface DashboardDutySalaryComparison {
321
+ yourSalary?: number | null;
322
+ regionalAverageSalary?: number | null;
323
+ differencePercentage?: number | null;
324
+ status: DutySalaryStatus;
325
+ highlightTitle: string;
326
+ description: string;
327
+ badgeText?: string | null;
328
+ }
329
+ ```
330
+
331
+ ### Enums do Pacote
332
+
333
+ ```typescript
334
+ export enum DashboardPeriod {
335
+ Today = 'Today',
336
+ Week = 'Week',
337
+ Month = 'Month'
338
+ }
339
+
340
+ export enum PerformanceLevel {
341
+ Blue = 'Blue',
342
+ Orange = 'Orange',
343
+ Red = 'Red'
344
+ }
345
+
346
+ export enum DutySalaryStatus {
347
+ BelowMarket = 'BelowMarket',
348
+ AtMarket = 'AtMarket',
349
+ AboveMarket = 'AboveMarket',
350
+ NotInformed = 'NotInformed',
351
+ InsufficientData = 'InsufficientData'
352
+ }
353
+ ```
354
+
355
+ ---
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZW9uYnJhc2lsLWRhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC9zcmMvY2FyZW9uYnJhc2lsLWRhc2hib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,43 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { CareonChartsModule } from '@careonbrasil/ng-charts';
4
+ import { DashboardComponent } from './dashboard.component';
5
+ import { PerformanceWaveComponent } from './components/performance-wave/performance-wave.component';
6
+ import { DashboardIconComponent } from './components/dashboard-icon/dashboard-icon.component';
7
+ import { DashboardSkeletonComponent } from './components/dashboard-skeleton/dashboard-skeleton.component';
8
+ import * as i0 from "@angular/core";
9
+ export class CareonDashboardModule {
10
+ }
11
+ CareonDashboardModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CareonDashboardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
+ CareonDashboardModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: CareonDashboardModule, declarations: [DashboardComponent,
13
+ PerformanceWaveComponent,
14
+ DashboardIconComponent,
15
+ DashboardSkeletonComponent], imports: [CommonModule,
16
+ CareonChartsModule], exports: [DashboardComponent,
17
+ PerformanceWaveComponent,
18
+ DashboardIconComponent,
19
+ DashboardSkeletonComponent] });
20
+ CareonDashboardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CareonDashboardModule, imports: [CommonModule,
21
+ CareonChartsModule] });
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CareonDashboardModule, decorators: [{
23
+ type: NgModule,
24
+ args: [{
25
+ declarations: [
26
+ DashboardComponent,
27
+ PerformanceWaveComponent,
28
+ DashboardIconComponent,
29
+ DashboardSkeletonComponent
30
+ ],
31
+ imports: [
32
+ CommonModule,
33
+ CareonChartsModule
34
+ ],
35
+ exports: [
36
+ DashboardComponent,
37
+ PerformanceWaveComponent,
38
+ DashboardIconComponent,
39
+ DashboardSkeletonComponent
40
+ ]
41
+ }]
42
+ }] });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZW9uLWRhc2hib2FyZC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQvc3JjL2xpYi9jYXJlb24tZGFzaGJvYXJkLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQzs7QUFvQjFHLE1BQU0sT0FBTyxxQkFBcUI7O2tIQUFyQixxQkFBcUI7bUhBQXJCLHFCQUFxQixpQkFoQjlCLGtCQUFrQjtRQUNsQix3QkFBd0I7UUFDeEIsc0JBQXNCO1FBQ3RCLDBCQUEwQixhQUcxQixZQUFZO1FBQ1osa0JBQWtCLGFBR2xCLGtCQUFrQjtRQUNsQix3QkFBd0I7UUFDeEIsc0JBQXNCO1FBQ3RCLDBCQUEwQjttSEFHakIscUJBQXFCLFlBVjlCLFlBQVk7UUFDWixrQkFBa0I7MkZBU1QscUJBQXFCO2tCQWxCakMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osa0JBQWtCO3dCQUNsQix3QkFBd0I7d0JBQ3hCLHNCQUFzQjt3QkFDdEIsMEJBQTBCO3FCQUMzQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixrQkFBa0I7cUJBQ25CO29CQUNELE9BQU8sRUFBRTt3QkFDUCxrQkFBa0I7d0JBQ2xCLHdCQUF3Qjt3QkFDeEIsc0JBQXNCO3dCQUN0QiwwQkFBMEI7cUJBQzNCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ2FyZW9uQ2hhcnRzTW9kdWxlIH0gZnJvbSAnQGNhcmVvbmJyYXNpbC9uZy1jaGFydHMnO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICcuL2Rhc2hib2FyZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQZXJmb3JtYW5jZVdhdmVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGVyZm9ybWFuY2Utd2F2ZS9wZXJmb3JtYW5jZS13YXZlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERhc2hib2FyZEljb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZGFzaGJvYXJkLWljb24vZGFzaGJvYXJkLWljb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGFzaGJvYXJkU2tlbGV0b25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZGFzaGJvYXJkLXNrZWxldG9uL2Rhc2hib2FyZC1za2VsZXRvbi5jb21wb25lbnQnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIERhc2hib2FyZENvbXBvbmVudCxcclxuICAgIFBlcmZvcm1hbmNlV2F2ZUNvbXBvbmVudCxcclxuICAgIERhc2hib2FyZEljb25Db21wb25lbnQsXHJcbiAgICBEYXNoYm9hcmRTa2VsZXRvbkNvbXBvbmVudFxyXG4gIF0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgQ2FyZW9uQ2hhcnRzTW9kdWxlXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBEYXNoYm9hcmRDb21wb25lbnQsXHJcbiAgICBQZXJmb3JtYW5jZVdhdmVDb21wb25lbnQsXHJcbiAgICBEYXNoYm9hcmRJY29uQ29tcG9uZW50LFxyXG4gICAgRGFzaGJvYXJkU2tlbGV0b25Db21wb25lbnRcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXJlb25EYXNoYm9hcmRNb2R1bGUge31cclxuIl19
@@ -0,0 +1,32 @@
1
+ import { Component, Input, ChangeDetectionStrategy, HostBinding } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ /**
5
+ * Componente interno para renderizacao de icones vetoriais SVG leves do dashboard.
6
+ */
7
+ export class DashboardIconComponent {
8
+ constructor() {
9
+ /** Nome do icone a ser exibido. */
10
+ this.name = 'info';
11
+ /** Aplica rotacao de 180 graus (util para setas de expansao e indicadores de tendencia). */
12
+ this.rotated = false;
13
+ /** Classes CSS adicionais a serem anexadas ao elemento SVG. */
14
+ this.customClass = '';
15
+ }
16
+ }
17
+ DashboardIconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DashboardIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
+ DashboardIconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DashboardIconComponent, selector: "careon-dashboard-icon", inputs: { name: "name", rotated: "rotated", customClass: "customClass" }, host: { properties: { "class.rotated": "this.rotated" } }, ngImport: i0, template: "<ng-container [ngSwitch]=\"name\">\r\n <!-- Arrow Up Icon -->\r\n <svg\r\n *ngSwitchCase=\"'arrow-up'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 10 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M2.5 7.5L7.5 2.5M7.5 2.5H3.75M7.5 2.5V6.25\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.6\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <!-- Arrow Down Icon -->\r\n <svg\r\n *ngSwitchCase=\"'arrow-down'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 10 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M2.5 2.5L7.5 7.5M7.5 7.5H3.75M7.5 7.5V3.75\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.6\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <!-- Info Icon -->\r\n <svg\r\n *ngSwitchCase=\"'info'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle cx=\"10\" cy=\"10\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.5\" />\r\n <path d=\"M10 8.5V14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"5.5\" r=\"1.1\" fill=\"currentColor\" />\r\n </svg>\r\n\r\n <!-- Chevron Down Icon -->\r\n <svg\r\n *ngSwitchCase=\"'chevron-down'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M5 7.5L10 12.5L15 7.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n</ng-container>\r\n", styles: [":host{display:inline-flex;align-items:center;justify-content:center;line-height:1}svg{display:block;width:100%;height:100%}:host(.rotated){transform:rotate(180deg)}\n"], dependencies: [{ kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DashboardIconComponent, decorators: [{
20
+ type: Component,
21
+ args: [{ selector: 'careon-dashboard-icon', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container [ngSwitch]=\"name\">\r\n <!-- Arrow Up Icon -->\r\n <svg\r\n *ngSwitchCase=\"'arrow-up'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 10 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M2.5 7.5L7.5 2.5M7.5 2.5H3.75M7.5 2.5V6.25\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.6\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <!-- Arrow Down Icon -->\r\n <svg\r\n *ngSwitchCase=\"'arrow-down'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 10 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M2.5 2.5L7.5 7.5M7.5 7.5H3.75M7.5 7.5V3.75\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.6\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <!-- Info Icon -->\r\n <svg\r\n *ngSwitchCase=\"'info'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle cx=\"10\" cy=\"10\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.5\" />\r\n <path d=\"M10 8.5V14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"5.5\" r=\"1.1\" fill=\"currentColor\" />\r\n </svg>\r\n\r\n <!-- Chevron Down Icon -->\r\n <svg\r\n *ngSwitchCase=\"'chevron-down'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M5 7.5L10 12.5L15 7.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n</ng-container>\r\n", styles: [":host{display:inline-flex;align-items:center;justify-content:center;line-height:1}svg{display:block;width:100%;height:100%}:host(.rotated){transform:rotate(180deg)}\n"] }]
22
+ }], propDecorators: { name: [{
23
+ type: Input
24
+ }], rotated: [{
25
+ type: HostBinding,
26
+ args: ['class.rotated']
27
+ }, {
28
+ type: Input
29
+ }], customClass: [{
30
+ type: Input
31
+ }] } });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLWljb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9kYXNoYm9hcmQtaWNvbi9kYXNoYm9hcmQtaWNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2Rhc2hib2FyZC1pY29uL2Rhc2hib2FyZC1pY29uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBT3ZGOztHQUVHO0FBT0gsTUFBTSxPQUFPLHNCQUFzQjtJQU5uQztRQU9FLG1DQUFtQztRQUMxQixTQUFJLEdBQXNCLE1BQU0sQ0FBQztRQUUxQyw0RkFBNEY7UUFDckQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUV2RCwrREFBK0Q7UUFDdEQsZ0JBQVcsR0FBRyxFQUFFLENBQUM7S0FDM0I7O21IQVRZLHNCQUFzQjt1R0FBdEIsc0JBQXNCLGtNQ2hCbkMsbzVEQXFFQTsyRkRyRGEsc0JBQXNCO2tCQU5sQyxTQUFTOytCQUNFLHVCQUF1QixtQkFHaEIsdUJBQXVCLENBQUMsTUFBTTs4QkFJdEMsSUFBSTtzQkFBWixLQUFLO2dCQUdpQyxPQUFPO3NCQUE3QyxXQUFXO3VCQUFDLGVBQWU7O3NCQUFHLEtBQUs7Z0JBRzNCLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBOb21lcyBkZSBpY29uZXMgdmV0b3JpYWlzIFNWRyBzdXBvcnRhZG9zIHBlbG8gY29tcG9uZW50ZS5cclxuICovXHJcbmV4cG9ydCB0eXBlIERhc2hib2FyZEljb25OYW1lID0gJ2Fycm93LXVwJyB8ICdhcnJvdy1kb3duJyB8ICdpbmZvJyB8ICdjaGV2cm9uLWRvd24nO1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgaW50ZXJubyBwYXJhIHJlbmRlcml6YWNhbyBkZSBpY29uZXMgdmV0b3JpYWlzIFNWRyBsZXZlcyBkbyBkYXNoYm9hcmQuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NhcmVvbi1kYXNoYm9hcmQtaWNvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC1pY29uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXNoYm9hcmQtaWNvbi5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRJY29uQ29tcG9uZW50IHtcclxuICAvKiogTm9tZSBkbyBpY29uZSBhIHNlciBleGliaWRvLiAqL1xyXG4gIEBJbnB1dCgpIG5hbWU6IERhc2hib2FyZEljb25OYW1lID0gJ2luZm8nO1xyXG5cclxuICAvKiogQXBsaWNhIHJvdGFjYW8gZGUgMTgwIGdyYXVzICh1dGlsIHBhcmEgc2V0YXMgZGUgZXhwYW5zYW8gZSBpbmRpY2Fkb3JlcyBkZSB0ZW5kZW5jaWEpLiAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3Mucm90YXRlZCcpIEBJbnB1dCgpIHJvdGF0ZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqIENsYXNzZXMgQ1NTIGFkaWNpb25haXMgYSBzZXJlbSBhbmV4YWRhcyBhbyBlbGVtZW50byBTVkcuICovXHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3MgPSAnJztcclxufVxyXG4iLCI8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJuYW1lXCI+XHJcbiAgPCEtLSBBcnJvdyBVcCBJY29uIC0tPlxyXG4gIDxzdmdcclxuICAgICpuZ1N3aXRjaENhc2U9XCInYXJyb3ctdXAnXCJcclxuICAgIFtjbGFzc109XCJjdXN0b21DbGFzc1wiXHJcbiAgICB2aWV3Qm94PVwiMCAwIDEwIDEwXCJcclxuICAgIGZpbGw9XCJub25lXCJcclxuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICA+XHJcbiAgICA8cGF0aFxyXG4gICAgICBkPVwiTTIuNSA3LjVMNy41IDIuNU03LjUgMi41SDMuNzVNNy41IDIuNVY2LjI1XCJcclxuICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42XCJcclxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcblxyXG4gIDwhLS0gQXJyb3cgRG93biBJY29uIC0tPlxyXG4gIDxzdmdcclxuICAgICpuZ1N3aXRjaENhc2U9XCInYXJyb3ctZG93bidcIlxyXG4gICAgW2NsYXNzXT1cImN1c3RvbUNsYXNzXCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMTAgMTBcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gID5cclxuICAgIDxwYXRoXHJcbiAgICAgIGQ9XCJNMi41IDIuNUw3LjUgNy41TTcuNSA3LjVIMy43NU03LjUgNy41VjMuNzVcIlxyXG4gICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICBzdHJva2Utd2lkdGg9XCIxLjZcIlxyXG4gICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgLz5cclxuICA8L3N2Zz5cclxuXHJcbiAgPCEtLSBJbmZvIEljb24gLS0+XHJcbiAgPHN2Z1xyXG4gICAgKm5nU3dpdGNoQ2FzZT1cIidpbmZvJ1wiXHJcbiAgICBbY2xhc3NdPVwiY3VzdG9tQ2xhc3NcIlxyXG4gICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXHJcbiAgICBmaWxsPVwibm9uZVwiXHJcbiAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgPlxyXG4gICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCI5XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgLz5cclxuICAgIDxwYXRoIGQ9XCJNMTAgOC41VjE0XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIC8+XHJcbiAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjUuNVwiIHI9XCIxLjFcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cclxuICA8L3N2Zz5cclxuXHJcbiAgPCEtLSBDaGV2cm9uIERvd24gSWNvbiAtLT5cclxuICA8c3ZnXHJcbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ2NoZXZyb24tZG93bidcIlxyXG4gICAgW2NsYXNzXT1cImN1c3RvbUNsYXNzXCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gID5cclxuICAgIDxwYXRoXHJcbiAgICAgIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIlxyXG4gICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=