@careonbrasil/ng-charts
v14.0.6
Published
Biblioteca de componentes de gráficos SVG para Angular 14 da CareOn
Readme
@careon-brasil/charts
Biblioteca oficial de componentes de gráficos SVG reativos desenvolvida para o ecossistema CareOn.
Todos os componentes são construídos com SVG declarativo inline (sem dependências pesadas como D3 ou Chart.js), suporte nativo a ChangeDetectionStrategy.OnPush, validação estrita de schema em tempo de execução, tipagem TypeScript e eventos bidirecionais de interação.
Sumário
1. Instalação
Instale o pacote através do registro privado da CareOn via NPM ou Yarn:
npm install @careon-brasil/chartsDependências de Peer
@angular/core:>=14.0.0 <15.0.0@angular/common:>=14.0.0 <15.0.0tslib:^2.3.0
2. Configuração
Importe o módulo CareonChartsModule no seu módulo Angular (ex: AppModule ou feature module):
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { CareonChartsModule } from '@careon-brasil/charts';
import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule,
CareonChartsModule
],
bootstrap: [AppComponent]
})
export class AppModule { }3. Recursos Universais
Metadados e Tipagem Genérica (id e payload)
Todos os modelos de dados dos 5 gráficos estendem um contrato com suporte a genéricos <T = any>:
export interface BaseChartItem<T = any> {
/** Identificador opcional do item (ex: ID no banco de dados) */
id?: string | number;
/** Objeto de domínio complementar (ex: entidade do backend, metadados de auditoria) */
payload?: T;
}Tipagem Segura: Diferente de um dicionário genérico
[key: string]: any;, esta abordagem preserva a verificação de erros de digitação em tempo de compilação do TypeScript (ex: passarvaleu: 10em vez devalue: 10gerará um erro de compilação imediato), enquanto permite anexar com segurança qualquer entidade customizada viapayload.
Evento de Seleção (itemSelected)
Todos os 5 gráficos emitem o evento @Output() itemSelected ao clicar em elementos gráficos (barras, pontos de linha, fatias, segmentos ou legendas). O evento retorna a referência exata do item passado no array de entrada [data]:
<careon-timeline-bar-chart
[data]="points"
(itemSelected)="onItemSelected($event)"
></careon-timeline-bar-chart>import { TimelinePoint } from '@careon-brasil/charts';
onItemSelected(item: TimelinePoint): void {
console.log('Item selecionado:', item.label);
console.log('ID do registro:', item.id);
console.log('Payload anexado:', item.payload);
}Validação e Mensagens de Erro
Se o input [data] receber um valor nulo, indefinido, formato incompatível (ex: um objeto {} em vez de array []) ou itens sem as propriedades obrigatórias, o gráfico renderiza automaticamente um painel de alerta amigável de erro de validação com o diagnóstico exato do tipo recebido e a estrutura esperada.
4. Componentes
1. Timeline Bar Chart (<careon-timeline-bar-chart>)
Gráfico de barras temporais desenhado em SVG inline. Suporta hachurado listrado para períodos passados (isPast), destaque do dia atual (isCurrent), linha pontilhada de tendência conectando o topo das barras, tooltips flutuantes e navegação com scroll horizontal para mais de 7 itens.
Modelo de Dados: TimelinePoint<T = any>
export interface TimelinePoint<T = any> {
/** Rótulo exibido no eixo X (ex: 'Seg', '15/09', 'Sem 1') */
label: string;
/** Valor numérico da barra */
value: number;
/** Indica se o ponto é do passado (aplica preenchimento listrado) */
isPast?: boolean;
/** Indica se é o dia/período corrente (aplica destaque de cor) */
isCurrent?: boolean;
/** Identificador único opcional */
id?: string | number;
/** Dados arbitrários de domínio */
payload?: T;
}Inputs e Outputs
| Propriedade | Tipo | Padrão | Descrição |
| :--- | :--- | :--- | :--- |
| [data] | TimelinePoint[] | Obrigatório | Array de pontos temporais a serem plotados. |
| [autoBarWidth] | boolean | true | Quando true, calcula a largura ótima da barra com base no dicionário de densidade. |
| [barWidth] | number | 50 | Largura fixa da barra em pixels (usada quando autoBarWidth = false). |
| [itemSlotWidth] | number | 80 | Espaço alocado por item em pixels quando o scroll horizontal estiver ativo (> 7 itens). |
| [currentBarColor] | string | '#3B82F6' | Cor de preenchimento para a barra do período atual (isCurrent = true). |
| [barColor] | string | '#3B82F6' | Cor de preenchimento padrão para barras normais. |
| [pastHatchColor] | string | '#e2e8f0' | Cor das listras de hachurado para períodos passados (isPast = true). |
| [zeroColor] | string | '#ef4444' | Cor de destaque para barras com valor zero. |
| [trendLineColor] | string | '#1e293b' | Cor da linha pontilhada de tendência. |
| [dotColor] | string | '#1e293b' | Cor dos marcadores circulares nos topos das barras. |
| [tooltipBgColor] | string | '#29285A' | Cor de fundo do tooltip flutuante. |
| [tooltipTextColor] | string | '#ffffff' | Cor do texto dentro do tooltip flutuante. |
| [textColor] | string | '#64748b' | Cor padrão dos rótulos do eixo X. |
| [activeTextColor] | string | '#0f172a' | Cor dos rótulos para o período atual. |
| (itemSelected) | EventEmitter<TimelinePoint> | — | Disparado ao clicar em uma barra, marcador ou rótulo do eixo X. |
Exemplo de Uso
<careon-timeline-bar-chart
[data]="timelineData"
[autoBarWidth]="true"
[currentBarColor]="'#059669'"
(itemSelected)="onTimelineSelect($event)"
></careon-timeline-bar-chart>timelineData: TimelinePoint[] = [
{ label: 'Dom', value: 3, isPast: true, id: 1 },
{ label: 'Seg', value: 7, isPast: true, id: 2 },
{ label: 'Ter', value: 5, isPast: true, id: 3 },
{ label: 'Qua', value: 9, isPast: true, id: 4 },
{ label: 'Qui', value: 0, isPast: true, id: 5 },
{ label: 'Sex', value: 6, isPast: true, id: 6 },
{ label: 'Sáb', value: 11, isCurrent: true, id: 7, payload: { plantoesConfirmados: 11 } }
];2. Comparison Bar Chart (<careon-comparison-bar-chart>)
Gráfico de barras comparativas verticais em SVG inline com ordenação alfabética automática em português (pt-BR), filtro Top 10, linha pontilhada de tendência conectando o topo das barras e rolagem suave com botões integrados de navegação.
Modelo de Dados: ComparisonItem<T = any>
export interface ComparisonItem<T = any> {
/** Rótulo da categoria ou vaga (ex: 'Enfermeiro UTI') */
label: string;
/** Quantidade ou valor numérico */
value: number;
/** Identificador único opcional */
id?: string | number;
/** Dados arbitrários de domínio */
payload?: T;
}Inputs e Outputs
| Propriedade | Tipo | Padrão | Descrição |
| :--- | :--- | :--- | :--- |
| [data] | ComparisonItem[] | Obrigatório | Lista de itens a serem comparados. |
| [limitTop10] | boolean | false | Quando true, filtra e exibe apenas os 10 itens com maiores valores. |
| [autoBarWidth] | boolean | true | Quando true, calcula dinamicamente a largura das barras via dicionário proporcional. Quando false, usa barWidth. |
| [barWidth] | number | 46 | Largura em pixels de cada barra vertical (usada quando autoBarWidth = false). |
| [itemSlotWidth] | number | 100 | Espaço horizontal em pixels alocado por coluna (ativa scroll quando ultrapassar a tela). |
| [barColor] | string | '#3B82F6' | Cor de preenchimento das barras com valor > 0. |
| [zeroColor] | string | '#ef4444' | Cor das barras com valor zero (estado vazio/alerta). |
| [trendLineColor] | string | '#1e293b' | Cor da linha pontilhada conectando os topos das barras. |
| [dotColor] | string | '#1e293b' | Cor do ponto marcador no topo de cada barra. |
| [textColor] | string | '#0f172a' | Cor dos rótulos de texto de cada coluna. |
| (itemSelected) | EventEmitter<ComparisonItem> | — | Disparado ao clicar em uma barra, marcador circular ou rótulo do eixo X. |
Exemplo de Uso
<careon-comparison-bar-chart
[data]="vagas"
[limitTop10]="true"
[barWidth]="48"
[itemSlotWidth]="110"
(itemSelected)="onVagaClick($event)"
></careon-comparison-bar-chart>3. Donut Chart (<careon-donut-chart>)
Gráfico circular tipo rosca desenhado através de arcos SVG reativos com stroke-dasharray. Suporta legenda interativa com valores absolutos e percentuais, tooltips no hover, orifício central com texto customizado e estado vazio elegante.
Modelo de Dados: DonutChartItem<T = any>
export interface DonutChartItem<T = any> {
/** Rótulo da fatia (ex: 'Visualizações', 'Cardiologia') */
label: string;
/** Valor numérico */
count: number;
/** Cor hexadecimal específica para esta fatia (opcional) */
color?: string;
/** Identificador único opcional */
id?: string | number;
/** Dados arbitrários de domínio */
payload?: T;
}Inputs e Outputs
| Propriedade | Tipo | Padrão | Descrição |
| :--- | :--- | :--- | :--- |
| [data] | DonutChartItem[] | Obrigatório | Lista de fatias que compõem a rosca. |
| [title] | string | undefined | Título opcional exibido no topo do card. |
| [size] | number | 110 | Dimensão SVG (largura e altura) em pixels. |
| [strokeWidth] | number | 14 | Espessura do aro circular da rosca em pixels. |
| [maxItems] | number | 6 | Limite máximo de fatias antes de agrupar ou limitar. |
| [showLegend] | boolean | true | Exibe ou oculta a legenda textual ao lado do gráfico. |
| [showLegendPercentage]| boolean| false | Quando true, exibe também a porcentagem correspondente na legenda. |
| [showTooltip] | boolean | true | Exibe tooltip flutuante ao passar o mouse sobre uma fatia. |
| [centerText] | string | undefined | Texto customizado a ser renderizado dentro do orifício central. |
| [emptyColor] | string | '#e2e8f0' | Cor do aro quando todos os valores forem zero. |
| [textColor] | string | '#0f172a' | Cor dos textos da legenda. |
| (itemSelected) | EventEmitter<DonutChartItem> | — | Disparado ao clicar em uma fatia circular ou em um item da legenda. |
Exemplo de Uso
<careon-donut-chart
[data]="candidaturas"
[size]="130"
[strokeWidth]="16"
[showLegend]="true"
[showLegendPercentage]="true"
(itemSelected)="onDonutSelect($event)"
></careon-donut-chart>4. Stacked Horizontal Bar (<careon-stacked-horizontal-bar>)
Barra horizontal proporcional empilhada desenhada em HTML/CSS Flexbox com cantos arredondados, legenda descritiva, contagem total agregada no cabeçalho e suporte completo a estado vazio customizável.
Modelo de Dados: StackedBarItem<T = any>
export interface StackedBarItem<T = any> {
/** Rótulo do segmento (ex: 'Abertas', 'Encerradas') */
label: string;
/** Valor numérico daquele segmento */
value: number;
/** Cor de preenchimento hexadecimal */
color: string;
/** Identificador único opcional */
id?: string | number;
/** Dados arbitrários de domínio */
payload?: T;
}Inputs e Outputs
| Propriedade | Tipo | Padrão | Descrição |
| :--- | :--- | :--- | :--- |
| [data] | StackedBarItem[] | Obrigatório | Lista de segmentos da barra horizontal. |
| [title] | string | 'title' | Título do cabeçalho (invariante oficial). |
| [totalLabel] | string | 'total label' | Rótulo explicativo ao lado do valor total (invariante oficial). |
| [showHeader] | boolean | true | Exibe ou oculta o cabeçalho superior com título e total. |
| [showLegend] | boolean | true | Exibe ou oculta a legenda abaixo da barra. |
| [emptyText] | string | 'empty text' | Texto exibido quando todos os valores forem zero (invariante oficial). |
| [emptyTrackColor] | string | '#f1f5f9' | Cor de fundo da barra quando estiver em estado vazio. |
| [maxSegments] | number | 6 | Quantidade máxima de segmentos suportados. |
| (itemSelected) | EventEmitter<StackedBarItem> | — | Disparado ao clicar em um segmento da barra ou em um item da legenda. |
Exemplo de Uso
<careon-stacked-horizontal-bar
[data]="statusVagas"
[title]="'Vagas no Período'"
[totalLabel]="'total de vagas'"
[emptyText]="'nao existe comparativo'"
(itemSelected)="onSegmentSelect($event)"
></careon-stacked-horizontal-bar>5. Funnel Bar (<careon-funnel-bar>)
Funil horizontal de conversão. Cada etapa é representada por uma barra horizontal cuja largura é matematicamente dimensionada de forma proporcional ao valor da maior etapa do funil, calculando automaticamente as taxas de retenção percentual.
Modelo de Dados: FunnelBarItem<T = any>
export interface FunnelBarItem<T = any> {
/** Nome da etapa do funil (ex: 'Visualizações', 'Candidaturas') */
label: string;
/** Quantidade numérica de registros */
count: number;
/** Cor customizada da barra da etapa (opcional) */
barColor?: string;
/** Cor da fonte do texto dentro da barra (opcional) */
fontColor?: string;
/** Identificador único opcional */
id?: string | number;
/** Dados arbitrários de domínio */
payload?: T;
}Inputs e Outputs
| Propriedade | Tipo | Padrão | Descrição |
| :--- | :--- | :--- | :--- |
| [data] | FunnelBarItem[] | Obrigatório | Lista ordenada de etapas do funil de conversão. |
| [title] | string | undefined | Título opcional acima do funil. |
| [fontColor] | string | '#ffffff' | Cor do texto renderizado dentro das barras do funil. |
| [minBarWidth] | number | undefined | Largura mínima em pixels para garantir legibilidade em etapas com poucos registros. |
| (itemSelected) | EventEmitter<FunnelBarItem> | — | Disparado ao clicar em qualquer barra do funil. |
Exemplo de Uso
<careon-funnel-bar
[data]="etapasFunil"
[title]="'Funil de Conversão do Processo Seletivo'"
[minBarWidth]="70"
(itemSelected)="onFunnelClick($event)"
></careon-funnel-bar>