@celke/kole-react 0.0.0-stage → 0.1.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 (102) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +254 -2
  3. package/dist/components/Abas/Abas.d.ts +55 -0
  4. package/dist/components/AcaoLinha/AcaoLinha.d.ts +12 -0
  5. package/dist/components/Acordeao/Acordeao.d.ts +42 -0
  6. package/dist/components/Alerta/Alerta.d.ts +39 -0
  7. package/dist/components/Arquivo/CampoAnexo.d.ts +27 -0
  8. package/dist/components/Arquivo/DialogoArquivo.d.ts +11 -0
  9. package/dist/components/Arquivo/Foto.d.ts +29 -0
  10. package/dist/components/Arquivo/VisualizadorArquivo.d.ts +12 -0
  11. package/dist/components/Avaliacao/Avaliacao.d.ts +30 -0
  12. package/dist/components/Avatar/Avatar.d.ts +12 -0
  13. package/dist/components/Badge/Badge.d.ts +43 -0
  14. package/dist/components/Balao/Balao.d.ts +30 -0
  15. package/dist/components/BoasVindas/BoasVindas.d.ts +19 -0
  16. package/dist/components/Botao/Botao.d.ts +40 -0
  17. package/dist/components/BotaoFechar/BotaoFechar.d.ts +10 -0
  18. package/dist/components/Busca/Busca.d.ts +27 -0
  19. package/dist/components/CabecalhoPagina/CabecalhoPagina.d.ts +21 -0
  20. package/dist/components/Campo/Campo.d.ts +63 -0
  21. package/dist/components/CampoBusca/CampoBusca.d.ts +28 -0
  22. package/dist/components/CampoBusca/CampoCidade.d.ts +25 -0
  23. package/dist/components/CampoDominio/CampoDominio.d.ts +17 -0
  24. package/dist/components/CampoMarcacao/CampoMarcacao.d.ts +13 -0
  25. package/dist/components/CampoMensagem/CampoMensagem.d.ts +31 -0
  26. package/dist/components/CampoSelect/CampoSelect.d.ts +25 -0
  27. package/dist/components/CampoSenha/CampoSenha.d.ts +16 -0
  28. package/dist/components/CampoTextarea/CampoTextarea.d.ts +11 -0
  29. package/dist/components/CampoTexto/CampoTexto.d.ts +63 -0
  30. package/dist/components/Card/Card.d.ts +51 -0
  31. package/dist/components/Carregando/Carregando.d.ts +10 -0
  32. package/dist/components/Carrossel/Carrossel.d.ts +33 -0
  33. package/dist/components/Chip/Chip.d.ts +11 -0
  34. package/dist/components/Citacao/Citacao.d.ts +20 -0
  35. package/dist/components/Confirmacao/Confirmacao.d.ts +35 -0
  36. package/dist/components/Conversa/Conversa.d.ts +21 -0
  37. package/dist/components/Detalhes/Detalhes.d.ts +12 -0
  38. package/dist/components/Dialogo/Dialogo.d.ts +37 -0
  39. package/dist/components/Dialogo/Sobreposicao.d.ts +19 -0
  40. package/dist/components/Dica/Dica.d.ts +15 -0
  41. package/dist/components/Escolha/Escolha.d.ts +14 -0
  42. package/dist/components/Estrutura/Estrutura.d.ts +106 -0
  43. package/dist/components/Filtros/Filtros.d.ts +22 -0
  44. package/dist/components/Form/Form.d.ts +85 -0
  45. package/dist/components/Girador/Girador.d.ts +15 -0
  46. package/dist/components/GrupoBotoes/GrupoBotoes.d.ts +56 -0
  47. package/dist/components/Imagem/Imagem.d.ts +40 -0
  48. package/dist/components/Indicador/Indicador.d.ts +29 -0
  49. package/dist/components/Lista/Lista.d.ts +47 -0
  50. package/dist/components/ListaCards/ListaCards.d.ts +28 -0
  51. package/dist/components/Mensagem/Mensagem.d.ts +40 -0
  52. package/dist/components/MenuSuspenso/MenuSuspenso.d.ts +79 -0
  53. package/dist/components/Paginacao/Paginacao.d.ts +13 -0
  54. package/dist/components/Picklist/Picklist.d.ts +28 -0
  55. package/dist/components/Placa/Placa.d.ts +9 -0
  56. package/dist/components/Preferencias/Preferencias.d.ts +26 -0
  57. package/dist/components/Progresso/Progresso.d.ts +42 -0
  58. package/dist/components/QuadroArrastavel/QuadroArrastavel.d.ts +27 -0
  59. package/dist/components/Recolhivel/Recolhivel.d.ts +14 -0
  60. package/dist/components/Referencias/Referencias.d.ts +24 -0
  61. package/dist/components/Skeleton/Skeleton.d.ts +8 -0
  62. package/dist/components/Status/Status.d.ts +10 -0
  63. package/dist/components/Tabela/Tabela.d.ts +57 -0
  64. package/dist/components/TelaErro/TelaErro.d.ts +25 -0
  65. package/dist/components/TelaLogin/TelaLogin.d.ts +66 -0
  66. package/dist/components/Toast/Toast.d.ts +62 -0
  67. package/dist/components/Trilha/Trilha.d.ts +60 -0
  68. package/dist/components/Vazio/Vazio.d.ts +12 -0
  69. package/dist/css.d.ts +1 -0
  70. package/dist/estilos.css +72 -0
  71. package/dist/fonts/LICENSE +93 -0
  72. package/dist/fonts/inter-cyrillic-ext-wght-normal.woff2 +0 -0
  73. package/dist/fonts/inter-cyrillic-wght-normal.woff2 +0 -0
  74. package/dist/fonts/inter-greek-ext-wght-normal.woff2 +0 -0
  75. package/dist/fonts/inter-greek-wght-normal.woff2 +0 -0
  76. package/dist/fonts/inter-latin-ext-wght-normal.woff2 +0 -0
  77. package/dist/fonts/inter-latin-wght-normal.woff2 +0 -0
  78. package/dist/fonts/inter-vietnamese-wght-normal.woff2 +0 -0
  79. package/dist/index.d.ts +81 -0
  80. package/dist/index.js +6915 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/tokens.css +325 -0
  83. package/dist/utils/Icone.d.ts +22 -0
  84. package/dist/utils/anexos.d.ts +20 -0
  85. package/dist/utils/constantes.d.ts +14 -0
  86. package/dist/utils/cx.d.ts +2 -0
  87. package/dist/utils/datas.d.ts +17 -0
  88. package/dist/utils/entidade.d.ts +19 -0
  89. package/dist/utils/jwt.d.ts +11 -0
  90. package/dist/utils/mascara.d.ts +19 -0
  91. package/dist/utils/picklist.d.ts +15 -0
  92. package/dist/utils/portal.d.ts +8 -0
  93. package/dist/utils/senha.d.ts +21 -0
  94. package/dist/utils/severidade.d.ts +7 -0
  95. package/dist/utils/texto.d.ts +28 -0
  96. package/dist/utils/tipos.d.ts +8 -0
  97. package/dist/utils/tiposCampo.d.ts +12 -0
  98. package/dist/utils/useBuscaAssincrona.d.ts +22 -0
  99. package/dist/utils/useCliqueFora.d.ts +3 -0
  100. package/dist/utils/usePosicaoFlutuante.d.ts +13 -0
  101. package/dist/utils/validadores.d.ts +42 -0
  102. package/package.json +81 -4
