@celke/kole-react 0.3.0 → 0.4.1

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.
@@ -0,0 +1,23 @@
1
+ import type { DadoGrafico, EixoGrafico, EixoXGrafico, FaixaGrafico, GraficoBaseProps, ReferenciaGrafico, SerieGrafico } from './tipos.js';
2
+ export interface SerieCartesiana extends SerieGrafico {
3
+ tipo: 'linha' | 'barra';
4
+ }
5
+ export interface CartesianoProps extends GraficoBaseProps {
6
+ dados: DadoGrafico[];
7
+ eixoX: EixoXGrafico;
8
+ eixoY?: EixoGrafico;
9
+ eixoYDireito?: EixoGrafico;
10
+ series: SerieCartesiana[];
11
+ orientacao?: 'vertical' | 'horizontal';
12
+ pontos?: boolean;
13
+ area?: boolean;
14
+ referencias?: ReferenciaGrafico[];
15
+ faixas?: FaixaGrafico[];
16
+ divergente?: boolean;
17
+ rotulosNasBarras?: boolean;
18
+ }
19
+ /**
20
+ * Motor comum de `GraficoLinha`, `GraficoBarras` e `GraficoCombinado`: eixo X por
21
+ * categoria (faixas), data ou número, um ou dois eixos Y, barras agrupadas e linhas.
22
+ */
23
+ export declare function Cartesiano(props: CartesianoProps): import("react").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import type { DadoGrafico, EixoGrafico, EixoXGrafico, GraficoBaseProps, ReferenciaGrafico, SerieGrafico } from './tipos.js';
2
+ export interface GraficoBarrasProps extends GraficoBaseProps {
3
+ dados: DadoGrafico[];
4
+ eixoX: EixoXGrafico;
5
+ eixoY?: EixoGrafico;
6
+ /** Mais de uma série = barras agrupadas lado a lado. */
7
+ series: SerieGrafico[];
8
+ /** `horizontal` serve para rankings: os rótulos longos ficam inteiros, sem girar. */
9
+ orientacao?: 'vertical' | 'horizontal';
10
+ /** `--graf-pos` acima de zero e `--graf-neg` abaixo, com a linha do zero destacada. */
11
+ divergente?: boolean;
12
+ /** Valor escrito na ponta de cada barra (some se não couber). */
13
+ rotulosNasBarras?: boolean;
14
+ referencias?: ReferenciaGrafico[];
15
+ }
16
+ /** Barras verticais ou horizontais, agrupadas ou divergentes. */
17
+ export declare function GraficoBarras({ series, ...props }: GraficoBarrasProps): import("react").JSX.Element;
@@ -0,0 +1,20 @@
1
+ import type { DadoGrafico, EixoGrafico, EixoXGrafico, GraficoBaseProps, ReferenciaGrafico, SerieGrafico } from './tipos.js';
2
+ export interface GraficoCombinadoProps extends GraficoBaseProps {
3
+ dados: DadoGrafico[];
4
+ eixoX: EixoXGrafico;
5
+ /** Eixo esquerdo. */
6
+ eixoY?: EixoGrafico;
7
+ eixoYDireito?: EixoGrafico;
8
+ /** Padrão: eixo esquerdo. */
9
+ barras?: SerieGrafico[];
10
+ /** Padrão: eixo direito. */
11
+ linhas?: SerieGrafico[];
12
+ referencias?: ReferenciaGrafico[];
13
+ /** Marca os pontos das linhas. Padrão: sim até 60 pontos. */
14
+ pontos?: boolean;
15
+ }
16
+ /**
17
+ * Barras e linhas no mesmo eixo X, com dois eixos Y. A legenda diz o eixo de cada
18
+ * série ("Ticket médio (R$, eixo direito)"): sem isso, o gráfico de dois eixos engana.
19
+ */
20
+ export declare function GraficoCombinado({ barras, linhas, eixoYDireito, ...props }: GraficoCombinadoProps): import("react").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { DadoGrafico, EixoGrafico, GraficoBaseProps } from './tipos.js';
3
+ export interface GraficoDispersaoProps extends GraficoBaseProps {
4
+ /** Cada item é um ponto. */
5
+ dados: DadoGrafico[];
6
+ /** Eixo horizontal (numérico). */
7
+ eixoX?: EixoGrafico;
8
+ eixoY?: EixoGrafico;
9
+ chaveX: string;
10
+ chaveY: string;
11
+ /** Campo mostrado como título da caixa de detalhes (ex.: o ano). */
12
+ chaveRotulo?: string;
13
+ /** Campo booleano: pontos destacados com `--graf-2`. */
14
+ chaveDestaque?: string;
15
+ /** Desenha a reta dos mínimos quadrados e mostra `r`, `r²` e `n` no canto. */
16
+ regressao?: boolean;
17
+ /** Texto abaixo do gráfico (ex.: p-valor calculado pelo app). */
18
+ nota?: ReactNode;
19
+ rotuloPontos?: string;
20
+ rotuloDestaque?: string;
21
+ rotuloRegressao?: string;
22
+ }
23
+ /** Cruzamento de duas medidas, um ponto por item, com reta de regressão opcional. */
24
+ export declare function GraficoDispersao(props: GraficoDispersaoProps): import("react").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import type { DadoGrafico, EixoGrafico, EixoXGrafico, FaixaGrafico, GraficoBaseProps, ReferenciaGrafico, SerieGrafico } from './tipos.js';
2
+ export interface GraficoLinhaProps extends GraficoBaseProps {
3
+ /** Um objeto por ponto do eixo X. */
4
+ dados: DadoGrafico[];
5
+ eixoX: EixoXGrafico;
6
+ eixoY?: EixoGrafico;
7
+ series: SerieGrafico[];
8
+ /** Marca os pontos. Padrão: sim até 60 pontos. */
9
+ pontos?: boolean;
10
+ /** Preenche abaixo da primeira série. */
11
+ area?: boolean;
12
+ /** Linhas horizontais (ex.: média mensal). */
13
+ referencias?: ReferenciaGrafico[];
14
+ /** Intervalos sombreados no eixo X (ex.: novembro e dezembro). */
15
+ faixas?: FaixaGrafico[];
16
+ }
17
+ /** Séries ao longo do eixo X (tempo, categoria ou número). `null` deixa uma falha na linha. */
18
+ export declare function GraficoLinha({ series, ...props }: GraficoLinhaProps): import("react").JSX.Element;
@@ -0,0 +1,25 @@
1
+ import type { GraficoBaseProps, ValorGrafico } from './tipos.js';
2
+ export interface CelulaMapaCalor {
3
+ linha: string | number;
4
+ coluna: string | number;
5
+ valor: ValorGrafico;
6
+ }
7
+ export interface MapaCalorProps extends Omit<GraficoBaseProps, 'legenda'> {
8
+ /** Rótulos das linhas, de cima para baixo (ex.: anos). */
9
+ linhas: Array<string | number>;
10
+ /** Rótulos das colunas, da esquerda para a direita (ex.: meses). */
11
+ colunas: Array<string | number>;
12
+ valores: CelulaMapaCalor[];
13
+ /** Padrão: o menor valor. */
14
+ minimo?: number;
15
+ /** Padrão: o maior valor. */
16
+ maximo?: number;
17
+ formatar?: (valor: number) => string;
18
+ unidade?: string;
19
+ /** Padrão `true`: barra com a escala de cores abaixo da grade. */
20
+ legendaEscala?: boolean;
21
+ /** Cabeçalho da coluna das linhas na tabela do "Ver dados". Padrão: "Linha". */
22
+ rotuloLinhas?: string;
23
+ }
24
+ /** Grade de células coloridas pela escala sequencial (`--graf-seq-1` a `--graf-seq-5`). */
25
+ export declare function MapaCalor(props: MapaCalorProps): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ export interface MinigraficoProps {
2
+ valores: number[];
3
+ /** A linha se desenha da esquerda para a direita ao aparecer (nunca com "reduzir movimento"). */
4
+ animacao?: boolean;
5
+ className?: string;
6
+ }
7
+ /**
8
+ * Linha pequena, sem eixos (sparkline), na cor `--ind-cor` do indicador ou `--graf-1`.
9
+ * Decorativa: o valor em texto fica com quem a usa.
10
+ */
11
+ export declare function Minigrafico({ valores, animacao, className }: MinigraficoProps): import("react").JSX.Element | null;
@@ -0,0 +1,77 @@
1
+ import { type KeyboardEvent, type ReactNode } from 'react';
2
+ import { type Coluna } from '../Tabela/Tabela.js';
3
+ import type { DadoGrafico, GraficoBaseProps } from './tipos.js';
4
+ export type FormaLegenda = 'linha' | 'barra' | 'ponto';
5
+ export interface ItemLegenda {
6
+ chave: string;
7
+ rotulo: string;
8
+ cor: string;
9
+ forma: FormaLegenda;
10
+ tracejada?: boolean;
11
+ visivel: boolean;
12
+ }
13
+ export interface TabelaGrafico {
14
+ colunas: Coluna<DadoGrafico>[];
15
+ registros: DadoGrafico[];
16
+ }
17
+ interface MolduraGraficoProps extends GraficoBaseProps {
18
+ semDados: boolean;
19
+ itensLegenda?: ItemLegenda[];
20
+ aoAlternarSerie?: (chave: string) => void;
21
+ /** Montada só quando a pessoa pede a tabela. */
22
+ tabela: () => TabelaGrafico;
23
+ /** Texto abaixo do gráfico (ex.: estatística calculada pelo app). */
24
+ nota?: ReactNode;
25
+ /** O gráfico em si, desenhado na largura do container. */
26
+ children: (largura: number) => ReactNode;
27
+ }
28
+ /** Largura do elemento, acompanhando o container (o SVG é redesenhado, não esticado). */
29
+ export declare function useLargura<T extends HTMLElement>(): readonly [import("react").RefObject<T | null>, number];
30
+ /** Amostra da legenda e da caixa de detalhes: traço (linha), quadrado (barra) ou círculo (ponto). */
31
+ export declare function Amostra({ cor, forma, tracejada }: {
32
+ cor: string;
33
+ forma: FormaLegenda;
34
+ tracejada?: boolean;
35
+ }): import("react").JSX.Element;
36
+ /** Esqueleto comum dos gráficos: título, legenda, ver dados, carregando e vazio. */
37
+ export declare function MolduraGrafico({ titulo, altura, legenda, carregando, textoVazio, verDados, animacao, className, semDados, itensLegenda, aoAlternarSerie, tabela, nota, children, }: MolduraGraficoProps): import("react").JSX.Element;
38
+ /** Legenda: esconde/mostra uma série, mas nunca a última visível (o gráfico ficaria em branco). */
39
+ export declare function useSeriesOcultas(): readonly [ReadonlySet<string>, (chave: string, total: number) => void];
40
+ /** Ponto ativo da caixa de detalhes: mouse, toque e setas do teclado andam pelos itens. */
41
+ export declare function usePontoAtivo(total: number): {
42
+ ativo: number | null;
43
+ setAtivo: import("react").Dispatch<import("react").SetStateAction<number | null>>;
44
+ aoTeclar: (e: KeyboardEvent) => void;
45
+ };
46
+ export interface LinhaDetalhe {
47
+ chave: string;
48
+ rotulo: string;
49
+ cor: string;
50
+ forma: FormaLegenda;
51
+ valor: string;
52
+ }
53
+ /** Caixa de detalhes, ao lado da posição `x` (vira para a esquerda na metade direita). */
54
+ export declare function CaixaDetalhes({ x, y, largura, titulo, linhas }: {
55
+ x: number;
56
+ y?: number;
57
+ largura: number;
58
+ titulo: string;
59
+ linhas: LinhaDetalhe[];
60
+ }): import("react").JSX.Element;
61
+ /** Texto da caixa de detalhes para o leitor de tela (a caixa visual fica escondida dele). */
62
+ export declare function textoDetalhe(titulo: string, linhas: LinhaDetalhe[]): string;
63
+ /**
64
+ * Recorte que revela o desenho da esquerda para a direita, na entrada animada
65
+ * (linhas, áreas e pontos). O retângulo cobre o SVG todo: no fim da animação,
66
+ * não corta nada.
67
+ */
68
+ export declare function useRevelacao(animacao: boolean | undefined, largura: number, altura: number): {
69
+ recorte: undefined;
70
+ definicao: null;
71
+ } | {
72
+ recorte: string;
73
+ definicao: import("react").JSX.Element;
74
+ };
75
+ /** Cor padrão da série pela posição: `--graf-1`, `--graf-2`… */
76
+ export declare function corDaSerie(indice: number, cor?: string): string;
77
+ export {};
@@ -0,0 +1,85 @@
1
+ import type { EixoGrafico, EixoXGrafico, ValorGrafico } from './tipos.js';
2
+ /** Valor da caixa de detalhes e da tabela: `1.234,5 mm`. */
3
+ export declare function formatarValor(valor: ValorGrafico | undefined, eixo?: EixoGrafico): string;
4
+ /** Rótulo do eixo: compacto a partir de 10 mil (`12,4 mil`). */
5
+ export declare function formatarPasso(valor: number, eixo?: EixoGrafico): string;
6
+ /** Lê o campo como número; texto, `undefined` e `NaN` viram `null` (sem dado). */
7
+ export declare function lerNumero(valor: unknown): ValorGrafico;
8
+ /** Passo "redondo" de 1, 2 ou 5 × 10ⁿ, o mais próximo acima do passo bruto. */
9
+ export declare function passoRedondo(bruto: number): number;
10
+ export interface DominioRedondo {
11
+ de: number;
12
+ ate: number;
13
+ passos: number[];
14
+ }
15
+ /** Domínio ampliado até múltiplos do passo, com cerca de `alvo` divisões. */
16
+ export declare function dominioRedondo(minimo: number, maximo: number, alvo?: number): DominioRedondo;
17
+ export interface EscalaLinear {
18
+ (valor: number): number;
19
+ de: number;
20
+ ate: number;
21
+ passos: number[];
22
+ }
23
+ /** Escala linear de `[de, ate]` para `[p0, p1]` (em px), com os passos redondos do domínio. */
24
+ export declare function escalaLinear(dominio: DominioRedondo, p0: number, p1: number): EscalaLinear;
25
+ /** Domínio de um eixo Y a partir dos valores, respeitando `minimo`/`maximo` do eixo. */
26
+ export declare function dominioDoEixo(valores: number[], eixo: EixoGrafico | undefined, alvo: number, comZero: boolean): DominioRedondo;
27
+ export interface EscalaBanda {
28
+ /** Início da faixa do item `i` (px). */
29
+ inicio(i: number): number;
30
+ centro(i: number): number;
31
+ /** Largura útil da faixa (sem o espaço entre faixas). */
32
+ largura: number;
33
+ /** Largura de uma faixa inteira, com o espaço. */
34
+ passo: number;
35
+ /** Item sob a posição em px. */
36
+ indice(px: number): number;
37
+ }
38
+ /** Uma faixa por item, com `espaco` (0 a 1) de folga entre elas. */
39
+ export declare function escalaBanda(n: number, p0: number, p1: number, espaco?: number): EscalaBanda;
40
+ /** `Date`, timestamp ou texto (`aaaa-mm-dd`, `aaaa-mm`, ISO). Texto sem hora é lido no fuso local. */
41
+ export declare function lerData(valor: unknown): Date | null;
42
+ /** Formatadores curto (eixo: `jan/21`) e completo (caixa de detalhes: `jan/2021`) para estas datas. */
43
+ export declare function formatadoresDeData(datas: Date[]): {
44
+ curto: (d: Date) => string;
45
+ completo: (d: Date) => string;
46
+ };
47
+ /** Rótulos do eixo X (curto) e da caixa de detalhes (completo), um por item. */
48
+ export declare function rotulosDoEixoX(valores: unknown[], eixoX: EixoXGrafico): {
49
+ curtos: string[];
50
+ completos: string[];
51
+ };
52
+ /** Valor numérico do eixo X (`data` vira timestamp); `null` se não der para ler. */
53
+ export declare function posicaoX(valor: unknown, tipo: EixoXGrafico['tipo']): number | null;
54
+ /**
55
+ * Largura aproximada do texto em px (Inter a 12px, com folga). Estimativa fixa: o
56
+ * desenho não depende da fonte já ter carregado, e o teste visual sai sempre igual.
57
+ */
58
+ export declare function larguraTexto(texto: string, tamanho?: number): number;
59
+ /**
60
+ * Índices cujos rótulos cabem sem se sobrepor, andando da esquerda para a direita
61
+ * (o primeiro sempre entra). `posicoes` em px, na ordem dos itens.
62
+ */
63
+ export declare function rotulosQueCabem(posicoes: number[], rotulos: string[], folga?: number): number[];
64
+ /**
65
+ * Um rótulo a cada N itens, com N fixo (para faixas de mesmo tamanho): o mesmo
66
+ * espaçamento do começo ao fim do eixo.
67
+ */
68
+ export declare function rotulosACadaN(passo: number, rotulos: string[], folga?: number): number[];
69
+ export interface RegressaoLinear {
70
+ inclinacao: number;
71
+ intercepto: number;
72
+ /** Correlação de Pearson. */
73
+ r: number;
74
+ r2: number;
75
+ n: number;
76
+ }
77
+ /**
78
+ * Reta dos mínimos quadrados (`y = inclinacao × x + intercepto`) com `r`, `r²` e `n`.
79
+ * Pontos com `x` ou `y` não numérico ficam de fora. `null` com menos de 3 pontos ou
80
+ * variância zero em `x` ou em `y`.
81
+ */
82
+ export declare function regressaoLinear(pontos: ReadonlyArray<{
83
+ x: number | null;
84
+ y: number | null;
85
+ }>): RegressaoLinear | null;
@@ -0,0 +1,68 @@
1
+ /** `null` = sem dado: a linha fica com uma falha, a barra some, a célula fica sem cor. Nunca vira zero. */
2
+ export type ValorGrafico = number | null;
3
+ export interface SerieGrafico {
4
+ /** Campo de cada item de `dados`. */
5
+ chave: string;
6
+ /** Legenda e caixa de detalhes. */
7
+ rotulo: string;
8
+ /** Padrão: `--graf-1`, `--graf-2`… na ordem das séries. */
9
+ cor?: string;
10
+ /** Ex.: linha de tendência. */
11
+ tracejada?: boolean;
12
+ /** Só no `GraficoCombinado`. Padrão: barras no esquerdo, linhas no direito. */
13
+ eixo?: 'esquerdo' | 'direito';
14
+ }
15
+ export interface EixoGrafico {
16
+ /** Ex.: "Vendas". */
17
+ rotulo?: string;
18
+ /** Ex.: "mil R$"; aparece no eixo e na caixa de detalhes. */
19
+ unidade?: string;
20
+ formatar?: (valor: number) => string;
21
+ minimo?: number;
22
+ maximo?: number;
23
+ }
24
+ export interface EixoXGrafico {
25
+ chave: string;
26
+ /** `data` aceita `Date`, timestamp ou texto `aaaa-mm-dd` / `aaaa-mm`. */
27
+ tipo: 'categoria' | 'data' | 'numero';
28
+ /** Cabeçalho da coluna na tabela do "Ver dados" (padrão: Categoria, Data ou Valor). */
29
+ rotulo?: string;
30
+ formatar?: (valor: string | number | Date) => string;
31
+ }
32
+ /** Linha horizontal de referência (ex.: média mensal). */
33
+ export interface ReferenciaGrafico {
34
+ valor: number;
35
+ rotulo: string;
36
+ eixo?: 'esquerdo' | 'direito';
37
+ }
38
+ /** Intervalo sombreado no eixo X (ex.: novembro e dezembro). `de` e `ate` são valores do eixo X. */
39
+ export interface FaixaGrafico {
40
+ de: string | number;
41
+ ate: string | number;
42
+ rotulo?: string;
43
+ }
44
+ /** Item de `dados`: um objeto por ponto do eixo X. */
45
+ export type DadoGrafico = Record<string, unknown>;
46
+ /** Props comuns a todos os gráficos. */
47
+ export interface GraficoBaseProps {
48
+ /** Nome acessível do gráfico (aparece acima dele). */
49
+ titulo: string;
50
+ /** Resumo em texto para leitor de tela (ex.: "Faturamento mensal de 2025, máximo em dezembro"). */
51
+ descricao?: string;
52
+ /** Altura da área do gráfico em px. Padrão `280`; a largura acompanha o container. */
53
+ altura?: number;
54
+ /** Padrão `true`. Clicar num item esconde ou mostra a série. */
55
+ legenda?: boolean;
56
+ carregando?: boolean;
57
+ /** Sem dados, mostra o `Vazio` com este texto. */
58
+ textoVazio?: string;
59
+ /**
60
+ * Anima a entrada do gráfico (linhas se desenham, barras crescem a partir do zero).
61
+ * Só na primeira vez que aparece, não a cada atualização dos dados, e nunca com
62
+ * "reduzir movimento" ligado no sistema. Padrão `false`.
63
+ */
64
+ animacao?: boolean;
65
+ /** Padrão `true`. Botão que alterna entre o gráfico e uma `Tabela` com os mesmos valores. */
66
+ verDados?: boolean;
67
+ className?: string;
68
+ }
@@ -14,6 +14,10 @@ export interface IndicadorProps {
14
14
  variacao?: number;
15
15
  /** Qual direção é boa (verde). Padrão: `alta`; use `baixa` para despesas, rejeições… */
16
16
  variacaoBoa?: 'alta' | 'baixa';
17
+ /** Série para um minigráfico abaixo do valor, na cor de `cor` (ou `--graf-1`). Sem eixos: só a forma da tendência. */
18
+ tendencia?: number[];
19
+ /** Anima o minigráfico da `tendencia` ao aparecer (nunca com "reduzir movimento"). Padrão `false`. */
20
+ animacao?: boolean;
17
21
  /** Linha miúda abaixo do valor (ex.: "há 6 min"). */
18
22
  descricao?: ReactNode;
19
23
  /** Rodapé (variação, comparação…). */
@@ -21,7 +25,7 @@ export interface IndicadorProps {
21
25
  className?: string;
22
26
  }
23
27
  /** Card de KPI para dashboards. */
24
- export declare function Indicador({ rotulo, valor, icone, cor, href, aoClicar, carregando, variacao, variacaoBoa, descricao, children, className }: IndicadorProps): import("react").JSX.Element;
28
+ export declare function Indicador({ rotulo, valor, icone, cor, href, aoClicar, carregando, variacao, variacaoBoa, tendencia, animacao, descricao, children, className }: IndicadorProps): import("react").JSX.Element;
25
29
  /** Grade responsiva de indicadores. */
26
30
  export declare function Indicadores({ children, className }: {
27
31
  children: ReactNode;