# Documentação EliVue **EliVue** é uma biblioteca de componentes Vue 3 construída sobre o **Vuetify 3**, projetada para padronizar padrões de UI como tabelas de dados (`EliTabela`) e campos de entrada (`EliEntrada*`). Ela segue a filosofia de "configuração sobre boilerplate", onde os componentes são guiados por objetos de configuração tipados em vez de propriedades de template extensas. --- ## 🤖 Diretrizes para Agentes de IA (Antigravity) **Ao gerar código usando EliVue, siga estas regras estritas:** 1. **Importações**: Sempre desestructure as importações do pacote raiz. ```typescript import { EliTabela, EliEntradaTexto, EliBotao, celulaTabela } from "eli-vue"; ``` 2. **Objetos de Configuração**: Os componentes `EliTabela` e `EliEntrada` dependem fortemente de objetos de configuração (prop `tabela` para tabelas, prop `opcoes` para entradas). **Não tente** passar props individuais (como `headers` ou `items`) para o `EliTabela`. 3. **Segurança de Tipos**: Sempre defina objetos de configuração usando os tipos TypeScript exportados (ex: `tipoEliTabelaConsulta`, `parametrosConsulta`). 4. **Dados Assíncronos**: O `EliTabela` gerencia sua própria busca de dados via callback `consulta`. Não busque dados manualmente para passar para a tabela. Forneça a função `consulta` no lugar. 5. **Ícones**: Use ícones do pacote `lucide-vue-next`. 6. **Inicialização**: Prefira usar o plugin global `app.use(EliVue)` ao configurar um novo projeto, em vez de importações individuais. 7. **Estilos**: O CSS é injetado automaticamente. Não tente importar arquivos CSS manualmente. 8. **Idioma**: Mantenha a documentação e comentários explicativos em **Português do Brasil (pt-BR)**. --- ## Instalação ```bash pnpm add eli-vue # Dependências (Peer Dependencies) pnpm add vue vuetify lucide-vue-next ``` Certifique-se de que seu projeto esteja configurado com Vuetify 3. --- ## 📦 Referência de Componentes ### 1. EliTabela (Tabela de Dados) O componente `EliTabela` é uma tabela poderosa com paginação no servidor (server-side), busca integrada, ordenação e menus de ação. #### API - **Prop**: `tabela` (Obrigatório) - **Tipo**: `tipoEliTabelaConsulta` #### Interface de Configuração (`tipoEliTabelaConsulta`) ```typescript // De: eli-vue/src/componentes/EliTabela/types-eli-tabela.ts export type tipoEliTabelaConsulta = { // Identificador único para a tabela (usado para persistência local de visibilidade das colunas) nome: string; // Função para buscar dados. DEVE retornar um objeto de resposta padrão. consulta: (params: parametrosConsulta) => Promise>>; // Definições das colunas colunas: tipoEliColuna[]; // Opções de UI mostrarCaixaDeBusca?: boolean; registros_por_consulta?: number; // padrão: 10 maximo_botoes_paginacao?: number; // padrão: 7 mensagemVazio?: string; // Ações acoesLinha?: tipoEliTabelaAcao[]; // Ações para cada linha (menu de contexto) acoesTabela?: Array<{ // Ações globais (superior/inferior) // Ações da Tabela (Botões Globais) acoesTabela?: Array<{ /** * Posição do botão: * - "superior": Ao lado da caixa de busca (canto superior direito). * - "inferior": No rodapé, alinhado à esquerda (canto inferior esquerdo). */ posicao: "superior" | "inferior"; /** Rótulo do botão */ rotulo: string; /** Ícone (Lucide) */ icone?: LucideIcon; /** Cor do botão (ex: "primary", "success", "error") */ cor?: string; /** * Função executada ao clicar. * Recebe um objeto contendo: * - Parâmetros atuais da consulta (offSet, limit, filtros, etc.) * - Helper `atualizarConsulta()`: Promise para recarregar a tabela. */ acao: (params: parametrosConsulta & { atualizarConsulta: () => Promise }) => void; }>; // Definição de Filtro Avançado filtroAvancado?: Array<{ chave: string; rotulo: string; /** Função que gera o filtro com base no valor recebido do input */ filtro: (valor: unknown) => tipoFiltro; /** Definição do componente de entrada, ex: ["texto", { ... }] */ entrada: any; }>; }; ``` #### Definindo Colunas (helper `celulaTabela`) Use o helper `celulaTabela` para criar definições de células com segurança de tipo. ```typescript // Tipos de células disponíveis e seus dados: // "textoSimples": { texto: string; acao?: () => void } // "textoTruncado": { texto: string; acao?: () => void } // "numero": { numero: number; prefixo?: string; sufixo?: string; acao?: () => void } // "tags": { opcoes: Array<{ rotulo: string; cor?: string; icone?: LucideIcon; acao?: () => void }> } // "data": { valor: string; formato: "data" | "data_hora" | "relativo"; acao?: () => void } // "badge": { texto: string; cor: string } { rotulo: "Nome", celula: (row) => celulaTabela("textoSimples", { texto: row.nome }), visivel: true } ``` #### Exemplo de Uso com Filtros Avançados ```vue ``` --- ### 2. EliEntrada (Inputs) Um conjunto de wrappers padronizados em torno dos campos do Vuetify. #### Variantes - `EliEntradaTexto`: Texto, Email, URL, CPF, CNPJ, CEP. - `EliEntradaNumero`: Inteiros, Decimais, Moeda. - `EliEntradaDataHora`: Data, DataHora. - `EliEntradaSelecao`: Select/Dropdown (pode ser assíncrono). - `EliEntradaParagrafo`: Textarea. #### API Comum Todas as entradas aceitam duas props principais: 1. `value`: O binding v-model. 2. `opcoes`: Um objeto de configuração específico para o tipo de entrada. #### Objetos de Configuração (`tiposEntradas.ts`) **EliEntradaTexto** ```typescript opcoes: { rotulo: string; placeholder?: string; limiteCaracteres?: number; formato?: "texto" | "email" | "url" | "telefone" | "cpfCnpj" | "cep"; } ``` **EliEntradaNumero** ```typescript opcoes: { rotulo: string; precisao?: number; // 0=inteiro (padrão se null), 0.1=1 decimal, 0.01=2 decimais. Se undefined/null, assume decimal livre. prefixo?: string; // ex: "R$" sufixo?: string; // ex: "kg" } ``` **EliEntradaDataHora** ```typescript opcoes: { rotulo: string; modo?: "data" | "dataHora"; // padrão: "dataHora" min?: string; // String ISO max?: string; // String ISO } ``` **EliEntradaSelecao** ```typescript opcoes: { rotulo: string; // Função que retorna itens ou promise de itens. // IMPORTANTE: Itens devem ser objetos { chave: string, rotulo: string } itens: () => Array<{ chave: string; rotulo: string }> | Promise>; limpavel?: boolean; } ``` #### Exemplo de Uso ```vue ``` --- ### 3. EliBotao Wrapper simples para `v-btn`. - **Props**: `color`, `variant` (elevated, flat, text, etc.), `size`, `loading`, `disabled`. - **Slots**: slot padrão para o conteúdo do botão. ```vue Salvar ``` --- ### 4. EliCartao & EliBadge **EliCartao** Cartão padronizado para itens de domínio. - **Props**: `titulo`, `status` (tipo `CartaoStatus`: "novo" | "rascunho" | "vendido" | "cancelado"), `variant`. - **Slots**: `default` (conteúdo), `acoes` (ações de rodapé). **EliBadge** Badge aprimorado com raios. - **Props**: `badge` (conteúdo), `color`, `radius` ("suave" | "pill"). --- ## 🔧 Solução de Problemas e Dicas ### 1. "Failed to resolve component" - Certifique-se de que `app.use(EliVue)` foi chamado no `main.ts`. - Se importar diretamente, garanta importações padrão: `import { EliTabela } from 'eli-vue'`. ### 2. Problemas de Estilo - **Injeção de CSS**: O `eli-vue` injeta CSS automaticamente. Verifique sua CSP (Política de Segurança de Conteúdo) se os estilos estiverem bloqueados. - **Vuetify**: Certifique-se de que o Vuetify 3 está corretamente instalado e os estilos (`vuetify/styles`) estão importados no seu arquivo de entrada principal. ### 3. Erros de TypeScript no `celulaTabela` - Garanta que o segundo argumento corresponda ao esquema específico do tipo de célula. - Exemplo: `celulaTabela("textoSimples", { texto: ... })` funciona, mas `celulaTabela("textoSimples", { numero: ... })` falhará. ### 4. Ícones não aparecem - Passe o **objeto do componente** (ex: importado de `lucide-vue-next`), não o nome em string. - Exemplo: `icone: Pencil` (Correto) vs `icone: "pencil"` (Incorreto). ### 5. Valores do `EliEntrada` - `EliEntradaTexto` com `formato='cpfCnpj'` emite a string **formatada** (ex: "123.456.789-00"). - `EliEntradaNumero` emite um `number` ou `null`. - `EliEntradaDataHora` trabalha com **Strings ISO** (ex: "2023-01-01T00:00:00Z"). A exibição é localizada, mas o valor do modelo é sempre ISO.