@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.
- package/LICENSE +22 -0
- package/README.md +254 -2
- package/dist/components/Abas/Abas.d.ts +55 -0
- package/dist/components/AcaoLinha/AcaoLinha.d.ts +12 -0
- package/dist/components/Acordeao/Acordeao.d.ts +42 -0
- package/dist/components/Alerta/Alerta.d.ts +39 -0
- package/dist/components/Arquivo/CampoAnexo.d.ts +27 -0
- package/dist/components/Arquivo/DialogoArquivo.d.ts +11 -0
- package/dist/components/Arquivo/Foto.d.ts +29 -0
- package/dist/components/Arquivo/VisualizadorArquivo.d.ts +12 -0
- package/dist/components/Avaliacao/Avaliacao.d.ts +30 -0
- package/dist/components/Avatar/Avatar.d.ts +12 -0
- package/dist/components/Badge/Badge.d.ts +43 -0
- package/dist/components/Balao/Balao.d.ts +30 -0
- package/dist/components/BoasVindas/BoasVindas.d.ts +19 -0
- package/dist/components/Botao/Botao.d.ts +40 -0
- package/dist/components/BotaoFechar/BotaoFechar.d.ts +10 -0
- package/dist/components/Busca/Busca.d.ts +27 -0
- package/dist/components/CabecalhoPagina/CabecalhoPagina.d.ts +21 -0
- package/dist/components/Campo/Campo.d.ts +63 -0
- package/dist/components/CampoBusca/CampoBusca.d.ts +28 -0
- package/dist/components/CampoBusca/CampoCidade.d.ts +25 -0
- package/dist/components/CampoDominio/CampoDominio.d.ts +17 -0
- package/dist/components/CampoMarcacao/CampoMarcacao.d.ts +13 -0
- package/dist/components/CampoMensagem/CampoMensagem.d.ts +31 -0
- package/dist/components/CampoSelect/CampoSelect.d.ts +25 -0
- package/dist/components/CampoSenha/CampoSenha.d.ts +16 -0
- package/dist/components/CampoTextarea/CampoTextarea.d.ts +11 -0
- package/dist/components/CampoTexto/CampoTexto.d.ts +63 -0
- package/dist/components/Card/Card.d.ts +51 -0
- package/dist/components/Carregando/Carregando.d.ts +10 -0
- package/dist/components/Carrossel/Carrossel.d.ts +33 -0
- package/dist/components/Chip/Chip.d.ts +11 -0
- package/dist/components/Citacao/Citacao.d.ts +20 -0
- package/dist/components/Confirmacao/Confirmacao.d.ts +35 -0
- package/dist/components/Conversa/Conversa.d.ts +21 -0
- package/dist/components/Detalhes/Detalhes.d.ts +12 -0
- package/dist/components/Dialogo/Dialogo.d.ts +37 -0
- package/dist/components/Dialogo/Sobreposicao.d.ts +19 -0
- package/dist/components/Dica/Dica.d.ts +15 -0
- package/dist/components/Escolha/Escolha.d.ts +14 -0
- package/dist/components/Estrutura/Estrutura.d.ts +106 -0
- package/dist/components/Filtros/Filtros.d.ts +22 -0
- package/dist/components/Form/Form.d.ts +85 -0
- package/dist/components/Girador/Girador.d.ts +15 -0
- package/dist/components/GrupoBotoes/GrupoBotoes.d.ts +56 -0
- package/dist/components/Imagem/Imagem.d.ts +40 -0
- package/dist/components/Indicador/Indicador.d.ts +29 -0
- package/dist/components/Lista/Lista.d.ts +47 -0
- package/dist/components/ListaCards/ListaCards.d.ts +28 -0
- package/dist/components/Mensagem/Mensagem.d.ts +40 -0
- package/dist/components/MenuSuspenso/MenuSuspenso.d.ts +79 -0
- package/dist/components/Paginacao/Paginacao.d.ts +13 -0
- package/dist/components/Picklist/Picklist.d.ts +28 -0
- package/dist/components/Placa/Placa.d.ts +9 -0
- package/dist/components/Preferencias/Preferencias.d.ts +26 -0
- package/dist/components/Progresso/Progresso.d.ts +42 -0
- package/dist/components/QuadroArrastavel/QuadroArrastavel.d.ts +27 -0
- package/dist/components/Recolhivel/Recolhivel.d.ts +14 -0
- package/dist/components/Referencias/Referencias.d.ts +24 -0
- package/dist/components/Skeleton/Skeleton.d.ts +8 -0
- package/dist/components/Status/Status.d.ts +10 -0
- package/dist/components/Tabela/Tabela.d.ts +57 -0
- package/dist/components/TelaErro/TelaErro.d.ts +25 -0
- package/dist/components/TelaLogin/TelaLogin.d.ts +66 -0
- package/dist/components/Toast/Toast.d.ts +62 -0
- package/dist/components/Trilha/Trilha.d.ts +60 -0
- package/dist/components/Vazio/Vazio.d.ts +12 -0
- package/dist/css.d.ts +1 -0
- package/dist/estilos.css +72 -0
- package/dist/fonts/LICENSE +93 -0
- package/dist/fonts/inter-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-cyrillic-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-greek-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-greek-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-vietnamese-wght-normal.woff2 +0 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.js +6915 -0
- package/dist/index.js.map +1 -0
- package/dist/tokens.css +325 -0
- package/dist/utils/Icone.d.ts +22 -0
- package/dist/utils/anexos.d.ts +20 -0
- package/dist/utils/constantes.d.ts +14 -0
- package/dist/utils/cx.d.ts +2 -0
- package/dist/utils/datas.d.ts +17 -0
- package/dist/utils/entidade.d.ts +19 -0
- package/dist/utils/jwt.d.ts +11 -0
- package/dist/utils/mascara.d.ts +19 -0
- package/dist/utils/picklist.d.ts +15 -0
- package/dist/utils/portal.d.ts +8 -0
- package/dist/utils/senha.d.ts +21 -0
- package/dist/utils/severidade.d.ts +7 -0
- package/dist/utils/texto.d.ts +28 -0
- package/dist/utils/tipos.d.ts +8 -0
- package/dist/utils/tiposCampo.d.ts +12 -0
- package/dist/utils/useBuscaAssincrona.d.ts +22 -0
- package/dist/utils/useCliqueFora.d.ts +3 -0
- package/dist/utils/usePosicaoFlutuante.d.ts +13 -0
- package/dist/utils/validadores.d.ts +42 -0
- package/package.json +81 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Celke
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,255 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @celke/kole-react
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Biblioteca de componentes **React** para sistemas administrativos. Design tokens
|
|
4
|
+
próprios (cores, raios, densidade, tema claro/escuro), CSS puro e sem dependência
|
|
5
|
+
de Tailwind.
|
|
6
|
+
|
|
7
|
+
## Instalação
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i @celke/kole-react
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Requisitos: React 18.2+ ou 19. A fonte Inter já vem dentro do pacote (o
|
|
14
|
+
`estilos.css` carrega só os alfabetos que a página usa). O pacote é só ESM, traz
|
|
15
|
+
os tipos TypeScript e já vem marcado com `'use client'`, então funciona no App
|
|
16
|
+
Router do Next.js.
|
|
17
|
+
|
|
18
|
+
## Uso
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
// main.tsx
|
|
22
|
+
import { createRoot } from 'react-dom/client';
|
|
23
|
+
import '@celke/kole-react/estilos.css';
|
|
24
|
+
import { ProvedorUi } from '@celke/kole-react';
|
|
25
|
+
import { App } from './App';
|
|
26
|
+
|
|
27
|
+
createRoot(document.getElementById('root')!).render(
|
|
28
|
+
<ProvedorUi>
|
|
29
|
+
<App />
|
|
30
|
+
</ProvedorUi>,
|
|
31
|
+
);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`ProvedorUi` liga tema/densidade (lembrados no navegador), toasts (`useToast`) e
|
|
35
|
+
confirmação (`useConfirmacao`).
|
|
36
|
+
|
|
37
|
+
### Layout com React Router
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
import { Link, Outlet, useLocation, useNavigate } from 'react-router-dom';
|
|
41
|
+
import { Estrutura } from '@celke/kole-react';
|
|
42
|
+
|
|
43
|
+
export function Layout({ sair }: { sair: () => void }) {
|
|
44
|
+
const { pathname } = useLocation();
|
|
45
|
+
const navigate = useNavigate();
|
|
46
|
+
return (
|
|
47
|
+
<Estrutura
|
|
48
|
+
marca={{ nome: 'Gestor', subtitulo: 'Gestão comercial', logo: '/logo.svg' }}
|
|
49
|
+
nav={[
|
|
50
|
+
{ itens: [{ rotulo: 'Painel', icone: 'house', rota: '/' }] },
|
|
51
|
+
{
|
|
52
|
+
rotulo: 'Cadastros',
|
|
53
|
+
itens: [
|
|
54
|
+
{ rotulo: 'Pedidos', icone: 'shopping-cart', rota: '/pedidos' },
|
|
55
|
+
{ rotulo: 'Tabelas', icone: 'table', filhos: [{ rotulo: 'Categorias', rota: '/categorias' }] },
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
]}
|
|
59
|
+
rotaAtual={pathname}
|
|
60
|
+
aoNavegar={navigate}
|
|
61
|
+
usuario={{ nome: 'Gabrielly Ribeiro', cargo: 'Gerente comercial' }}
|
|
62
|
+
menuUsuario={[{ id: 'sair', rotulo: 'Sair', icone: 'log-out', destrutivo: true }]}
|
|
63
|
+
aoEscolherMenuUsuario={(id) => id === 'sair' && sair()}
|
|
64
|
+
>
|
|
65
|
+
<Outlet />
|
|
66
|
+
</Estrutura>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Para links de verdade do roteador (ctrl+clique abre em nova aba), passe
|
|
72
|
+
`renderLink={(p) => <Link to={p.href} className={p.className} onClick={p.onClick} aria-current={p['aria-current']}>{p.children}</Link>}`.
|
|
73
|
+
|
|
74
|
+
## Componentes
|
|
75
|
+
|
|
76
|
+
| Grupo | Componentes |
|
|
77
|
+
|---|---|
|
|
78
|
+
| Layout | `Estrutura`, `Busca`, `CabecalhoPagina`, `BoasVindas`, `TelaLogin`, `Abas`/`Aba`, `Card` |
|
|
79
|
+
| Ações | `Botao`, `AcaoLinha`, `Dica` |
|
|
80
|
+
| Formulário | `Form` (página ou modal, `entidade`/`modo`), `FormSecao`, `Campo`, `CampoTexto`, `CampoTextarea`, `CampoSenha`, `CampoSelect`, `CampoSelectMultiplo`, `CampoMarcacao`, `Escolha`, `Picklist`, `Filtros` |
|
|
81
|
+
| Campos prontos | `CampoCpf`, `CampoCnpj`, `CampoCpfCnpj`, `CampoCep`, `CampoTelefone`, `CampoPlaca`, `CampoRenavam`, `CampoChassi`, `CampoCnh`, `CampoImei`, `CampoEmail`, `CampoData`, `CampoHora`, `CampoDataHora`, `CampoMoeda`, `CampoInteiro`, `CampoUf`, `CampoUfMultiplo`, `CampoTipoPessoa` |
|
|
82
|
+
| Busca remota | `CampoBusca`, `CampoCidade`, `useBuscaAssincrona` |
|
|
83
|
+
| Arquivos | `CampoAnexo`, `VisualizadorArquivo`, `DialogoArquivo`, `Foto` |
|
|
84
|
+
| Dados | `Tabela`, `ListaCards`, `Paginacao`, `Indicador`/`Indicadores`, `Detalhes`, `Status`, `Chip`, `Avatar`, `Placa` |
|
|
85
|
+
| Feedback | `Alerta`, `Dialogo` (central ou `lateral`), `useConfirmacao` (+ `.remover()`, `.avisar()`), `useToast`, `Vazio`, `Skeleton`, `Carregando` |
|
|
86
|
+
| Conversa | `Conversa`, `Mensagem`, `CampoMensagem`, `Referencias` |
|
|
87
|
+
|
|
88
|
+
### Conversa (chat)
|
|
89
|
+
|
|
90
|
+
`Conversa` é a área rolável (acompanha o fim durante o streaming e para de
|
|
91
|
+
puxar se a pessoa rolar para cima); `Mensagem` é a bolha; `CampoMensagem` é o
|
|
92
|
+
campo de envio (Enter envia, Shift+Enter quebra a linha); `Referencias` lista
|
|
93
|
+
as fontes de uma resposta. A conversa ocupa a altura do contêiner pai, e a
|
|
94
|
+
busca da resposta (rede, streaming, Markdown) fica com o app.
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
import { useState } from 'react';
|
|
98
|
+
import {
|
|
99
|
+
CampoMensagem,
|
|
100
|
+
Conversa,
|
|
101
|
+
Mensagem,
|
|
102
|
+
Referencias,
|
|
103
|
+
type AutorMensagem,
|
|
104
|
+
type EstadoMensagem,
|
|
105
|
+
type ItemReferencia,
|
|
106
|
+
} from '@celke/kole-react';
|
|
107
|
+
|
|
108
|
+
interface ItemChat {
|
|
109
|
+
id: string;
|
|
110
|
+
autor: AutorMensagem;
|
|
111
|
+
estado: EstadoMensagem;
|
|
112
|
+
texto: string;
|
|
113
|
+
hora: Date;
|
|
114
|
+
fontes?: ItemReferencia[]; // { id, titulo, detalhe?, trecho?, href? }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
interface ChatProps {
|
|
118
|
+
mensagens: ItemChat[];
|
|
119
|
+
gerando: boolean;
|
|
120
|
+
enviar: (texto: string) => void;
|
|
121
|
+
parar: () => void;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function Chat({ mensagens, gerando, enviar, parar }: ChatProps) {
|
|
125
|
+
const [texto, setTexto] = useState('');
|
|
126
|
+
return (
|
|
127
|
+
<div style={{ height: '32rem' }}>
|
|
128
|
+
<Conversa
|
|
129
|
+
campo={
|
|
130
|
+
<CampoMensagem
|
|
131
|
+
valor={texto}
|
|
132
|
+
aoMudar={setTexto}
|
|
133
|
+
aoEnviar={(t) => {
|
|
134
|
+
enviar(t);
|
|
135
|
+
setTexto('');
|
|
136
|
+
}}
|
|
137
|
+
gerando={gerando}
|
|
138
|
+
aoParar={parar}
|
|
139
|
+
/>
|
|
140
|
+
}
|
|
141
|
+
>
|
|
142
|
+
{mensagens.map((m) => (
|
|
143
|
+
<Mensagem
|
|
144
|
+
key={m.id}
|
|
145
|
+
autor={m.autor} // 'usuario' | 'assistente' | 'sistema'
|
|
146
|
+
estado={m.estado} // 'enviando' | 'gerando' | 'concluida' | 'erro'
|
|
147
|
+
hora={m.hora}
|
|
148
|
+
copiavel={m.autor === 'assistente'}
|
|
149
|
+
rodape={m.fontes && <Referencias itens={m.fontes} />}
|
|
150
|
+
>
|
|
151
|
+
{m.texto}
|
|
152
|
+
</Mensagem>
|
|
153
|
+
))}
|
|
154
|
+
</Conversa>
|
|
155
|
+
</div>
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Utilitários (lógica pura, também exportados): validadores BR (`isCpf`, `isCnpj`,
|
|
161
|
+
`isCnh`, `isImei`, `validar(tipo, valor)`…), `TIPOS_CAMPO` (máscara +
|
|
162
|
+
placeholder + regra por tipo), `ESTADOS`/`TIPOS_PESSOA`, por extenso
|
|
163
|
+
(`numeroPorExtenso`, `valorMonetarioPorExtenso`, `listaPorExtenso`), texto
|
|
164
|
+
(`normalizar`, `nomeProprio`, `nomeCurto`, `iniciais`, `formatCpfCnpj`), datas
|
|
165
|
+
pt-BR (`parseDataBr`, `formatDataBr`…), `tituloDeEntidade`/`nomeDeArquivo`,
|
|
166
|
+
anexos (`formatBytes`, `tipoDeArquivo`, `iconeArquivo`), senha
|
|
167
|
+
(`validarSenha`, `forcaSenha`), picklist, JWT (`decodificarJwt`, `jwtExpirado`…)
|
|
168
|
+
e `severidadeCor`. A demo do repositório tem uma página interativa de cada um
|
|
169
|
+
(`#/utilitarios`).
|
|
170
|
+
|
|
171
|
+
Convenções:
|
|
172
|
+
|
|
173
|
+
- Campos são controlados por `valor` + `aoMudar`; aceitam `rotulo`, `dica`,
|
|
174
|
+
`erro`, `aviso`, `obrigatorio` e `variante="inline"` (pílula com rótulo dentro,
|
|
175
|
+
para barras de filtro).
|
|
176
|
+
- Severidades: `ok`, `info`, `warn`, `err`, `neutral` (botão: `pri`, `secundario`,
|
|
177
|
+
`ok`, `warn`, `err`).
|
|
178
|
+
- Ícones: [Lucide](https://lucide.dev/icons) (SVG, já incluso no pacote). Passe o
|
|
179
|
+
nome (`icone="save"`, `icone="trash-2"`) ou o componente
|
|
180
|
+
(`import { Rocket } from 'lucide-react'` → `icone={<Rocket />}`). Só os ícones
|
|
181
|
+
registrados entram no bundle; para usar outro pelo nome, registre uma vez:
|
|
182
|
+
`registrarIcones({ rocket: Rocket })`. Um nome não registrado avisa no console
|
|
183
|
+
em desenvolvimento.
|
|
184
|
+
- Pendência de campo: o erro aparece ao **sair** do campo depois de digitar, ou
|
|
185
|
+
quando o `Form` tenta salvar (todos os campos acusam). Um valor carregado de
|
|
186
|
+
fora que não atende ao formato não é recusado: vira aviso âmbar.
|
|
187
|
+
- Grade do `FormSecao`: 4 colunas na página, 3 no modal; `className="lp-col-2"`,
|
|
188
|
+
`lp-col-3` ou `lp-col-full` alarga o campo.
|
|
189
|
+
- Cadastro com vários formulários: passe `menu` (itens com `id`, `rotulo`,
|
|
190
|
+
`icone`, `href`) e `menuAtivo` ao `Form` de cada página; o menu lateral liga
|
|
191
|
+
os formulários entre si, cada um com o próprio Salvar.
|
|
192
|
+
|
|
193
|
+
## Tema e tokens
|
|
194
|
+
|
|
195
|
+
Toda cor/medida vem de variáveis CSS (os tokens). Para mudar a marca, redefina
|
|
196
|
+
os tokens no CSS do app, carregado **depois** do `estilos.css` — por exemplo
|
|
197
|
+
`--navy` (marinho da sidebar), `--pri` (azul de ação) e `--acento-claro` (laranja
|
|
198
|
+
do item ativo). O tema escuro tem valores próprios, então redefina lá também:
|
|
199
|
+
|
|
200
|
+
```css
|
|
201
|
+
:root {
|
|
202
|
+
--pri: #0f766e;
|
|
203
|
+
--pri-ink: #115e59;
|
|
204
|
+
}
|
|
205
|
+
[data-theme='dark'] {
|
|
206
|
+
--pri: #2dd4bf;
|
|
207
|
+
--pri-ink: #5eead4;
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
O tema escuro usa `<html data-theme="dark">`; a densidade, as classes
|
|
212
|
+
`density-compact`, `density-comfortable` e `density-cozy` no `<body>` (o
|
|
213
|
+
`ProvedorUi` cuida das duas). A lista completa de tokens, com os valores dos
|
|
214
|
+
dois temas, está em `@celke/kole-react/tokens.css`.
|
|
215
|
+
|
|
216
|
+
Para usar só os tokens fora do React: `@import '@celke/kole-react/tokens.css';`.
|
|
217
|
+
|
|
218
|
+
## CSS
|
|
219
|
+
|
|
220
|
+
Classes CSS usam o prefixo `lp-`.
|
|
221
|
+
|
|
222
|
+
## Desenvolvimento
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
npm install
|
|
226
|
+
npm run dev # http://localhost:5173 — demo com todos os componentes
|
|
227
|
+
npm run typecheck
|
|
228
|
+
npm run build # dist/index.js + tipos (.d.ts) + dist/estilos.css + dist/tokens.css
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Para testar uma versão que ainda não está no npm, instale direto do GitHub
|
|
232
|
+
(o `prepare` gera o `dist/` na instalação) ou de um pacote local:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npm i github:celkecursos/kole-react
|
|
236
|
+
# ou: gere o .tgz na pasta da biblioteca e instale no app
|
|
237
|
+
npm pack # → celke-kole-react-<versão>.tgz
|
|
238
|
+
npm i ../kole-react/celke-kole-react-<versão>.tgz
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Evite `npm i ../kole-react` (pasta): o npm cria um link e o bundler
|
|
242
|
+
pega o React do `node_modules` da biblioteca — dois Reacts no app quebram os hooks
|
|
243
|
+
(_Invalid hook call_). Se precisar do link durante o desenvolvimento, use
|
|
244
|
+
`resolve: { dedupe: ['react', 'react-dom'] }` no `vite.config` do app.
|
|
245
|
+
|
|
246
|
+
Publicar uma versão nova: `npm version patch` e `npm publish` (o `prepare` roda o
|
|
247
|
+
build; confira o conteúdo antes com `npm pack --dry-run`).
|
|
248
|
+
|
|
249
|
+
## Autor
|
|
250
|
+
|
|
251
|
+
Criado por **Cesar Szpak**.
|
|
252
|
+
|
|
253
|
+
## Licença
|
|
254
|
+
|
|
255
|
+
MIT © 2026 Celke — veja o arquivo [LICENSE](https://github.com/celkecursos/kole-react/blob/main/LICENSE).
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type IconeProp } from '../../utils/Icone.js';
|
|
3
|
+
export interface AbaProps {
|
|
4
|
+
valor: string;
|
|
5
|
+
rotulo: string;
|
|
6
|
+
icone?: IconeProp;
|
|
7
|
+
desabilitada?: boolean;
|
|
8
|
+
/** Número de pendências (chip âmbar na aba). */
|
|
9
|
+
pendentes?: number;
|
|
10
|
+
/** Selo livre depois do rótulo (ex.: `<Badge>`). */
|
|
11
|
+
badge?: ReactNode;
|
|
12
|
+
/** Abas vizinhas com o mesmo grupo viram uma aba com menu suspenso. */
|
|
13
|
+
grupo?: string;
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
/** Painel de uma aba. Só funciona dentro de `<Abas>`. */
|
|
17
|
+
export declare function Aba(_props: AbaProps): null;
|
|
18
|
+
/**
|
|
19
|
+
* `sublinhado` (padrão) · `classica` = aba com borda colada no painel ·
|
|
20
|
+
* `pilulas` = ativa sólida · `suave` = ativa em fundo claro · `contorno` =
|
|
21
|
+
* todas com borda, ativa sólida · `segmentado` = trilho cinza com a ativa
|
|
22
|
+
* destacada · `passos` = círculos numerados · `cartao` = ativa e painel na
|
|
23
|
+
* mesma cor · `blocos` = caixas com ícone em cima e seta para o painel.
|
|
24
|
+
*/
|
|
25
|
+
export type VarianteAbas = 'sublinhado' | 'classica' | 'pilulas' | 'suave' | 'contorno' | 'segmentado' | 'passos' | 'cartao' | 'blocos';
|
|
26
|
+
/** `preencher` = abas crescem conforme o rótulo · `justificado` = todas da mesma largura. */
|
|
27
|
+
export type AlinhamentoAbas = 'inicio' | 'centro' | 'fim' | 'preencher' | 'justificado';
|
|
28
|
+
export interface AbasProps {
|
|
29
|
+
/** Aba ativa (controlado). Sem ele, começa na primeira. */
|
|
30
|
+
ativa?: string;
|
|
31
|
+
aoMudar?: (valor: string) => void;
|
|
32
|
+
/** Nome acessível da lista de abas. */
|
|
33
|
+
rotulo?: string;
|
|
34
|
+
variante?: VarianteAbas;
|
|
35
|
+
/** Padrão: `preencher` no sublinhado, `inicio` nas demais. */
|
|
36
|
+
alinhamento?: AlinhamentoAbas;
|
|
37
|
+
/** `responsiva` = empilha as abas abaixo de 36rem. */
|
|
38
|
+
orientacao?: 'horizontal' | 'vertical' | 'responsiva';
|
|
39
|
+
/** Ícone acima do rótulo. */
|
|
40
|
+
iconeAcima?: boolean;
|
|
41
|
+
/** `caixa` = painel com borda e respiro. */
|
|
42
|
+
painel?: 'livre' | 'caixa';
|
|
43
|
+
/** `base` = abas abaixo do painel (rodapé). */
|
|
44
|
+
posicaoBarra?: 'topo' | 'base';
|
|
45
|
+
/** Título à esquerda, na mesma linha das abas. */
|
|
46
|
+
cabecalho?: ReactNode;
|
|
47
|
+
/** Modo página: cabeçalho com Voltar + título acima das abas. */
|
|
48
|
+
titulo?: string;
|
|
49
|
+
identidade?: string;
|
|
50
|
+
aoVoltar?: () => void;
|
|
51
|
+
acoes?: ReactNode;
|
|
52
|
+
children: ReactNode;
|
|
53
|
+
className?: string;
|
|
54
|
+
}
|
|
55
|
+
export declare function Abas({ ativa, aoMudar, rotulo, variante, alinhamento, orientacao, iconeAcima, painel, posicaoBarra, cabecalho, titulo, identidade, aoVoltar, acoes, children, className, }: AbasProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ButtonHTMLAttributes } from 'react';
|
|
2
|
+
import { type IconeProp } from '../../utils/Icone.js';
|
|
3
|
+
export interface AcaoLinhaProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
|
|
4
|
+
icone: IconeProp;
|
|
5
|
+
/** Nome da ação: vira dica e aria-label. */
|
|
6
|
+
rotulo: string;
|
|
7
|
+
/** `pri` = azul · `destaque` = laranja · `err` = vermelho. */
|
|
8
|
+
severidade?: 'neutra' | 'pri' | 'destaque' | 'err';
|
|
9
|
+
carregando?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Botão-ícone compacto para ações de linha de tabela/card. */
|
|
12
|
+
export declare function AcaoLinha({ icone, rotulo, severidade, carregando, disabled, className, type, ...resto }: AcaoLinhaProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type IconeProp } from '../../utils/Icone.js';
|
|
3
|
+
export type CorAcordeao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';
|
|
4
|
+
/**
|
|
5
|
+
* `padrao` = caixa com borda · `sem-borda` = encostado no container ·
|
|
6
|
+
* `solido` = cabeçalho aberto na cor · `suave` = cabeçalho aberto em tom
|
|
7
|
+
* claro · `contorno` = borda na cor.
|
|
8
|
+
*/
|
|
9
|
+
export type VarianteAcordeao = 'padrao' | 'sem-borda' | 'solido' | 'suave' | 'contorno';
|
|
10
|
+
export interface AcordeaoProps {
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
/** Vários itens abertos ao mesmo tempo. */
|
|
13
|
+
multiplo?: boolean;
|
|
14
|
+
/** Itens abertos (controlado). */
|
|
15
|
+
abertos?: string[];
|
|
16
|
+
/** Itens abertos de início (não controlado). */
|
|
17
|
+
padraoAbertos?: string[];
|
|
18
|
+
aoMudar?: (abertos: string[]) => void;
|
|
19
|
+
variante?: VarianteAcordeao;
|
|
20
|
+
cor?: CorAcordeao;
|
|
21
|
+
/** Itens soltos, com espaço entre eles. */
|
|
22
|
+
separado?: boolean;
|
|
23
|
+
/** `seta` (padrão) · `mais` = + / − · `nenhum`. */
|
|
24
|
+
icone?: 'seta' | 'mais' | 'nenhum';
|
|
25
|
+
/** Lado do ícone. */
|
|
26
|
+
posicaoIcone?: 'fim' | 'inicio';
|
|
27
|
+
className?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Lista de seções que abrem e fecham (acordeão). */
|
|
30
|
+
export declare function Acordeao({ children, multiplo, abertos: controlado, padraoAbertos, aoMudar, variante, cor, separado, icone, posicaoIcone, className, }: AcordeaoProps): import("react").JSX.Element;
|
|
31
|
+
export interface ItemAcordeaoProps {
|
|
32
|
+
valor: string;
|
|
33
|
+
titulo: ReactNode;
|
|
34
|
+
/** Ícone antes do título. */
|
|
35
|
+
icone?: IconeProp;
|
|
36
|
+
/** Cor só deste item (sobrepõe a do acordeão). */
|
|
37
|
+
cor?: CorAcordeao;
|
|
38
|
+
desabilitado?: boolean;
|
|
39
|
+
children: ReactNode;
|
|
40
|
+
}
|
|
41
|
+
/** Seção de um `Acordeao`. */
|
|
42
|
+
export declare function ItemAcordeao({ valor, titulo, icone, cor, desabilitado, children }: ItemAcordeaoProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type IconeProp } from '../../utils/Icone.js';
|
|
3
|
+
import type { Severidade } from '../../utils/tipos.js';
|
|
4
|
+
/** Cores do alerta: as severidades + `pri` (azul de ação) e `destaque` (laranja da marca). */
|
|
5
|
+
export type CorAlerta = Severidade | 'pri' | 'destaque';
|
|
6
|
+
export type AparenciaAlerta = 'suave' | 'solido' | 'contorno' | 'destaque' | 'faixa' | 'cartao';
|
|
7
|
+
export interface AlertaProps {
|
|
8
|
+
severidade?: CorAlerta;
|
|
9
|
+
/**
|
|
10
|
+
* `suave` (padrão) = fundo claro · `solido` = fundo cheio · `contorno` =
|
|
11
|
+
* só a borda · `destaque` = fundo neutro com filete lateral colorido ·
|
|
12
|
+
* `faixa` = título numa faixa sólida sobre o texto · `cartao` = bloco
|
|
13
|
+
* centralizado com ícone grande (avisos de página, confirmações).
|
|
14
|
+
*/
|
|
15
|
+
aparencia?: AparenciaAlerta;
|
|
16
|
+
/** `pilula` = cantos totalmente arredondados. */
|
|
17
|
+
formato?: 'padrao' | 'pilula';
|
|
18
|
+
sombra?: 'pequena' | 'media' | 'grande';
|
|
19
|
+
/** Linha em negrito acima da mensagem. */
|
|
20
|
+
titulo?: ReactNode;
|
|
21
|
+
mensagem?: ReactNode;
|
|
22
|
+
children?: ReactNode;
|
|
23
|
+
/** Ícone da severidade por padrão; outro ícone, ou `false` para nenhum. */
|
|
24
|
+
icone?: IconeProp | false;
|
|
25
|
+
/** Imagem/avatar no lugar do ícone. */
|
|
26
|
+
midia?: ReactNode;
|
|
27
|
+
/** Botões ou links. */
|
|
28
|
+
acoes?: ReactNode;
|
|
29
|
+
/** `lado` = à direita da mensagem (padrão) · `abaixo` = sob o texto. */
|
|
30
|
+
posicaoAcoes?: 'lado' | 'abaixo';
|
|
31
|
+
/** Mostra o "×" e some ao clicar (sem controle externo). */
|
|
32
|
+
dispensavel?: boolean;
|
|
33
|
+
/** Mostra o "×" e avisa o app (que decide se o alerta sai da tela). */
|
|
34
|
+
aoFechar?: () => void;
|
|
35
|
+
/** `circulo` = "×" num círculo sólido da cor do alerta. */
|
|
36
|
+
botaoFechar?: 'simples' | 'circulo';
|
|
37
|
+
className?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function Alerta({ severidade, aparencia, formato, sombra, titulo, mensagem, children, icone, midia, acoes, posicaoAcoes, dispensavel, aoFechar, botaoFechar, className, }: AlertaProps): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Anexo } from '../../utils/anexos.js';
|
|
2
|
+
import { type CampoBaseProps } from '../Campo/Campo.js';
|
|
3
|
+
export interface CampoAnexoProps extends Omit<CampoBaseProps, 'variante' | 'obrigatorio'> {
|
|
4
|
+
/** Lista serializável de anexos (sem o `File`). */
|
|
5
|
+
valor?: Anexo[];
|
|
6
|
+
aoMudar?: (valor: Anexo[]) => void;
|
|
7
|
+
/** Filtro do seletor nativo (ex.: `image/*,.pdf`). */
|
|
8
|
+
accept?: string;
|
|
9
|
+
/** Vários arquivos (padrão: sim). Com `false`, a nova escolha substitui. */
|
|
10
|
+
multiple?: boolean;
|
|
11
|
+
/** Tamanho máximo por arquivo, em bytes (0 = sem limite). */
|
|
12
|
+
maxTamanho?: number;
|
|
13
|
+
/** Mínimo de anexos; acima de zero o campo é obrigatório. */
|
|
14
|
+
minimo?: number;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
id?: string;
|
|
17
|
+
}
|
|
18
|
+
/** O que a `ref` do `CampoAnexo` expõe. */
|
|
19
|
+
export interface CampoAnexoRef {
|
|
20
|
+
/** O `File` da sessão por trás do anexo, ou `null` (anexo já salvo no backend). */
|
|
21
|
+
arquivoDe: (anexo: Pick<Anexo, 'nome' | 'tamanho'>) => File | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Zona de anexos (clicar ou arrastar). O valor é `Anexo[]`; o `File` real fica
|
|
25
|
+
* na sessão e sai por `ref.current.arquivoDe(anexo)` na hora do upload.
|
|
26
|
+
*/
|
|
27
|
+
export declare const CampoAnexo: import("react").ForwardRefExoticComponent<CampoAnexoProps & import("react").RefAttributes<CampoAnexoRef>>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Anexo } from '../../utils/anexos.js';
|
|
2
|
+
export interface DialogoArquivoProps {
|
|
3
|
+
aberto: boolean;
|
|
4
|
+
aoFechar: () => void;
|
|
5
|
+
/** A lista INTEIRA; aponte o item clicado com `indice`. */
|
|
6
|
+
arquivos: readonly Anexo[];
|
|
7
|
+
indice: number;
|
|
8
|
+
aoMudarIndice: (indice: number) => void;
|
|
9
|
+
}
|
|
10
|
+
/** Visualizador em tela cheia que folheia uma lista de anexos (botões ou ← →). */
|
|
11
|
+
export declare function DialogoArquivo({ aberto, aoFechar, arquivos, indice, aoMudarIndice }: DialogoArquivoProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { Anexo } from '../../utils/anexos.js';
|
|
3
|
+
export type EntradaFoto = string | Anexo | readonly (string | Anexo)[] | null | undefined;
|
|
4
|
+
export interface FotoProps {
|
|
5
|
+
/** A foto ou a coleção: URL, `Anexo` ou lista misturando os dois. */
|
|
6
|
+
fotos?: EntradaFoto;
|
|
7
|
+
/** De quem é a foto: vira o `alt` e as iniciais do avatar sem foto. */
|
|
8
|
+
nome: string;
|
|
9
|
+
tamanho?: 'sm' | 'md' | 'lg';
|
|
10
|
+
/** Válvulas de escape da escala (ex.: `13rem`). */
|
|
11
|
+
altura?: string;
|
|
12
|
+
largura?: string;
|
|
13
|
+
/** Clique abre a galeria em tela cheia. Não use dentro de outro alvo clicável. */
|
|
14
|
+
ampliavel?: boolean;
|
|
15
|
+
/** Qual foto da coleção (padrão: 0). */
|
|
16
|
+
indice?: number;
|
|
17
|
+
aoMudarIndice?: (indice: number) => void;
|
|
18
|
+
aoAmpliar?: (indice: number) => void;
|
|
19
|
+
/** Substitui o avatar padrão quando não há foto (ex.: "Foto indisponível"). */
|
|
20
|
+
semFoto?: ReactNode;
|
|
21
|
+
/** Conteúdo sobre a imagem (selo, marca d'água). */
|
|
22
|
+
sobreposto?: ReactNode;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Moldura de foto em tamanho de leitura: fundo desfocado da própria foto,
|
|
27
|
+
* sombra e anel. Entre o `Avatar` (miniatura) e o `DialogoArquivo` (tela cheia).
|
|
28
|
+
*/
|
|
29
|
+
export declare function Foto({ fotos, nome, tamanho, altura, largura, ampliavel, indice: indiceExterno, aoMudarIndice, aoAmpliar, semFoto, sobreposto, className, }: FotoProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Anexo } from '../../utils/anexos.js';
|
|
2
|
+
export interface VisualizadorArquivoProps {
|
|
3
|
+
arquivo: Anexo | null;
|
|
4
|
+
/** A imagem/vídeo/áudio falhou ao carregar (URL expirada, 404, codec). */
|
|
5
|
+
aoFalhar?: (arquivo: Anexo) => void;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Superfície de exibição de UM anexo: imagem (zoom, giro, arrasto), PDF,
|
|
10
|
+
* vídeo e áudio nativos; o resto cai num estado com botão "Baixar".
|
|
11
|
+
*/
|
|
12
|
+
export declare function VisualizadorArquivo({ arquivo, aoFalhar, className }: VisualizadorArquivoProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface AvaliacaoProps {
|
|
2
|
+
/** Nota atual (0 = sem nota). */
|
|
3
|
+
valor: number;
|
|
4
|
+
/**
|
|
5
|
+
* Muda a nota. Se devolver uma Promise (ex.: salvar no servidor), o
|
|
6
|
+
* componente fica ocupado até ela terminar.
|
|
7
|
+
*/
|
|
8
|
+
aoMudar?: (valor: number) => void | Promise<unknown>;
|
|
9
|
+
/** Quantidade de estrelas. */
|
|
10
|
+
max?: number;
|
|
11
|
+
/** `1` = estrelas inteiras · `0.5` = meias estrelas. */
|
|
12
|
+
passo?: 1 | 0.5;
|
|
13
|
+
/** Só mostra a nota (aceita fração, ex.: 3.7). */
|
|
14
|
+
somenteLeitura?: boolean;
|
|
15
|
+
/** Nome para leitor de tela (ex.: "Avaliação do produto"). */
|
|
16
|
+
rotulo: string;
|
|
17
|
+
icone?: 'star' | 'heart';
|
|
18
|
+
tamanho?: 'pequeno' | 'medio' | 'grande';
|
|
19
|
+
/** Texto para cada nota inteira (índice 0 = 1 estrela), mostrado ao lado. */
|
|
20
|
+
mensagens?: string[];
|
|
21
|
+
/** Chamado ao passar o mouse (com a nota sob o ponteiro, ou `null` ao sair). */
|
|
22
|
+
aoPassar?: (valor: number | null) => void;
|
|
23
|
+
/** Botão para limpar a nota. */
|
|
24
|
+
limpavel?: boolean;
|
|
25
|
+
/** Texto enquanto `aoMudar` não termina. */
|
|
26
|
+
textoOcupado?: string;
|
|
27
|
+
className?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Avaliação por estrelas (ou corações): editável, com meias estrelas, ou só leitura. */
|
|
30
|
+
export declare function Avaliacao({ valor, aoMudar, max, passo, somenteLeitura, rotulo, icone, tamanho, mensagens, aoPassar, limpavel, textoOcupado, className, }: AvaliacaoProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AvatarProps {
|
|
2
|
+
foto?: string;
|
|
3
|
+
/** Nome completo — gera as iniciais quando não há foto. */
|
|
4
|
+
nome?: string;
|
|
5
|
+
iniciais?: string;
|
|
6
|
+
tom?: 'claro' | 'escuro';
|
|
7
|
+
formato?: 'circulo' | 'quadrado';
|
|
8
|
+
/** Tamanho CSS (ex.: `2rem`). */
|
|
9
|
+
tamanho?: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function Avatar({ foto, nome, iniciais, tom, formato, tamanho, className }: AvatarProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { type IconeProp } from '../../utils/Icone.js';
|
|
3
|
+
import type { Severidade } from '../../utils/tipos.js';
|
|
4
|
+
/** Mesmas cores do `Alerta`: severidades + `pri` (azul) e `destaque` (laranja). */
|
|
5
|
+
export type CorBadge = Severidade | 'pri' | 'destaque';
|
|
6
|
+
export interface BadgeProps {
|
|
7
|
+
cor?: CorBadge;
|
|
8
|
+
/**
|
|
9
|
+
* `solido` (padrão) · `suave` = fundo claro · `contorno` = só a borda ·
|
|
10
|
+
* `gradiente` · `inverso` = fundo da superfície com texto colorido (para
|
|
11
|
+
* usar dentro de um botão sólido da mesma cor).
|
|
12
|
+
*/
|
|
13
|
+
aparencia?: 'solido' | 'suave' | 'contorno' | 'gradiente' | 'inverso';
|
|
14
|
+
/** `pilula` = cantos totalmente arredondados. */
|
|
15
|
+
formato?: 'padrao' | 'pilula';
|
|
16
|
+
/** `herdar` = acompanha o tamanho do texto em volta (títulos). */
|
|
17
|
+
tamanho?: 'pequeno' | 'medio' | 'herdar';
|
|
18
|
+
icone?: IconeProp;
|
|
19
|
+
/** Texto do badge (ou use `children`). */
|
|
20
|
+
rotulo?: ReactNode;
|
|
21
|
+
children?: ReactNode;
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Etiqueta curta: contagem, rótulo de novidade, categoria. */
|
|
25
|
+
export declare function Badge({ cor, aparencia, formato, tamanho, icone, rotulo, children, className }: BadgeProps): import("react").JSX.Element;
|
|
26
|
+
export interface ComBadgeProps {
|
|
27
|
+
/** Elemento que recebe o badge (avatar, botão, ícone). */
|
|
28
|
+
children: ReactNode;
|
|
29
|
+
/** Contagem ou texto no canto; com `ponto`, é ignorado. */
|
|
30
|
+
conteudo?: ReactNode;
|
|
31
|
+
/** Acima disto vira "N+" (só para números; padrão: 99). */
|
|
32
|
+
max?: number;
|
|
33
|
+
/** Só um ponto (ex.: "online", "não lido"). */
|
|
34
|
+
ponto?: boolean;
|
|
35
|
+
cor?: CorBadge;
|
|
36
|
+
/** Canto do badge (padrão: superior direito). */
|
|
37
|
+
posicao?: 'superior-direita' | 'inferior-direita' | 'superior-esquerda' | 'inferior-esquerda';
|
|
38
|
+
/** Texto para leitor de tela (ex.: "99 mensagens não lidas"). */
|
|
39
|
+
descricao?: string;
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/** Posiciona um badge (ou ponto) no canto de outro elemento. */
|
|
43
|
+
export declare function ComBadge({ children, conteudo, max, ponto, cor, posicao, descricao, className }: ComBadgeProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export type PosicaoBalao = 'cima' | 'direita' | 'baixo' | 'esquerda';
|
|
3
|
+
export type CorBalao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';
|
|
4
|
+
/** `padrao` · `cabecalho` = só o título na cor · `solido` = balão todo na cor · `suave` = fundo claro da cor. */
|
|
5
|
+
export type AparenciaBalao = 'padrao' | 'cabecalho' | 'solido' | 'suave';
|
|
6
|
+
/**
|
|
7
|
+
* `clique` = abre/fecha no clique; fecha também ao clicar fora ou Esc ·
|
|
8
|
+
* `foco` = fecha no próximo clique em qualquer lugar · `passar` = abre com o
|
|
9
|
+
* mouse em cima ou com o foco do teclado.
|
|
10
|
+
*/
|
|
11
|
+
export type GatilhoBalao = 'clique' | 'foco' | 'passar';
|
|
12
|
+
export interface BalaoProps {
|
|
13
|
+
/** O elemento que abre o balão (botão, ícone, avatar…). */
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
titulo?: ReactNode;
|
|
16
|
+
conteudo: ReactNode;
|
|
17
|
+
/** Lado preferido; vira para o oposto se não couber. */
|
|
18
|
+
posicao?: PosicaoBalao;
|
|
19
|
+
cor?: CorBalao;
|
|
20
|
+
aparencia?: AparenciaBalao;
|
|
21
|
+
gatilho?: GatilhoBalao;
|
|
22
|
+
/** Largura máxima (padrão `17rem`). */
|
|
23
|
+
largura?: string;
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Balão com título e conteúdo (popover), ancorado num elemento. Abre no
|
|
28
|
+
* clique, no foco ou ao passar o mouse; nas 4 direções e em cores.
|
|
29
|
+
*/
|
|
30
|
+
export declare function Balao({ children, titulo, conteudo, posicao, cor, aparencia, gatilho, largura, className, }: BalaoProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface BoasVindasProps {
|
|
3
|
+
/** Nome completo (a saudação usa primeiro + último). */
|
|
4
|
+
nome: string;
|
|
5
|
+
cargo?: string;
|
|
6
|
+
/** Sigla da unidade (ex.: RH). */
|
|
7
|
+
sigla?: string;
|
|
8
|
+
foto?: string;
|
|
9
|
+
/** Último acesso; sem ele a linha some. */
|
|
10
|
+
ultimoAcesso?: Date | null;
|
|
11
|
+
/** Ações da página inicial (ex.: "Novo cadastro"). */
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Cabeçalho de sessão da página inicial: foto, data por extenso, saudação
|
|
17
|
+
* pela hora, cargo · unidade e último acesso. Substitui o `CabecalhoPagina` na home.
|
|
18
|
+
*/
|
|
19
|
+
export declare function BoasVindas({ nome, cargo, sigla, foto, ultimoAcesso, children, className }: BoasVindasProps): import("react").JSX.Element;
|