@@ -0,0 +1,37 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type IconeProp } from '../../utils/Icone.js';
3
+ export type TamanhoDialogo = 'pequeno' | 'medio' | 'grande' | 'extragrande' | 'full';
4
+ /** Efeito de entrada do diálogo central. */
5
+ export type AnimacaoDialogo = 'padrao' | 'escala' | 'deslizar-direita' | 'deslizar-baixo' | 'jornal' | 'queda' | 'girar-horizontal' | 'girar-vertical' | 'super-escala' | 'placa' | 'girar-baixo' | 'girar-esquerda';
6
+ export interface DialogoProps {
7
+ aberto: boolean;
8
+ aoFechar: () => void;
9
+ titulo: string;
10
+ subtitulo?: string;
11
+ icone?: IconeProp;
12
+ tamanho?: TamanhoDialogo;
13
+ /** Tela cheia só abaixo desta largura (`sm` 36rem · `md` 48rem · `lg` 64rem · `xl` 75rem · `xxl` 87.5rem). */
14
+ telaCheiaAbaixo?: 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
15
+ /**
16
+ * `central` (padrão) · `lateral` = painel encostado à direita, altura
17
+ * total (gaveta). No lateral, `full` cai para `grande`.
18
+ */
19
+ aparencia?: 'central' | 'lateral';
20
+ /** Onde o diálogo central fica: `centro` (padrão) ou `topo`. */
21
+ posicao?: 'centro' | 'topo';
22
+ /**
23
+ * Conteúdo longo: `corpo` (padrão) rola só o miolo, com cabeçalho e rodapé
24
+ * fixos · `pagina` deixa o diálogo crescer e rola a máscara inteira.
25
+ */
26
+ rolagem?: 'corpo' | 'pagina';
27
+ animacao?: AnimacaoDialogo;
28
+ /** `escuro` = cabeçalho na cor da marca. */
29
+ tom?: 'claro' | 'escuro';
30
+ /** Esc / clique fora fecham (padrão: sim). */
31
+ dispensavel?: boolean;
32
+ /** Botões do rodapé. */
33
+ rodape?: ReactNode;
34
+ children?: ReactNode;
35
+ className?: string;
36
+ }
37
+ export declare function Dialogo({ aberto, aoFechar, titulo, subtitulo, icone, tamanho, telaCheiaAbaixo, aparencia, posicao, rolagem, animacao, tom, dispensavel, rodape, children, className, }: DialogoProps): import("react").JSX.Element | null;
@@ -0,0 +1,19 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface SobreposicaoProps {
3
+ aoDispensar?: () => void;
4
+ /** Esc e clique na máscara fecham. */
5
+ dispensavel?: boolean;
6
+ rotuloId?: string;
7
+ descricaoId?: string;
8
+ /** Elemento que recebe o foco ao abrir (seletor CSS dentro do painel). */
9
+ focoInicial?: string;
10
+ className?: string;
11
+ /** Classe extra na máscara (ex.: alinhamento do painel lateral). */
12
+ classeMascara?: string;
13
+ children: ReactNode;
14
+ }
15
+ /**
16
+ * Máscara + painel modal: portal no <body>, trava o scroll, prende o foco
17
+ * (Tab circula dentro) e devolve o foco a quem abriu ao fechar.
18
+ */
19
+ export declare function Sobreposicao({ aoDispensar, dispensavel, rotuloId, descricaoId, focoInicial, className, classeMascara, children, }: SobreposicaoProps): import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from 'react';
2
+ export type PosicaoDica = 'cima' | 'direita' | 'baixo' | 'esquerda';
3
+ export type CorDica = 'padrao' | 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'claro';
4
+ export interface DicaProps {
5
+ /** Texto do balão (aceita conteúdo formatado). Vazio = sem dica (o filho é renderizado puro). */
6
+ texto?: ReactNode;
7
+ children: ReactNode;
8
+ /** Atraso para abrir no hover, em ms. */
9
+ atraso?: number;
10
+ /** Lado preferido; vira para o oposto se não couber. Padrão: `cima`. */
11
+ posicao?: PosicaoDica;
12
+ cor?: CorDica;
13
+ }
14
+ /** Balão de dica (tooltip) no hover/foco do elemento envolvido. */
15
+ export declare function Dica({ texto, children, atraso, posicao, cor }: DicaProps): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import type { Opcao } from '../../utils/tipos.js';
2
+ import { type CampoBaseProps } from '../Campo/Campo.js';
3
+ export interface EscolhaProps<V = string> extends Omit<CampoBaseProps, 'variante' | 'aviso'> {
4
+ opcoes: Opcao<V>[];
5
+ valor?: V | null;
6
+ aoMudar?: (valor: V) => void;
7
+ /** `segmentado` = botões colados · `radio` = lista de bolinhas. */
8
+ aparencia?: 'segmentado' | 'radio';
9
+ disabled?: boolean;
10
+ ariaLabel?: string;
11
+ id?: string;
12
+ }
13
+ /** Escolha única entre poucas opções (radiogroup). */
14
+ export declare function Escolha<V = string>({ rotulo, dica, erro, obrigatorio, className, opcoes, valor, aoMudar, aparencia, disabled, ariaLabel, id: idExterno, }: EscolhaProps<V>): import("react").JSX.Element;
@@ -0,0 +1,106 @@
1
+ import { type MouseEvent, type ReactNode } from 'react';
2
+ import { type IconeProp } from '../../utils/Icone.js';
3
+ import { type ModeloTrilha } from '../Trilha/Trilha.js';
4
+ export interface ItemNav {
5
+ rotulo: string;
6
+ icone?: IconeProp;
7
+ /** Folha: destino. Grupo: omita e use `filhos`. */
8
+ rota?: string;
9
+ filhos?: ItemNav[];
10
+ desabilitado?: boolean;
11
+ }
12
+ export interface SecaoNav {
13
+ /** Rótulo do grupo (linha em caixa alta). */
14
+ rotulo?: string;
15
+ itens: ItemNav[];
16
+ }
17
+ export interface Marca {
18
+ nome: string;
19
+ subtitulo?: string;
20
+ /** URL da imagem do logo (sem ela, mostra um escudo). */
21
+ logo?: string;
22
+ href?: string;
23
+ }
24
+ export interface UsuarioEstrutura {
25
+ nome: string;
26
+ cargo?: string;
27
+ foto?: string;
28
+ iniciais?: string;
29
+ }
30
+ export interface ItemMenu {
31
+ id: string;
32
+ rotulo: string;
33
+ icone?: string;
34
+ destrutivo?: boolean;
35
+ divisorAntes?: boolean;
36
+ }
37
+ export interface Notificacao {
38
+ id: string;
39
+ titulo: string;
40
+ descricao?: string;
41
+ tempo?: string;
42
+ icone?: string;
43
+ naoLida?: boolean;
44
+ }
45
+ /** Props entregues a `renderLink` (para usar o <Link> do seu roteador). */
46
+ export interface PropsLink {
47
+ href: string;
48
+ className: string;
49
+ children: ReactNode;
50
+ onClick: (e: MouseEvent<HTMLAnchorElement>) => void;
51
+ 'aria-current'?: 'page';
52
+ 'aria-disabled'?: boolean;
53
+ }
54
+ export interface EstruturaProps {
55
+ marca: Marca;
56
+ nav: SecaoNav[];
57
+ /** Rota atual — marca o item ativo (ex.: `location.pathname`). */
58
+ rotaAtual?: string;
59
+ /** Navegação SPA: recebe a rota e evita o reload. */
60
+ aoNavegar?: (rota: string) => void;
61
+ /** Renderiza os links com o componente do seu roteador. */
62
+ renderLink?: (props: PropsLink, item: ItemNav) => ReactNode;
63
+ usuario?: UsuarioEstrutura;
64
+ menuUsuario?: ItemMenu[];
65
+ aoEscolherMenuUsuario?: (id: string) => void;
66
+ /** Lista de notificações. Sem a prop, o sino não aparece. */
67
+ notificacoes?: Notificacao[];
68
+ aoEscolherNotificacao?: (id: string) => void;
69
+ /** Menu de ferramentas de desenvolvimento (não passe em produção). */
70
+ menuDesenvolvimento?: ItemMenu[];
71
+ aoEscolherMenuDesenvolvimento?: (id: string) => void;
72
+ /** Tarja de ambiente no topo da sidebar (Homologação, Treinamento…). */
73
+ ambiente?: {
74
+ rotulo: string;
75
+ severidade?: 'warn' | 'err' | 'info' | 'neutral';
76
+ /** Texto curto para a sidebar recolhida (padrão: 3 primeiras letras, ex.: "HOM"). */
77
+ sigla?: string;
78
+ };
79
+ versao?: string;
80
+ /**
81
+ * Como os grupos do menu abrem com a sidebar expandida: `abaixo` (padrão,
82
+ * sanfona dentro da própria sidebar) ou `lateral` (painel ao lado). Com a
83
+ * sidebar recolhida, sempre abre o painel lateral.
84
+ */
85
+ submenu?: 'abaixo' | 'lateral';
86
+ /** Modelo padrão das trilhas de navegação do sistema (separador, ícones, aparência). */
87
+ modeloTrilha?: ModeloTrilha;
88
+ /** Conteúdo do rodapé da sidebar (marca do ecossistema, links…). */
89
+ rodapeSidebar?: ReactNode;
90
+ /** Rodapé da área de conteúdo, sempre visível no pé da tela (autoria, direitos, links…). */
91
+ rodape?: ReactNode;
92
+ /** Substitui a busca padrão (filtro do menu). `false` remove. */
93
+ busca?: ReactNode | false;
94
+ placeholderBusca?: string;
95
+ aoBuscar?: (termo: string) => void;
96
+ /** Controles extras à direita da topbar. */
97
+ complementosTopbar?: ReactNode;
98
+ children?: ReactNode;
99
+ }
100
+ /**
101
+ * Moldura do app autenticado: sidebar recolhível (com submenu em painel
102
+ * lateral), topbar com busca, densidade, tema, notificações e perfil.
103
+ * Responsiva: abaixo de 64rem a sidebar vira sobreposição; abaixo de 48rem,
104
+ * gaveta com hambúrguer.
105
+ */
106
+ export declare function Estrutura({ marca, nav, rotaAtual, aoNavegar, renderLink, usuario, menuUsuario, aoEscolherMenuUsuario, notificacoes, aoEscolherNotificacao, menuDesenvolvimento, aoEscolherMenuDesenvolvimento, ambiente, versao, rodapeSidebar, rodape, modeloTrilha, submenu, busca, placeholderBusca, aoBuscar, complementosTopbar, children, }: EstruturaProps): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface FiltroAplicado {
3
+ campo: string;
4
+ rotulo: string;
5
+ aoRemover?: () => void;
6
+ }
7
+ export interface FiltrosProps {
8
+ /** Campos de filtro — de preferência com `variante="inline"`. */
9
+ children: ReactNode;
10
+ aoConsultar: () => void;
11
+ aoLimpar?: () => void;
12
+ /** Chips dos filtros já aplicados. */
13
+ aplicados?: FiltroAplicado[];
14
+ /** Há mudanças ainda não consultadas (ponto âmbar + aviso). */
15
+ alterado?: boolean;
16
+ consultando?: boolean;
17
+ /** `barra` = linha única em card · `secao` = moldura com legenda "Filtros". */
18
+ aparencia?: 'barra' | 'secao';
19
+ className?: string;
20
+ }
21
+ /** Barra de filtros de listagem: campos + Consultar + Limpar + chips. */
22
+ export declare function Filtros({ children, aoConsultar, aoLimpar, aplicados, alterado, consultando, aparencia, className, }: FiltrosProps): import("react").JSX.Element;
@@ -0,0 +1,85 @@
1
+ import { type MouseEvent, type ReactNode } from 'react';
2
+ import { type IconeProp } from '../../utils/Icone.js';
3
+ import { type Entidade, type Modo } from '../../utils/entidade.js';
4
+ import { type ItemTrilha } from '../Trilha/Trilha.js';
5
+ import { type TamanhoDialogo } from '../Dialogo/Dialogo.js';
6
+ /** Item do menu lateral: cada um leva a um formulário do mesmo cadastro. */
7
+ export interface ItemMenuForm {
8
+ id: string;
9
+ rotulo: string;
10
+ icone?: IconeProp;
11
+ /** Com `href` o item vira link (ex.: `#/pedidos/novo/itens`). */
12
+ href?: string;
13
+ /** Chip de pendências ao lado do rótulo. */
14
+ pendencias?: number;
15
+ desabilitado?: boolean;
16
+ }
17
+ export interface FormProps {
18
+ /** `pagina` = tela cheia com menu lateral opcional · `modal` = dentro de diálogo. */
19
+ arranjo?: 'pagina' | 'modal';
20
+ /**
21
+ * Título do cabeçalho. Com `entidade`, pode ser omitido: vira
22
+ * "Cadastrar/Editar/Visualizar <entidade>" conforme o `modo`.
23
+ */
24
+ titulo?: string;
25
+ /** Entidade do cadastro (`'veículo'` ou `{ nome, novo: 'Firmar contrato' }`). */
26
+ entidade?: string | Entidade;
27
+ /** Fase do registro na tela (padrão: `novo`). Em `leitura` some o Salvar. */
28
+ modo?: Modo;
29
+ /**
30
+ * Página: trilha de navegação abaixo do título. `true` = caminho automático
31
+ * do menu; lista = automático + estes passos no fim.
32
+ */
33
+ trilha?: boolean | ItemTrilha[];
34
+ /** Identificação do registro (ex.: "Protocolo 2026/0012"). */
35
+ identidade?: string;
36
+ icone?: IconeProp;
37
+ /** Modal: controla a abertura. */
38
+ aberto?: boolean;
39
+ tamanho?: TamanhoDialogo;
40
+ aoSalvar?: () => void;
41
+ aoCancelar?: () => void;
42
+ salvando?: boolean;
43
+ /** Quantos campos faltam corrigir — mostrado no rodapé. */
44
+ pendencias?: number;
45
+ /** Página: menu lateral com os formulários do cadastro. */
46
+ menu?: ItemMenuForm[];
47
+ /** Título do card do menu (padrão: "Formulários"). */
48
+ menuTitulo?: string;
49
+ /** `id` do item do menu que corresponde a este formulário. */
50
+ menuAtivo?: string;
51
+ /** Clique num item do menu; num item com `href`, chame `preventDefault` para navegar por conta própria. */
52
+ aoEscolherMenu?: (id: string, evento: MouseEvent) => void;
53
+ /** Botões extras no rodapé, antes de Cancelar/Salvar. */
54
+ acoes?: ReactNode;
55
+ /** Cancelar + Salvar no rodapé (padrão: sim). */
56
+ acoesPadrao?: boolean;
57
+ /**
58
+ * Página: onde ficam os botões. `secao` (padrão) = card logo abaixo das
59
+ * seções · `fixo` = barra presa ao pé da tela.
60
+ */
61
+ posicaoAcoes?: 'secao' | 'fixo';
62
+ rotuloSalvar?: string;
63
+ children: ReactNode;
64
+ className?: string;
65
+ }
66
+ /**
67
+ * Formulário de cadastro. Agrupe os campos em `<FormSecao>`; a grade de
68
+ * colunas, o menu lateral e o rodapé com Salvar/Cancelar vêm prontos.
69
+ */
70
+ export declare function Form({ arranjo, titulo: tituloProp, entidade, modo, trilha, identidade, icone, aberto, tamanho, aoSalvar, aoCancelar, salvando, pendencias, menu, menuTitulo, menuAtivo, aoEscolherMenu, acoes, acoesPadrao, posicaoAcoes, rotuloSalvar, children, className, }: FormProps): import("react").JSX.Element | null;
71
+ export interface FormSecaoProps {
72
+ legenda: string;
73
+ icone?: IconeProp;
74
+ /** Botões no cabeçalho da seção. */
75
+ acoes?: ReactNode;
76
+ /** Colunas da grade (padrão: 4 na página, 3 no modal). */
77
+ colunas?: number;
78
+ children: ReactNode;
79
+ className?: string;
80
+ }
81
+ /**
82
+ * Seção de formulário: card com título e grade de campos.
83
+ * Larguras: `className="lp-col-2"`, `lp-col-3` ou `lp-col-full` no campo.
84
+ */
85
+ export declare function FormSecao({ legenda, icone, acoes, colunas, children, className }: FormSecaoProps): import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ /** `atual` = cor do texto em volta (para usar dentro de botões). */
2
+ export type CorGirador = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro' | 'atual';
3
+ export interface GiradorProps {
4
+ /** `anel` = gira · `pulso` = cresce e some · `pontos` = três pontos piscando. */
5
+ tipo?: 'anel' | 'pulso' | 'pontos';
6
+ cor?: CorGirador;
7
+ /** Escala pronta, ou qualquer medida CSS (ex.: `'3rem'`). */
8
+ tamanho?: 'pequeno' | 'medio' | 'grande' | (string & {});
9
+ /** Texto para leitor de tela (e visível com `mostrarRotulo`). */
10
+ rotulo?: string;
11
+ mostrarRotulo?: boolean;
12
+ className?: string;
13
+ }
14
+ /** Indicador de atividade em linha (spinner). Para espera de seção inteira, use `Carregando`. */
15
+ export declare function Girador({ tipo, cor, tamanho, rotulo, mostrarRotulo, className }: GiradorProps): import("react").JSX.Element;
@@ -0,0 +1,56 @@
1
+ import type { JSX, ReactNode } from 'react';
2
+ import type { IconeProp } from '../../utils/Icone.js';
3
+ import { type BotaoProps, type PadroesBotao } from '../Botao/Botao.js';
4
+ export interface GrupoBotoesProps extends PadroesBotao {
5
+ children: ReactNode;
6
+ orientacao?: 'horizontal' | 'vertical';
7
+ /** Nome do grupo para leitor de tela (ex.: "Controles do player"). */
8
+ rotulo?: string;
9
+ className?: string;
10
+ }
11
+ /**
12
+ * Botões colados num bloco só. `severidade`, `aparencia`, `formato` e
13
+ * `tamanho` viram o padrão dos botões de dentro (cada um pode sobrescrever).
14
+ */
15
+ export declare function GrupoBotoes({ children, orientacao, rotulo, className, ...padroes }: GrupoBotoesProps): JSX.Element;
16
+ export interface OpcaoAlternancia<V> {
17
+ valor: V;
18
+ rotulo?: string;
19
+ icone?: IconeProp;
20
+ /** Obrigatória quando a opção é só ícone. */
21
+ dica?: string;
22
+ desabilitada?: boolean;
23
+ }
24
+ interface BaseAlternancia<V> extends Omit<GrupoBotoesProps, 'children'> {
25
+ opcoes: OpcaoAlternancia<V>[];
26
+ /** Aparência das opções desmarcadas (as marcadas ficam sólidas). Padrão: `contorno`. */
27
+ aparencia?: BotaoProps['aparencia'];
28
+ }
29
+ export interface GrupoAlternanciaUnicoProps<V> extends BaseAlternancia<V> {
30
+ multiplo?: false;
31
+ valor?: V | null;
32
+ aoMudar?: (valor: V) => void;
33
+ }
34
+ export interface GrupoAlternanciaMultiploProps<V> extends BaseAlternancia<V> {
35
+ multiplo: true;
36
+ valor?: V[];
37
+ aoMudar?: (valor: V[]) => void;
38
+ }
39
+ export type GrupoAlternanciaProps<V> = GrupoAlternanciaUnicoProps<V> | GrupoAlternanciaMultiploProps<V>;
40
+ /**
41
+ * Grupo de botões de seleção: única (como rádio) ou múltipla (como caixas de
42
+ * marcação). Cada opção é um botão de alternância (`aria-pressed`).
43
+ */
44
+ export declare function GrupoAlternancia<V = string>(props: GrupoAlternanciaMultiploProps<V>): JSX.Element;
45
+ export declare function GrupoAlternancia<V = string>(props: GrupoAlternanciaUnicoProps<V>): JSX.Element;
46
+ export interface BarraBotoesProps {
47
+ children: ReactNode;
48
+ /** Nome da barra para leitor de tela. */
49
+ rotulo?: string;
50
+ /** `inicio` (padrão) · `entre` = espalha os grupos de ponta a ponta. */
51
+ distribuicao?: 'inicio' | 'entre';
52
+ className?: string;
53
+ }
54
+ /** Barra de ferramentas: vários grupos (e campos) lado a lado. */
55
+ export declare function BarraBotoes({ children, rotulo, distribuicao, className }: BarraBotoesProps): JSX.Element;
56
+ export {};
@@ -0,0 +1,40 @@
1
+ import type { CSSProperties, ImgHTMLAttributes, ReactNode } from 'react';
2
+ /** `reto` · `arredondado` = cantos do card · `circulo` = pílula/círculo. */
3
+ export type CantosImagem = 'reto' | 'arredondado' | 'circulo';
4
+ /** `esquerda`/`direita` = flutua com o texto em volta · `centro` = bloco centralizado. */
5
+ export type AlinhamentoImagem = 'esquerda' | 'centro' | 'direita';
6
+ export interface ImagemProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'alt' | 'width'> {
7
+ src: string;
8
+ /** Texto alternativo. Use `''` só para imagem decorativa. */
9
+ alt: string;
10
+ /** Encolhe para caber no container (largura máx. 100%). Padrão: true. */
11
+ responsiva?: boolean;
12
+ cantos?: CantosImagem;
13
+ /** Moldura de miniatura: borda fina e respiro em volta. */
14
+ miniatura?: boolean;
15
+ alinhamento?: AlinhamentoImagem;
16
+ /** Recorta na proporção dada (ex.: `'1 / 1'`, `'16 / 9'`) sem distorcer. */
17
+ proporcao?: string;
18
+ /** Largura (ex.: `'12rem'`, `'50%'`). */
19
+ largura?: string;
20
+ }
21
+ /** Imagem responsiva com cantos, miniatura, recorte e alinhamento. */
22
+ export declare function Imagem({ responsiva, cantos, miniatura, alinhamento, proporcao, largura, loading, className, style, ...resto }: ImagemProps): import("react").JSX.Element;
23
+ export interface FiguraProps {
24
+ src: string;
25
+ alt: string;
26
+ /** Legenda abaixo da imagem. */
27
+ legenda?: ReactNode;
28
+ alinhamentoLegenda?: 'inicio' | 'centro' | 'fim';
29
+ cantos?: CantosImagem;
30
+ miniatura?: boolean;
31
+ proporcao?: string;
32
+ /** Posição da figura inteira (imagem + legenda). */
33
+ alinhamento?: AlinhamentoImagem;
34
+ /** Largura da figura (ex.: `'14rem'`). */
35
+ largura?: string;
36
+ className?: string;
37
+ style?: CSSProperties;
38
+ }
39
+ /** Imagem com legenda (`<figure>` + `<figcaption>`). */
40
+ export declare function Figura({ src, alt, legenda, alinhamentoLegenda, cantos, miniatura, proporcao, alinhamento, largura, className, style, }: FiguraProps): import("react").JSX.Element;
@@ -0,0 +1,29 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type IconeProp } from '../../utils/Icone.js';
3
+ export interface IndicadorProps {
4
+ rotulo: string;
5
+ valor: number | string;
6
+ icone?: IconeProp;
7
+ /** Cor de destaque (qualquer cor CSS, de preferência um token: `var(--ok-solid)`). */
8
+ cor?: string;
9
+ /** Torna o card um link. */
10
+ href?: string;
11
+ aoClicar?: () => void;
12
+ carregando?: boolean;
13
+ /** Variação em % (ex.: `1.31` ou `-9.26`): seta e cor ao lado do valor. */
14
+ variacao?: number;
15
+ /** Qual direção é boa (verde). Padrão: `alta`; use `baixa` para despesas, rejeições… */
16
+ variacaoBoa?: 'alta' | 'baixa';
17
+ /** Linha miúda abaixo do valor (ex.: "há 6 min"). */
18
+ descricao?: ReactNode;
19
+ /** Rodapé (variação, comparação…). */
20
+ children?: ReactNode;
21
+ className?: string;
22
+ }
23
+ /** 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;
25
+ /** Grade responsiva de indicadores. */
26
+ export declare function Indicadores({ children, className }: {
27
+ children: ReactNode;
28
+ className?: string;
29
+ }): import("react").JSX.Element;
@@ -0,0 +1,47 @@
1
+ import type { MouseEvent, ReactNode } from 'react';
2
+ import { type IconeProp } from '../../utils/Icone.js';
3
+ export type CorItemLista = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';
4
+ export interface ListaProps {
5
+ children: ReactNode;
6
+ /** `padrao` = caixa com borda · `sem-borda` = encostada no container (dentro de card). */
7
+ variante?: 'padrao' | 'sem-borda';
8
+ /** Numera os itens (1, 2, 3…). */
9
+ numerada?: boolean;
10
+ /** Itens lado a lado; com breakpoint, só a partir dele (`sm` 36rem · `md` 48rem · `lg` 64rem · `xl` 75rem). */
11
+ horizontal?: boolean | 'sm' | 'md' | 'lg' | 'xl';
12
+ /** Nome da lista para leitor de tela. */
13
+ rotulo?: string;
14
+ className?: string;
15
+ }
16
+ /** Grupo de itens empilhados (list group): lista simples, de links, de seleção… */
17
+ export declare function Lista({ children, variante, numerada, horizontal, rotulo, className }: ListaProps): import("react").JSX.Element;
18
+ export interface ItemListaProps {
19
+ /** Conteúdo principal (ou a descrição, quando há `titulo`). */
20
+ children?: ReactNode;
21
+ /** Linha em negrito acima do conteúdo. */
22
+ titulo?: ReactNode;
23
+ /** Ícone à esquerda (atalho para `inicio`). */
24
+ icone?: IconeProp;
25
+ /** Conteúdo à esquerda: avatar, ícone em caixa… */
26
+ inicio?: ReactNode;
27
+ /** Conteúdo à direita: badge, contagem, data… */
28
+ fim?: ReactNode;
29
+ ativo?: boolean;
30
+ desabilitado?: boolean;
31
+ /** Tom do item: fundo claro da cor, ou sólido com `solido`. */
32
+ cor?: CorItemLista;
33
+ solido?: boolean;
34
+ /** Vira link. */
35
+ href?: string;
36
+ /** Vira botão. */
37
+ onClick?: (e: MouseEvent<HTMLElement>) => void;
38
+ /** Vira item de seleção: caixa de marcação ou rádio. */
39
+ marcacao?: 'caixa' | 'radio';
40
+ marcado?: boolean;
41
+ aoMarcar?: (marcado: boolean) => void;
42
+ /** Nome do grupo de rádios. */
43
+ nome?: string;
44
+ className?: string;
45
+ }
46
+ /** Item de `Lista`. Estático, link (`href`), botão (`onClick`) ou seleção (`marcacao`). */
47
+ export declare function ItemLista({ children, titulo, icone, inicio, fim, ativo, desabilitado, cor, solido, href, onClick, marcacao, marcado, aoMarcar, nome, className, }: ItemListaProps): import("react").JSX.Element;
@@ -0,0 +1,28 @@
1
+ import type { Key, ReactNode } from 'react';
2
+ import { type PaginacaoProps } from '../Paginacao/Paginacao.js';
3
+ export interface ListaCardsProps<T> {
4
+ itens: T[];
5
+ /** Monta o card de cada item (normalmente um `<Card>` composto pelo módulo). */
6
+ card: (item: T, indice: number) => ReactNode;
7
+ chave?: (item: T, indice: number) => Key;
8
+ /** Largura mínima de cada célula (padrão: 16rem) — define quantas colunas cabem. */
9
+ larguraMin?: string;
10
+ /** Altura das silhuetas: calibre pela altura do SEU card (padrão: 8.5rem). */
11
+ alturaCard?: string;
12
+ /** Nome acessível da grade. */
13
+ rotulo?: string;
14
+ /** Primeira carga: silhuetas no lugar dos cards. */
15
+ carregando?: boolean;
16
+ /** Recarga: mantém a grade esmaecida. */
17
+ atualizando?: boolean;
18
+ erro?: string | boolean;
19
+ aoRecarregar?: () => void;
20
+ vazioTitulo?: string;
21
+ vazioDescricao?: string;
22
+ vazioIcone?: string;
23
+ vazioAcoes?: ReactNode;
24
+ paginacao?: Omit<PaginacaoProps, 'embutida' | 'className'>;
25
+ className?: string;
26
+ }
27
+ /** Listagem em grade de cards, irmã da `Tabela` (a ordenação fica na barra de filtros). */
28
+ export declare function ListaCards<T>({ itens, card, chave, larguraMin, alturaCard, rotulo, carregando, atualizando, erro, aoRecarregar, vazioTitulo, vazioDescricao, vazioIcone, vazioAcoes, paginacao, className, }: ListaCardsProps<T>): import("react").JSX.Element;
@@ -0,0 +1,40 @@
1
+ import { type ReactNode } from 'react';
2
+ /** `usuario` = à direita, em destaque · `assistente` = à esquerda, neutra · `sistema` = aviso centralizado. */
3
+ export type AutorMensagem = 'usuario' | 'assistente' | 'sistema';
4
+ /**
5
+ * `enviando` = ainda não confirmada · `gerando` = a resposta está chegando
6
+ * (sem conteúdo, mostra os três pontos) · `concluida` · `erro`.
7
+ */
8
+ export type EstadoMensagem = 'enviando' | 'gerando' | 'concluida' | 'erro';
9
+ export interface MensagemProps {
10
+ autor?: AutorMensagem;
11
+ /** O conteúdo. Texto puro preserva as quebras de linha; Markdown chega já renderizado pelo app. */
12
+ children?: ReactNode;
13
+ /** Nome de quem escreveu, acima da bolha. */
14
+ nome?: string;
15
+ /** `true` = iniciais do `nome` · texto = URL da foto · ou um nó próprio (`<Avatar>`, ícone). */
16
+ avatar?: ReactNode;
17
+ /** Quando foi enviada. `Date` vira `HH:mm` (hoje) ou `dd/mm/aaaa HH:mm`; texto aparece como veio. */
18
+ hora?: Date | string;
19
+ estado?: EstadoMensagem;
20
+ /** Texto do erro, com `estado="erro"`. */
21
+ erro?: ReactNode;
22
+ /** Mostra "Tentar novamente" no erro. */
23
+ aoTentarNovamente?: () => void;
24
+ /** Botão que copia o texto da mensagem. */
25
+ copiavel?: boolean;
26
+ /** O que copiar, quando o conteúdo não é texto puro. Padrão: o texto visível. */
27
+ textoCopia?: string;
28
+ /** Outras ações abaixo da bolha (botões pequenos). */
29
+ acoes?: ReactNode;
30
+ /** Abaixo do conteúdo, dentro da bolha (ex.: `Referencias`). */
31
+ rodape?: ReactNode;
32
+ rotuloTentarNovamente?: string;
33
+ rotuloCopiar?: string;
34
+ /** Lido pelo leitor de tela no lugar dos três pontos. */
35
+ rotuloGerando?: string;
36
+ rotuloEnviando?: string;
37
+ className?: string;
38
+ }
39
+ /** Uma mensagem da `Conversa`: bolha com autor, hora, estado e ações. */
40
+ export declare function Mensagem({ autor, children, nome, avatar, hora, estado, erro, aoTentarNovamente, copiavel, textoCopia, acoes, rodape, rotuloTentarNovamente, rotuloCopiar, rotuloGerando, rotuloEnviando, className, }: MensagemProps): import("react").JSX.Element;
@@ -0,0 +1,79 @@
1
+ import { type KeyboardEvent, type ReactNode, type RefObject } from 'react';
2
+ import { type IconeProp } from '../../utils/Icone.js';
3
+ import { type BotaoProps, type PadroesBotao, type SeveridadeBotao } from '../Botao/Botao.js';
4
+ export interface ItemMenuSuspenso {
5
+ /** Devolvido em `aoEscolher` (sem id, vai o rótulo). */
6
+ id?: string;
7
+ /** `item` (padrão) · `titulo` = cabeçalho de seção · `divisor` · `texto` = linha não clicável. */
8
+ tipo?: 'item' | 'titulo' | 'divisor' | 'texto';
9
+ rotulo?: string;
10
+ icone?: IconeProp;
11
+ /** Texto miúdo à direita (atalho, contagem). */
12
+ extra?: string;
13
+ /** Vira link (`<a href>`) em vez de botão. */
14
+ href?: string;
15
+ ativo?: boolean;
16
+ desabilitado?: boolean;
17
+ destrutivo?: boolean;
18
+ }
19
+ export type DirecaoMenu = 'baixo' | 'cima' | 'direita' | 'esquerda';
20
+ export type AlinhamentoMenu = 'inicio' | 'centro' | 'fim';
21
+ /**
22
+ * Quando o menu fecha sozinho: `sempre` (escolher item ou clicar fora) ·
23
+ * `dentro` (só ao escolher item) · `fora` (só ao clicar fora) · `manual`
24
+ * (só pelo próprio botão ou Esc).
25
+ */
26
+ export type FechamentoMenu = 'sempre' | 'dentro' | 'fora' | 'manual';
27
+ /** Props que um gatilho próprio (`gatilho`) deve espalhar no seu botão. */
28
+ export interface PropsGatilhoMenu {
29
+ ref: RefObject<HTMLButtonElement | null>;
30
+ 'aria-haspopup': 'menu' | 'dialog';
31
+ 'aria-expanded': boolean;
32
+ 'aria-controls'?: string;
33
+ disabled?: boolean;
34
+ onClick: () => void;
35
+ onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;
36
+ }
37
+ export interface MenuSuspensoProps extends PadroesBotao {
38
+ rotulo?: string;
39
+ icone?: IconeProp;
40
+ /** Balão de dica — use em gatilhos só com ícone. */
41
+ dica?: string;
42
+ 'aria-label'?: string;
43
+ itens?: ItemMenuSuspenso[];
44
+ aoEscolher?: (id: string) => void;
45
+ /** Conteúdo livre no painel (texto, formulário). A função recebe `fechar`. */
46
+ children?: ReactNode | ((fechar: () => void) => ReactNode);
47
+ /** Botão dividido: ação principal + seta que abre o menu. */
48
+ dividido?: boolean;
49
+ aoClicarPrincipal?: () => void;
50
+ /** Para onde o painel abre; vira para o lado oposto se não couber. */
51
+ direcao?: DirecaoMenu;
52
+ alinhamento?: AlinhamentoMenu;
53
+ /** Alinhamento a partir de 64rem (o anterior vale abaixo disso). */
54
+ alinhamentoTelaGrande?: AlinhamentoMenu;
55
+ fechamento?: FechamentoMenu;
56
+ /** `[ao longo, afastando]` em px (ex.: `[10, 20]`). */
57
+ deslocamento?: [number, number];
58
+ /** No dividido, `pai` ancora o painel no grupo inteiro em vez de só na seta. */
59
+ referencia?: 'gatilho' | 'pai';
60
+ /** Painel escuro. */
61
+ escuro?: boolean;
62
+ /** Cor do item em foco/ativo (painel colorido). */
63
+ cor?: SeveridadeBotao;
64
+ sombra?: BotaoProps['sombra'];
65
+ /** Esconde a seta do gatilho. */
66
+ semSeta?: boolean;
67
+ /** Largura mínima do painel (ex.: `'16rem'`). */
68
+ larguraMenu?: string;
69
+ desabilitado?: boolean;
70
+ /** Gatilho próprio no lugar do `Botao` (ex.: uma aba). Espalhe as props no `<button>`. */
71
+ gatilho?: (props: PropsGatilhoMenu, aberto: boolean) => ReactNode;
72
+ className?: string;
73
+ }
74
+ /**
75
+ * Menu suspenso (dropdown): botão que abre uma lista de ações, ou um painel
76
+ * livre (texto, formulário). Dividido, em 4 direções, alinhável, com
77
+ * fechamento configurável e navegação por setas.
78
+ */
79
+ export declare function MenuSuspenso({ rotulo, icone, dica, 'aria-label': ariaLabel, itens, aoEscolher, children, dividido, aoClicarPrincipal, direcao, alinhamento, alinhamentoTelaGrande, fechamento, deslocamento, referencia, escuro, cor, sombra, semSeta, larguraMenu, desabilitado, gatilho: gatilhoProprio, className, severidade, aparencia, formato, tamanho, }: MenuSuspensoProps): import("react").JSX.Element;