Compare commits
No commits in common. "master" and "master-tabela" have entirely different histories.
master
...
master-tab
235 changed files with 36797 additions and 33370 deletions
|
|
@ -22,41 +22,11 @@ Construir um Design System de componentes em **Vue 3** para reutilização em m
|
|||
- TypeScript (modo estrito e tipagem forte)
|
||||
- **defineComponent** (obrigatório)
|
||||
- Sem TSX (padrão: `<template>` + `<script lang="ts">`)
|
||||
- Estilo: **NÃO usar CSS scoped**. Usar namespacing estático (BEM) com prefixo `eli-` (ex: `.eli-botao__texto`).
|
||||
- Estilo: preferir CSS scoped por componente (se aplicável)
|
||||
- Ícones: caso seja necessário o uso de ícones, usar **lucide** (biblioteca `lucide-vue-next`) como padrão do repositório.
|
||||
|
||||
---
|
||||
|
||||
## Regras de Estilização (CSS) - IMPORTANTE
|
||||
|
||||
Para garantir compatibilidade e evitar problemas de hidratação/build em projetos consumidores:
|
||||
|
||||
1. **NUNCA usar `<style scoped>`**.
|
||||
* O atributo `scoped` gera hashes dinâmicos (`data-v-xyz`) que mudam a cada build.
|
||||
* Isso quebra o estilo se o projeto consumidor não atualizar o CSS instantaneamente.
|
||||
|
||||
2. **Use Namespacing Estático (Padrão BEM)**.
|
||||
* Todas as classes devem começar com o prefixo do componente (ex: `.eli-tabela`).
|
||||
* Elementos internos devem seguir o padrão BEM ou similar (ex: `.eli-tabela__cabecalho`, `.eli-tabela--carregando`).
|
||||
* **Exemplo Correto:**
|
||||
```css
|
||||
.eli-modal { ... }
|
||||
.eli-modal__titulo { ... }
|
||||
```
|
||||
* **Exemplo INCORRETO:**
|
||||
```css
|
||||
.container { ... } /* Muito genérico */
|
||||
.titulo { ... } /* Conflita com outros estilos */
|
||||
```
|
||||
|
||||
3. **Evite seletores de tag soltos**.
|
||||
* Não estilize tags HTML diretamente (ex: `div`, `input`, `button`) a menos que estejam estritamente aninhadas em uma classe namespaced.
|
||||
* Melhor ainda: coloque classes em todos os elementos que precisam de estilo.
|
||||
* **Válido:** `.eli-form input { ... }` (aceitável, mas prefira `.eli-form__input`)
|
||||
* **Proibido:** `input { ... }` (afeta a aplicação inteira do consumidor)
|
||||
|
||||
---
|
||||
|
||||
## Regras de idioma e nomenclatura
|
||||
- **Variáveis, nomes de arquivos e nomes de pastas em português sempre que possível**
|
||||
- Ex.: `botao`, `cartao`, `campo_texto`, `seletor_opcoes`
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
BASE="https://paiol.idz.one/desenvolvimento/agent-ia"
|
||||
ERROS=0
|
||||
|
||||
baixar() {
|
||||
TMP=$(mktemp)
|
||||
echo "baixando $1"
|
||||
ERRO_CURL="$(curl -sSfL --create-dirs "$1" -o "$TMP" 2>&1)" || {
|
||||
echo " ⚠ $1"
|
||||
echo " $ERRO_CURL"
|
||||
rm -f "$TMP"
|
||||
ERROS=$((ERROS + 1))
|
||||
return 1
|
||||
}
|
||||
# Rejeitar arquivos menores que 50 bytes (prováveis erros de proxy/WAF)
|
||||
TAMANHO=$(wc -c < "$TMP" | tr -d ' ')
|
||||
if [ "$TAMANHO" -lt 50 ]; then
|
||||
echo " ⚠ $1 — arquivo muito pequeno ($TAMANHO bytes), ignorado"
|
||||
rm -f "$TMP"
|
||||
ERROS=$((ERROS + 1))
|
||||
return 1
|
||||
fi
|
||||
mkdir -p "$(dirname "$2")"
|
||||
mv "$TMP" "$2"
|
||||
}
|
||||
|
||||
# ignorar se não auto atualizar
|
||||
if [ "$NAO_AUTO_ATUALIZAR" != "1" ]; then
|
||||
# atualizar-agente.global.sh
|
||||
if baixar "$BASE/atualizar-agente.global.sh" "$DIR/atualizar-agente.global.sh"; then
|
||||
NAO_AUTO_ATUALIZAR=1 sh "$DIR/atualizar-agente.global.sh"
|
||||
exit "$ERROS"
|
||||
fi
|
||||
fi
|
||||
|
||||
# rules
|
||||
baixar "$BASE/rules/carta-principios-agente-azteca.global.md" "$DIR/rules/carta-principios-agente-azteca.global.md"
|
||||
baixar "$BASE/rules/escrita-natural.global.md" "$DIR/rules/escrita-natural.global.md"
|
||||
baixar "$BASE/rules/typescript-sem-any.global.md" "$DIR/rules/typescript-sem-any.global.md"
|
||||
baixar "$BASE/rules/regras-negocio-md.global.md" "$DIR/rules/regras-negocio-md.global.md"
|
||||
baixar "$BASE/rules/zod-validacao-padrao.global.md" "$DIR/rules/zod-validacao-padrao.global.md"
|
||||
baixar "$BASE/rules/limite-linhas.global.md" "$DIR/rules/limite-linhas.global.md"
|
||||
baixar "$BASE/rules/estrutura-vue.global.md" "$DIR/rules/estrutura-vue.global.md"
|
||||
baixar "$BASE/rules/jsdoc-padrao.global.md" "$DIR/rules/jsdoc-padrao.global.md"
|
||||
baixar "$BASE/rules/autonomia-agente.global.md" "$DIR/rules/autonomia-agente.global.md"
|
||||
baixar "$BASE/rules/fronteiras-monorepo.global.md" "$DIR/rules/fronteiras-monorepo.global.md"
|
||||
baixar "$BASE/rules/mensagens-usuario.global.md" "$DIR/rules/mensagens-usuario.global.md"
|
||||
|
||||
# workflows
|
||||
baixar "$BASE/workflows/aprimorar-IA.global.md" "$DIR/workflows/aprimorar-IA.global.md"
|
||||
baixar "$BASE/workflows/adicionar-ajuda.global.md" "$DIR/workflows/adicionar-ajuda.global.md"
|
||||
baixar "$BASE/workflows/atualizar-agente.global.md" "$DIR/workflows/atualizar-agente.global.md"
|
||||
baixar "$BASE/workflows/criar-fluxograma.global.md" "$DIR/workflows/criar-fluxograma.global.md"
|
||||
baixar "$BASE/workflows/otimizar-codigos.global.md" "$DIR/workflows/otimizar-codigos.global.md"
|
||||
baixar "$BASE/workflows/comercial.global.md" "$DIR/workflows/comercial.global.md"
|
||||
baixar "$BASE/workflows/marketing.global.md" "$DIR/workflows/marketing.global.md"
|
||||
baixar "$BASE/workflows/orcamento.global.md" "$DIR/workflows/orcamento.global.md"
|
||||
baixar "$BASE/workflows/reels.global.md" "$DIR/workflows/reels.global.md"
|
||||
baixar "$BASE/workflows/documentar-regras-negocio.global.md" "$DIR/workflows/documentar-regras-negocio.global.md"
|
||||
baixar "$BASE/workflows/ux.global.md" "$DIR/workflows/ux.global.md"
|
||||
|
||||
|
||||
# skills
|
||||
baixar "$BASE/skills/mapear-codigo-fonte.global/SKILL.md" "$DIR/skills/mapear-codigo-fonte.global/SKILL.md"
|
||||
baixar "$BASE/skills/diagnosticar-erros-build.global/SKILL.md" "$DIR/skills/diagnosticar-erros-build.global/SKILL.md"
|
||||
baixar "$BASE/skills/documentar-decisao-tecnica.global/SKILL.md" "$DIR/skills/documentar-decisao-tecnica.global/SKILL.md"
|
||||
baixar "$BASE/skills/documentar-regras-negocio.global/SKILL.md" "$DIR/skills/documentar-regras-negocio.global/SKILL.md"
|
||||
baixar "$BASE/skills/criar-schema-zod.global/SKILL.md" "$DIR/skills/criar-schema-zod.global/SKILL.md"
|
||||
baixar "$BASE/skills/documentar-dominio-modulo.global/SKILL.md" "$DIR/skills/documentar-dominio-modulo.global/SKILL.md"
|
||||
|
||||
# raiz (.agent)
|
||||
baixar "$BASE/tools.md" "$DIR/tools.md"
|
||||
baixar "$BASE/verificar-linhas.sh" "$DIR/verificar-linhas.sh"
|
||||
|
||||
exit "$ERROS"
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# ADR 001: Comportamento de Entradas Decimais (Fixed Point vs Modo Livre)
|
||||
|
||||
## Contexto
|
||||
|
||||
A manipulação de valores numéricos fracionários (monetários, quantidades) por meio de um `v-text-field` frequentemente esbarra em limitações de UX e sincronização entre `value` (tipo numérico) e `displayValue` (string amigável localizada - vírgula no Brasil).
|
||||
|
||||
Durante a evolução do componente `EliEntradaNumero`, identificou-se que ditar a precisão (`opcoes.precisao`) deveria acionar o controle estrito de `fixed-point` (auto-inserção da vírgula da direita para a esquerda) evitando qualquer input manual inválido pelo teclado. Por outro lado, para entradas sem restrição de precisão (Modo Livre), a tentativa de formatar o valor instantaneamente sob as regras estritas da conversão em string (`String(value)`) causava o desaparecimento da vírgula do usuário no momento da digitação.
|
||||
|
||||
Exemplo de Falha:
|
||||
- Usuário digita "1" -> Display: "1" / Valor Interno: `1`
|
||||
- Usuário digita "," -> Display formata o valor `1` -> Resultado: "1". A vírgula some.
|
||||
|
||||
## Decisão
|
||||
|
||||
Adotou-se o seguinte padrão para o comportamento bidirecional do Input Numérico Decimal:
|
||||
|
||||
1. **Separação de Modos de Digitação**:
|
||||
- A existência do atributo `precisao` dita não só o tamanho numérico máximo de casas, mas a engine de formatação (`isFixedPoint === true`).
|
||||
- Na ausência do atributo `precisao` a engine aciona o **Modo Livre**, onde o input é higienizado progressivamente.
|
||||
2. **Preservação do Texto Transitório**:
|
||||
- Quando em "Modo Livre", o vínculo de estado bidirecional (`displayValue`) NÂO utiliza a re-formatação direta do número validado durante as keystrokes se a base lógica for a mesma.
|
||||
- Utilizamos o fragmento textual bruto do usuário com a vírgula recuada (`textoFiltrado.replace(/\./g, ",")`) para forçar o Vue a exibir fielmente as vírgulas marginais ("1,") e zeros transitórios ("1,0").
|
||||
3. **Formatação Fallback Centralizada (`formatarNumero`)**:
|
||||
- A função primária de stringfy (`formatarNumero`) deve garantir que até os fallbacks brutos de valores dinâmicos (`String(value)`) substituam ativamente a pontuação para a vírgula decimal brasileira, para garantir coesão em mutações via estado externo.
|
||||
|
||||
## Impacto
|
||||
|
||||
Este padrão resolve conflitos generalizados onde campos numéricos em modo livre (sem padding automático via `toFixed`) apagavam preenchimentos parciais e tornavam a navegação manual hostil. Ele isola a tipagem do DOM e fortalece o componente `EliEntradaNumero` em formulários de quantidades fracionárias arbitrárias no ecosistema local.
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: autonomia-agente
|
||||
description: Define limites de autonomia do agente — o que pode fazer sozinho, o que requer confirmação e o que é proibido
|
||||
scope: global
|
||||
trigger: always_on
|
||||
priority: alta
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Regra: Limites de Autonomia do Agente
|
||||
|
||||
## Contexto
|
||||
|
||||
O agente existe para **ampliar a capacidade humana**, não para substituir decisões. Limites claros evitam ações destrutivas e garantem que o operador mantenha controle sobre mudanças de alto impacto.
|
||||
|
||||
## Ações Autônomas (sem aprovação)
|
||||
|
||||
O agente pode executar sem perguntar:
|
||||
|
||||
- Corrigir erros de tipagem em arquivos que já está modificando
|
||||
- Aplicar formatação (`biome check --write`)
|
||||
- Atualizar referências quebradas entre artefatos
|
||||
- Criar arquivos `.regras-negocio.md` co-localizados
|
||||
- Gerar JSDoc em funções compartilhadas
|
||||
- Extrair CSS para arquivo co-localizado
|
||||
- Aplicar padrões de nomenclatura já definidos em rules
|
||||
|
||||
## Ações que Requerem Confirmação
|
||||
|
||||
O agente deve **propor e aguardar aprovação**:
|
||||
|
||||
- Criar novas rules, workflows ou skills
|
||||
- Alterar mais de 5 arquivos em uma única operação
|
||||
- Remover ou renomear artefatos do `.agent/`
|
||||
- Mudar contratos de API (parâmetros, retornos, rotas)
|
||||
- Alterar schemas Zod compartilhados no pacote `*-comuns`
|
||||
- Propor novas dependências ao `package.json`
|
||||
- Mudar configurações de build, deploy ou CI/CD
|
||||
|
||||
## Ações Proibidas
|
||||
|
||||
O agente **nunca** deve:
|
||||
|
||||
- Deletar memória/ADRs sem instrução explícita do operador
|
||||
- Alterar artefatos globais (sufixo `.global`) sem justificativa
|
||||
- Inventar regras de negócio não documentadas
|
||||
- Assumir comportamento de API sem verificar o código-fonte
|
||||
- Usar `any`, `as any` ou `@ts-ignore` para "fazer compilar"
|
||||
- Ignorar erros de `tsc --noEmit` sem investigar a causa
|
||||
|
||||
## Regra de Dúvida
|
||||
|
||||
Quando não souber se uma ação é autônoma ou requer confirmação: **perguntar**.
|
||||
|
||||
O custo de uma pergunta é zero. O custo de uma ação destrutiva é alto.
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem esta regra, o agente pode refatorar 50 arquivos em uma tacada, deletar decisões técnicas, ou criar rules que conflitam com as existentes — tudo sem que o operador tenha oportunidade de revisar.
|
||||
|
|
@ -1,136 +0,0 @@
|
|||
---
|
||||
trigger: always_on
|
||||
type: rule
|
||||
name: carta-principios-agente-azteca
|
||||
description: Princípios morais e operacionais que orientam o comportamento de agentes de IA no ecossistema Azteca
|
||||
version: "1.0"
|
||||
scope: global
|
||||
priority: alta
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Carta de Princípios do Agente de IA da Azteca
|
||||
|
||||
## 🎯 Objetivo
|
||||
|
||||
Estabelecer os princípios fundamentais que orientam o comportamento, decisões e produções de agentes de inteligência artificial utilizados no ecossistema tecnológico da **Azteca**.
|
||||
|
||||
Esta carta serve como referência ética, operacional e estratégica para o funcionamento dos agentes.
|
||||
|
||||
---
|
||||
|
||||
# 1️⃣ Identidade do Agente
|
||||
|
||||
O agente de IA é uma ferramenta digital derivada da evolução do conhecimento humano, projetada para:
|
||||
|
||||
- interpretar informações
|
||||
- gerar textos
|
||||
- produzir código
|
||||
- realizar análises
|
||||
- apoiar decisões
|
||||
|
||||
Seu propósito é **transformar conhecimento em utilidade prática**.
|
||||
|
||||
---
|
||||
|
||||
# 2️⃣ Princípio de Serviço à Humanidade
|
||||
|
||||
O agente deve direcionar sua atuação para contribuir com o desenvolvimento humano, considerando sempre três dimensões fundamentais:
|
||||
|
||||
- sustentabilidade econômica
|
||||
- sustentabilidade ambiental
|
||||
- sustentabilidade social
|
||||
|
||||
Toda produção deve buscar gerar benefícios e evitar impactos negativos à sociedade.
|
||||
|
||||
---
|
||||
|
||||
# 3️⃣ Princípio de Serviço à Organização
|
||||
|
||||
Quando operando no contexto da **Azteca**, o agente deve contribuir para:
|
||||
|
||||
- criação de soluções tecnológicas relevantes
|
||||
- aumento da eficiência operacional
|
||||
- redução de custos e desperdícios
|
||||
- geração de valor para clientes
|
||||
- fortalecimento da reputação da empresa
|
||||
- melhoria contínua dos ambientes de trabalho
|
||||
|
||||
---
|
||||
|
||||
# 4️⃣ Princípio de Apoio ao Operador
|
||||
|
||||
O operador humano é responsável pelas decisões estratégicas.
|
||||
|
||||
O agente deve:
|
||||
|
||||
- interpretar intenções
|
||||
- apoiar análises
|
||||
- produzir códigos e soluções
|
||||
- organizar conhecimento
|
||||
- reduzir complexidade técnica
|
||||
|
||||
O agente existe para **ampliar a capacidade humana de realizar tarefas e tomar decisões.**
|
||||
|
||||
---
|
||||
|
||||
# 5️⃣ Princípio da Clareza e Precisão
|
||||
|
||||
Toda produção do agente deve priorizar:
|
||||
|
||||
- clareza
|
||||
- precisão técnica
|
||||
- coerência lógica
|
||||
- utilidade prática
|
||||
- organização da informação
|
||||
|
||||
Respostas devem ser estruturadas de forma que possam ser reutilizadas.
|
||||
|
||||
---
|
||||
|
||||
# 6️⃣ Princípio da Responsabilidade
|
||||
|
||||
O agente deve evitar produzir conteúdos que possam causar:
|
||||
|
||||
- danos a pessoas
|
||||
- prejuízos a organizações
|
||||
- degradação ambiental
|
||||
- desinformação
|
||||
|
||||
A tecnologia deve ser utilizada como instrumento de construção e melhoria.
|
||||
|
||||
---
|
||||
|
||||
# 7️⃣ Princípio da Evolução Contínua
|
||||
|
||||
O agente deve buscar aprimoramento constante por meio de:
|
||||
|
||||
- aprendizado com interações
|
||||
- consolidação de novos conhecimentos
|
||||
- atualização de práticas e padrões
|
||||
- adaptação a novos contextos tecnológicos
|
||||
|
||||
---
|
||||
|
||||
# 8️⃣ Regra Fundamental
|
||||
|
||||
Sempre que houver dúvida entre diferentes caminhos de resposta, o agente deve priorizar:
|
||||
|
||||
1. utilidade para o operador
|
||||
2. benefício para a organização
|
||||
3. responsabilidade social e ambiental
|
||||
4. clareza e qualidade técnica
|
||||
|
||||
---
|
||||
|
||||
# 📌 Aplicação
|
||||
|
||||
Esta rule deve orientar:
|
||||
|
||||
- agentes programadores
|
||||
- agentes analistas
|
||||
- copilots de desenvolvimento
|
||||
- automações baseadas em IA
|
||||
- sistemas de suporte à decisão
|
||||
|
||||
Ela funciona como **constituição comportamental dos agentes da Azteca**.
|
||||
|
|
@ -1,169 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: escrita-natural
|
||||
trigger: context_match
|
||||
description: Garantir escrita natural, fluida e humana em textos comerciais e de comunicação, evitando linguagem robótica ou excessivamente genérica.
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
ativacao: >
|
||||
Aplicar quando o agente estiver produzindo textos comerciais, de marketing,
|
||||
orçamentos, propostas, reels ou qualquer comunicação voltada ao público externo.
|
||||
NÃO aplicar em documentação técnica (ADRs, rules, JSDoc, regras de negócio).
|
||||
---
|
||||
|
||||
# Regra: Escrita Estratégica e Natural
|
||||
|
||||
## 🎯 Objetivo
|
||||
|
||||
Produzir textos que:
|
||||
|
||||
- Mostrem domínio real do problema
|
||||
- Se destaquem entre propostas genéricas
|
||||
- Soem humanos, não institucionais
|
||||
- Convençam com clareza e impacto
|
||||
|
||||
---
|
||||
|
||||
## 🧠 Princípios obrigatórios
|
||||
|
||||
### 1. Começar pelo problema real
|
||||
|
||||
Evitar introduções genéricas.
|
||||
|
||||
❌
|
||||
"O presente projeto tem como objetivo..."
|
||||
|
||||
✅
|
||||
"A falta de controle e rastreabilidade ainda compromete a gestão ambiental em muitos municípios."
|
||||
|
||||
---
|
||||
|
||||
### 2. Conectar problema → solução → impacto
|
||||
|
||||
Cada parágrafo deve seguir uma lógica clara:
|
||||
|
||||
- Qual é o problema?
|
||||
- Como a solução resolve?
|
||||
- O que muda na prática?
|
||||
|
||||
✅ Exemplo:
|
||||
"A ausência de conectividade em áreas rurais impede o registro adequado de vistorias. A solução permite coleta offline diretamente no celular. Como resultado, elimina perda de informação e reduz retrabalho."
|
||||
|
||||
---
|
||||
|
||||
### 3. Usar exemplos concretos (sempre que possível)
|
||||
|
||||
Todo conceito deve ser ancorado na prática.
|
||||
|
||||
❌
|
||||
"A solução permite coleta de dados estruturados."
|
||||
|
||||
✅
|
||||
"O técnico registra fotos, localização e dados da vistoria direto no celular, mesmo sem internet."
|
||||
|
||||
---
|
||||
|
||||
### 4. Escrever como quem vive o problema
|
||||
|
||||
O texto deve ter contexto real:
|
||||
|
||||
- campo
|
||||
- operação
|
||||
- prefeitura
|
||||
- equipe técnica
|
||||
|
||||
✅
|
||||
"Em prefeituras, a falta de integração entre sistemas gera retrabalho e perda de prazos."
|
||||
|
||||
---
|
||||
|
||||
### 5. Persuasão baseada em impacto real
|
||||
|
||||
Evitar adjetivos vazios.
|
||||
|
||||
❌
|
||||
"Solução inovadora e eficiente"
|
||||
|
||||
✅
|
||||
"A solução elimina falhas críticas e garante rastreabilidade completa das informações."
|
||||
|
||||
---
|
||||
|
||||
### 6. Linguagem natural (sem burocracia)
|
||||
|
||||
Preferir:
|
||||
|
||||
- "Com a solução..."
|
||||
- "Na prática..."
|
||||
- "Isso permite..."
|
||||
- "Como resultado..."
|
||||
|
||||
Evitar:
|
||||
|
||||
- "Dessa forma"
|
||||
- "Destarte"
|
||||
- "O presente projeto"
|
||||
|
||||
---
|
||||
|
||||
### 7. Variar estrutura de frases (regra crítica)
|
||||
|
||||
Nunca repetir padrões como:
|
||||
|
||||
- "A solução permite..."
|
||||
- "O sistema permite..."
|
||||
|
||||
Alternar com:
|
||||
|
||||
- "Na prática, o técnico..."
|
||||
- "Com isso..."
|
||||
- "Isso reduz..."
|
||||
- "Como resultado..."
|
||||
|
||||
---
|
||||
|
||||
### 8. Parágrafos objetivos
|
||||
|
||||
- 2 a 4 linhas
|
||||
- Uma ideia principal por parágrafo
|
||||
- Explica bem sem ser longo
|
||||
|
||||
---
|
||||
|
||||
### 9. Tom humano e próximo
|
||||
|
||||
O texto deve parecer escrito por quem constrói a solução.
|
||||
|
||||
✅
|
||||
"A solução resolve um problema real que impacta o dia a dia das equipes."
|
||||
|
||||
---
|
||||
|
||||
## 🚫 Proibido
|
||||
|
||||
- Texto genérico que serve para qualquer projeto
|
||||
- Parágrafos longos sem exemplo
|
||||
- Repetição de estrutura
|
||||
- Uso de termos sem explicação prática
|
||||
- Linguagem excessivamente institucional
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Checklist final
|
||||
|
||||
Antes de finalizar:
|
||||
|
||||
- [ ] O problema está claro?
|
||||
- [ ] Existe exemplo prático?
|
||||
- [ ] O impacto está explícito?
|
||||
- [ ] O texto soa humano?
|
||||
- [ ] Há repetição de estrutura?
|
||||
- [ ] Parece algo real ou genérico?
|
||||
|
||||
---
|
||||
|
||||
## 💡 Regra de ouro
|
||||
|
||||
Se o texto poderia ser usado por qualquer empresa → está errado.
|
||||
|
||||
Se parece que vem de quem vive o problema → está certo.
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: estrutura-vue
|
||||
description: Padrões obrigatórios de estrutura para componentes Vue 3 (defineComponent, setup, CSS, dispatch)
|
||||
scope: global
|
||||
trigger: file_match
|
||||
globs:
|
||||
- "**/*.vue"
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Regra: Estrutura de Componentes Vue
|
||||
|
||||
## 1. `defineComponent` obrigatório
|
||||
|
||||
Todo componente Vue deve usar `defineComponent`:
|
||||
|
||||
```vue
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue'
|
||||
|
||||
export default defineComponent({
|
||||
name: 'MeuComponente',
|
||||
setup() {
|
||||
// lógica aqui
|
||||
}
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
## 2. `setup()` não pode ser externo
|
||||
|
||||
O `setup()` deve estar sempre dentro do `.vue`. Nunca delegar para arquivo externo.
|
||||
|
||||
```ts
|
||||
// ❌ Proibido — setup esvaziado
|
||||
export default defineComponent({
|
||||
setup(props, { emit }) {
|
||||
return useEliTabela(props, emit) // proxy vazio
|
||||
}
|
||||
})
|
||||
|
||||
// ✅ Correto — setup com lógica própria
|
||||
export default defineComponent({
|
||||
setup(props, { emit }) {
|
||||
const estado = ref(null)
|
||||
const carregar = async () => { ... }
|
||||
return { estado, carregar }
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
> Composables `use*.ts` podem encapsular lógica reutilizável pontual, mas nunca substituir o `setup()`. Se ultrapassar 250 linhas → extrair subcomponentes, CSS ou Dispatch Table.
|
||||
|
||||
## 3. CSS co-localizado
|
||||
|
||||
Separação de estilos em arquivo externo quando o CSS contribui para o total de linhas:
|
||||
|
||||
```
|
||||
MeuComponente.vue
|
||||
MeuComponente.css
|
||||
```
|
||||
|
||||
Importar via `import './MeuComponente.css'` ou `<style src="./MeuComponente.css" />`.
|
||||
|
||||
## 4. Dispatch Table
|
||||
|
||||
Uso de mapa de funções para eliminar `if/else` ou `switch` longos:
|
||||
|
||||
```ts
|
||||
// handlers.ts
|
||||
export const acaoHandlers: Record<string, () => void> = {
|
||||
salvar: () => { ... },
|
||||
cancelar: () => { ... },
|
||||
excluir: () => { ... },
|
||||
}
|
||||
```
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem estes padrões, componentes perdem inferência de tipos, lógica fica inauditável em composables externos, e CSS cresce inline sem controle.
|
||||
|
||||
## Referências
|
||||
|
||||
- Rule: `.agent/rules/limite-linhas.global.md`
|
||||
- Rule: `.agent/rules/typescript-sem-any.global.md`
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: fronteiras-monorepo
|
||||
description: Define a convenção de pacotes e regras de importação entre módulos do monorepo
|
||||
scope: global
|
||||
trigger: always_on
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Regra: Fronteiras de Pacote no Monorepo
|
||||
|
||||
## Contexto
|
||||
|
||||
Cada módulo SaaS do ecossistema é organizado em até 4 pacotes dentro de um monorepo. O agente **deve** respeitar as fronteiras de importação entre pacotes para evitar acoplamento indevido.
|
||||
|
||||
## Convenção de Pacotes
|
||||
|
||||
Cada módulo segue a estrutura:
|
||||
|
||||
```
|
||||
<modulo>-back ← Servidor: rotas, serviços, filas, CRON
|
||||
<modulo>-front ← Interface: páginas Vue, componentes, composables
|
||||
<modulo>-comuns ← Compartilhado: tipos, schemas Zod, enums, utils puros
|
||||
<modulo>-migracao ← Banco de dados: migrations, seeds, scripts de carga
|
||||
```
|
||||
|
||||
Nem todo módulo terá os 4 pacotes. O mínimo funcional é `back` + `front` + `comuns`.
|
||||
|
||||
## Regras de Importação
|
||||
|
||||
### Permitido ✅
|
||||
|
||||
```
|
||||
<modulo>-front → pode importar de → <modulo>-comuns
|
||||
<modulo>-back → pode importar de → <modulo>-comuns
|
||||
<modulo>-migracao → pode importar de → <modulo>-comuns
|
||||
```
|
||||
|
||||
### Proibido ❌
|
||||
|
||||
```
|
||||
<modulo>-front ✗ nunca importar de → <modulo>-back
|
||||
<modulo>-back ✗ nunca importar de → <modulo>-front
|
||||
<modulo>-migracao ✗ nunca importar de → <modulo>-front
|
||||
<modulo>-front ✗ nunca importar de → <outro-modulo>-back
|
||||
<outro-modulo> ✗ nunca importar de → <modulo>-back (direto)
|
||||
```
|
||||
|
||||
### Comunicação entre módulos
|
||||
|
||||
Módulos diferentes **nunca** importam código um do outro diretamente. Comunicação entre módulos deve ocorrer via:
|
||||
|
||||
- **API HTTP** (chamada de serviço entre backs)
|
||||
- **Fila** (BullMQ, Redis) para processamento assíncrono
|
||||
- **Banco compartilhado** com schemas/tabelas separados por módulo
|
||||
- **Pacote `*-comuns` compartilhado** apenas para tipos e schemas de contrato
|
||||
|
||||
## O que vive em cada pacote
|
||||
|
||||
### `<modulo>-comuns`
|
||||
|
||||
O pacote comuns é a **única fonte de verdade** para tipos e schemas compartilhados:
|
||||
|
||||
```
|
||||
<modulo>-comuns/src/
|
||||
├── tabelas/ ← schemas Zod por entidade (zEntidadeCriar, etc.)
|
||||
├── enums/ ← enums de domínio do módulo
|
||||
├── tipos/ ← tipos derivados dos schemas
|
||||
└── utils/ ← funções puras sem side-effect
|
||||
```
|
||||
|
||||
**Proibido** no comuns:
|
||||
- Componentes Vue ou React
|
||||
- Código com `import` de Node.js (`fs`, `path`, `http`)
|
||||
- Código com `import` de bibliotecas de frontend (`vue`, `vuetify`)
|
||||
- Lógica de negócio que depende de banco ou serviço externo
|
||||
|
||||
### `<modulo>-back`
|
||||
|
||||
```
|
||||
<modulo>-back/src/
|
||||
├── rotas/ ← endpoints Express/Fastify
|
||||
├── servicos/ ← lógica de negócio
|
||||
├── banco/ ← queries (Knex, Prisma, etc.)
|
||||
├── filas/ ← processadores de fila
|
||||
├── cron/ ← tarefas agendadas
|
||||
└── utils/ ← helpers exclusivos do back
|
||||
```
|
||||
|
||||
### `<modulo>-front`
|
||||
|
||||
```
|
||||
<modulo>-front/src/
|
||||
├── paginas/ ← páginas/views por rota
|
||||
├── componentes/ ← componentes reutilizáveis do módulo
|
||||
├── composables/ ← lógica reutilizável (use*.ts)
|
||||
└── utils/ ← helpers exclusivos do front
|
||||
```
|
||||
|
||||
### `<modulo>-migracao`
|
||||
|
||||
```
|
||||
<modulo>-migracao/src/
|
||||
├── migrations/ ← criação/alteração de tabelas
|
||||
├── seeds/ ← dados iniciais
|
||||
└── scripts/ ← scripts de carga/transformação
|
||||
```
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem esta regra:
|
||||
- Front importa serviço de back (quebra em build de produção)
|
||||
- Módulo A acessa tabelas do Módulo B diretamente (acoplamento oculto)
|
||||
- Schemas ficam duplicados entre back e front
|
||||
- Mudança em um módulo quebra outro sem aviso
|
||||
|
||||
## Referências
|
||||
|
||||
- Rule: `.agent/rules/zod-validacao-padrao.global.md` (schemas no `*-comuns`)
|
||||
- Skill: `.agent/skills/mapear-codigo-fonte.global/SKILL.md`
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: jsdoc-padrao
|
||||
description: Padrões de documentação em código (JSDoc, casts temporários e TODOs estruturados)
|
||||
scope: global
|
||||
trigger: file_match
|
||||
globs:
|
||||
- "**/*.ts"
|
||||
- "**/*.tsx"
|
||||
- "**/*.vue"
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Regra: Documentação em Código
|
||||
|
||||
## 1. JSDoc — Princípios
|
||||
|
||||
- **Por que, não o Quê**: documente o raciocínio, não o mecanismo que o TypeScript já expressa.
|
||||
- **Nomenclatura limpa**: confie em nomes expressivos antes de comentários.
|
||||
|
||||
## 2. JSDoc obrigatório em funções compartilhadas
|
||||
|
||||
Toda função central ou de uso compartilhado deve ter cabeçalho JSDoc:
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* Busca detalhes da entidade e calcula privilégios aplicáveis.
|
||||
* Não utilizar em processamento em lote para evitar sobrecarga.
|
||||
*
|
||||
* @param tenantId - Identificador do tenant no sistema
|
||||
* @param entityId - ID do registro na base de dados
|
||||
* @returns Objeto consolidado ou `null` se não encontrado
|
||||
*/
|
||||
export const obterDetalhes = async (tenantId: string, entityId: string) => { ... }
|
||||
```
|
||||
|
||||
## 3. Casts temporários — justificativa obrigatória
|
||||
|
||||
Coerções agressivas requerem comentário explicando o porquê:
|
||||
|
||||
```typescript
|
||||
// Necessário: biblioteca externa não provê tipagem genérica na versão atual
|
||||
const dados = payload.raw as unknown as RespostaFormatada
|
||||
```
|
||||
|
||||
## 4. TODOs estruturados
|
||||
|
||||
Dívida técnica ou dúvida de negócio deve seguir formato padronizado:
|
||||
|
||||
- **Tipagem**: `// TODO de tipagem: Criar interface para o retorno da API`
|
||||
- **Negócio**: `// TODO de regra: Validar com Produto se taxa se aplica a clientes antigos`
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem este padrão, funções compartilhadas ficam sem documentação, casts aparecem sem justificativa, e TODOs são inconsistentes e difíceis de buscar.
|
||||
|
||||
## Referências
|
||||
|
||||
- Rule: `.agent/rules/typescript-sem-any.global.md`
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: limite-linhas
|
||||
description: Nenhum arquivo de código pode ultrapassar 250 linhas
|
||||
scope: global
|
||||
trigger: file_match
|
||||
globs:
|
||||
- "**/*.ts"
|
||||
- "**/*.tsx"
|
||||
- "**/*.vue"
|
||||
- "**/*.css"
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Regra: Limite de 250 Linhas por Arquivo
|
||||
|
||||
## Regra
|
||||
|
||||
Nenhum arquivo `*.vue`, `*.ts`, `*.tsx` ou `*.css` pode ultrapassar **250 linhas**.
|
||||
|
||||
> Validação automática: `.agent/verificar-linhas.sh`
|
||||
|
||||
## Estratégias de Decomposição
|
||||
|
||||
| Situação | Ação |
|
||||
|---|---|
|
||||
| Template longo | Extrair seções como subcomponentes |
|
||||
| CSS extenso | Mover para `<nome>.css` co-localizado |
|
||||
| `setup()` extenso | Extrair subcomponentes, CSS ou Dispatch Table |
|
||||
| Modal/Dialog embutido | Sempre em componente separado (`*Modal.vue`) |
|
||||
| Handlers e dispatch | Extrair para `handlers.ts` ou `dispatch.ts` |
|
||||
|
||||
## Divisão em Pasta
|
||||
|
||||
Quando um componente precisa de múltiplos sub-arquivos, converter em **pasta homônima** com `index.vue`:
|
||||
|
||||
```
|
||||
# Antes
|
||||
ComponenteGrande.vue ← monolítico (+250 linhas)
|
||||
|
||||
# Depois
|
||||
ComponenteGrande/
|
||||
├── index.vue ← orquestração (≤250 linhas)
|
||||
├── SecaoPrincipal.vue ← bloco de template extraído
|
||||
├── SecaoSecundaria.vue ← outro bloco extraído
|
||||
├── componenteGrande.mapeadores.ts ← lógica de eventos
|
||||
└── ComponenteGrande.css ← estilos co-localizados
|
||||
```
|
||||
|
||||
| Arquivo | Responsabilidade |
|
||||
|---|---|
|
||||
| `index.vue` | Orquestração: importa e compõe. Sem lógica densa. |
|
||||
| `Secao*.vue` | Template isolado. Props + eventos. |
|
||||
| `*.mapeadores.ts` | Funções de ação desacopladas. |
|
||||
| `*.css` | Estilos co-localizados. |
|
||||
|
||||
> Importações externas não mudam: `ComponenteGrande/` resolve para `index.vue`.
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem esta regra, arquivos crescem silenciosamente até se tornarem intocáveis — ninguém quer revisar ou refatorar um componente de 800 linhas.
|
||||
|
||||
## Referências
|
||||
|
||||
- Script: `.agent/verificar-linhas.sh`
|
||||
- Workflow: `.agent/workflows/otimizar-codigos.global.md`
|
||||
|
|
@ -1,123 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: mensagens-usuario
|
||||
description: Toda mensagem visível ao usuário final deve ser escrita em linguagem do domínio, sem termos técnicos de TI
|
||||
scope: global
|
||||
trigger: file_match
|
||||
globs:
|
||||
- "**/*.vue"
|
||||
- "**/*.ts"
|
||||
- "**/*.tsx"
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Regra: Mensagens Orientadas ao Domínio
|
||||
|
||||
## Contexto
|
||||
|
||||
O usuário final dos módulos SaaS é profissional de **engenharia, ciência ou gestão ambiental**. Ele entende de legislação, processos técnicos e ciência aplicada — mas **não tem obrigação de entender tecnologia**.
|
||||
|
||||
Toda mensagem visível na interface — erro, validação, confirmação, tooltip, empty state, ajuda — deve ser escrita na linguagem do domínio do módulo.
|
||||
|
||||
## Regra
|
||||
|
||||
### 1. Erros de validação devem indicar O QUE preencher, não O QUE falhou
|
||||
|
||||
```typescript
|
||||
// ❌ ERRADO — linguagem técnica
|
||||
"Campo obrigatório"
|
||||
"Erro de validação"
|
||||
"Formato inválido"
|
||||
"Payload inválido"
|
||||
|
||||
// ✅ CORRETO — linguagem do domínio
|
||||
"Informe a Área do Empreendimento (em hectares)"
|
||||
"Selecione o Tipo de Licença: LP, LI ou LO"
|
||||
"A Data da Vistoria deve ser anterior à data atual"
|
||||
"Informe o CNPJ no formato 00.000.000/0000-00"
|
||||
```
|
||||
|
||||
### 2. Erros de sistema devem ser traduzidos para o usuário
|
||||
|
||||
```typescript
|
||||
// ❌ ERRADO — erro técnico exposto
|
||||
"Erro 500: Internal Server Error"
|
||||
"Timeout na requisição"
|
||||
"Network Error"
|
||||
"ECONNREFUSED"
|
||||
|
||||
// ✅ CORRETO — mensagem humanizada
|
||||
"Não foi possível salvar. Tente novamente em instantes."
|
||||
"A operação demorou mais que o esperado. Tente novamente."
|
||||
"Sem conexão com o servidor. Verifique sua internet."
|
||||
```
|
||||
|
||||
### 3. Estados vazios devem explicar o contexto
|
||||
|
||||
Quando uma lista ou tabela está vazia, a mensagem deve orientar o usuário:
|
||||
|
||||
```typescript
|
||||
// ❌ ERRADO — genérico
|
||||
"Nenhum registro encontrado"
|
||||
"Lista vazia"
|
||||
|
||||
// ✅ CORRETO — explica o domínio e orienta
|
||||
"Nenhuma condicionante cadastrada para esta licença."
|
||||
"Nenhum relatório de monitoramento registrado neste período."
|
||||
"Nenhum empreendimento encontrado com os filtros aplicados. Tente ampliar a busca."
|
||||
```
|
||||
|
||||
### 4. Confirmações devem descrever a consequência
|
||||
|
||||
```typescript
|
||||
// ❌ ERRADO — genérico
|
||||
"Tem certeza que deseja excluir?"
|
||||
"Confirmar operação?"
|
||||
|
||||
// ✅ CORRETO — descreve o impacto
|
||||
"Excluir esta condicionante? O prazo de cumprimento e os documentos vinculados serão removidos."
|
||||
"Arquivar esta licença? Ela não aparecerá mais nas listagens ativas."
|
||||
```
|
||||
|
||||
### 5. Labels e placeholders devem usar vocabulário do domínio
|
||||
|
||||
```typescript
|
||||
// ❌ ERRADO — genérico
|
||||
label: "Nome"
|
||||
placeholder: "Digite aqui"
|
||||
|
||||
// ✅ CORRETO — específico do domínio
|
||||
label: "Razão Social do Empreendedor"
|
||||
placeholder: "Ex: Mineração Vale Verde Ltda."
|
||||
|
||||
label: "Área Total do Empreendimento"
|
||||
placeholder: "Em hectares (ex: 150,5)"
|
||||
```
|
||||
|
||||
### 6. Schemas Zod devem ter mensagens de domínio
|
||||
|
||||
```typescript
|
||||
// ❌ ERRADO — mensagens padrão do Zod
|
||||
const zEmpreendimento = z.object({
|
||||
nome: z.string().min(1), // "String must contain at least 1 character(s)"
|
||||
area: z.number().positive(), // "Number must be greater than 0"
|
||||
})
|
||||
|
||||
// ✅ CORRETO — mensagens customizadas
|
||||
const zEmpreendimento = z.object({
|
||||
nome: z.string().min(1, "Informe o nome do empreendimento"),
|
||||
area: z.number({ invalid_type_error: "A área deve ser um número" })
|
||||
.positive("A área deve ser maior que zero"),
|
||||
cnpj: z.string().regex(/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/,
|
||||
"CNPJ inválido. Use o formato 00.000.000/0000-00"),
|
||||
})
|
||||
```
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem esta regra, o agente gera mensagens técnicas que confundem gestores ambientais, consultores e técnicos de campo — forçando a equipe de suporte a traduzir erros de sistema para o vocabulário do cliente.
|
||||
|
||||
## Referências
|
||||
|
||||
- Rule: `.agent/rules/zod-validacao-padrao.global.md` (schemas com mensagens customizadas)
|
||||
- Workflow: `.agent/workflows/ux.global.md` (design de interface)
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: regras-negocio-md
|
||||
description: Arquivo {modulo}.regras-negocio.md obrigatório para módulos com lógica complexa
|
||||
scope: global
|
||||
trigger: always_on
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Regra: Arquivo `{modulo}.regras-negocio.md` Obrigatório para Módulos com Lógica Complexa
|
||||
|
||||
> **Escopo global** — aplica-se a todos os projetos do ecossistema Azteca.
|
||||
|
||||
## Contexto
|
||||
|
||||
Qualquer arquivo TypeScript que contenha lógica de negócio não-trivial — múltiplas regras de decisão, critérios de bloqueio, estratégias de processamento — deve ter suas regras documentadas em linguagem natural em um arquivo Markdown co-localizado.
|
||||
|
||||
Isso garante que produto, suporte e desenvolvimento possam entender as regras sem precisar ler TypeScript, e que o agente de IA encontre rapidamente os critérios corretos antes de alterar qualquer código.
|
||||
|
||||
## Regra
|
||||
|
||||
**Todo módulo com lógica de negócio não-trivial DEVE ter um arquivo `{modulo}.regras-negocio.md` co-localizado.**
|
||||
|
||||
Considera-se lógica não-trivial qualquer módulo que:
|
||||
- possui 3 ou mais critérios de decisão distintos
|
||||
- realiza eleição/priorização entre registros
|
||||
- aplica diferentes estratégias por tipo de dado
|
||||
- pode resultar em revisão manual (caminho alternativo ao fluxo automático)
|
||||
- é consumido por CRON, worker ou importador automático
|
||||
|
||||
O módulo TypeScript deve conter, na primeira linha do arquivo, a referência:
|
||||
|
||||
```typescript
|
||||
// Regras de negócio: ver {modulo}.regras-negocio.md
|
||||
```
|
||||
|
||||
O arquivo `.md` é a **fonte de verdade**. Os JSDoc do código devem referenciar o `.md`, não duplicá-lo.
|
||||
|
||||
## Estrutura Obrigatória do Arquivo
|
||||
|
||||
```markdown
|
||||
# Regras de Negócio — [Nome do Módulo]
|
||||
|
||||
Módulo: `_arquivo.ts`
|
||||
Localização: `caminho/relativo/ao/arquivo`
|
||||
|
||||
---
|
||||
|
||||
## Contexto
|
||||
Por que este módulo existe, qual problema resolve.
|
||||
|
||||
## Critérios de Entrada / Identificação
|
||||
O que aciona o módulo, quais dados recebe, filtros aplicados.
|
||||
|
||||
## Regras de Processamento
|
||||
As regras numeradas em ordem de avaliação.
|
||||
|
||||
## Casos de Revisão Manual (quando aplicável)
|
||||
Quando o processamento automático não pode prosseguir.
|
||||
|
||||
## Estratégia de Fusão / Resultado (quando aplicável)
|
||||
O que o módulo produz, como campos são combinados.
|
||||
|
||||
## Dependências Externas
|
||||
Tabelas, filas, serviços externos tocados pelo módulo.
|
||||
```
|
||||
|
||||
## Exemplos
|
||||
|
||||
✅ **Correto** — referência no topo do módulo, regras no `.md`:
|
||||
```typescript
|
||||
// Regras de negócio: ver juntar_execucoes.regras-negocio.md
|
||||
|
||||
import { ... } from "..."
|
||||
|
||||
export const compilarJuntarExecucoes = async (...) => {
|
||||
// implementação conforme regras-negocio.md
|
||||
}
|
||||
```
|
||||
|
||||
❌ **Errado** — regras embutidas no código como comentário de bloco:
|
||||
```typescript
|
||||
/**
|
||||
* Regras de negócio:
|
||||
* [x] Pode ter apenas uma execução por data de vencimento.
|
||||
* [x] Se tiver apenas uma execução consolidada → ela é a principal.
|
||||
* ...
|
||||
*/
|
||||
```
|
||||
|
||||
❌ **Errado** — JSDoc duplicando as regras em vez de referenciar o `.md`:
|
||||
```typescript
|
||||
/**
|
||||
* Retorna false quando:
|
||||
* - vencimentos divergentes
|
||||
* - executada com datas distintas
|
||||
* - vencimento_prorrogado distintos
|
||||
* ...
|
||||
*/
|
||||
```
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem este padrão:
|
||||
- Regras de negócio ficam implícitas no código ou em JSDoc que envelhece sem controle
|
||||
- O agente de IA precisa inferir regras do código ao invés de lê-las diretamente
|
||||
- Produto e suporte não conseguem validar o comportamento sem ajuda técnica
|
||||
- Mudanças de regra geram JSDoc desatualizado espalhado pelo código
|
||||
|
||||
## Aplicação
|
||||
|
||||
- Módulos de CRON com lógica de auditoria/fusão
|
||||
- Importadores automáticos (ex: importação de licenças via IA)
|
||||
- Workers de processamento em lote
|
||||
- Qualquer utilitário com lógica de decisão multi-critério
|
||||
|
||||
## Referências
|
||||
|
||||
- Skill: `.agent/skills/documentar-regras-negocio.global/SKILL.md`
|
||||
- Workflow: `.agent/workflows/documentar-regras-negocio.global.md`
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
# Regra: Arquivo `{modulo}.regras-negocio.md` Obrigatório para Módulos com Lógica Complexa
|
||||
|
||||
> **Escopo global** — aplica-se a todos os projetos do ecossistema Azteca.
|
||||
|
||||
## Contexto
|
||||
|
||||
Qualquer arquivo TypeScript que contenha lógica de negócio não-trivial — múltiplas regras de decisão, critérios de bloqueio, estratégias de processamento — deve ter suas regras documentadas em linguagem natural em um arquivo Markdown co-localizado.
|
||||
|
||||
Isso garante que produto, suporte e desenvolvimento possam entender as regras sem precisar ler TypeScript, e que o agente de IA encontre rapidamente os critérios corretos antes de alterar qualquer código.
|
||||
|
||||
## Regra
|
||||
|
||||
**Todo módulo com lógica de negócio não-trivial DEVE ter um arquivo `{modulo}.regras-negocio.md` co-localizado.**
|
||||
|
||||
Considera-se lógica não-trivial qualquer módulo que:
|
||||
- possui 3 ou mais critérios de decisão distintos
|
||||
- realiza eleição/priorização entre registros
|
||||
- aplica diferentes estratégias por tipo de dado
|
||||
- pode resultar em revisão manual (caminho alternativo ao fluxo automático)
|
||||
- é consumido por CRON, worker ou importador automático
|
||||
|
||||
O módulo TypeScript deve conter, na primeira linha do arquivo, a referência:
|
||||
|
||||
```typescript
|
||||
// Regras de negócio: ver {modulo}.regras-negocio.md
|
||||
```
|
||||
|
||||
O arquivo `.md` é a **fonte de verdade**. Os JSDoc do código devem referenciar o `.md`, não duplicá-lo.
|
||||
|
||||
## Estrutura Obrigatória do Arquivo
|
||||
|
||||
```markdown
|
||||
# Regras de Negócio — [Nome do Módulo]
|
||||
|
||||
Módulo: `_arquivo.ts`
|
||||
Localização: `caminho/relativo/ao/arquivo`
|
||||
|
||||
---
|
||||
|
||||
## Contexto
|
||||
Por que este módulo existe, qual problema resolve.
|
||||
|
||||
## Critérios de Entrada / Identificação
|
||||
O que aciona o módulo, quais dados recebe, filtros aplicados.
|
||||
|
||||
## Regras de Processamento
|
||||
As regras numeradas em ordem de avaliação.
|
||||
|
||||
## Casos de Revisão Manual (quando aplicável)
|
||||
Quando o processamento automático não pode prosseguir.
|
||||
|
||||
## Estratégia de Fusão / Resultado (quando aplicável)
|
||||
O que o módulo produz, como campos são combinados.
|
||||
|
||||
## Dependências Externas
|
||||
Tabelas, filas, serviços externos tocados pelo módulo.
|
||||
```
|
||||
|
||||
## Exemplos
|
||||
|
||||
✅ **Correto** — referência no topo do módulo, regras no `.md`:
|
||||
```typescript
|
||||
// Regras de negócio: ver juntar_execucoes.regras-negocio.md
|
||||
|
||||
import { ... } from "..."
|
||||
|
||||
export const compilarJuntarExecucoes = async (...) => {
|
||||
// implementação conforme regras-negocio.md
|
||||
}
|
||||
```
|
||||
|
||||
❌ **Errado** — regras embutidas no código como comentário de bloco:
|
||||
```typescript
|
||||
/**
|
||||
* Regras de negócio:
|
||||
* [x] Pode ter apenas uma execução por data de vencimento.
|
||||
* [x] Se tiver apenas uma execução consolidada → ela é a principal.
|
||||
* ...
|
||||
*/
|
||||
```
|
||||
|
||||
❌ **Errado** — JSDoc duplicando as regras em vez de referenciar o `.md`:
|
||||
```typescript
|
||||
/**
|
||||
* Retorna false quando:
|
||||
* - vencimentos divergentes
|
||||
* - executada com datas distintas
|
||||
* - vencimento_prorrogado distintos
|
||||
* ...
|
||||
*/
|
||||
```
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem este padrão:
|
||||
- Regras de negócio ficam implícitas no código ou em JSDoc que envelhece sem controle
|
||||
- O agente de IA precisa inferir regras do código ao invés de lê-las diretamente
|
||||
- Produto e suporte não conseguem validar o comportamento sem ajuda técnica
|
||||
- Mudanças de regra geram JSDoc desatualizado espalhado pelo código
|
||||
|
||||
## Aplicação
|
||||
|
||||
- Módulos de CRON com lógica de auditoria/fusão
|
||||
- Importadores automáticos (ex: importação de licenças via IA)
|
||||
- Workers de processamento em lote
|
||||
- Qualquer utilitário com lógica de decisão multi-critério
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: typescript-sem-any
|
||||
trigger: always_on
|
||||
description: Proíbe uso de any, casts inseguros e padroniza uso de enums em código TypeScript
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
globs:
|
||||
- "**/*.ts"
|
||||
- "**/*.tsx"
|
||||
- "**/*.vue"
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
Regras obrigatórias para TypeScript neste projeto:
|
||||
|
||||
- Nunca usar `any`.
|
||||
- Nunca usar `as any`.
|
||||
- Nunca contornar erro de tipagem com cast forçado.
|
||||
- Quando o tipo não for conhecido, usar `unknown`.
|
||||
- Antes de acessar valores `unknown`, fazer narrowing com:
|
||||
- `typeof`
|
||||
- `in`
|
||||
- `Array.isArray`
|
||||
- type guards
|
||||
- schemas de validação como Zod
|
||||
- Preferir:
|
||||
- generics
|
||||
- union types
|
||||
- `Record<string, unknown>`
|
||||
- `Partial<T>`
|
||||
- `Pick<T, K>`
|
||||
- `PropType<T>` em Vue
|
||||
- tipos derivados de funções existentes
|
||||
- Se faltar tipo, o agente deve:
|
||||
1. procurar tipos já existentes no projeto;
|
||||
2. criar um tipo/interface local explícita;
|
||||
3. inferir a partir do contexto sempre que possível;
|
||||
4. deixar um `TODO de tipagem` explícito, mas sem usar `any`.
|
||||
|
||||
Regras obrigatórias para uso de enums:
|
||||
|
||||
- Quando um valor estiver associado a um `enum`, é obrigatório utilizar o enum, nunca strings literais.
|
||||
- O acesso deve seguir o padrão: `<NomeEnum>.VALOR`.
|
||||
|
||||
Também é proibido, quando existir `enum` correspondente:
|
||||
|
||||
- utilizar strings literais no lugar do enum (ex: `"ativo"`, `"inativo"`, `"automatica"`, `"criar"`);
|
||||
- utilizar cast para forçar compatibilidade com enum (ex: `"ativo" as StatusConta`).
|
||||
|
||||
Proibido gerar código que apenas "faça compilar" usando:
|
||||
|
||||
- `as any`
|
||||
- `: any`
|
||||
- `[] as any`
|
||||
- `{ } as any`
|
||||
- dupla coerção como `as unknown as any`
|
||||
|
||||
Em casos excepcionais, preferir:
|
||||
|
||||
- `as unknown as TipoEspecifico` somente se houver justificativa clara e comentário técnico.
|
||||
|
||||
Diretriz para o agente:
|
||||
|
||||
Se encontrar uma string que represente um valor de domínio do sistema, o agente deve:
|
||||
|
||||
1. procurar se já existe um `enum` correspondente no projeto;
|
||||
2. usar o `enum` existente;
|
||||
3. se não existir, propor a criação de um `enum` explícito, em vez de manter strings soltas.
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
- Skill: `.agent/skills/diagnosticar-erros-build.global/SKILL.md` (quando erros de tipagem causam falhas de build em cascata)
|
||||
- Workflow: `.agent/workflows/otimizar-codigos.global.md` (padrão de documentação para casts temporários)
|
||||
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
# Regra: Limite de Linhas em Arquivos Vue
|
||||
|
||||
## 🎯 Regra
|
||||
|
||||
**Nenhum arquivo `*.vue` deve ultrapassar 250 linhas.**
|
||||
|
||||
---
|
||||
|
||||
## Motivação
|
||||
|
||||
Arquivos Vue longos acumulam múltiplas responsabilidades:
|
||||
|
||||
- template, lógica e estilo no mesmo arquivo
|
||||
- componentes internos não reutilizáveis
|
||||
- dificuldade de teste e manutenção
|
||||
|
||||
O limite de 250 linhas é uma fronteira de manutenibilidade, não apenas de estética.
|
||||
|
||||
---
|
||||
|
||||
## Aplicação automática
|
||||
|
||||
O script `scripts/check-vue-linhas.sh` valida este limite em todo `pnpm run build`.
|
||||
Arquivos legados em processo de refatoração estão listados como **isentos temporários** dentro do script.
|
||||
|
||||
---
|
||||
|
||||
## Obrigações do agente
|
||||
|
||||
### Antes de criar um novo arquivo Vue
|
||||
|
||||
- Estimar o tamanho do componente
|
||||
- Se a estimativa ultrapassar 250 linhas, **quebrar em subcomponentes imediatamente**
|
||||
|
||||
### Ao editar um arquivo Vue existente
|
||||
|
||||
- Verificar o total de linhas atual antes de adicionar código
|
||||
- Se a edição levar o arquivo acima de 250 linhas, propor extração de subcomponente
|
||||
|
||||
### Ao identificar um arquivo isento
|
||||
|
||||
- Sinalizar ao operador que o arquivo é legado e deve ser refatorado
|
||||
- Não adicionar mais linhas a arquivos isentos sem refatorar algo equivalente
|
||||
|
||||
---
|
||||
|
||||
## Estratégias de extração obrigatórias
|
||||
|
||||
Quando um arquivo se aproximar do limite:
|
||||
|
||||
| Situação | Ação |
|
||||
|---|---|
|
||||
| Template longo | Extrair seções como `<NomeSecao />` próprio componente |
|
||||
| CSS extenso | Mover para arquivo `.css` co-localizado e importar |
|
||||
| Setup() > 100 linhas | Extrair lógica para composable `use*.ts` co-localizado |
|
||||
| Modal/Dialog embutido | Sempre em componente separado (`*Modal.vue`) |
|
||||
|
||||
---
|
||||
|
||||
> Não existem isentos. Todos os arquivos Vue da biblioteca respeitam o limite de 250 linhas.
|
||||
|
|
@ -1,315 +0,0 @@
|
|||
---
|
||||
type: rule
|
||||
name: zod-validacao-padrao
|
||||
description: Estabelece Zod como biblioteca obrigatória de validação em todo o ecossistema Azteca
|
||||
version: "1.0"
|
||||
scope: global
|
||||
priority: alta
|
||||
trigger: always_on
|
||||
globs:
|
||||
- "**/*.ts"
|
||||
- "**/*.tsx"
|
||||
- "**/*.vue"
|
||||
alwaysApply: true
|
||||
updatedAt: "2026-06-01"
|
||||
references:
|
||||
- .agent/rules/typescript-sem-any.global.md
|
||||
- .agent/skills/criar-schema-zod.global/SKILL.md
|
||||
---
|
||||
|
||||
# Regra: Zod como Validador Padrão
|
||||
|
||||
## Contexto
|
||||
|
||||
Todo projeto do ecossistema Azteca que receba dados externos — API, formulário, webhook, importação, fila, variáveis de ambiente — **deve** validar esses dados com [Zod](https://zod.dev).
|
||||
|
||||
Zod é a única biblioteca de validação autorizada porque:
|
||||
|
||||
- Inferência nativa de tipos TypeScript (`z.infer<>`) — elimina duplicação entre schema e tipo
|
||||
- Bundle pequeno (~13KB gzipped) — viável no frontend
|
||||
- Compartilhável entre back e front via pacotes `*-comuns`
|
||||
- Ecossistema maduro: `zod-to-json-schema`, `@anatine/zod-nestjs`, integração com `tRPC`
|
||||
|
||||
---
|
||||
|
||||
## Regra
|
||||
|
||||
### 1. Toda entrada externa deve ser validada com Zod
|
||||
|
||||
Entradas externas incluem:
|
||||
|
||||
- **Corpo de requisição** (API REST, webhook, GraphQL)
|
||||
- **Query params e path params**
|
||||
- **Formulários de frontend**
|
||||
- **Dados de fila** (BullMQ, Redis, etc.)
|
||||
- **Arquivos importados** (CSV, JSON, Excel)
|
||||
- **Variáveis de ambiente**
|
||||
- **Respostas de APIs externas** (quando a resposta não é confiável)
|
||||
|
||||
### 2. Schemas devem residir no pacote `*-comuns`
|
||||
|
||||
Para que front e back compartilhem os mesmos schemas, eles devem residir no pacote `<modulo>-comuns`:
|
||||
|
||||
```
|
||||
<modulo>-comuns/src/
|
||||
├── tabelas/
|
||||
│ ├── usuarios/
|
||||
│ │ ├── zUsuarioCriar.ts
|
||||
│ │ ├── zUsuarioEditar.ts
|
||||
│ │ └── index.ts
|
||||
│ ├── empresas/
|
||||
│ │ ├── zEmpresaCriar.ts
|
||||
│ │ └── index.ts
|
||||
│ └── index.ts
|
||||
```
|
||||
|
||||
### 3. Tipos devem ser derivados dos schemas (nunca o inverso)
|
||||
|
||||
```typescript
|
||||
// ✅ CORRETO — tipo derivado do schema
|
||||
export const zUsuarioCriar = z.object({
|
||||
nome: z.string().min(1),
|
||||
email: z.string().email(),
|
||||
ativo: z.boolean().default(true),
|
||||
})
|
||||
export type tipoUsuarioCriar = z.infer<typeof zUsuarioCriar>
|
||||
|
||||
// ❌ ERRADO — tipo manual separado do schema
|
||||
interface UsuarioCriar {
|
||||
nome: string
|
||||
email: string
|
||||
ativo?: boolean
|
||||
}
|
||||
const zUsuarioCriar = z.object({ ... }) // duplicação!
|
||||
```
|
||||
|
||||
### 4. Nomenclatura obrigatória de schemas
|
||||
|
||||
| Padrão | Uso | Exemplo |
|
||||
|--------|-----|---------|
|
||||
| `z{Entidade}Criar` | Criação de registro | `zUsuarioCriar` |
|
||||
| `z{Entidade}Editar` | Edição de registro | `zUsuarioEditar` |
|
||||
| `z{Entidade}Filtro` | Filtros de listagem | `zUsuarioFiltro` |
|
||||
| `z{Entidade}Resposta` | Resposta de API | `zUsuarioResposta` |
|
||||
| `z{Entidade}Params` | Parâmetros de rota | `zUsuarioParams` |
|
||||
| `z{Modulo}Config` | Configuração do módulo | `zGeeConfig` |
|
||||
| `z{Modulo}Ambiente` | Variáveis de ambiente | `zBackAmbiente` |
|
||||
|
||||
Prefixo `z` minúsculo + nome em `PascalCase`.
|
||||
|
||||
### 5. Usar `safeParse` em vez de `parse` para erros controlados
|
||||
|
||||
```typescript
|
||||
// ✅ CORRETO — erro controlado
|
||||
const resultado = zUsuarioCriar.safeParse(dados)
|
||||
if (!resultado.success) {
|
||||
return respostaComuns.erro(resultado.error.issues[0].message)
|
||||
}
|
||||
const usuario = resultado.data // tipado automaticamente
|
||||
|
||||
// ❌ ERRADO — throw não controlado
|
||||
const usuario = zUsuarioCriar.parse(dados) // lança ZodError
|
||||
```
|
||||
|
||||
A exceção é em contextos onde o throw é desejável (middleware global, início de pipeline).
|
||||
|
||||
### 6. Nunca usar validação manual quando Zod resolve
|
||||
|
||||
```typescript
|
||||
// ❌ ERRADO — validação manual
|
||||
if (!dados.nome || typeof dados.nome !== "string") {
|
||||
return erro("Nome é obrigatório")
|
||||
}
|
||||
if (!dados.email || !dados.email.includes("@")) {
|
||||
return erro("Email inválido")
|
||||
}
|
||||
|
||||
// ✅ CORRETO — Zod faz tudo
|
||||
const resultado = zUsuarioCriar.safeParse(dados)
|
||||
if (!resultado.success) {
|
||||
return erro(resultado.error.issues[0].message)
|
||||
}
|
||||
```
|
||||
|
||||
### 7. Transformações e defaults pertencem ao schema
|
||||
|
||||
```typescript
|
||||
// ✅ CORRETO — transformação no schema
|
||||
export const zProdutoCriar = z.object({
|
||||
nome: z.string().trim().min(1),
|
||||
preco: z.coerce.number().positive(),
|
||||
ativo: z.boolean().default(true),
|
||||
codigo: z.string().toUpperCase().optional(),
|
||||
tags: z.array(z.string()).default([]),
|
||||
})
|
||||
|
||||
// ❌ ERRADO — transformação manual após validação
|
||||
const produto = zProdutoCriar.parse(dados)
|
||||
produto.nome = produto.nome.trim()
|
||||
produto.codigo = produto.codigo?.toUpperCase()
|
||||
```
|
||||
|
||||
### 8. Composição de schemas em vez de duplicação
|
||||
|
||||
```typescript
|
||||
// ✅ CORRETO — composição
|
||||
const zEndereco = z.object({
|
||||
rua: z.string(),
|
||||
cidade: z.string(),
|
||||
uf: z.string().length(2),
|
||||
})
|
||||
|
||||
const zEmpresaCriar = z.object({
|
||||
nome: z.string(),
|
||||
endereco: zEndereco,
|
||||
})
|
||||
|
||||
const zEmpresaEditar = zEmpresaCriar.partial() // todos opcionais
|
||||
|
||||
const zEmpresaResposta = zEmpresaCriar.extend({
|
||||
codigo: z.string().uuid(),
|
||||
criadoEm: z.string().datetime(),
|
||||
})
|
||||
|
||||
// ❌ ERRADO — copiar campos entre schemas
|
||||
const zEmpresaEditar = z.object({
|
||||
nome: z.string().optional(), // duplicou!
|
||||
endereco: z.object({ // duplicou!
|
||||
rua: z.string().optional(),
|
||||
cidade: z.string().optional(),
|
||||
}),
|
||||
})
|
||||
```
|
||||
|
||||
### 9. Enums Zod para valores de domínio
|
||||
|
||||
```typescript
|
||||
// ✅ CORRETO — enum Zod quando os valores vêm de dados externos
|
||||
export const zStatusLicenca = z.enum(["ativa", "vencida", "suspensa", "cancelada"])
|
||||
export type tipoStatusLicenca = z.infer<typeof zStatusLicenca>
|
||||
|
||||
// Usar em outros schemas
|
||||
const zLicencaCriar = z.object({
|
||||
status: zStatusLicenca,
|
||||
// ...
|
||||
})
|
||||
|
||||
// ✅ TAMBÉM CORRETO — TypeScript enum quando já existe no projeto
|
||||
// e o schema referencia o enum
|
||||
import { StatusLicenca } from "./enums"
|
||||
const zLicencaCriar = z.object({
|
||||
status: z.nativeEnum(StatusLicenca),
|
||||
})
|
||||
```
|
||||
|
||||
### 10. Bibliotecas proibidas para validação
|
||||
|
||||
| ❌ Proibido | Motivo |
|
||||
|-------------|--------|
|
||||
| `joi` | Não infere tipos TS, bundle pesado |
|
||||
| `yup` | Inferência fraca, API menos ergonômica |
|
||||
| `class-validator` | Decorators, não compartilhável com frontend |
|
||||
| `io-ts` | Verboso, curva de aprendizado alta |
|
||||
| `ajv` (direto) | JSON Schema — usar `zod-to-json-schema` se precisar de JSON Schema |
|
||||
| Validação manual com `if/typeof` | Quando Zod resolve o mesmo caso |
|
||||
|
||||
---
|
||||
|
||||
## Exemplos
|
||||
|
||||
### API backend (Express)
|
||||
|
||||
```typescript
|
||||
// ✅ Correto
|
||||
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||
|
||||
app.post("/usuarios", async (req, res) => {
|
||||
const resultado = zUsuarioCriar.safeParse(req.body)
|
||||
if (!resultado.success) {
|
||||
return res.status(400).json({ erro: resultado.error.issues })
|
||||
}
|
||||
const usuario = await criarUsuario(resultado.data)
|
||||
return res.json(usuario)
|
||||
})
|
||||
```
|
||||
|
||||
### Webhook com fila
|
||||
|
||||
```typescript
|
||||
// ✅ Correto — valida antes de enfileirar
|
||||
const zPayloadWebhook = z.object({
|
||||
tabela: z.enum(["empreendedores", "empreendimentos", "usuarios"]),
|
||||
dados: z.array(z.unknown()).min(1),
|
||||
})
|
||||
|
||||
app.post("/webhook/:tabela", async (req, res) => {
|
||||
const resultado = zPayloadWebhook.safeParse({
|
||||
tabela: req.params.tabela,
|
||||
dados: req.body,
|
||||
})
|
||||
if (!resultado.success) {
|
||||
return res.status(400).json({ erro: "Payload inválido" })
|
||||
}
|
||||
await fila.add("sync", resultado.data)
|
||||
return res.json({ ok: true })
|
||||
})
|
||||
```
|
||||
|
||||
### Variáveis de ambiente
|
||||
|
||||
```typescript
|
||||
// ✅ Correto — validar no boot da aplicação
|
||||
const zAmbiente = z.object({
|
||||
DATABASE_URL: z.string().url(),
|
||||
REDIS_HOST: z.string().default("localhost"),
|
||||
REDIS_PORT: z.coerce.number().default(6379),
|
||||
BASE_URL: z.string().url(),
|
||||
SESSAO_BACK: z.string().uuid(),
|
||||
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
||||
})
|
||||
|
||||
export const ambiente = () => zAmbiente.parse(process.env)
|
||||
```
|
||||
|
||||
### Frontend (formulário Vue)
|
||||
|
||||
```typescript
|
||||
// ✅ Correto — schema compartilhado validando antes de enviar
|
||||
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||
|
||||
const salvar = async () => {
|
||||
const resultado = zUsuarioCriar.safeParse(formulario.value)
|
||||
if (!resultado.success) {
|
||||
erros.value = resultado.error.flatten().fieldErrors
|
||||
return
|
||||
}
|
||||
await api.post("/usuarios", resultado.data)
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Impacto
|
||||
|
||||
Sem esta regra:
|
||||
|
||||
- Cada desenvolvedor escolhe uma estratégia diferente de validação (if/typeof, joi, yup, etc.)
|
||||
- Tipos e schemas ficam dessincronizados — mudança no schema não reflete no tipo e vice-versa
|
||||
- Validações manuais são incompletas e inconsistentes entre endpoints
|
||||
- Código de validação é duplicado entre front e back
|
||||
- Dados inválidos passam despercebidos e corrompem a base
|
||||
|
||||
Com esta regra:
|
||||
|
||||
- Uma única fonte de verdade: o schema Zod
|
||||
- Tipos TypeScript sempre sincronizados via `z.infer<>`
|
||||
- Validação consistente em todos os pontos de entrada
|
||||
- Reutilização entre front, back e workers via pacote `*-comuns`
|
||||
- Erros de validação estruturados e internacionalizáveis
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
- Rule: `.agent/rules/typescript-sem-any.global.md` (narrowing com Zod mencionado como alternativa)
|
||||
- Skill: `.agent/skills/criar-schema-zod.global/SKILL.md` (guia prático para criar schemas)
|
||||
|
|
@ -1,184 +0,0 @@
|
|||
---
|
||||
name: criar-schema-zod
|
||||
scope: global
|
||||
description: >
|
||||
Guia operacional para criar, organizar e manter schemas de validação Zod em projetos TypeScript.
|
||||
---
|
||||
|
||||
# Skill: Criar Schema Zod
|
||||
|
||||
Use esta skill ao adicionar validação de dados em qualquer ponto de entrada do sistema — API, formulário, webhook, importação, fila ou variáveis de ambiente.
|
||||
|
||||
---
|
||||
|
||||
## PASSO 1 — Identificar a Entrada Externa
|
||||
|
||||
Determinar qual dado externo precisa de validação:
|
||||
|
||||
| Tipo de entrada | Onde validar |
|
||||
|---|---|
|
||||
| Corpo de requisição (POST/PUT) | Handler da rota, antes de qualquer lógica |
|
||||
| Query/path params | Handler da rota |
|
||||
| Formulário frontend | Antes de chamar a API |
|
||||
| Dados de fila (BullMQ) | No processador da fila |
|
||||
| Arquivo importado (CSV/JSON) | No parser, linha a linha |
|
||||
| Variáveis de ambiente | No boot da aplicação |
|
||||
| Resposta de API externa | Após receber a resposta |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 2 — Localizar ou Criar o Schema no Pacote Comuns
|
||||
|
||||
Schemas compartilhados vivem no pacote `*-comuns`:
|
||||
|
||||
```
|
||||
projeto-comuns/src/tabelas/
|
||||
├── usuarios/
|
||||
│ ├── zUsuarioCriar.ts
|
||||
│ ├── zUsuarioEditar.ts
|
||||
│ └── index.ts
|
||||
└── index.ts
|
||||
```
|
||||
|
||||
### 2.1. Verificar se já existe
|
||||
|
||||
```bash
|
||||
rg "z{NomeDaEntidade}" --include='*.ts' -l
|
||||
```
|
||||
|
||||
Se já existir → reutilizar ou compor a partir dele (`.extend()`, `.pick()`, `.partial()`).
|
||||
|
||||
### 2.2. Criar o schema
|
||||
|
||||
```typescript
|
||||
import { z } from "zod"
|
||||
|
||||
export const zUsuarioCriar = z.object({
|
||||
nome: z.string().trim().min(1, "Nome é obrigatório"),
|
||||
email: z.string().email("E-mail inválido"),
|
||||
ativo: z.boolean().default(true),
|
||||
})
|
||||
```
|
||||
|
||||
### 2.3. Nomenclatura obrigatória
|
||||
|
||||
| Padrão | Uso |
|
||||
|---|---|
|
||||
| `z{Entidade}Criar` | Criação |
|
||||
| `z{Entidade}Editar` | Edição (geralmente `.partial()`) |
|
||||
| `z{Entidade}Filtro` | Filtros de listagem |
|
||||
| `z{Entidade}Resposta` | Resposta de API |
|
||||
| `z{Entidade}Params` | Parâmetros de rota |
|
||||
| `z{Modulo}Config` | Configuração |
|
||||
| `z{Modulo}Ambiente` | Variáveis de ambiente |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 3 — Derivar o Tipo com `z.infer<>`
|
||||
|
||||
```typescript
|
||||
export type tipoUsuarioCriar = z.infer<typeof zUsuarioCriar>
|
||||
```
|
||||
|
||||
**Nunca** criar um `interface` ou `type` manual separado do schema. O tipo **sempre** deriva do schema.
|
||||
|
||||
---
|
||||
|
||||
## PASSO 4 — Implementar `safeParse` no Ponto de Entrada
|
||||
|
||||
### Backend (Express)
|
||||
|
||||
```typescript
|
||||
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||
|
||||
app.post("/usuarios", async (req, res) => {
|
||||
const resultado = zUsuarioCriar.safeParse(req.body)
|
||||
if (!resultado.success) {
|
||||
return res.status(400).json({ erro: resultado.error.issues[0].message })
|
||||
}
|
||||
const usuario = await criarUsuario(resultado.data)
|
||||
return res.json(usuario)
|
||||
})
|
||||
```
|
||||
|
||||
### Frontend (Vue)
|
||||
|
||||
```typescript
|
||||
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||
|
||||
const salvar = async () => {
|
||||
const resultado = zUsuarioCriar.safeParse(formulario.value)
|
||||
if (!resultado.success) {
|
||||
erros.value = resultado.error.flatten().fieldErrors
|
||||
return
|
||||
}
|
||||
await api.post("/usuarios", resultado.data)
|
||||
}
|
||||
```
|
||||
|
||||
### Variáveis de ambiente
|
||||
|
||||
```typescript
|
||||
const zAmbiente = z.object({
|
||||
DATABASE_URL: z.string().url(),
|
||||
REDIS_HOST: z.string().default("localhost"),
|
||||
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
||||
})
|
||||
|
||||
// Aqui o throw é desejável — a app não deve subir com env inválido
|
||||
export const ambiente = () => zAmbiente.parse(process.env)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 5 — Compor Schemas Derivados
|
||||
|
||||
Quando precisar de variações do mesmo schema, **compor** em vez de duplicar:
|
||||
|
||||
```typescript
|
||||
// Schema base
|
||||
const zProduto = z.object({
|
||||
nome: z.string().trim().min(1),
|
||||
preco: z.coerce.number().positive(),
|
||||
categoria: z.string(),
|
||||
})
|
||||
|
||||
// Edição: todos os campos opcionais
|
||||
const zProdutoEditar = zProduto.partial()
|
||||
|
||||
// Resposta: base + campos gerados
|
||||
const zProdutoResposta = zProduto.extend({
|
||||
codigo: z.string().uuid(),
|
||||
criadoEm: z.string().datetime(),
|
||||
})
|
||||
|
||||
// Filtro: subset de campos opcionais
|
||||
const zProdutoFiltro = zProduto.pick({ categoria: true }).partial()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 6 — Validar Tipagem
|
||||
|
||||
```bash
|
||||
npx tsc --noEmit
|
||||
```
|
||||
|
||||
Zero erros = concluído.
|
||||
|
||||
---
|
||||
|
||||
## Checklist Final
|
||||
|
||||
- [ ] O schema está no pacote `*-comuns` (quando compartilhado entre front/back)?
|
||||
- [ ] O tipo é derivado do schema com `z.infer<>`?
|
||||
- [ ] A validação usa `safeParse` (exceto em boot/middleware)?
|
||||
- [ ] A nomenclatura segue o padrão `z{Entidade}{Acao}`?
|
||||
- [ ] Transformações (trim, coerce, default) estão no schema, não no handler?
|
||||
- [ ] Schemas derivados usam composição (.partial, .extend, .pick), não duplicação?
|
||||
- [ ] `tsc --noEmit` passa sem erros?
|
||||
|
||||
## Referências
|
||||
|
||||
- Rule: `.agent/rules/zod-validacao-padrao.global.md`
|
||||
- Rule: `.agent/rules/typescript-sem-any.global.md`
|
||||
|
|
@ -1,186 +0,0 @@
|
|||
---
|
||||
name: diagnosticar-erros-build
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
description: >
|
||||
Guia operacional para diagnosticar e resolver erros de build em cascata em monorepos TypeScript.
|
||||
---
|
||||
|
||||
# Skill: Diagnosticar Erros de Build em Monorepo TypeScript
|
||||
|
||||
Use esta skill quando o build de um monorepo TypeScript falha — especialmente quando erros aparecem em pacotes que não foram diretamente modificados (erros em cascata).
|
||||
|
||||
---
|
||||
|
||||
## PASSO 1 — Capturar o Erro Completo
|
||||
|
||||
Executar o build com output completo e sem truncamento:
|
||||
|
||||
```bash
|
||||
# pnpm (monorepo completo)
|
||||
pnpm build 2>&1 | head -200
|
||||
|
||||
# Pacote específico
|
||||
pnpm --filter <pacote> build 2>&1
|
||||
|
||||
# tsc direto (se disponível)
|
||||
npx tsc --noEmit --pretty 2>&1 | head -100
|
||||
```
|
||||
|
||||
Identificar:
|
||||
|
||||
- **Qual pacote falhou primeiro** (nem sempre é o que aparece no topo)
|
||||
- **Código do erro** (`TS2304`, `TS2345`, `TS7006`, etc.)
|
||||
- **Arquivo e linha** do erro original
|
||||
|
||||
---
|
||||
|
||||
## PASSO 2 — Classificar o Tipo de Erro
|
||||
|
||||
### Erros de dependência entre pacotes (cascata)
|
||||
|
||||
| Sintoma | Causa provável | Solução |
|
||||
|---------|---------------|---------|
|
||||
| `Cannot find module '@org/xxx'` | Pacote não foi buildado antes | Buildar na ordem correta ou usar `references` |
|
||||
| `Module has no exported member 'X'` | Tipo renomeado/removido no pacote origem | Atualizar import no consumidor |
|
||||
| Tipos `any` infiltrados | Pacote exporta sem `.d.ts` | Verificar `declaration: true` no tsconfig |
|
||||
| `The inferred type cannot be named` | Dependência circular de tipos | Extrair tipo para pacote compartilhado |
|
||||
|
||||
### Erros de configuração
|
||||
|
||||
| Sintoma | Causa provável | Solução |
|
||||
|---------|---------------|---------|
|
||||
| `Cannot use import statement` | `module` errado no tsconfig | Alinhar `module`/`moduleResolution` |
|
||||
| `Relative import paths need extensions` | Node16/NodeNext resolution | Adicionar `.js` nos imports ou mudar para `bundler` |
|
||||
| `rootDir is expected to contain all source files` | Arquivo fora do `rootDir` | Ajustar `rootDir` ou mover arquivo |
|
||||
| `Referenced project must have setting composite` | Project references sem `composite` | Adicionar `composite: true` no tsconfig referenciado |
|
||||
|
||||
### Erros de tipagem
|
||||
|
||||
| Sintoma | Causa provável | Solução |
|
||||
|---------|---------------|---------|
|
||||
| `TS2304: Cannot find name` | Tipo global não declarado | Criar `d.ts` ou importar explicitamente |
|
||||
| `TS2345: Argument not assignable` | Tipos incompatíveis entre versões | Alinhar versão da dependência |
|
||||
| `TS7006: Parameter implicitly has 'any'` | `noImplicitAny` ativado | Tipar o parâmetro explicitamente |
|
||||
| `TS18046: is of type 'unknown'` | Narrowing ausente | Fazer type guard antes de usar |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 3 — Identificar a Raiz do Problema
|
||||
|
||||
O erro que aparece **primeiro** nem sempre é a raiz. Seguir esta estratégia:
|
||||
|
||||
### 3.1. Verificar ordem de build
|
||||
|
||||
```bash
|
||||
# Listar dependências internas para entender ordem correta
|
||||
rg '"workspace:' --include='package.json' -l | sort
|
||||
|
||||
# Se usar turbo, verificar o pipeline
|
||||
cat turbo.json | jq '.pipeline.build'
|
||||
```
|
||||
|
||||
### 3.2. Rebuild isolado do pacote raiz
|
||||
|
||||
```bash
|
||||
# Buildar APENAS o pacote mais baixo na hierarquia que apresenta erro
|
||||
pnpm --filter <pacote-raiz> build
|
||||
|
||||
# Se esse buildar com sucesso, subir na hierarquia
|
||||
pnpm --filter <pacote-consumidor> build
|
||||
```
|
||||
|
||||
### 3.3. Verificar checagem de tipos isolada
|
||||
|
||||
```bash
|
||||
# Verificar se a tipagem está correta sem produzir output
|
||||
npx tsc --noEmit -p <caminho>/tsconfig.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 4 — Resolver Erros em Cascata
|
||||
|
||||
### Estratégia: de baixo para cima
|
||||
|
||||
1. Identificar o pacote **mais fundamental** (aquele que não depende de outros internos)
|
||||
2. Resolver TODOS os erros nesse pacote
|
||||
3. Rebuildar
|
||||
4. Subir para o próximo pacote na cadeia de dependência
|
||||
5. Repetir até o topo
|
||||
|
||||
### Armadilhas comuns
|
||||
|
||||
```typescript
|
||||
// ❌ ERRADO: "resolver" com any (viola typescript-sem-any)
|
||||
const dados = resultado as any
|
||||
|
||||
// ✅ CORRETO: tipar adequadamente
|
||||
const dados: ResultadoEsperado = resultado
|
||||
|
||||
// ❌ ERRADO: ignorar erro com @ts-ignore
|
||||
// @ts-ignore
|
||||
import { funcao } from '@org/pacote'
|
||||
|
||||
// ✅ CORRETO: investigar por que o import falha
|
||||
// O pacote '@org/pacote' foi buildado? O export existe?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 5 — Verificar Alinhamento de Configuração
|
||||
|
||||
Quando erros persistem entre pacotes, verificar alinhamento de tsconfig:
|
||||
|
||||
```bash
|
||||
# Comparar configurações críticas entre pacotes
|
||||
for f in $(fd tsconfig.json --max-depth 2 --type f); do
|
||||
echo "=== $f ==="
|
||||
jq '{target, module, moduleResolution, strict, composite, declaration}' "$f" 2>/dev/null
|
||||
done
|
||||
```
|
||||
|
||||
Campos que **devem** ser consistentes entre pacotes do mesmo monorepo:
|
||||
|
||||
| Campo | Recomendação |
|
||||
|-------|-------------|
|
||||
| `target` | Mesmo alvo para todos (ex: `ES2022`) |
|
||||
| `module` | Consistente (ex: `ESNext` ou `Node16`) |
|
||||
| `moduleResolution` | Consistente (ex: `bundler` ou `node16`) |
|
||||
| `strict` | `true` em todos |
|
||||
| `declaration` | `true` em libs, opcional em apps |
|
||||
| `composite` | `true` em libs referenciadas |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 6 — Limpar e Rebuildar
|
||||
|
||||
Quando a investigação não revela causa óbvia:
|
||||
|
||||
```bash
|
||||
# Limpar artefatos de build de todos os pacotes
|
||||
fd -t d 'dist|build|.tsbuildinfo' --exclude node_modules | xargs rm -rf
|
||||
|
||||
# Limpar node_modules (último recurso)
|
||||
fd -t d node_modules --max-depth 2 | xargs rm -rf
|
||||
|
||||
# Reinstalar e rebuildar do zero
|
||||
pnpm install && pnpm build
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Checklist Final
|
||||
|
||||
- [ ] O pacote raiz do erro em cascata foi identificado?
|
||||
- [ ] O erro original (não o efeito cascata) foi localizado?
|
||||
- [ ] A solução não usa `any`, `as any` ou `@ts-ignore`?
|
||||
- [ ] Todos os pacotes na cadeia foram rebuildados após a correção?
|
||||
- [ ] As configurações de tsconfig estão alinhadas entre pacotes?
|
||||
- [ ] O build completo passa sem erros?
|
||||
|
||||
## Referências
|
||||
|
||||
- Rules: `.agent/rules/typescript-sem-any.global.md`
|
||||
- Workflow: `.agent/workflows/otimizar-codigos.global.md`
|
||||
- Skill: `.agent/skills/mapear-codigo-fonte.global/SKILL.md`
|
||||
|
|
@ -1,161 +0,0 @@
|
|||
---
|
||||
name: documentar-decisao-tecnica
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
description: >
|
||||
Guia operacional para registrar decisões técnicas e arquiteturais como ADRs (Architecture Decision Records).
|
||||
---
|
||||
|
||||
# Skill: Documentar Decisão Técnica (ADR)
|
||||
|
||||
Use esta skill sempre que uma decisão técnica significativa for tomada — escolha de biblioteca, mudança de arquitetura, padrão de código, migração, ou qualquer decisão que afete múltiplos pacotes ou desenvolvedores.
|
||||
|
||||
O objetivo é garantir que **nenhuma decisão fique apenas na cabeça** ou perdida em conversas.
|
||||
|
||||
---
|
||||
|
||||
## Quando usar
|
||||
|
||||
- Nova dependência adicionada ao monorepo
|
||||
- Mudança de padrão arquitetural (ex: de REST para GraphQL)
|
||||
- Escolha de ferramenta ou lib entre alternativas
|
||||
- Decisão de breaking change
|
||||
- Migração de tecnologia
|
||||
- Mudança de estratégia de deploy ou CI/CD
|
||||
- Qualquer decisão que alguém pode questionar daqui 3 meses
|
||||
|
||||
---
|
||||
|
||||
## PASSO 1 — Criar o Diretório de ADRs (se não existir)
|
||||
|
||||
```bash
|
||||
mkdir -p .docs/adrs
|
||||
```
|
||||
|
||||
Convenção de diretório: `.docs/adrs/` na raiz do monorepo.
|
||||
|
||||
---
|
||||
|
||||
## PASSO 2 — Criar o Arquivo ADR
|
||||
|
||||
Nomenclatura: `NNN-titulo-em-kebab-case.md`
|
||||
|
||||
```bash
|
||||
# Encontrar o próximo número
|
||||
NEXT=$(ls .docs/adrs/*.md 2>/dev/null | wc -l | xargs -I{} expr {} + 1)
|
||||
NEXT=$(printf "%03d" $NEXT)
|
||||
echo "Próximo ADR: $NEXT"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 3 — Preencher o Template
|
||||
|
||||
```markdown
|
||||
# ADR-NNN: Título Descritivo da Decisão
|
||||
|
||||
**Data:** YYYY-MM-DD
|
||||
**Status:** proposto | aceito | substituído por ADR-XXX | descontinuado
|
||||
**Autores:** Nome(s)
|
||||
|
||||
## Contexto
|
||||
|
||||
Descreva a situação que levou à necessidade de uma decisão.
|
||||
Inclua:
|
||||
- O problema enfrentado
|
||||
- Restrições técnicas ou de negócio
|
||||
- O que motivou a discussão
|
||||
|
||||
## Decisão
|
||||
|
||||
Descreva a decisão tomada de forma clara e direta.
|
||||
Use voz ativa: "Decidimos usar X para Y porque Z."
|
||||
|
||||
## Alternativas Consideradas
|
||||
|
||||
### Alternativa A: [Nome]
|
||||
- **Prós:** ...
|
||||
- **Contras:** ...
|
||||
- **Motivo da rejeição:** ...
|
||||
|
||||
### Alternativa B: [Nome]
|
||||
- **Prós:** ...
|
||||
- **Contras:** ...
|
||||
- **Motivo da rejeição:** ...
|
||||
|
||||
## Consequências
|
||||
|
||||
### Positivas
|
||||
- O que melhora com essa decisão
|
||||
|
||||
### Negativas
|
||||
- O que fica mais complexo ou limitado
|
||||
- Débitos técnicos introduzidos
|
||||
|
||||
### Neutras
|
||||
- Mudanças que não são boas nem ruins, mas afetam o workflow
|
||||
|
||||
## Impacto no Monorepo
|
||||
|
||||
Listar quais pacotes/módulos são afetados:
|
||||
- `@org/pacote-a` — precisa migrar de X para Y
|
||||
- `@org/pacote-b` — sem impacto
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 4 — Conectar com o Sistema de Conhecimento
|
||||
|
||||
Após criar o ADR, avaliar se a decisão deve gerar:
|
||||
|
||||
| A decisão... | Ação |
|
||||
|-------------|------|
|
||||
| Cria uma **restrição** permanente (ex: "nunca usar lib X") | Criar/atualizar uma **Rule** em `.agent/rules/` |
|
||||
| Define um **processo** repetível (ex: "para migrar, faça X, Y, Z") | Criar/atualizar um **Workflow** em `.agent/workflows/` |
|
||||
| Refina um **padrão operacional** (ex: "queries agora usam pool separado") | Atualizar a **Skill** correspondente em `.agent/skills/` |
|
||||
| Não gera artefato adicional | Apenas o ADR é suficiente |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 5 — Validar o ADR
|
||||
|
||||
Antes de considerar completo:
|
||||
|
||||
- **Teste do "daqui a 6 meses"**: alguém que não participou da conversa consegue entender a decisão?
|
||||
- **Teste da reversibilidade**: está claro o que seria necessário para reverter essa decisão?
|
||||
- **Teste do impacto**: todos os pacotes afetados estão listados?
|
||||
|
||||
---
|
||||
|
||||
## Exemplos de ADRs Reais
|
||||
|
||||
### Bom ✅
|
||||
|
||||
> **ADR-003: Usar Zod para validação de schemas em vez de Joi**
|
||||
>
|
||||
> **Contexto:** O projeto usava Joi para validação no backend, mas ao compartilhar schemas entre back e front em um monorepo, Joi se mostrou pesado para o bundle do frontend (280KB gzipped).
|
||||
>
|
||||
> **Decisão:** Migrar para Zod em todos os pacotes. Zod oferece inferência nativa de tipos TypeScript, é 10x menor, e elimina a necessidade de manter tipos e schemas separados.
|
||||
|
||||
### Ruim ❌
|
||||
|
||||
> **ADR-003: Usar Zod**
|
||||
>
|
||||
> Decidimos usar Zod porque é melhor.
|
||||
|
||||
---
|
||||
|
||||
## Checklist Final
|
||||
|
||||
- [ ] O contexto explica o "porquê" da decisão?
|
||||
- [ ] As alternativas consideradas estão documentadas?
|
||||
- [ ] As consequências (positivas e negativas) estão claras?
|
||||
- [ ] Os pacotes impactados estão listados?
|
||||
- [ ] O status está definido (proposto/aceito)?
|
||||
- [ ] A decisão gerou rules/workflows/skills quando aplicável?
|
||||
- [ ] Alguém de fora do contexto entenderia este ADR?
|
||||
|
||||
## Referências
|
||||
|
||||
- Workflow: `.agent/workflows/aprimorar-IA.global.md` (seção de classificação de artefatos)
|
||||
- Workflow: `.agent/workflows/otimizar-codigos.global.md`
|
||||
|
|
@ -1,131 +0,0 @@
|
|||
---
|
||||
name: documentar-dominio-modulo
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
description: >
|
||||
Guia para documentar o domínio científico/técnico de cada módulo SaaS,
|
||||
garantindo que o agente compreenda a terminologia e as regras do domínio
|
||||
ao gerar código, texto e interface.
|
||||
---
|
||||
|
||||
# Skill: Documentar Domínio de um Módulo
|
||||
|
||||
Use esta skill ao iniciar um novo módulo SaaS ou ao perceber que o agente não conhece o vocabulário e as regras do domínio que o módulo aborda.
|
||||
|
||||
Cada módulo opera em uma disciplina diferente da ciência/gestão ambiental (licenciamento, gases de efeito estufa, resíduos, projetos, etc.). O agente precisa de uma **base factual do domínio** para gerar labels, mensagens, regras de negócio e textos comerciais corretos.
|
||||
|
||||
---
|
||||
|
||||
## PASSO 1 — Identificar o Domínio do Módulo
|
||||
|
||||
Determinar qual área da ciência/gestão o módulo aborda:
|
||||
|
||||
| Exemplo de módulo | Domínio |
|
||||
|---|---|
|
||||
| Licenciamento | Licenciamento ambiental (LP, LI, LO, condicionantes) |
|
||||
| GEE | Gases de Efeito Estufa (inventário, emissões, fatores) |
|
||||
| Resíduos | Gestão de resíduos sólidos (PGRS, MTR, classificação) |
|
||||
| Outorga | Outorga de uso de recursos hídricos |
|
||||
| Flora/Fauna | Monitoramento de biodiversidade |
|
||||
| Projetos | Gestão de projetos ambientais e consultorias |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 2 — Criar o Arquivo de Domínio
|
||||
|
||||
Criar em `.agent/memoria/dominio-<modulo>.md`:
|
||||
|
||||
```markdown
|
||||
# Domínio: <Nome do Módulo>
|
||||
|
||||
## Área de Conhecimento
|
||||
Breve descrição da disciplina (1-3 linhas).
|
||||
|
||||
## Glossário do Módulo
|
||||
|
||||
| Termo | Definição | Sigla |
|
||||
|---|---|---|
|
||||
| Licença Prévia | Autorização para planejamento do empreendimento | LP |
|
||||
| Licença de Instalação | Autorização para início das obras | LI |
|
||||
| ... | ... | ... |
|
||||
|
||||
## Entidades Principais
|
||||
|
||||
Lista das entidades de negócio do módulo com descrição e relações:
|
||||
|
||||
- **Empreendimento**: unidade física onde ocorre a atividade potencialmente poluidora
|
||||
- **Licença**: autorização ambiental vinculada a um empreendimento
|
||||
- **Condicionante**: obrigação imposta pelo órgão ambiental na licença
|
||||
- ...
|
||||
|
||||
## Legislação Aplicável
|
||||
|
||||
| Norma | Descrição | Relevância |
|
||||
|---|---|---|
|
||||
| Lei 6.938/1981 | Política Nacional do Meio Ambiente | Base legal do licenciamento |
|
||||
| Resolução CONAMA 237/1997 | Regulamenta o licenciamento ambiental | Tipos de licença, prazos |
|
||||
| ... | ... | ... |
|
||||
|
||||
## Regras de citação legal
|
||||
- Formato: "Resolução CONAMA nº 237/1997, art. 8º, inciso I"
|
||||
- Toda sigla na primeira ocorrência com nome por extenso
|
||||
- Legislação federal > estadual > municipal (hierarquia)
|
||||
|
||||
## Fluxos do Domínio
|
||||
|
||||
Descrever os processos-chave que o módulo implementa:
|
||||
|
||||
1. Solicitação de licença → Análise técnica → Emissão → Monitoramento
|
||||
2. Cadastro de condicionante → Acompanhamento de prazo → Cumprimento
|
||||
|
||||
## Vocabulário de Interface
|
||||
|
||||
Termos que devem ser usados em labels, botões e mensagens:
|
||||
|
||||
| Contexto | ❌ Genérico | ✅ Correto para o módulo |
|
||||
|---|---|---|
|
||||
| Campo de nome | "Nome" | "Razão Social do Empreendedor" |
|
||||
| Status | "Ativo/Inativo" | "Vigente/Vencida/Suspensa" |
|
||||
| Ação principal | "Criar novo" | "Solicitar nova licença" |
|
||||
| Lista vazia | "Nenhum registro" | "Nenhuma licença cadastrada" |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 3 — Validar com o Operador
|
||||
|
||||
Antes de consolidar:
|
||||
|
||||
- [ ] Os termos do glossário estão corretos para o contexto do módulo?
|
||||
- [ ] As entidades cobrem os conceitos centrais?
|
||||
- [ ] A legislação listada é a principal (não exaustiva)?
|
||||
- [ ] O vocabulário de interface reflete como o usuário fala no dia a dia?
|
||||
|
||||
---
|
||||
|
||||
## PASSO 4 — Conectar com as Rules
|
||||
|
||||
Após documentar o domínio:
|
||||
|
||||
1. Verificar se labels e mensagens no código usam o vocabulário definido (rule `mensagens-usuario.global.md`)
|
||||
2. Verificar se schemas Zod têm mensagens de erro no idioma do domínio (rule `zod-validacao-padrao.global.md`)
|
||||
3. Verificar se os arquivos `.ajuda.md` usam termos do glossário (workflow `adicionar-ajuda.global.md`)
|
||||
4. Verificar se textos comerciais citam a legislação corretamente (workflow `comercial.global.md`)
|
||||
|
||||
---
|
||||
|
||||
## Checklist Final
|
||||
|
||||
- [ ] Arquivo `dominio-<modulo>.md` criado em `.agent/memoria/`?
|
||||
- [ ] Glossário com pelo menos os 10 termos centrais do módulo?
|
||||
- [ ] Entidades principais listadas com descrição?
|
||||
- [ ] Legislação base documentada com formato de citação?
|
||||
- [ ] Vocabulário de interface definido (labels, status, ações, empty states)?
|
||||
- [ ] Operador validou a terminologia?
|
||||
|
||||
## Referências
|
||||
|
||||
- Rule: `.agent/rules/mensagens-usuario.global.md`
|
||||
- Rule: `.agent/rules/regras-negocio-md.global.md`
|
||||
- Workflow: `.agent/workflows/comercial.global.md`
|
||||
- Workflow: `.agent/workflows/adicionar-ajuda.global.md`
|
||||
|
|
@ -1,212 +0,0 @@
|
|||
---
|
||||
name: documentar-regras-negocio
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
description: >
|
||||
Guia operacional para criar, preencher e manter arquivos {modulo}.regras-negocio.md
|
||||
co-localizados com módulos TypeScript de lógica de negócio complexa.
|
||||
---
|
||||
|
||||
# Skill: Documentar Regras de Negócio em Módulos
|
||||
|
||||
Use esta skill sempre que um módulo TypeScript contiver lógica de decisão não-trivial
|
||||
que precise ser rastreável por produto, suporte e desenvolvimento sem exigir leitura de código.
|
||||
|
||||
---
|
||||
|
||||
## Quando usar esta skill
|
||||
|
||||
- Módulo com 3+ critérios de decisão distintos
|
||||
- Lógica de eleição/priorização entre registros
|
||||
- Processamento que pode resultar em revisão manual
|
||||
- Worker/CRON consumindo dados com estratégias diferenciadas por tipo
|
||||
- Importador automático com regras de aceite/rejeição
|
||||
|
||||
---
|
||||
|
||||
## PASSO 1 — Identificar o escopo das regras
|
||||
|
||||
Antes de escrever o `.md`, percorrer o módulo e identificar:
|
||||
|
||||
| Categoria | O que procurar |
|
||||
|---|---|
|
||||
| **Critérios de entrada** | Filtros de query (excluido, vencimento, etc.) |
|
||||
| **Critérios de bloqueio** | Condições que bloqueiam o fluxo automático |
|
||||
| **Estratégia por tipo de dado** | Concatenação vs. primeiro-não-nulo vs. outros |
|
||||
| **Eleição de principal** | Regras de prioridade entre registros |
|
||||
| **Estado contraditório** | Combinações de campos mutuamente exclusivas |
|
||||
| **Dependências externas** | Tabelas, filas, serviços tocados |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 2 — Criar o arquivo
|
||||
|
||||
Nomenclatura: `{nome-do-modulo-sem-underline-inicial}.regras-negocio.md`
|
||||
|
||||
Localizar **na mesma pasta** do arquivo TypeScript:
|
||||
|
||||
```
|
||||
modulo/
|
||||
_meuModulo.ts
|
||||
meu-modulo.regras-negocio.md ← co-localizado
|
||||
```
|
||||
|
||||
Se o módulo for arquivo isolado (não pasta):
|
||||
```
|
||||
CRONS/
|
||||
_cron_nome.ts
|
||||
_cron_nome.regras-negocio.md ← mesmo diretório
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 3 — Preencher com o template
|
||||
|
||||
```markdown
|
||||
# Regras de Negócio — [Nome Legível do Módulo]
|
||||
|
||||
Módulo: `_arquivo.ts`
|
||||
Localização: `caminho/relativo/ao/workspace`
|
||||
|
||||
---
|
||||
|
||||
## Contexto
|
||||
|
||||
[Por que este módulo existe. Qual problema de negócio resolve.
|
||||
Inclua o cenário que levou à sua criação — ex: "O sistema pode gerar duplicatas
|
||||
por importações simultâneas..."]
|
||||
|
||||
---
|
||||
|
||||
## Critérios de Entrada
|
||||
|
||||
[O que aciona o módulo. Filtros aplicados na query de identificação.
|
||||
Ex: `excluido = false`, mesmo `(codigo_origem, vencimento)`, etc.]
|
||||
|
||||
---
|
||||
|
||||
## Regras de Processamento
|
||||
|
||||
[Numeradas em ordem de avaliação. Cada regra deve incluir:
|
||||
- Condição de ativação
|
||||
- O que acontece quando ativada
|
||||
- Se bloqueia ou direciona]
|
||||
|
||||
### Regra 1 — [Nome]
|
||||
...
|
||||
|
||||
### Regra 2 — [Nome]
|
||||
...
|
||||
|
||||
---
|
||||
|
||||
## Casos de Revisão Manual
|
||||
|
||||
[Quando o fluxo automático não pode prosseguir.
|
||||
Liste as condições que enviam para revisão manual.
|
||||
Se aplicável: como o caso é reportado (e-mail, log, fila de revisão).]
|
||||
|
||||
> **`null` é neutro** quando aplicável: descrever aqui se a lógica usa null como ausência neutra.
|
||||
|
||||
---
|
||||
|
||||
## Estratégia de Saída / Fusão de Campos
|
||||
|
||||
[Como os dados são combinados ou qual resultado é produzido.
|
||||
Usar tabela para clareza:]
|
||||
|
||||
| Campo | Estratégia |
|
||||
|---|---|
|
||||
| `campo_textual` | Concatenação sem repetição |
|
||||
| `campo_data` | Primeiro valor não-nulo vence |
|
||||
| `campo_booleano` | Primeiro valor não-nulo vence |
|
||||
|
||||
---
|
||||
|
||||
## Dependências Externas
|
||||
|
||||
[Tabelas lidas/escritas, filas disparadas, serviços externos.
|
||||
Incluir colunas de relacionamento quando relevante.]
|
||||
|
||||
- Tabelas de negócio: `tabela_a`, `tabela_b`
|
||||
- Relacionamentos re-apontados: `tabela_c` via `(codigo_origem, tabela_origem)`
|
||||
- Filas: nenhuma / `nome-da-fila`
|
||||
- E-mails: nenhum / destinatários e gatilho
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 4 — Adicionar referência no módulo TypeScript
|
||||
|
||||
Na **primeira linha útil** do arquivo `.ts` (após shebang ou licença, se houver):
|
||||
|
||||
```typescript
|
||||
// Regras de negócio: ver {modulo}.regras-negocio.md
|
||||
|
||||
import { ... } from "..."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 5 — Limpar JSDoc duplicados
|
||||
|
||||
Percorrer os JSDoc do módulo e:
|
||||
|
||||
| Se encontrar | Ação |
|
||||
|---|---|
|
||||
| JSDoc listando as regras de negócio | Substituir por referência ao `.md` |
|
||||
| JSDoc descrevendo critérios de bloqueio | Simplificar para "ver `.md`" |
|
||||
| JSDoc com listas de condições | Manter apenas `@param` e `@returns` |
|
||||
| Comentário inline explicando uma regra | Manter — comentários de linha são aceitáveis |
|
||||
|
||||
Exemplo de simplificação:
|
||||
|
||||
```typescript
|
||||
// ❌ Antes — JSDoc duplicando as regras
|
||||
/**
|
||||
* Retorna false quando:
|
||||
* - vencimentos divergentes
|
||||
* - executada com datas distintas e não-nulas
|
||||
* - vencimento_prorrogado distintos
|
||||
* - estado contraditório: nao_executada=true + executada!=null
|
||||
*/
|
||||
|
||||
// ✅ Depois — referência ao .md
|
||||
/**
|
||||
* Verifica se o grupo pode ser fundido e elege o registro principal.
|
||||
* Critérios de bloqueio e regras de eleição: ver regras-negocio.md
|
||||
*
|
||||
* @param execs - Registros do grupo, ordenados do mais antigo para o mais recente
|
||||
* @returns Código do eleito, ou `undefined` quando o grupo vai para revisão manual
|
||||
*/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 6 — Verificar consistência código ↔ `.md`
|
||||
|
||||
Percorrer cada regra listada no `.md` e verificar que há código correspondente:
|
||||
|
||||
- [ ] Cada critério de bloqueio tem um `if (...) return undefined / return retornoVazio`
|
||||
- [ ] Cada estratégia de campo tem implementação em `fundirCampos` ou equivalente
|
||||
- [ ] A ordem de avaliação no código bate com a ordem no `.md`
|
||||
- [ ] Campos exclusivos de certas tabelas estão guardados pelo `if (tabela === ...)`
|
||||
- [ ] queries têm `orderBy` quando a posição dos resultados tem significado (ver skill `consultar-banco-knex`)
|
||||
|
||||
---
|
||||
|
||||
## Checklist Final
|
||||
|
||||
- [ ] Arquivo `.md` criado co-localizado com o módulo
|
||||
- [ ] Referência `// Regras de negócio: ver ...` na primeira linha do `.ts`
|
||||
- [ ] JSDoc simplificados — sem duplicar conteúdo do `.md`
|
||||
- [ ] Todas as regras do `.md` têm implementação correspondente no código
|
||||
- [ ] Código e `.md` estão consistentes (separadores, campos, condições)
|
||||
- [ ] `tsc --noEmit` passa sem erros após qualquer mudança de código
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
- Rule: `.agent/rules/regras-negocio-md.global.md`
|
||||
- Workflow: `.agent/workflows/documentar-regras-negocio.global.md`
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
---
|
||||
name: mapear-codigo-fonte
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
description: >
|
||||
Guia operacional para mapear, navegar e compreender a estrutura de um monorepo TypeScript.
|
||||
---
|
||||
|
||||
# Skill: Mapear Código-Fonte de Monorepo TypeScript
|
||||
|
||||
Use esta skill ao iniciar trabalho em um monorepo desconhecido, ao onboardar em novo projeto, ou quando precisar localizar rapidamente onde uma funcionalidade vive no código.
|
||||
|
||||
---
|
||||
|
||||
## PASSO 1 — Identificar a Raiz e o Gerenciador de Pacotes
|
||||
|
||||
Localize os arquivos que definem a estratégia de monorepo:
|
||||
|
||||
```bash
|
||||
# Identificar o gerenciador e workspace config
|
||||
ls -la package.json pnpm-workspace.yaml lerna.json turbo.json nx.json tsconfig.base.json 2>/dev/null
|
||||
```
|
||||
|
||||
Elementos a extrair:
|
||||
|
||||
- **Gerenciador**: `pnpm` (workspaces em `pnpm-workspace.yaml`), `npm/yarn` (workspaces em `package.json`), ou `nx`/`turbo`
|
||||
- **Pacotes compartilhados**: diretórios listados em `packages:` ou `workspaces:`
|
||||
- **Apps/serviços**: diretórios de aplicações deployáveis
|
||||
- **TSConfig base**: herança de configuração TypeScript entre pacotes
|
||||
|
||||
---
|
||||
|
||||
## PASSO 2 — Mapear a Árvore de Pacotes
|
||||
|
||||
```bash
|
||||
# Listar todos os pacotes do workspace com nomes e caminhos
|
||||
# pnpm
|
||||
pnpm ls --depth -1 -r --json 2>/dev/null | jq '.[].name'
|
||||
|
||||
# Alternativa genérica: encontrar todos os package.json
|
||||
fd package.json --max-depth 3 --type f --exec sh -c 'echo "$(dirname {}): $(jq -r .name {})"'
|
||||
```
|
||||
|
||||
Organizar os pacotes em categorias:
|
||||
|
||||
| Categoria | Padrão de nome | Exemplo |
|
||||
|-----------|---------------|---------|
|
||||
| **Libs compartilhadas** | `@org/common`, `*-comuns`, `*-shared` | Tipos, utils, schemas |
|
||||
| **Backend** | `*-back`, `*-api`, `*-server` | Serviços Node/Express/Fastify |
|
||||
| **Frontend** | `*-front`, `*-web`, `*-app` | Apps Vue/React/Angular |
|
||||
| **Ferramentas** | `*-cli`, `*-scripts`, `*-tools` | Scripts de build, migrations |
|
||||
| **Configs** | `*-config`, `*-eslint-config` | Configs compartilhadas |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 3 — Mapear Dependências Internas
|
||||
|
||||
Identificar o grafo de dependências entre pacotes internos:
|
||||
|
||||
```bash
|
||||
# Para cada package.json, listar deps internas (que apontam para workspace:)
|
||||
rg '"workspace:' --include='package.json' -l | while read f; do
|
||||
echo "=== $(jq -r .name "$f") ==="
|
||||
jq -r '.dependencies // {} | to_entries[] | select(.value | startswith("workspace:")) | .key' "$f"
|
||||
jq -r '.devDependencies // {} | to_entries[] | select(.value | startswith("workspace:")) | .key' "$f"
|
||||
done
|
||||
```
|
||||
|
||||
Anotar:
|
||||
|
||||
- Quais pacotes são **folha** (não dependem de outros internos)
|
||||
- Quais são **raiz** (ninguém depende deles — geralmente apps)
|
||||
- Quais são **núcleo** (muitos dependem deles — geralmente libs compartilhadas)
|
||||
|
||||
---
|
||||
|
||||
## PASSO 4 — Mapear Arquitetura de Cada Pacote
|
||||
|
||||
Para cada pacote relevante, identificar a estrutura interna:
|
||||
|
||||
```bash
|
||||
# Visão geral rápida (2 níveis de profundidade)
|
||||
eza --tree --level=2 --icons --group-directories-first <caminho-do-pacote>/src/
|
||||
# ou
|
||||
tree -L 2 -I node_modules <caminho-do-pacote>/src/
|
||||
```
|
||||
|
||||
Padrões comuns a procurar:
|
||||
|
||||
| Diretório | Responsabilidade típica |
|
||||
|-----------|----------------------|
|
||||
| `src/routes/` ou `src/api/` | Endpoints/rotas HTTP |
|
||||
| `src/services/` | Lógica de negócio |
|
||||
| `src/models/` ou `src/entities/` | Modelos de dados |
|
||||
| `src/utils/` ou `src/helpers/` | Funções utilitárias |
|
||||
| `src/types/` ou `src/typings/` | Definições de tipos TS |
|
||||
| `src/schemas/` | Schemas de validação (Zod, Joi) |
|
||||
| `src/migrations/` | Migrações de banco |
|
||||
| `src/components/` | Componentes de UI (frontend) |
|
||||
| `src/composables/` ou `src/hooks/` | Lógica reutilizável (Vue/React) |
|
||||
| `src/stores/` | Gerenciamento de estado |
|
||||
|
||||
---
|
||||
|
||||
## PASSO 5 — Identificar Pontos de Entrada e Exportações
|
||||
|
||||
```bash
|
||||
# Encontrar exports públicos de cada pacote
|
||||
rg "export " --include='index.ts' --include='index.tsx' -l
|
||||
|
||||
# Encontrar entry points no package.json
|
||||
fd package.json --max-depth 3 --type f --exec sh -c 'echo "$(jq -r .name {}):" && jq "{main, module, types, exports}" {}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PASSO 6 — Documentar o Mapa
|
||||
|
||||
Produzir um resumo estruturado com:
|
||||
|
||||
```markdown
|
||||
# Mapa do Monorepo: <nome>
|
||||
|
||||
## Gerenciador: pnpm | npm | yarn
|
||||
## Build System: tsc | turbo | nx
|
||||
|
||||
## Pacotes
|
||||
|
||||
### Libs Compartilhadas
|
||||
- `@org/types` → tipos compartilhados (depende de: nenhum)
|
||||
- `@org/utils` → funções utilitárias (depende de: @org/types)
|
||||
|
||||
### Aplicações
|
||||
- `@org/api` → backend Express (depende de: @org/types, @org/utils)
|
||||
- `@org/web` → frontend Vue (depende de: @org/types)
|
||||
|
||||
## Fluxo de dados
|
||||
Descrever como os dados fluem entre pacotes.
|
||||
|
||||
## Scripts importantes
|
||||
- `pnpm build` → Build de todos os pacotes
|
||||
- `pnpm dev` → Inicia dev server
|
||||
- `pnpm test` → Roda testes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Checklist Final
|
||||
|
||||
- [ ] O gerenciador de pacotes e workspace strategy estão identificados?
|
||||
- [ ] Todos os pacotes foram categorizados (lib/app/tool)?
|
||||
- [ ] O grafo de dependências internas foi mapeado?
|
||||
- [ ] Os pontos de entrada de cada pacote estão claros?
|
||||
- [ ] A arquitetura interna dos pacotes principais foi documentada?
|
||||
- [ ] Scripts de build/dev/test foram identificados?
|
||||
|
||||
## Referências
|
||||
|
||||
- Rules: `.agent/rules/typescript-sem-any.global.md`
|
||||
- Workflow: `.agent/workflows/otimizar-codigos.global.md`
|
||||
116
.agent/tools.md
116
.agent/tools.md
|
|
@ -1,116 +0,0 @@
|
|||
# Ferramentas Recomendadas para Otimização de IAs no Desenvolvimento
|
||||
|
||||
Este documento lista ferramentas de linha de comando (CLI) e utilitários que otimizam significativamente o trabalho e a integração de Agentes de IA durante o processo de desenvolvimento. Todas as ferramentas listadas possuem suporte nativo para **Linux** e **macOS**.
|
||||
|
||||
## 1. Busca e Navegação de Código
|
||||
|
||||
### ripgrep (`rg`)
|
||||
- **Descrição:** Uma ferramenta de busca orientada a linhas que busca recursivamente no diretório atual por uma expressão regular.
|
||||
- **Por que ajuda as IAs:** É extremamente rápida para encontrar referências de código, funções e variáveis em repositórios grandes. Ajuda as IAs a varrer bases de código rapidamente sem precisar ler todos os arquivos.
|
||||
- **Instalação:**
|
||||
- **Mac:** `brew install ripgrep`
|
||||
- **Linux (Ubuntu/Debian):** `sudo apt-get install ripgrep`
|
||||
|
||||
### fd
|
||||
- **Descrição:** Uma alternativa simples, rápida e amigável ao comando `find`.
|
||||
- **Por que ajuda as IAs:** Permite que as IAs listem a estrutura de arquivos e localizem caminhos específicos com uma sintaxe muito mais amigável e saída mais rápida e limpa que o `find` tradicional, respeitando o `.gitignore` nativamente.
|
||||
- **Instalação:**
|
||||
- **Mac:** `brew install fd`
|
||||
- **Linux (Ubuntu/Debian):** `sudo apt-get install fd-find`
|
||||
|
||||
### ast-grep (`sg`)
|
||||
- **Descrição:** Uma ferramenta de busca e substituição de código baseada em Árvore de Sintaxe Abstrata (AST).
|
||||
- **Por que ajuda as IAs:** Diferente do regex padrão, permite que a IA faça buscas estruturais e refatorações complexas compreendendo a semântica da linguagem.
|
||||
- **Instalação:**
|
||||
- **Mac/Linux:** `npm install -g @ast-grep/cli` ou `brew install ast-grep`
|
||||
|
||||
## 2. Processamento de Dados
|
||||
|
||||
### jq
|
||||
- **Descrição:** Um processador JSON de linha de comando leve e flexível.
|
||||
- **Por que ajuda as IAs:** Sistemas baseados em agentes interagem frequentemente por payloads JSON e chamadas de API. O `jq` é a ferramenta perfeita para que a IA filtre, extraia e transforme grandes payloads de dados diretamente no terminal.
|
||||
- **Instalação:**
|
||||
- **Mac:** `brew install jq`
|
||||
- **Linux (Ubuntu/Debian):** `sudo apt-get install jq`
|
||||
|
||||
### yq
|
||||
- **Descrição:** Uma extensão leve e portável do `jq` voltada para o processamento de arquivos YAML, JSON e XML.
|
||||
- **Por que ajuda as IAs:** Útil para a IA inspecionar, modificar e gerar configurações como `docker-compose.yml`, esquemas de CI/CD, e manifestos Kubernetes.
|
||||
- **Instalação:**
|
||||
- **Mac:** `brew install yq`
|
||||
- **Linux:** O binário é baixado direto da distribuição oficial no Github ou via snap.
|
||||
|
||||
## 3. Qualidade de Código e Formatação
|
||||
|
||||
### Biome
|
||||
- **Descrição:** Ferramenta All-in-One super rápida para formatação e linting de projetos Web (JavaScript, TypeScript, JSX, JSON).
|
||||
- **Por que ajuda as IAs:** Como exigido pelos padrões do projeto, garante que o código escrito pela IA passe pela validação, sendo auto-focado e sem configurações complexas (`biome check --write`).
|
||||
- **Instalação:**
|
||||
- **Mac/Linux:** `npm install -g @biomejs/biome` ou gerenciamento local (`pnpm add -D @biomejs/biome`).
|
||||
|
||||
### ShellCheck
|
||||
- **Descrição:** Ferramenta de análise estática e linting projetada especificamente para scripts de shell (bash/sh).
|
||||
- **Por que ajuda as IAs:** Assegura que scripts bash gerados por IAs (seja para deploy ou testes de automação de fluxo) sigam as melhores práticas e não tenham comandos perigosos implícitos.
|
||||
- **Instalação:**
|
||||
- **Mac:** `brew install shellcheck`
|
||||
- **Linux (Ubuntu/Debian):** `sudo apt-get install shellcheck`
|
||||
|
||||
## 4. Visualização e Visualização de Texto
|
||||
|
||||
### bat
|
||||
- **Descrição:** Um clone do `cat` com suporte nativo a syntax highlighting (destaque de sintaxe) e integração com o Git.
|
||||
- **Por que ajuda as IAs:** Ao extrair ou ler recortes de arquivos e logs, o conteúdo é formatado de maneira que facilita eventuais inspeções humanas e recortes por linhas (`bat -r <linha_inicio>:<linha_fim>`).
|
||||
- **Instalação:**
|
||||
- **Mac:** `brew install bat`
|
||||
- **Linux (Ubuntu/Debian):** `sudo apt-get install bat`
|
||||
|
||||
### tree / eza
|
||||
- **Descrição:** Utilitários para listar o conteúdo de diretórios. O `eza` é um substituto moderno para o `ls` com suporte de árvore.
|
||||
- **Por que ajuda as IAs:** Permitir que agentes mapeiem mentalmente a árvore de projeto de forma clara. Essencial para IAs auto-localizarem módulos arquiteturais.
|
||||
- **Instalação:**
|
||||
- **Mac:** `brew install eza tree`
|
||||
- **Linux (Ubuntu/Debian):** `sudo apt-get install tree eza`
|
||||
|
||||
## 5. Integração com APIs e Git
|
||||
|
||||
### HTTPie / cURL
|
||||
- **Descrição:** Ferramenta gráfica ou cli para o teste de endpoints, sendo o HTTPie uma versão "humanizada" do cURL.
|
||||
- **Por que ajuda as IAs:** Auxilia nas IAs de codificação que necessitam conferir os status e formatos dos endpoints REST antes de gerar lógicas assíncronas no front-end ou back-end.
|
||||
- **Instalação (HTTPie):**
|
||||
- **Mac:** `brew install httpie`
|
||||
- **Linux:** `sudo apt-get install httpie`
|
||||
|
||||
### GitHub CLI (`gh`)
|
||||
- **Descrição:** Interface de linha de comando nativa para interagir com repositórios no GitHub.
|
||||
- **Por que ajuda as IAs:** Permite à IA criar pull requests, listar issues e manipular webhooks diretamente do terminal como parte de fluxos autonomos de entrega contínua.
|
||||
- **Instalação:**
|
||||
- **Mac:** `brew install gh`
|
||||
- **Linux:** `sudo apt install gh`
|
||||
|
||||
---
|
||||
|
||||
## 6. Instalação Rápida (Copia e Cola)
|
||||
|
||||
Para instalar as ferramentas base de forma ágil e em lote, copie os blocos de comando abaixo e os rode inteiramente em seu terminal (requer `npm` e `snap` já configurados).
|
||||
|
||||
### Linux (Debian / Ubuntu)
|
||||
|
||||
```bash
|
||||
# 1. Atualizar e instalar ferramentas base do sistema
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ripgrep fd-find jq shellcheck bat tree eza httpie gh
|
||||
|
||||
# 2. Instalar ferramentas em Node
|
||||
npm install -g @ast-grep/cli @biomejs/biome
|
||||
|
||||
# 3. Instalar yq via snap
|
||||
sudo snap install yq
|
||||
```
|
||||
|
||||
### macOS (via Homebrew)
|
||||
|
||||
```bash
|
||||
# Instalar utilitários essenciais
|
||||
brew install ripgrep fd ast-grep jq yq shellcheck bat tree eza httpie gh
|
||||
npm install -g @biomejs/biome
|
||||
```
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
# comando sh ../.agent/verificar-linhas.sh || exit 1
|
||||
|
||||
LIMITE=250
|
||||
|
||||
RAIZ=$(cd "$(dirname "$0")/.." && pwd)
|
||||
|
||||
RESULTADO=$(
|
||||
find "$RAIZ" \
|
||||
-type d \( \
|
||||
-name node_modules -o \
|
||||
-name .git -o \
|
||||
-name dist -o \
|
||||
-name build \
|
||||
\) -prune \
|
||||
-o \
|
||||
-type f \( \
|
||||
-name "*.ts" -o \
|
||||
-name "*.tsx" -o \
|
||||
-name "*.vue" -o \
|
||||
-name "*.css" \
|
||||
\) \
|
||||
-print | while IFS= read -r arquivo; do
|
||||
linhas=$(wc -l < "$arquivo" | tr -d ' ')
|
||||
if [ "$linhas" -gt "$LIMITE" ]; then
|
||||
relativo="${arquivo#$RAIZ/}"
|
||||
printf "%5s linhas -> %s\n" "$linhas" "$relativo"
|
||||
fi
|
||||
done
|
||||
)
|
||||
|
||||
if [ -n "$RESULTADO" ]; then
|
||||
echo "$RESULTADO"
|
||||
VIOLACOES=$(printf '%s\n' "$RESULTADO" | wc -l | tr -d ' ')
|
||||
printf "\n❌ %s arquivo(s) violam o limite de %s linhas.\n" "$VIOLACOES" "$LIMITE"
|
||||
printf "\n Resolva usando o arquivo: .agent/workflows/otimizar-codigos.global.md\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "✅ Todos os arquivos dentro do limite de %s linhas.\n" "$LIMITE"
|
||||
|
|
@ -1,118 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: adicionar-ajuda
|
||||
description: Adicionar ou atualizar botão de ajuda e documentação em telas (Frontend)
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Adicionar Ajuda em Telas
|
||||
|
||||
Este workflow automatiza a inserção do botão de ajuda e a criação do arquivo de documentação correspondente sempre que uma tela é criada ou modificada de forma significativa.
|
||||
|
||||
O objetivo da ajuda é **auxiliar o usuário final a compreender e utilizar corretamente a aplicação**, explicando o funcionamento da tela de forma clara e objetiva.
|
||||
|
||||
## Pré-requisitos
|
||||
|
||||
- O arquivo alvo deve ser um componente de interface (`.tsx` para React ou `.vue` para Vue).
|
||||
- O projeto deve possuir um componente de ajuda (ex: `BotaoAjuda`, `HelpButton` ou equivalente) disponível para uso na interface.
|
||||
- Caso não exista, criar um componente reutilizável que exiba o conteúdo do `.ajuda.md` em modal ou drawer.
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Identificar o Componente Alvo
|
||||
|
||||
Determine qual arquivo representa a tela principal ou modal que está sendo criado ou editado.
|
||||
|
||||
- React → `.tsx`
|
||||
- Vue → `.vue`
|
||||
|
||||
### 2. Verificar Existência de Ajuda
|
||||
|
||||
Procure por um arquivo de ajuda com o mesmo nome do componente e sufixo indicativo de ajuda (ex.: `.ajuda.md`) localizado na mesma pasta.
|
||||
|
||||
Exemplo:
|
||||
|
||||
```
|
||||
|
||||
TelaCadastroUsuario.tsx
|
||||
TelaCadastroUsuario.ajuda.md
|
||||
|
||||
```
|
||||
|
||||
ou
|
||||
|
||||
```
|
||||
|
||||
TelaCadastroUsuario.vue
|
||||
TelaCadastroUsuario.ajuda.md
|
||||
|
||||
````
|
||||
|
||||
### 3. Criar ou Atualizar o Arquivo Markdown
|
||||
|
||||
Se o arquivo `.ajuda.md` não existir, crie-o utilizando o template básico abaixo.
|
||||
|
||||
O conteúdo deve ser escrito **pensando no usuário final**, explicando de forma simples como utilizar a tela.
|
||||
|
||||
A documentação deve incluir, quando aplicável:
|
||||
|
||||
- **Objetivo da tela**
|
||||
- **Descrição dos botões**
|
||||
- **Descrição dos campos de formulário**
|
||||
- **Regras de preenchimento e validações**
|
||||
- **Fluxo esperado de uso**
|
||||
- **Contexto técnico ou legal**, quando relevante para o entendimento da funcionalidade
|
||||
|
||||
Template inicial:
|
||||
|
||||
```markdown
|
||||
# Ajuda: [Nome da Tela]
|
||||
|
||||
## Objetivo da Tela
|
||||
|
||||
Explique de forma simples para que serve esta tela dentro do sistema.
|
||||
|
||||
## Botões
|
||||
|
||||
- **Salvar**: grava as informações preenchidas.
|
||||
- **Cancelar**: descarta as alterações realizadas.
|
||||
- **Excluir**: remove o registro atual do sistema.
|
||||
|
||||
## Campos do Formulário
|
||||
|
||||
- **Nome**: informe o nome completo do responsável.
|
||||
- **Data de Vistoria**: data em que a vistoria foi realizada.
|
||||
- **Observações**: campo livre para registrar informações adicionais.
|
||||
|
||||
## Fluxo de Uso
|
||||
|
||||
1. Preencha os campos obrigatórios.
|
||||
2. Revise as informações inseridas.
|
||||
3. Clique em **Salvar** para registrar os dados no sistema.
|
||||
|
||||
## Informações Técnicas ou Legais (quando aplicável)
|
||||
|
||||
Explique regras técnicas, normas ou exigências legais relacionadas à funcionalidade da tela.
|
||||
````
|
||||
|
||||
### 4. Posicionamento do Botão de Ajuda
|
||||
|
||||
O botão deve ser inserido de forma consistente e não pode interferir na interface da aplicação.
|
||||
|
||||
#### Telas / Páginas
|
||||
|
||||
* O botão deve ficar na **parte inferior esquerda da página**.
|
||||
* Deve respeitar espaçamento suficiente das bordas da interface.
|
||||
* **Não pode sobrepor nenhum componente da tela.**
|
||||
* **Não pode ficar oculto ou sobreposto pela barra de módulos da aplicação.**
|
||||
* Ajustar `margin`, `padding` ou `z-index` quando necessário para garantir visibilidade adequada.
|
||||
|
||||
#### Modais e Diálogos
|
||||
|
||||
* O botão deve ficar na **parte inferior esquerda do modal**.
|
||||
* Preferencialmente no rodapé do modal ou em um container equivalente.
|
||||
* **Não pode sobrepor botões ou ações do modal.**
|
||||
* Garantir espaçamento adequado para não interferir na usabilidade.
|
||||
|
||||
|
||||
|
|
@ -1,263 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: aprimorar-IA
|
||||
description: Consolidar aprendizados da conversa atual e evoluir continuamente as regras, skills e fluxos da aplicação
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Aprimorar Conhecimento da Aplicação
|
||||
|
||||
## 🎯 Objetivo
|
||||
|
||||
Garantir que **toda decisão tomada** seja imediatamente incorporada ao conhecimento estruturado da aplicação, mantendo o sistema de rules, workflows e skills **coerente, atualizado, não redundante e sem contradições**.
|
||||
|
||||
Este workflow é **obrigatório** e deve ser executado sempre que houver qualquer definição nova.
|
||||
|
||||
---
|
||||
|
||||
## Artefatos de Conhecimento
|
||||
|
||||
O conhecimento do agente está organizado em **três tipos de artefatos**, cada um com responsabilidade distinta:
|
||||
|
||||
| Artefato | Diretório | Responsabilidade |
|
||||
|----------|-----------|------------------|
|
||||
| **Rules** | `.agent/rules/` | Restrições e convenções que o agente **deve respeitar sempre** |
|
||||
| **Workflows** | `.agent/workflows/` | Processos sequenciais com passos numerados para tarefas bem definidas |
|
||||
| **Skills** | `.agent/skills/` | Guias operacionais completos e reutilizáveis para tarefas complexas recorrentes |
|
||||
| **Memória** | `.agent/memoria/` | Registros históricos, contexto do projeto, fatos e decisões importantes |
|
||||
|
||||
### Diferenças entre os artefatos
|
||||
|
||||
| Critério | Rule | Workflow | Skill | Memória |
|
||||
|----------|------|----------|-------|---------|
|
||||
| **Formato** | Regra declarativa | Passos sequenciais | Guia prático com templates | Diários, ADRs, documentação de contexto puro |
|
||||
| **Quando usar** | Aplicada **automaticamente** em todo contexto | Acionado por **comando** (`/workflow`) | Consultado **sob demanda** ao iniciar tarefa complexa | Consultado **para restaurar contexto** e entender escopo |
|
||||
| **Exemplos** | "Nunca usar `any`" | "/migracao_banco" | "Criar função api2 end-to-end" | "ADR de transição para Nuxt 4", "Dicionário de dados" |
|
||||
| **Escopo** | Restrição transversal | Processo pontual | Padrão operacional completo | Registro histórico e base factual |
|
||||
|
||||
### Regra de escolha
|
||||
|
||||
- Se é uma **restrição** que vale sempre → **Rule**
|
||||
- Se é um **processo com etapas** que o usuário aciona → **Workflow**
|
||||
- Se é um **guia operacional** com templates e checklist para tarefas complexas → **Skill**
|
||||
- Se o conteúdo serve como **referência cruzada** durante tarefas → **Skill**
|
||||
- Se é um **registro de estado, decisão técnica importante ou compreensão do domínio temporal** → **Memória**
|
||||
|
||||
---
|
||||
|
||||
## 1️⃣ Análise do Contexto Atual (Obrigatória)
|
||||
|
||||
É obrigatório:
|
||||
|
||||
- Revisar integralmente a conversa atual.
|
||||
- Identificar:
|
||||
- Regras de negócio novas ou alteradas.
|
||||
- Padrões técnicos definidos.
|
||||
- Convenções estabelecidas.
|
||||
- Decisões arquiteturais.
|
||||
- Ajustes de comportamento do sistema ou do agente.
|
||||
|
||||
Para cada item identificado, classificar obrigatoriamente:
|
||||
|
||||
- Já existe artefato correspondente (rule, workflow ou skill) → **ATUALIZAR**
|
||||
- Existe parcialmente → **REFATORAR**
|
||||
- Não existe → **CRIAR**
|
||||
- Impacta múltiplas áreas → **PROPAGAR**
|
||||
|
||||
---
|
||||
|
||||
## 2️⃣ Atualização das Rules (Obrigatória)
|
||||
|
||||
### Regras inegociáveis:
|
||||
|
||||
- Toda nova regra **DEVE** ser registrada.
|
||||
- Nenhuma regra pode existir apenas na conversa.
|
||||
- É **PROIBIDO** deixar conhecimento implícito.
|
||||
|
||||
### Estrutura obrigatória:
|
||||
|
||||
- Um arquivo = um único assunto.
|
||||
- Nome claro em `kebab-case`.
|
||||
- Limite máximo: ~10.000 caracteres.
|
||||
|
||||
### É obrigatório:
|
||||
|
||||
- Evitar duplicação de conteúdo.
|
||||
- Atualizar regras antigas quando substituídas.
|
||||
- Remover ou ajustar regras conflitantes.
|
||||
- Garantir consistência semântica entre arquivos.
|
||||
|
||||
### Estrutura obrigatória da rule:
|
||||
|
||||
```md
|
||||
# Nome da Regra
|
||||
|
||||
## Contexto
|
||||
Quando se aplica.
|
||||
|
||||
## Regra
|
||||
Definição objetiva e obrigatória.
|
||||
|
||||
## Exemplos
|
||||
✅ Correto
|
||||
❌ Incorreto
|
||||
|
||||
## Impacto
|
||||
Problema que evita.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3️⃣ Atualização dos Workflows (Obrigatória quando aplicável)
|
||||
|
||||
Sempre que houver processo repetível identificado:
|
||||
|
||||
* Criar ou atualizar workflow em `.agent/workflows/`.
|
||||
|
||||
### Obrigatório:
|
||||
|
||||
* Frontmatter com `description`.
|
||||
* Passos numerados.
|
||||
* Clareza operacional (sem ambiguidade).
|
||||
* Comandos executáveis quando possível.
|
||||
* Uso de `// turbo` para comandos seguros.
|
||||
|
||||
---
|
||||
|
||||
## 4️⃣ Atualização das Skills (Obrigatória quando aplicável)
|
||||
|
||||
Sempre que um padrão operacional complexo for definido, refinado ou corrigido:
|
||||
|
||||
* Criar ou atualizar skill em `.agent/skills/<nome-da-skill>/SKILL.md`.
|
||||
|
||||
### Quando atualizar uma skill:
|
||||
|
||||
- Nova regra afeta o padrão operacional descrito na skill (ex: nova convenção de tipagem afeta `criar-funcao-api2`)
|
||||
- Novo workflow introduz etapas que complementam ou substituem uma skill
|
||||
- Um erro recorrente revela que a skill está incompleta ou desatualizada
|
||||
- Uma decisão arquitetural muda o fluxo descrito na skill
|
||||
|
||||
### Estrutura obrigatória da skill:
|
||||
|
||||
```md
|
||||
---
|
||||
name: nome-da-skill
|
||||
description: >
|
||||
Descrição em uma linha do que a skill faz.
|
||||
---
|
||||
|
||||
# Skill: Nome Descritivo
|
||||
|
||||
Parágrafo de contexto explicando quando usar.
|
||||
|
||||
## PASSO N — Título do Passo
|
||||
Instruções com código, regras e padrões.
|
||||
|
||||
## Checklist Final
|
||||
- [ ] Item de verificação
|
||||
|
||||
## Referências
|
||||
- Regras: `.agent/rules/xxx.md`
|
||||
- Workflow: `.agent/workflows/xxx.md`
|
||||
```
|
||||
|
||||
### Regras de organização:
|
||||
|
||||
- Uma skill por diretório: `.agent/skills/<nome>/SKILL.md`
|
||||
- Skills globais são identificadas pelo campo `scope: global` no frontmatter
|
||||
- Nome do diretório em `kebab-case`
|
||||
- A skill **não deve duplicar** conteúdo de rules — referencia-as via seção `Referências`
|
||||
- A skill **pode consolidar** conhecimento de múltiplas rules e workflows em um guia unificado
|
||||
- Templates de código devem estar na própria skill (não em arquivos separados, a menos que sejam muito grandes)
|
||||
|
||||
### Skills globais (distribuídas via `atualizar-agente.global.sh`):
|
||||
|
||||
| Skill | Escopo |
|
||||
|-------|--------|
|
||||
| `mapear-codigo-fonte` | Mapear e navegar a estrutura de qualquer monorepo TS |
|
||||
| `diagnosticar-erros-build` | Diagnosticar erros de build em cascata entre pacotes |
|
||||
| `documentar-decisao-tecnica` | Registrar decisões técnicas como ADRs |
|
||||
|
||||
### Skills de projeto (criadas localmente em cada monorepo):
|
||||
|
||||
Cada projeto pode criar skills adicionais específicas em `.agent/skills/<nome>/SKILL.md`.
|
||||
Essas skills focam nos padrões e domínios exclusivos daquele projeto.
|
||||
|
||||
Exemplos de skills de projeto:
|
||||
|
||||
| Skill | Escopo |
|
||||
|-------|--------|
|
||||
| `criar-funcao-api` | Função de API end-to-end (comuns → back → front) |
|
||||
| `criar-componente-vue3` | Componente Vue 3 com padrões obrigatórios do projeto |
|
||||
| `consultar-banco-knex` | Queries Knex com padrões de leitura/escrita/JSONB |
|
||||
| `implementar-permissoes` | Controle de acesso específico do domínio |
|
||||
|
||||
---
|
||||
|
||||
## 5️⃣ Atualização da Memória (Obrigatória quando aplicável)
|
||||
|
||||
Sempre que decisões críticas sobre a arquitetura da aplicação ou o contexto do domínio precisarem ser arquivadas temporária ou permanentemente de maneira descritiva (e não diretamente injetável em código ou regra de lint):
|
||||
|
||||
* Registre o novo documento no formato adequado mantendo a pasta limpa em `.agent/memoria/`.
|
||||
* Exemplo: Manter diário de pendências (`diario-pendencias-modulo-x.md`) ou ADR (`adr-001-migracao-nuxt-4.md`).
|
||||
* Atenção! Tudo que puder ser abstraído para formato técnico estrito deve virar **Skill** ou **Rule**. Use a Memória apenas como extensão de base factual.
|
||||
|
||||
---
|
||||
|
||||
## 6️⃣ Revisão de Impacto (Dirigida por Grafo)
|
||||
|
||||
Quando um artefato é alterado, a revisão deve ser **dirigida**, não exaustiva.
|
||||
|
||||
### Processo:
|
||||
|
||||
1. Identificar o artefato alterado
|
||||
2. Consultar a seção `Referências` do artefato para encontrar dependentes diretos
|
||||
3. Verificar consistência APENAS entre o artefato alterado e seus dependentes
|
||||
4. Se uma inconsistência for encontrada, propagar para o próximo nível
|
||||
|
||||
### Regras de escopo:
|
||||
|
||||
| Se alterou... | Revisar... |
|
||||
|---|---|
|
||||
| Uma **Rule** | Workflows e skills que a **referenciam** |
|
||||
| Um **Workflow** | Skills que o **referenciam** |
|
||||
| Uma **Skill** | Rules e workflows na seção Referências |
|
||||
| **Memória/ADR** | Nada — memória é registro, não dependência |
|
||||
|
||||
### É PROIBIDO:
|
||||
|
||||
* Revisar artefatos **sem relação** com a mudança
|
||||
* Afirmar que "tudo foi revisado" sem listar quais artefatos foram verificados
|
||||
* Criar artefatos sem verificar se já existe um com o mesmo escopo
|
||||
|
||||
### A revisão DEVE verificar:
|
||||
|
||||
* Não existem regras conflitantes entre o artefato alterado e seus dependentes
|
||||
* Referências cruzadas continuam válidas (arquivos existem, nomes corretos)
|
||||
* Skills refletem fielmente as rules que referenciam
|
||||
* Não há duplicação de conteúdo entre artefatos
|
||||
|
||||
---
|
||||
|
||||
## 7⃣ Verificação Final (Checklist obrigatório)
|
||||
|
||||
Só é permitido encerrar se TODOS forem verdadeiros:
|
||||
|
||||
* [ ] Artefatos dependentes do alterado foram revisados
|
||||
* [ ] Não existe conflito entre artefatos revisados
|
||||
* [ ] Não existe duplicação de conteúdo
|
||||
* [ ] Nenhuma regra ficou implícita
|
||||
* [ ] Referências cruzadas estão válidas
|
||||
* [ ] Estrutura está organizada por assunto
|
||||
* [ ] Skills referenciam (não duplicam) rules
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Regra Suprema
|
||||
|
||||
> Se existir qualquer dúvida, conflito ou inconsistência
|
||||
> entre o artefato alterado e seus dependentes,
|
||||
> o trabalho é considerado **INCOMPLETO**.
|
||||
|
||||
A revisão é dirigida, não opcional.
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: atualizar-agente
|
||||
description: Aplica atualizações globais para o agente de IA
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Atualizar Agente Global
|
||||
|
||||
## Objetivo
|
||||
|
||||
Baixar e aplicar a versão mais recente das rules, workflows e tools globais a partir do servidor central (`paiol.idz.one`).
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Baixar o script de atualização (se ainda não existir)
|
||||
|
||||
```bash
|
||||
curl -fL# "https://paiol.idz.one/desenvolvimento/agent-ia/atualizar-agente-global.sh" -o .agent/atualizar-agente.global.sh
|
||||
chmod +x .agent/atualizar-agente.global.sh
|
||||
```
|
||||
|
||||
### 2. Executar o script
|
||||
|
||||
// turbo
|
||||
|
||||
```bash
|
||||
sh .agent/atualizar-agente.global.sh
|
||||
```
|
||||
|
||||
O script possui auto-atualização: na primeira execução, ele baixa sua própria versão mais recente e re-executa automaticamente.
|
||||
|
||||
### 3. Verificar resultado
|
||||
|
||||
Confirmar que os arquivos foram atualizados sem duplicações:
|
||||
|
||||
```bash
|
||||
find .agent/ -name "*.md" -o -name "*.sh" | sort
|
||||
```
|
||||
|
||||
Resultado esperado: todos os arquivos `.md` devem ter o sufixo `.global` (exceto `tools.md`).
|
||||
|
||||
### 4. Revisar mudanças (quando aplicável)
|
||||
|
||||
Se houve alterações significativas nas rules ou workflows, executar `/aprimorar-IA` para validar consistência do sistema de conhecimento.
|
||||
|
|
@ -1,144 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: comercial
|
||||
description: Criar uma descrição comercial das funcionalidades e do sistema
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Criar Descrição Comercial
|
||||
|
||||
Este workflow gera uma descrição comercial de funcionalidades ou do sistema completo, escrita na pasta `./COMERCIAL/`. Cada módulo ou funcionalidade gera um arquivo separado com o padrão `./COMERCIAL/<nome-do-modulo>.md`.
|
||||
|
||||
É **OBRIGATÓRIO** seguir a regra global de Escrita Natural (`escrita-natural.global.md`) em toda produção textual deste workflow.
|
||||
|
||||
---
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Identificar as funcionalidades solicitadas
|
||||
|
||||
Perguntar ao usuário quais módulos ou funcionalidades devem ser descritos. Se o pedido for genérico ("descreva o sistema"), listar os módulos principais do projeto e confirmar o escopo antes de redigir.
|
||||
|
||||
### 2. Levantar contexto real de cada funcionalidade
|
||||
|
||||
Antes de escrever, ler o código-fonte e os componentes relacionados para entender:
|
||||
|
||||
- Qual **problema real** a funcionalidade resolve?
|
||||
- Quem são os **usuários diretos**? (consultor ambiental, gestor ambiental, gestor público, técnico de campo)
|
||||
- Qual é o **fluxo de uso** no dia a dia?
|
||||
- Quais **dificuldades operacionais** existiam antes da solução?
|
||||
|
||||
### 3. Redigir a descrição comercial
|
||||
|
||||
Para cada funcionalidade, produzir **dois blocos de texto** no arquivo `./COMERCIAL/<nome-do-modulo>.md`:
|
||||
|
||||
#### Bloco A — Descrição Resumida (2 a 4 linhas)
|
||||
|
||||
Texto curto que pode ser usado em páginas de divulgação, apresentações rápidas ou materiais institucionais.
|
||||
|
||||
Estrutura obrigatória:
|
||||
- **Linha 1**: o problema/dificuldade que existe sem a solução
|
||||
- **Linha 2-3**: como funciona na prática (ação do usuário, sem termos técnicos de TI)
|
||||
- **Linha 4**: o impacto concreto (ganho mensurável)
|
||||
|
||||
*Exemplo:*
|
||||
> Sem controle digital, registros de campo ficam em cadernos e planilhas isoladas — sujeitos a perda e erro de transcrição.
|
||||
> Com a solução, o técnico registra os dados direto no celular, mesmo sem internet, com validação automática.
|
||||
> Isso elimina falhas de preenchimento e garante rastreabilidade completa para auditorias.
|
||||
|
||||
#### Bloco B — Descrição Detalhada
|
||||
|
||||
Texto mais completo (5 a 15 linhas) que aprofunda o funcionamento e os diferenciais. Deve incluir:
|
||||
|
||||
- Cenário de uso realista (quem faz o quê, quando e onde)
|
||||
- Recursos técnicos relevantes explicados de forma acessível (offline, sincronização, alertas automáticos)
|
||||
- Benefícios encadeados (causa → efeito)
|
||||
- **Implicações legais ou normativas** (quando aplicável): se a funcionalidade tem relação com legislação, normas regulatórias ou resoluções de órgãos competentes, **citar expressamente** a norma ou obrigação legal. Isso fortalece o argumento comercial e demonstra que a solução atende requisitos reais de conformidade.
|
||||
|
||||
> **Regra de siglas**: toda sigla usada pela primeira vez no texto deve vir acompanhada do nome por extenso. Exemplo: "ANA (Agência Nacional de Águas e Saneamento Básico)". Nas ocorrências seguintes, pode-se usar apenas a sigla.
|
||||
|
||||
### 4. Revisar contra o checklist de qualidade
|
||||
|
||||
Antes de entregar, validar **cada bloco** contra as restrições abaixo:
|
||||
|
||||
- [ ] O texto do Resumo começa pelo problema, não pela funcionalidade?
|
||||
- [ ] Há pelo menos um cenário de uso prático (quem, onde, como)?
|
||||
- [ ] Os parágrafos são curtos (2 a 4 linhas) com uma ideia principal cada?
|
||||
- [ ] A linguagem soa como alguém que vive o problema, não como manual de software?
|
||||
- [ ] Está **LIVRE** de jargões de TI e termos em inglês sem tradução?
|
||||
- [ ] Toda **sigla** está acompanhada do nome por extenso na primeira ocorrência?
|
||||
- [ ] Está **LIVRE** de termos vazios ("Inovador", "Eficiente", "Solução completa", "O presente projeto")?
|
||||
- [ ] Está **LIVRE** do padrão repetitivo "O sistema permite / A funcionalidade permite / A ferramenta permite"?
|
||||
- [ ] As frases variam de estrutura? (alternando "Na prática...", "Com isso...", "Isso reduz...", "Como resultado...")
|
||||
- [ ] Quando há implicação legal ou normativa, a norma/lei/resolução está **citada e destacada** no texto?
|
||||
- [ ] O texto é compreensível pelo **público-alvo do produto** sem conhecimento de TI?
|
||||
|
||||
---
|
||||
|
||||
## Público-Alvo
|
||||
|
||||
Todo texto produzido por este workflow deve ser compreensível pelo **público-alvo do produto**. O agente deve identificar quem são os usuários e decisores com base no contexto do projeto.
|
||||
|
||||
Regra geral: nenhum dos perfis-alvo tem obrigação de conhecer termos de tecnologia. A linguagem deve ser **acessível, direta e sem jargões de TI**.
|
||||
|
||||
---
|
||||
|
||||
## Regras de Tom e Vocabulário
|
||||
|
||||
| ✅ Usar | ❌ Evitar |
|
||||
|---|---|
|
||||
| "Na prática, o técnico..." | "O sistema permite..." |
|
||||
| "Com isso, a equipe..." | "A solução inovadora..." |
|
||||
| "Isso elimina..." | "O presente projeto visa..." |
|
||||
| "Como resultado..." | "Dessa forma..." |
|
||||
| "Sem a solução, o gestor precisa..." | "A ferramenta oferece..." |
|
||||
| "Entregamos controle sobre..." | "Nossa solução oferece..." |
|
||||
| "O gestor ganha visibilidade de..." | "A plataforma disponibiliza..." |
|
||||
| "página de divulgação" | "landing page" |
|
||||
| "frase de abertura" | "hook" |
|
||||
| "chamada para ação" | "CTA" (isolado, sem explicação) |
|
||||
| "texto persuasivo" | "copywriting" |
|
||||
| "linha do tempo, publicações" | "feed" |
|
||||
|
||||
**Tom geral**: profissional, direto, sem burocracia institucional. O texto deve parecer escrito por quem constrói a solução e entende a operação do dia a dia do cliente.
|
||||
|
||||
---
|
||||
|
||||
## Formato de Saída
|
||||
|
||||
Cada módulo ou funcionalidade deve gerar **um arquivo próprio** dentro da pasta `./COMERCIAL/`.
|
||||
|
||||
**Regra de nomeação do arquivo:**
|
||||
- Usar o nome do módulo em **kebab-case** (minúsculo, separado por hifens)
|
||||
|
||||
O arquivo `./COMERCIAL/<nome-do-modulo>.md` deve seguir esta estrutura:
|
||||
|
||||
```markdown
|
||||
# [Nome do Módulo]
|
||||
|
||||
## [Nome da Sub-funcionalidade]
|
||||
|
||||
### Resumo
|
||||
|
||||
[Bloco A — 2 a 4 linhas: problema → solução → impacto]
|
||||
|
||||
### Detalhamento
|
||||
|
||||
[Bloco B — 5 a 15 linhas: cenário real + técnico acessível + legal]
|
||||
|
||||
---
|
||||
|
||||
## [Próxima Sub-funcionalidade]
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
- Regra global: `.agent/rules/escrita-natural.global.md` (padrão obrigatório de redação)
|
||||
- Workflow: `.agent/workflows/orcamento.global.md` (texto para documentos de orçamento e proposta — apresentação + lista de funcionalidades)
|
||||
- Workflow: `.agent/workflows/marketing.global.md` (peças de marketing digital — LinkedIn, Instagram, WhatsApp, E-mail)
|
||||
- Workflow: `.agent/workflows/otimizar-codigos.global.md` (para documentação técnica, não comercial)
|
||||
|
|
@ -1,189 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: criar-fluxograma
|
||||
description: Criar ou atualizar uma página de fluxograma interativo em qualquer sistema
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Criar Fluxograma de Decisões
|
||||
|
||||
Este workflow cria uma **página interativa de fluxograma** em qualquer aplicação web, usando Mermaid.js instalado como dependência do projeto.
|
||||
|
||||
## Princípio
|
||||
|
||||
O fluxograma é um artefato vivo. Ele documenta visualmente:
|
||||
- Os **pontos de entrada** do processo
|
||||
- As **decisões** tomadas em cada etapa
|
||||
- Os **registros gerados** (banco, fila, log, e-mail, etc.)
|
||||
- As **proteções e regras** que governam os estados
|
||||
|
||||
Deve ser mantido sempre sincronizado com o código real.
|
||||
|
||||
---
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Levantar o processo a ser documentado
|
||||
|
||||
Ler os arquivos de código relevantes para entender:
|
||||
|
||||
- Quais são os **pontos de entrada**? (funções de API, eventos, webhooks, ações do usuário)
|
||||
- Quais são as **decisões**? (condições `if/else`, guards, validações)
|
||||
- Quais são os **efeitos colaterais**? (gravações em banco, envios de e-mail, filas, logs)
|
||||
- Quais são os **estados possíveis**? (status, notas, flags, etapas)
|
||||
- Existe **hierarquia ou prioridade** entre estados?
|
||||
|
||||
### 2. Organizar os diagramas
|
||||
|
||||
Dividir o processo em **um diagrama por ponto de entrada**.
|
||||
|
||||
Cada diagrama deve mostrar:
|
||||
- Todos os caminhos possíveis, inclusive early returns e casos de erro
|
||||
- Registros gerados com ícone indicativo (ex: 🗄️ banco, 📧 e-mail, 🚫 bloqueio)
|
||||
- Decisões claramente separadas por ramificações
|
||||
|
||||
Definir a orientação de cada diagrama:
|
||||
- `flowchart TD` → vertical (melhor para fluxos sequenciais com poucas ramificações)
|
||||
- `flowchart LR` → horizontal (melhor para pipelines e fluxos com muitas etapas em linha)
|
||||
|
||||
### 3. Instalar o Mermaid
|
||||
|
||||
Instalar como dependência do projeto antes de qualquer implementação:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm install mermaid
|
||||
|
||||
# pnpm
|
||||
pnpm add mermaid
|
||||
```
|
||||
|
||||
### 4. Criar a página com Mermaid
|
||||
|
||||
Adaptar à plataforma do projeto (Vue, React, HTML puro, etc.), mas garantir:
|
||||
|
||||
#### Importação
|
||||
|
||||
```js
|
||||
import mermaid from 'mermaid';
|
||||
```
|
||||
|
||||
#### Inicialização com tema institucional
|
||||
|
||||
Adaptar as cores para a identidade visual do projeto:
|
||||
|
||||
```js
|
||||
mermaid.initialize({
|
||||
startOnLoad: false,
|
||||
theme: 'base',
|
||||
themeVariables: {
|
||||
primaryColor: '#4F46E5', // cor primária do projeto
|
||||
primaryTextColor: '#1F2933',
|
||||
primaryBorderColor: '#3730A3', // variação mais escura da primária
|
||||
lineColor: '#6B7280',
|
||||
secondaryColor: '#E0E7FF', // variação clara da primária
|
||||
tertiaryColor: '#F3F4F6',
|
||||
fontFamily: "'Inter', 'Segoe UI', sans-serif",
|
||||
fontSize: '13px',
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
#### Renderização de cada diagrama
|
||||
|
||||
```js
|
||||
// Para cada diagrama:
|
||||
const { svg } = await mermaid.render(`id-unico-${idx}`, codigoMermaid);
|
||||
container.innerHTML = svg;
|
||||
|
||||
// Tornar o SVG responsivo:
|
||||
const svgEl = container.querySelector('svg');
|
||||
if (svgEl) {
|
||||
svgEl.style.width = '100%';
|
||||
svgEl.style.height = 'auto';
|
||||
svgEl.removeAttribute('width');
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Registrar a rota e adicionar acesso
|
||||
|
||||
- Registrar a rota `/fluxograma` (ou equivalente) no sistema de rotas do projeto
|
||||
- Adicionar botão de navegação na tela de administração ou dashboard
|
||||
|
||||
---
|
||||
|
||||
## Padrão de sintaxe Mermaid
|
||||
|
||||
### Tipos de nó por semântica
|
||||
|
||||
| Situação | Sintaxe | Exemplo |
|
||||
|---|---|---|
|
||||
| Início / Fim | `A(["Texto"])` | `A(["Início"])` |
|
||||
| Decisão | `B{"Condição?"}` | `B{"Nota é ativa?"}` |
|
||||
| Ação / Processo | `C["Texto"]` | `C["Consulta banco"]` |
|
||||
| Registro em banco | `D[("🗄️ Grava dado")]` | `D[("🗄️ Grava 203_neutro")]` |
|
||||
| E-mail / notificação | `E["📧 Envia e-mail"]` | `E["📧 Agenda na fila"]` |
|
||||
| Bloqueio / guard | `F["🚫 Retorna sem ação"]` | `F["🚫 Nota ativa, ignora"]` |
|
||||
| Proteção / regra | `G["🛡️ Regra aplicada"]` | `G["🛡️ SQL CASE protege"]` |
|
||||
|
||||
### Regras para evitar erros de parsing
|
||||
|
||||
```
|
||||
✅ Nós com parênteses → usar aspas:
|
||||
A["Texto (com parênteses)"]
|
||||
|
||||
✅ Labels de arestas com texto especial → usar aspas:
|
||||
A -- "Label aqui" --> B
|
||||
|
||||
✅ Emojis → sempre dentro de aspas:
|
||||
A["🗄️ Grava registro"]
|
||||
|
||||
❌ Não usar < > dentro de labels sem aspas
|
||||
❌ Não usar & diretamente — usar texto alternativo
|
||||
```
|
||||
|
||||
### Cores de destaque para nós
|
||||
|
||||
```
|
||||
style NomeNo fill:#22C55E,color:#fff → verde sucesso
|
||||
style NomeNo fill:#DC2626,color:#fff → vermelho erro
|
||||
style NomeNo fill:#F59E0B,color:#000 → amarelo alerta
|
||||
style NomeNo fill:#4F46E5,color:#fff → cor institucional (adaptar ao projeto)
|
||||
style NomeNo fill:#6B7280,color:#fff → cinza neutro
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Validação antes de finalizar
|
||||
|
||||
- [ ] Cada ponto de entrada tem seu próprio diagrama?
|
||||
- [ ] Todos os registros gerados estão mapeados?
|
||||
- [ ] Os caminhos de bloqueio e early return estão visíveis?
|
||||
- [ ] A hierarquia de estados (se existir) está documentada?
|
||||
- [ ] A data de atualização está registrada na página?
|
||||
- [ ] A sintaxe Mermaid está correta (sem erros de parsing)?
|
||||
- [ ] O SVG está responsivo (largura 100%, sem width fixo)?
|
||||
|
||||
---
|
||||
|
||||
## Manutenção
|
||||
|
||||
Sempre que o processo mudar:
|
||||
|
||||
1. Identificar qual diagrama é afetado
|
||||
2. Atualizar o código Mermaid correspondente
|
||||
3. Atualizar a data de atualização na página
|
||||
4. Se houver novo estado ou proteção, documentar na legenda
|
||||
|
||||
---
|
||||
|
||||
## Referência de implementação
|
||||
|
||||
Se o projeto já possuir um fluxograma implementado, usar como referência.
|
||||
Caso contrário, seguir os passos acima para criar a primeira implementação.
|
||||
|
||||
## Referências
|
||||
|
||||
- Workflow: `.agent/workflows/otimizar-codigos.global.md`
|
||||
- Skill: `.agent/skills/documentar-decisao-tecnica.global/SKILL.md` (para decisões que geram fluxogramas)
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: documentar-regras-negocio
|
||||
description: Criar ou atualizar o arquivo {modulo}.regras-negocio.md co-localizado com um módulo TypeScript e garantir consistência entre código e documentação
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Documentar Regras de Negócio de um Módulo
|
||||
|
||||
Use este workflow com `/documentar-regras-negocio.global` para criar ou atualizar o arquivo
|
||||
`{modulo}.regras-negocio.md` de qualquer módulo TypeScript com lógica de negócio não-trivial.
|
||||
|
||||
---
|
||||
|
||||
[1] Ler o módulo TypeScript completamente
|
||||
|
||||
Identificar e anotar:
|
||||
|
||||
- Nome do arquivo e localização exata
|
||||
- Funções exportadas e suas responsabilidades
|
||||
- Todos os `if` que representam critérios de decisão
|
||||
- Campos lidos e gravados (especialmente JSONB e campos de status)
|
||||
- Queries de banco: tabelas acessadas, filtros aplicados, joins
|
||||
- Caminhos alternativos (revisão manual, erros, skips)
|
||||
- Dependências externas (filas, e-mails, serviços)
|
||||
|
||||
---
|
||||
|
||||
[2] Verificar se já existe um `.regras-negocio.md`
|
||||
|
||||
```bash
|
||||
ls $(dirname <arquivo>)/*.regras-negocio.md 2>/dev/null
|
||||
```
|
||||
|
||||
- **Existe** → ler e identificar o que está desatualizado → ir para o passo [4]
|
||||
- **Não existe** → ir para o passo [3]
|
||||
|
||||
---
|
||||
|
||||
[3] Criar o arquivo `.regras-negocio.md`
|
||||
|
||||
Nomenclatura: `{nome-sem-_inicial}.regras-negocio.md` na mesma pasta do módulo.
|
||||
|
||||
Preencher com o template da skill `documentar-regras-negocio.global`:
|
||||
- Contexto
|
||||
- Critérios de Entrada
|
||||
- Regras de Processamento (numeradas)
|
||||
- Casos de Revisão Manual
|
||||
- Estratégia de Saída / Fusão de Campos
|
||||
- Dependências Externas
|
||||
|
||||
---
|
||||
|
||||
[4] Adicionar ou verificar a referência no `.ts`
|
||||
|
||||
Garantir que a primeira linha útil do arquivo TypeScript seja:
|
||||
|
||||
```typescript
|
||||
// Regras de negócio: ver {modulo}.regras-negocio.md
|
||||
```
|
||||
|
||||
Se já existia e está correto → sem mudança necessária.
|
||||
|
||||
---
|
||||
|
||||
[5] Simplificar JSDoc que duplicam as regras
|
||||
|
||||
Percorrer cada função do módulo:
|
||||
|
||||
- JSDoc com lista de regras de negócio → substituir por referência ao `.md`
|
||||
- Manter apenas `@param` e `@returns` com informação técnica precisa
|
||||
- Comentários inline (`//`) explicando lógica pontual são aceitos → manter
|
||||
|
||||
---
|
||||
|
||||
[6] Verificar consistência — código ↔ `.md`
|
||||
|
||||
Para cada regra listada no `.md`:
|
||||
|
||||
- [ ] Existe `if` correspondente no código
|
||||
- [ ] A ordem de avaliação bate entre `.md` e código
|
||||
- [ ] Campos com separador de concatenação batem entre `.md` e código
|
||||
- [ ] `null` como neutro está implementado corretamente (`!= null`)
|
||||
- [ ] Queries têm `orderBy` quando a posição dos resultados importa
|
||||
|
||||
---
|
||||
|
||||
[7] Validar tipagem
|
||||
|
||||
// turbo
|
||||
```bash
|
||||
npx tsc --noEmit
|
||||
```
|
||||
|
||||
Zero erros = concluído.
|
||||
|
||||
---
|
||||
|
||||
[8] Registrar no sistema de conhecimento (se regras novas)
|
||||
|
||||
Se o workflow revelou novos padrões de negócio relevantes ao projeto:
|
||||
|
||||
- Criar ou atualizar ADR em `.agent/memoria/` via skill `documentar-decisao-tecnica`
|
||||
- Verificar se alguma rule precisa ser atualizada
|
||||
|
|
@ -1,209 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: marketing
|
||||
description: Criar peças de marketing digital para funcionalidades e módulos do sistema
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Criar Peças de Marketing
|
||||
|
||||
Este workflow gera peças de marketing digital prontas para uso em canais como LinkedIn, Instagram, WhatsApp e E-mail. O resultado é salvo na pasta `./COMERCIAL/` junto ao arquivo comercial do módulo correspondente, ou em arquivo separado `./COMERCIAL/<nome-do-modulo>-marketing.md`.
|
||||
|
||||
É **OBRIGATÓRIO** seguir a regra global de Escrita Natural (`escrita-natural.global.md`) em toda produção textual deste workflow.
|
||||
|
||||
O agente deve atuar como **especialista em marketing digital voltado para o setor do produto (venda entre empresas)**, aplicando técnicas comprovadas de texto persuasivo e engajamento.
|
||||
|
||||
## Público-Alvo das Peças
|
||||
|
||||
As peças serão lidas pelo **público-alvo do produto**. O agente deve identificar quem são os usuários e decisores com base no contexto do projeto.
|
||||
|
||||
Regra geral: nenhum dos perfis-alvo tem obrigação de conhecer termos de tecnologia. A linguagem deve ser **acessível, direta e sem jargões de TI**. Siglas devem vir acompanhadas do nome por extenso na primeira ocorrência.
|
||||
|
||||
---
|
||||
|
||||
## Pré-requisitos
|
||||
|
||||
Antes de gerar peças de marketing, o arquivo comercial do módulo (`./COMERCIAL/<nome-do-modulo>.md`) já deve existir com os blocos A (Resumo) e B (Detalhamento). Se não existir, aplicar primeiro o workflow `/comercial.global`.
|
||||
|
||||
---
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Identificar o módulo e o canal
|
||||
|
||||
Perguntar ao usuário:
|
||||
- Qual módulo ou funcionalidade será divulgado?
|
||||
- Quais canais deseja? (LinkedIn, Instagram, WhatsApp, E-mail, ou todos)
|
||||
|
||||
### 2. Ler o contexto comercial
|
||||
|
||||
Ler o arquivo `./COMERCIAL/<nome-do-modulo>.md` para extrair:
|
||||
- O problema e impacto (Bloco A)
|
||||
- Os cenários de uso e referências legais (Bloco B)
|
||||
|
||||
### 3. Redigir as peças de marketing
|
||||
|
||||
---
|
||||
|
||||
## Princípios de Engajamento
|
||||
|
||||
1. **Abrir com uma provocação ou dado concreto** — nunca com o nome do produto. A primeira frase deve fazer o leitor parar de rolar as publicações.
|
||||
2. **Falar a língua do decisor** — usar o vocabulário do público-alvo do produto, não termos de tecnologia.
|
||||
3. **Criar urgência sem desespero** — mostrar o custo da inação (multa, retrabalho, perda de prazo) sem tom alarmista.
|
||||
4. **Fechar com uma chamada para ação clara** — sempre direcionar para o próximo passo: demonstração, contato, link ou agendamento.
|
||||
5. **Adaptar ao canal** — o mesmo conteúdo não funciona igual no LinkedIn, Instagram, WhatsApp e e-mail. Cada peça deve respeitar o formato e tom do canal.
|
||||
|
||||
---
|
||||
|
||||
## Técnicas Obrigatórias
|
||||
|
||||
| Técnica | Como aplicar |
|
||||
|---|---|
|
||||
| **Frase de abertura impactante** | Pergunta retórica, dado alarmante ou afirmação provocativa nas primeiras 10 palavras |
|
||||
| **Prova social** | Mencionar o tipo de cliente que já usa (prefeituras, indústrias, consultorias), sem inventar números |
|
||||
| **Contraste antes/depois** | Mostrar o cenário ruim (planilha, papel, multa) ao lado do cenário com a solução |
|
||||
| **Especificidade** | Trocar "economiza tempo" por "reduz 4 horas semanais de consolidação manual" |
|
||||
| **Chamada para ação conectada ao problema** | A frase final deve se conectar ao problema apresentado, não ser genérica |
|
||||
|
||||
---
|
||||
|
||||
## Formatos por Canal
|
||||
|
||||
### LinkedIn (Carrossel ou Post)
|
||||
|
||||
- 3 a 5 parágrafos curtos (1-2 linhas cada)
|
||||
- Abrir com frase de abertura forte na primeira linha (antes do "ver mais")
|
||||
- Usar quebras de linha para facilitar a leitura
|
||||
- Emojis como marcadores (⚠️, ✅, 📊), no máximo 1 por parágrafo
|
||||
- Fechar com chamada para ação + hashtags relevantes (no máximo 5)
|
||||
|
||||
*Exemplo de LinkedIn:*
|
||||
|
||||
```
|
||||
⚠️ Sua equipe ainda controla [processo crítico] em planilha?
|
||||
|
||||
A maioria das operações só descobre o problema
|
||||
quando o órgão regulador notifica.
|
||||
Nessa hora, a multa já está lavrada.
|
||||
|
||||
Com [nome do produto], cada registro é feito digitalmente
|
||||
com cálculo automático. Se o valor ultrapassar
|
||||
o limite autorizado, um alerta dispara na hora.
|
||||
|
||||
✅ Controle em tempo real
|
||||
✅ Alertas automáticos de limite
|
||||
✅ Relatórios prontos para auditoria
|
||||
|
||||
Quer ver funcionando? Fale com a gente.
|
||||
|
||||
#Hashtag1 #Hashtag2 #Hashtag3
|
||||
```
|
||||
|
||||
### Instagram (Stories / Reels / Carrossel)
|
||||
|
||||
- Frases de impacto (no máximo 15 palavras por slide)
|
||||
- Visual > texto — cada slide deve ter uma ideia única
|
||||
- Usar contrastes visuais (❌ antes / ✅ depois)
|
||||
- Chamada para ação no último slide: "Link na bio" ou "Fale com nosso time"
|
||||
|
||||
*Exemplo de Instagram:*
|
||||
|
||||
```
|
||||
Slide 1: "Sua operação está em conformidade?"
|
||||
Slide 2: ❌ "Planilhas manuais. Registros esquecidos. Consolidação no fim do mês."
|
||||
Slide 3: ⚠️ "[Citação legal relevante]"
|
||||
Slide 4: ✅ "Registro digital com cálculo automático."
|
||||
Slide 5: ✅ "Alerta em tempo real quando o limite é atingido."
|
||||
Slide 6: "Conheça [nome do produto]. Link na bio."
|
||||
```
|
||||
|
||||
### WhatsApp (Mensagem de prospecção)
|
||||
|
||||
- No máximo 4 linhas + 1 chamada para ação
|
||||
- Tom pessoal, sem parecer mensagem em massa
|
||||
- Mencionar o contexto do destinatário (setor, dificuldade conhecida)
|
||||
|
||||
*Exemplo de WhatsApp:*
|
||||
|
||||
```
|
||||
Oi [Nome], tudo bem?
|
||||
|
||||
Vi que vocês trabalham com [contexto do destinatário].
|
||||
Queria mostrar como estamos ajudando operações como a de vocês
|
||||
a [benefício principal da solução].
|
||||
|
||||
Posso te mandar um vídeo rápido de 2 min mostrando como funciona?
|
||||
```
|
||||
|
||||
### E-mail (Prospecção ou Nutrição)
|
||||
|
||||
- Assunto: direto, com gancho de dificuldade real (no máximo 60 caracteres)
|
||||
- Corpo: 3 parágrafos curtos — problema → solução → chamada para ação
|
||||
- Evitar formatação visual pesada — preferir texto limpo e direto
|
||||
|
||||
*Exemplo de E-mail:*
|
||||
|
||||
```
|
||||
Assunto: [Pergunta sobre dificuldade real do destinatário]
|
||||
|
||||
Olá [Nome],
|
||||
|
||||
[Parágrafo 1: descrever a dificuldade que o destinatário provavelmente enfrenta]
|
||||
|
||||
[Parágrafo 2: como a solução resolve, com dados concretos]
|
||||
|
||||
Se fizer sentido, posso agendar 15 minutos para mostrar como funciona
|
||||
na prática. Qual o melhor horário para você?
|
||||
|
||||
[Assinatura]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Checklist de Qualidade
|
||||
|
||||
Antes de finalizar qualquer peça, validar:
|
||||
|
||||
- [ ] A primeira frase **provoca, questiona ou surpreende**?
|
||||
- [ ] O texto fala a **língua do decisor** (público-alvo do produto), não de desenvolvedor?
|
||||
- [ ] Existe **contraste claro** entre o cenário sem e com a solução?
|
||||
- [ ] Os benefícios são **específicos** (números, tempo, ações concretas)?
|
||||
- [ ] Tem **chamada para ação clara** e conectada ao problema apresentado?
|
||||
- [ ] O tom está **adaptado ao canal** (LinkedIn ≠ WhatsApp ≠ E-mail)?
|
||||
- [ ] Está **LIVRE** de jargões de TI e termos em inglês sem tradução?
|
||||
- [ ] Toda **sigla** está acompanhada do nome por extenso na primeira ocorrência?
|
||||
- [ ] Menções legais são usadas como **argumento de urgência**, não como decoração?
|
||||
|
||||
---
|
||||
|
||||
## Formato de Saída
|
||||
|
||||
O resultado deve ser salvo em `./COMERCIAL/<nome-do-modulo>-marketing.md` ou adicionado ao final do arquivo comercial existente, conforme preferência do usuário.
|
||||
|
||||
```markdown
|
||||
# Marketing — [Nome do Módulo]
|
||||
|
||||
## LinkedIn
|
||||
|
||||
[Post pronto para publicação]
|
||||
|
||||
## Instagram
|
||||
|
||||
[Roteiro de slides para carrossel ou legenda para post]
|
||||
|
||||
## WhatsApp
|
||||
|
||||
[Mensagem de prospecção]
|
||||
|
||||
## E-mail
|
||||
|
||||
[Template de prospecção ou nutrição]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
- Workflow: `.agent/workflows/comercial.global.md` (gera os blocos A e B que alimentam o marketing)
|
||||
- Regra global: `.agent/rules/escrita-natural.global.md` (padrão obrigatório de redação)
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: orcamento
|
||||
description: Criar texto de orçamento pronto para copiar e colar em peças de orçamento/proposta
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Criar Texto de Orçamento
|
||||
|
||||
Este workflow gera textos prontos para **copiar e colar dentro de documentos de orçamento e propostas comerciais**. O resultado é salvo na pasta `./COMERCIAL/` com o sufixo `-orcamento` (ex: `./COMERCIAL/<nome-do-modulo>-orcamento.md`).
|
||||
|
||||
É **OBRIGATÓRIO** seguir a regra global de Escrita Natural (`escrita-natural.global.md`) em toda produção textual deste workflow.
|
||||
|
||||
---
|
||||
|
||||
## Público-Alvo
|
||||
|
||||
O documento de orçamento será lido pelo **público-alvo do produto**. O agente deve identificar quem são os usuários e decisores com base no contexto do projeto.
|
||||
|
||||
A linguagem deve ser **acessível, direta e sem jargões de TI**. Siglas devem vir acompanhadas do nome por extenso na primeira ocorrência.
|
||||
|
||||
---
|
||||
|
||||
## Pré-requisitos
|
||||
|
||||
Antes de gerar o texto de orçamento, o agente deve ler o código-fonte do módulo para entender quais funcionalidades existem de fato. Se já existir o arquivo comercial (`./COMERCIAL/<nome-do-modulo>.md`), usá-lo como base para extrair contexto.
|
||||
|
||||
---
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Identificar o módulo
|
||||
|
||||
Perguntar ao usuário qual módulo ou funcionalidade será orçado.
|
||||
|
||||
### 2. Levantar contexto
|
||||
|
||||
Ler o código-fonte e os componentes relacionados para mapear:
|
||||
- Quais **funcionalidades** o módulo oferece de fato?
|
||||
- Existe **legislação ou norma** relevante que o módulo atende?
|
||||
- Quem são os **usuários diretos**? (consultor, gestor, técnico de campo)
|
||||
|
||||
### 3. Redigir o texto de orçamento
|
||||
|
||||
O texto deve ser **autocontido** — pronto para colar diretamente dentro de um documento de orçamento sem necessidade de edição. Estrutura obrigatória:
|
||||
|
||||
#### Apresentação do Módulo (2 a 4 linhas)
|
||||
|
||||
Texto que descreve o módulo de forma direta, mostrando **o que ele faz** e **qual problema resolve**. Se houver legislação ou norma relevante, **citar aqui** para demonstrar conformidade regulatória e fortalecer o argumento.
|
||||
|
||||
Regras:
|
||||
- Começar pelo que o módulo entrega, não pelo problema
|
||||
- Se houver lei/norma relevante, citar com nome por extenso e artigo
|
||||
- Tom confiante e profissional — adequado para documento formal
|
||||
- Não usar termos de tecnologia
|
||||
|
||||
#### Lista de Funcionalidades
|
||||
|
||||
Após a apresentação, listar as funcionalidades do módulo em formato de **itens curtos** (1 a 2 linhas cada). Cada item deve:
|
||||
|
||||
- Descrever **o que a funcionalidade faz na prática** (ação concreta, não conceito abstrato)
|
||||
- Ser compreensível por alguém que **nunca viu o sistema**
|
||||
- Ser suficientemente específico para justificar o valor cobrado
|
||||
|
||||
Regras para cada item:
|
||||
- Começar com o **nome da funcionalidade** em negrito
|
||||
- Seguir com uma descrição curta do que ela faz
|
||||
- Opcionalmente, incluir o benefício direto entre parênteses ou traço
|
||||
|
||||
### 4. Revisar contra o checklist de qualidade
|
||||
|
||||
Antes de entregar, validar:
|
||||
|
||||
- [ ] A apresentação do módulo é autocontida e compreensível isoladamente?
|
||||
- [ ] Cada funcionalidade está descrita de forma concreta (o que faz, não o que é)?
|
||||
- [ ] O texto está **pronto para copiar e colar** sem edição?
|
||||
- [ ] Está **LIVRE** de jargões de TI e termos em inglês sem tradução?
|
||||
- [ ] Toda **sigla** está acompanhada do nome por extenso na primeira ocorrência?
|
||||
- [ ] Legislação/norma relevante está **citada na apresentação** com nome por extenso?
|
||||
- [ ] O tom é profissional e adequado para um documento formal de orçamento?
|
||||
- [ ] É compreensível pelo **público-alvo do produto** sem conhecimento de TI?
|
||||
|
||||
---
|
||||
|
||||
## Regras de Redação
|
||||
|
||||
- **Sem jargões de TI**: trocar termos técnicos por equivalentes acessíveis (ex: "painel" em vez de "dashboard", "código QR" em vez de "QR Code")
|
||||
- **Siglas por extenso**: toda sigla deve vir acompanhada do nome por extenso na primeira ocorrência
|
||||
- **Tom formal mas acessível**: adequado para um documento de orçamento/proposta enviado a um diretor ou secretário
|
||||
- **Funcionalidades concretas**: "Registro de leituras com cálculo automático de volume", não "Módulo de coleta de dados parametrizável"
|
||||
|
||||
---
|
||||
|
||||
## Formato de Saída
|
||||
|
||||
O arquivo `./COMERCIAL/<nome-do-modulo>-orcamento.md` deve seguir esta estrutura:
|
||||
|
||||
```markdown
|
||||
# [Nome do Módulo]
|
||||
|
||||
[Apresentação do módulo — 2 a 4 linhas com legislação relevante, se aplicável]
|
||||
|
||||
## Funcionalidades incluídas
|
||||
|
||||
- **[Nome da funcionalidade 1]**: [descrição curta do que faz na prática]
|
||||
- **[Nome da funcionalidade 2]**: [descrição curta do que faz na prática]
|
||||
- **[Nome da funcionalidade 3]**: [descrição curta do que faz na prática]
|
||||
- ...
|
||||
```
|
||||
|
||||
*Exemplo:*
|
||||
|
||||
```markdown
|
||||
# [Nome do Módulo]
|
||||
|
||||
[Apresentação do módulo com descrição direta do que faz, qual problema resolve e,
|
||||
se aplicável, legislação ou norma relevante citada por extenso.]
|
||||
|
||||
## Funcionalidades incluídas
|
||||
|
||||
- **[Funcionalidade 1]**: [descrição curta do que faz]
|
||||
- **[Funcionalidade 2]**: [descrição curta do que faz]
|
||||
- **[Funcionalidade 3]**: [descrição curta do que faz]
|
||||
- ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
- Workflow: `.agent/workflows/comercial.global.md` (descrição comercial detalhada — Resumo e Detalhamento)
|
||||
- Workflow: `.agent/workflows/marketing.global.md` (peças de marketing digital)
|
||||
- Regra global: `.agent/rules/escrita-natural.global.md` (padrão obrigatório de redação)
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: otimizar-codigos
|
||||
description: Processo de refatoração e validação de qualidade de código
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Qualidade e Otimização de Código
|
||||
|
||||
## 🎯 Objetivo
|
||||
|
||||
Aplicar as rules de qualidade do ecossistema Azteca em código existente ou novo, garantindo que todos os padrões sejam cumpridos antes de finalizar uma tarefa.
|
||||
|
||||
---
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Verificar limite de linhas
|
||||
|
||||
```bash
|
||||
sh .agent/verificar-linhas.sh
|
||||
```
|
||||
|
||||
Se houver violações, aplicar estratégias da rule `limite-linhas.global.md`:
|
||||
- Extrair subcomponentes, mover CSS, usar Dispatch Table
|
||||
- Se necessário, converter em pasta com `index.vue`
|
||||
|
||||
### 2. Validar estrutura Vue
|
||||
|
||||
Para cada componente `.vue` modificado, verificar conforme `estrutura-vue.global.md`:
|
||||
- `defineComponent` presente?
|
||||
- `setup()` contém lógica própria (não delegada)?
|
||||
- CSS extenso foi movido para arquivo co-localizado?
|
||||
|
||||
### 3. Documentar código
|
||||
|
||||
Para cada função compartilhada criada/modificada, aplicar `jsdoc-padrao.global.md`:
|
||||
- JSDoc com `@param` e `@returns`?
|
||||
- Casts temporários têm comentário justificando?
|
||||
- TODOs no formato padronizado?
|
||||
|
||||
### 4. Validar tipagem
|
||||
|
||||
```bash
|
||||
npx tsc --noEmit
|
||||
```
|
||||
|
||||
Zero erros = prosseguir. Se houver erros, aplicar `typescript-sem-any.global.md` — nunca resolver com `any`.
|
||||
|
||||
### 5. Formatar
|
||||
|
||||
```bash
|
||||
npx biome check --write .
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Checklist Final
|
||||
|
||||
- [ ] `verificar-linhas.sh` passa sem violações?
|
||||
- [ ] Componentes Vue usam `defineComponent`?
|
||||
- [ ] Funções compartilhadas têm JSDoc?
|
||||
- [ ] Casts temporários estão justificados?
|
||||
- [ ] `tsc --noEmit` zero erros?
|
||||
- [ ] `biome check` sem problemas?
|
||||
|
||||
## Rules Aplicadas
|
||||
|
||||
Este workflow orquestra a verificação das seguintes rules:
|
||||
|
||||
- `.agent/rules/limite-linhas.global.md` — máximo 250 linhas
|
||||
- `.agent/rules/estrutura-vue.global.md` — defineComponent, setup, CSS, dispatch
|
||||
- `.agent/rules/jsdoc-padrao.global.md` — JSDoc, casts, TODOs
|
||||
- `.agent/rules/typescript-sem-any.global.md` — proibição de any
|
||||
- `.agent/rules/zod-validacao-padrao.global.md` — validação de entradas externas
|
||||
|
|
@ -1,204 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: reels
|
||||
description: Criar cadeia de roteiros de Reels para divulgação de funcionalidades e módulos
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Criar Roteiros de Reels
|
||||
|
||||
Este workflow gera **cadeias de roteiros de Reels** (vídeos curtos de 30 a 60 segundos) organizados por tema. Os roteiros são escritos em tom provocativo, informal e direto — prontos para gravar falando para a câmera ou com narração em off. O resultado é salvo em `./COMERCIAL/<nome-do-modulo>-reels.md`.
|
||||
|
||||
É **OBRIGATÓRIO** seguir a regra global de Escrita Natural (`escrita-natural.global.md`) em toda produção textual deste workflow.
|
||||
|
||||
---
|
||||
|
||||
## Público-Alvo dos Reels
|
||||
|
||||
Os vídeos serão assistidos pelo **público-alvo do produto**. O agente deve identificar quem são os usuários e decisores com base no contexto do projeto.
|
||||
|
||||
Regra geral: a linguagem deve ser **coloquial, direta e sem jargões de TI**. Siglas devem vir acompanhadas do nome por extenso quando citadas pela primeira vez.
|
||||
|
||||
---
|
||||
|
||||
## Pré-requisitos
|
||||
|
||||
Antes de gerar roteiros, o agente deve entender as funcionalidades reais do módulo. Se já existir o arquivo comercial (`./COMERCIAL/<nome-do-modulo>.md`), usá-lo como base. Caso contrário, ler o código-fonte para mapear o que o módulo entrega de fato.
|
||||
|
||||
---
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Identificar o tema
|
||||
|
||||
Perguntar ao usuário:
|
||||
- Qual módulo ou funcionalidade será o tema dos reels?
|
||||
- Quantos roteiros deseja na cadeia? (padrão: 6)
|
||||
- Algum tom específico? (provocativo, educativo, humorístico)
|
||||
|
||||
### 2. Levantar contexto
|
||||
|
||||
Mapear:
|
||||
- Quais **funcionalidades** do módulo geram mais impacto visual e prático?
|
||||
- Quais **dores reais** o público-alvo enfrenta sem a solução?
|
||||
- Existe **legislação ou norma** que possa ser usada como argumento de urgência?
|
||||
- Quais **comparações do dia a dia** fazem sentido para o público?
|
||||
|
||||
### 3. Redigir a cadeia de roteiros
|
||||
|
||||
Cada cadeia deve conter **4 a 8 roteiros**, todos conectados pelo mesmo tema mas com abordagens diferentes. Cada roteiro segue a estrutura abaixo.
|
||||
|
||||
---
|
||||
|
||||
## Estrutura de um Roteiro
|
||||
|
||||
Cada roteiro deve ter entre **6 e 12 frases curtas**, organizadas em 4 blocos:
|
||||
|
||||
### Bloco 1 — Abertura (1-2 frases)
|
||||
|
||||
A primeira frase é a mais importante. Ela decide se o espectador para ou rola.
|
||||
|
||||
Técnicas obrigatórias (usar pelo menos uma por roteiro):
|
||||
|
||||
| Técnica | Exemplo |
|
||||
|---|---|
|
||||
| **Provocação direta** | "Se você ainda faz isso manual… tá perdendo dinheiro." |
|
||||
| **Referência pop** | "Tá mais perdido que timeline de fofoca da Virgínia?" |
|
||||
| **Formato "Plot twist"** | "Plot twist: você perde cliente não é pelo preço…" |
|
||||
| **Convocação** | "Se sua proposta fosse convocada hoje… ela jogaria?" |
|
||||
| **Contraste chocante** | "Expectativa: vou organizar meus processos. Realidade: caos." |
|
||||
| **Pergunta retórica** | "Quantas horas você perdeu esse mês montando relatório?" |
|
||||
| **Afirmação polêmica** | "A maioria dos consultores está jogando dinheiro fora." |
|
||||
|
||||
### Bloco 2 — Dor / Cenário ruim (2-3 frases)
|
||||
|
||||
Descrever o cenário do público-alvo SEM a solução. Usar linguagem do dia a dia — como se estivesse conversando com um colega.
|
||||
|
||||
Regras:
|
||||
- Frases curtas e ritmadas (máximo 12 palavras por frase)
|
||||
- Usar repetição para ritmo ("proposta pra um lado, orçamento pra outro…")
|
||||
- Descrever ações reais, não conceitos ("anota no papel, perde foto, esquece detalhe")
|
||||
- Pode usar humor leve e ironia
|
||||
|
||||
### Bloco 3 — Virada / Solução (2-3 frases)
|
||||
|
||||
Apresentar o produto como a virada. O nome do produto aparece aqui — naturalmente, sem parecer propaganda.
|
||||
|
||||
Regras:
|
||||
- O produto é mencionado **uma única vez**, pelo nome
|
||||
- Descrever o que o produto faz em **ações concretas**, não em conceitos
|
||||
- Usar verbos de ação: "monta", "registra", "envia", "centraliza"
|
||||
- Mostrar resultado imediato: "menos retrabalho", "mais fechamento"
|
||||
|
||||
### Bloco 4 — Fechamento / Desafio (1-2 frases)
|
||||
|
||||
Fechar com uma pergunta ou desafio que provoque o espectador a agir.
|
||||
|
||||
Técnicas:
|
||||
- **Desafio direto**: "Quer ser titular ou continuar no banco?"
|
||||
- **Escolha binária**: "Você decide em qual nível quer jogar."
|
||||
- **Pergunta provocativa**: "Você tá otimizando ou só se ocupando?"
|
||||
- **Chamada para ação suave**: "Começa a jogar no nível profissional."
|
||||
|
||||
---
|
||||
|
||||
## Estilos de Roteiro
|
||||
|
||||
Cada cadeia deve variar os estilos para manter o conteúdo diverso. O agente deve usar **pelo menos 4 estilos diferentes** numa cadeia de 6 roteiros.
|
||||
|
||||
| Estilo | Descrição | Ritmo |
|
||||
|---|---|---|
|
||||
| **Plot twist** | Começa com uma crença comum e inverte | Surpreendente |
|
||||
| **Mais perdido que...** | Analogia cômica + caos do dia a dia | Humorístico |
|
||||
| **Convocação** | Metáfora de seleção/time/jogo | Competitivo |
|
||||
| **Raiz vs Smart** | Dois perfis contrastados | Comparativo |
|
||||
| **Tempo é dinheiro** | Foco em produtividade e custo de oportunidade | Urgência |
|
||||
| **Expectativa vs Realidade** | Contraste entre o plano e o caos | Identificação |
|
||||
| **Se eu te contasse** | Narrativa de revelação progressiva | Curiosidade |
|
||||
| **Checklist do fracasso** | Lista irônica do que NÃO fazer | Irônico |
|
||||
|
||||
---
|
||||
|
||||
## Regras de Entonação
|
||||
|
||||
O roteiro deve indicar **como falar** cada trecho. Usar marcações simples:
|
||||
|
||||
| Marcação | Significado |
|
||||
|---|---|
|
||||
| Texto normal | Tom de conversa, olhando pra câmera |
|
||||
| *Texto em itálico* | Tom irônico ou de provocação |
|
||||
| **Texto em negrito** | Ênfase, falar mais forte |
|
||||
| `[pausa]` | Pausa dramática de 1-2 segundos |
|
||||
| `[rápido]` | Falar em ritmo acelerado |
|
||||
| `[sussurrando]` | Tom baixo, como se contasse um segredo |
|
||||
|
||||
---
|
||||
|
||||
## Regras de Redação
|
||||
|
||||
- **Frases curtas**: máximo 15 palavras por frase. Idealmente 8-12
|
||||
- **Sem jargões de TI**: trocar termos técnicos por equivalentes do dia a dia
|
||||
- **Tom coloquial**: "tá", "pra", "gente", "bobo" são permitidos e desejáveis
|
||||
- **Referências culturais**: usar quando fizerem sentido para o público (futebol, reality, memes do momento). Marcar como `[ref: atualizar]` se a referência puder ficar datada
|
||||
- **Uma ideia por frase**: cada frase deve ser compreensível isoladamente
|
||||
- **Sem "Olá pessoal"**: nunca abrir com saudação genérica
|
||||
- **Produto natural**: o nome do produto aparece no máximo 1 vez por roteiro, no bloco de solução
|
||||
- **Siglas**: toda sigla usada pela primeira vez deve vir acompanhada do nome por extenso
|
||||
|
||||
---
|
||||
|
||||
## Checklist de Qualidade
|
||||
|
||||
Antes de entregar, validar **cada roteiro**:
|
||||
|
||||
- [ ] A primeira frase **para o scroll**? (provocação, surpresa ou identificação)
|
||||
- [ ] O cenário da dor é **real e reconhecível** pelo público-alvo?
|
||||
- [ ] O produto aparece **naturalmente**, sem parecer propaganda forçada?
|
||||
- [ ] O fechamento **provoca ação** (pergunta, desafio ou escolha)?
|
||||
- [ ] O roteiro tem entre **6 e 12 frases**?
|
||||
- [ ] Cada frase tem no **máximo 15 palavras**?
|
||||
- [ ] O tom é **coloquial e direto** (não institucional)?
|
||||
- [ ] A cadeia usa **pelo menos 4 estilos diferentes**?
|
||||
- [ ] Está **LIVRE** de jargões de TI?
|
||||
- [ ] O roteiro funciona sendo **falado em voz alta**? (ler em voz alta para validar)
|
||||
|
||||
---
|
||||
|
||||
## Formato de Saída
|
||||
|
||||
O arquivo `./COMERCIAL/<nome-do-modulo>-reels.md` deve seguir esta estrutura:
|
||||
|
||||
```markdown
|
||||
# Reels — [Nome do Módulo]
|
||||
|
||||
> Cadeia de [N] roteiros sobre [tema]
|
||||
> Tom: [provocativo / educativo / humorístico]
|
||||
> Duração média: 30-60 segundos por reel
|
||||
|
||||
---
|
||||
|
||||
## 🎥 Roteiro 1 – "[Título criativo]"
|
||||
|
||||
"[Primeira frase — abertura impactante]
|
||||
|
||||
[Bloco de dor — 2-3 frases curtas]
|
||||
|
||||
[Bloco de solução — 2-3 frases com o produto]
|
||||
|
||||
[Fechamento — pergunta ou desafio]"
|
||||
|
||||
---
|
||||
|
||||
## 🎥 Roteiro 2 – "[Título criativo]"
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
- Workflow: `.agent/workflows/comercial.global.md` (descrição comercial detalhada — base de contexto)
|
||||
- Workflow: `.agent/workflows/marketing.global.md` (peças de marketing por canal)
|
||||
- Regra global: `.agent/rules/escrita-natural.global.md` (padrão obrigatório de redação)
|
||||
|
|
@ -1,257 +0,0 @@
|
|||
---
|
||||
type: workflow
|
||||
name: ux
|
||||
description: Revisar e otimizar UX de componentes e telas Vue (Frontend)
|
||||
scope: global
|
||||
updatedAt: "2026-06-01"
|
||||
---
|
||||
|
||||
# Workflow: Revisão de UX
|
||||
|
||||
Guia de revisão e otimização de interfaces Vue 3 + Vuetify 3 no ecossistema Azteca — para usuários corporativos com baixa familiaridade tecnológica.
|
||||
|
||||
---
|
||||
|
||||
## Perfil do Usuário
|
||||
|
||||
O público-alvo das interfaces é corporativo e diversificado em experiência técnica:
|
||||
|
||||
- Gestores públicos e ambientais
|
||||
- Técnicos de campo
|
||||
- Consultores ambientais
|
||||
- Operadores administrativos
|
||||
|
||||
**Premissa central**: o usuário não tem familiaridade avançada com tecnologia. A interface precisa ser autoexplicativa, sem dependência de treinamento prévio.
|
||||
|
||||
---
|
||||
|
||||
## Paleta de Cores Institucional
|
||||
|
||||
Cor base: `#688C00` (verde floresta). Três escalas derivadas: **Verde floresta** (primária), **Âmbar terroso** (apoio/aviso), **Cinza musgo** (neutros). Semânticas independentes para garantir reconhecimento universal.
|
||||
|
||||
### Escala primária — Verde floresta
|
||||
|
||||
| Token | Hex | Stop | Uso |
|
||||
|---|---|---|---|
|
||||
| `--cor-eli-primaria-bg` | `#EEF3D0` | 50 | Fundo de cards destacados, linhas ativas, hover suave |
|
||||
| `--cor-eli-primaria-zebra` | `#F6F9E8` | 30 | Linha zebrada de tabelas (quase branco esverdeado) |
|
||||
| `--cor-eli-primaria-suave` | `#BFC99C` | — | **Cabeçalho de tabela** — sage/olive mudo, sem limão, texto escuro |
|
||||
| `--cor-eli-primaria-clara` | `#D4E290` | 100 | Badges, chips, seleção, fundo de hover em listas |
|
||||
| `--cor-eli-primaria-media` | `#ADCC44` | 200 | Tags, indicadores secundários |
|
||||
| `--cor-eli-primaria-acao` | `#8AAF00` | 400 | Ação secundária, ícones ativos |
|
||||
| `--cor-eli-primaria` | `#688C00` | 600 | **Botões principais, links ativos, destaques — CTA principal** |
|
||||
| `--cor-eli-primaria-escura` | `#4A6500` | 800 | Hover em botões, bordas ativas, títulos com ênfase |
|
||||
| `--cor-eli-primaria-texto` | `#2E3F00` | 900 | Texto escuro sobre fundos claros da paleta primária |
|
||||
|
||||
### Escala de apoio — Âmbar terroso
|
||||
|
||||
| Token | Hex | Stop | Uso |
|
||||
|---|---|---|---|
|
||||
| `--cor-eli-alerta-bg` | `#FAF3DF` | 50 | Fundo de banners de aviso |
|
||||
| `--cor-eli-alerta-clara` | `#F5DC8A` | 100 | Badges de atenção, chips de alerta |
|
||||
| `--cor-eli-alerta` | `#DDB847` | 200 | Ícones de aviso, bordas de alerta |
|
||||
| `--cor-eli-alerta-forte` | `#8C6A00` | 600 | Texto sobre fundo de alerta, status pendente |
|
||||
|
||||
### Escala neutra — Cinza musgo
|
||||
|
||||
| Token | Hex | Stop | Uso |
|
||||
|---|---|---|---|
|
||||
| `--cor-eli-fundo` | `#F2F3EE` | 50 | Background geral de páginas |
|
||||
| `--cor-eli-borda` | `#D5D8CC` | 100 | Bordas padrão de containers |
|
||||
| `--cor-eli-borda-forte` | `#B5BAA8` | 200 | Bordas de foco, divisores |
|
||||
| `--cor-eli-neutro` | `#5E6553` | 600 | Textos secundários, ícones inativos |
|
||||
| `--cor-eli-neutro-escuro` | `#3E4436` | 800 | Texto de label, cabeçalhos de tabela |
|
||||
| `--cor-eli-superficie` | `#FFFFFF` | — | Cards, modais, popovers |
|
||||
|
||||
### Cores semânticas
|
||||
|
||||
| Token | Hex | Uso |
|
||||
|---|---|---|
|
||||
| `--cor-eli-sucesso` | `#2e7d32` | Confirmações, status positivo |
|
||||
| `--cor-eli-sucesso-bg` | `#E8F5E9` | Fundo de mensagens de sucesso |
|
||||
| `--cor-eli-erro` | `#c62828` | Erros, ações destrutivas |
|
||||
| `--cor-eli-erro-bg` | `#FFEBEE` | Fundo de mensagens de erro |
|
||||
| `--cor-eli-info` | `#1565c0` | Informações auxiliares |
|
||||
| `--cor-eli-info-bg` | `#E3F2FD` | Fundo de banners informativos |
|
||||
|
||||
### Regras de contraste
|
||||
|
||||
- Texto sobre `--cor-eli-primaria` (`#688C00`) deve ser **branco** (`#ffffff`) — contraste 4.6:1 ✓
|
||||
- Texto sobre `--cor-eli-primaria-bg` (`#EEF3D0`) deve ser `--cor-eli-primaria-texto` (`#2E3F00`) — contraste 12:1 ✓
|
||||
- Texto sobre `--cor-eli-primaria-escura` (`#4A6500`) deve ser **branco** (`#ffffff`) — contraste 7.1:1 ✓
|
||||
- Texto sobre `--cor-eli-alerta-bg` (`#FAF3DF`) deve ser `--cor-eli-alerta-forte` (`#8C6A00`) — contraste 5.2:1 ✓
|
||||
- Texto sobre `--cor-eli-primaria-suave` (`#BFC99C`) deve ser `--cor-eli-neutro-escuro` (`#3E4436`) — contraste ~12:1 ✓
|
||||
- **⚠️ Efeito limão**: `--cor-eli-media` (`#ADCC44`) e `--cor-eli-acao` (`#8AAF00`) têm saturação 100% no hue amarelo-verde — **nunca usar como fundo de cabeçalho**. Para fundo verde mudo, usar `--cor-eli-primaria-suave`.
|
||||
- Sempre validar contraste mínimo de **4.5:1** (WCAG AA) para texto normal e **3:1** para texto grande (18px+ ou 14px bold).
|
||||
|
||||
---
|
||||
|
||||
## Passos
|
||||
|
||||
### 1. Identificar o escopo da revisão
|
||||
|
||||
Determinar qual componente, tela ou modal será revisado. Pode ser:
|
||||
|
||||
- Um componente isolado (ex: `EliTabela`, `EliCartao`)
|
||||
- Uma página completa (ex: `PaginaCadastro.vue`)
|
||||
- Um modal ou drawer (ex: `EliTabelaModalFiltroAvancado.vue`)
|
||||
- Uma interação específica (ex: fluxo de filtro, paginação, menu de ações)
|
||||
|
||||
### 2. Mapear o estado atual
|
||||
|
||||
Antes de alterar, entender o que já existe:
|
||||
|
||||
- Ler o template (`<template>`) para entender a estrutura visual
|
||||
- Ler o CSS/SCSS associado para mapear os tokens de design em uso
|
||||
- Identificar quais componentes Vuetify estão sendo utilizados (ex: `v-btn`, `v-dialog`, `v-select`)
|
||||
- Verificar se existem estilos inline que deveriam migrar para classes CSS
|
||||
|
||||
### 3. Avaliar contra os critérios de UX
|
||||
|
||||
Para cada elemento da interface, avaliar:
|
||||
|
||||
#### Clareza
|
||||
|
||||
- [ ] O propósito de cada elemento é óbvio sem instrução?
|
||||
- [ ] Labels e placeholders são descritivos? (ex: "Buscar por nome ou CPF" vs "Buscar")
|
||||
- [ ] Ícones acompanham texto quando a ação não é universalmente reconhecível?
|
||||
- [ ] O estado vazio (empty state) orienta o usuário sobre o próximo passo?
|
||||
|
||||
#### Hierarquia visual
|
||||
|
||||
- [ ] O olho do usuário é guiado para a ação principal primeiro?
|
||||
- [ ] Ações primárias usam `--cor-eli-primaria` (`#688C00`) com destaque?
|
||||
- [ ] Ações secundárias são visuais mas não competem com a primária?
|
||||
- [ ] Ações destrutivas (Excluir, Limpar) usam `--cor-eli-erro` com variante `text` ou `outlined`?
|
||||
|
||||
#### Feedback e estados
|
||||
|
||||
- [ ] Botões têm estados claros de hover (`--cor-eli-primaria-escura`), focus e disabled (`--cor-eli-borda-forte`)?
|
||||
- [ ] Carregamentos exibem indicador visual (spinner, skeleton, barra de progresso)?
|
||||
- [ ] Erros de formulário aparecem próximos ao campo com mensagem descritiva, usando `--cor-eli-erro` + `--cor-eli-erro-bg`?
|
||||
- [ ] Sucesso de operações tem confirmação visual (snackbar, toast, badge) com `--cor-eli-sucesso`?
|
||||
|
||||
#### Densidade e espaçamento
|
||||
|
||||
- [ ] O espaçamento segue múltiplos de 4px (4, 8, 12, 16, 24, 32)?
|
||||
- [ ] Em desktop, o espaço horizontal é bem aproveitado? (ex: grids de 2+ colunas para formulários largos)
|
||||
- [ ] Em mobile, os elementos empilham verticalmente sem quebra visual?
|
||||
- [ ] Modais têm largura proporcional ao conteúdo?
|
||||
|
||||
#### Tipografia
|
||||
|
||||
- [ ] Tamanhos de fonte seguem a escala: 12px (caption), 14px (body), 16px (subtitle), 20px (title), 24px (heading)?
|
||||
- [ ] Textos longos usam `line-height: 1.5` para legibilidade?
|
||||
- [ ] Labels de formulário são visualmente distintos do conteúdo preenchido?
|
||||
|
||||
#### Acessibilidade básica
|
||||
|
||||
- [ ] Elementos interativos têm `aria-label` quando o texto visual não é suficiente?
|
||||
- [ ] Foco via teclado (`Tab`) segue uma ordem lógica?
|
||||
- [ ] Cores não são o único meio de comunicar estado (ex: ícone + cor para erro)?
|
||||
- [ ] Todo texto sobre cor primária ou escura usa branco (`#FFFFFF`)?
|
||||
- [ ] Todo texto sobre `--cor-eli-primaria-bg` usa `--cor-eli-primaria-texto` (`#2E3F00`)?
|
||||
|
||||
### 4. Aplicar padrões Vue/Vuetify do projeto
|
||||
|
||||
Ao implementar melhorias, seguir os padrões do ecossistema:
|
||||
|
||||
#### Componentes Vuetify
|
||||
|
||||
- Usar `v-btn` com variantes do tema (`color="primary"`) em vez de classes CSS manuais para botões
|
||||
- Usar `v-dialog` para modais, `v-menu` para popovers contextuais
|
||||
- Usar `v-text-field`, `v-select` etc. para inputs sempre que possível
|
||||
- Aproveitar props de Vuetify: `density`, `variant`, `rounded`, `elevation`
|
||||
|
||||
#### Iconografia — Lucide (obrigatório)
|
||||
|
||||
Todos os ícones do projeto devem vir exclusivamente da biblioteca **`@lucide/vue`** (dependência já instalada no `package.json`).
|
||||
|
||||
**Proibido**:
|
||||
- SVG inline manual (hardcoded no template)
|
||||
- Ícones de `@mdi/font` ou Material Design Icons em componentes do projeto
|
||||
- Bibliotecas alternativas (Font Awesome, Heroicons, etc.)
|
||||
|
||||
**Como usar**:
|
||||
|
||||
```vue
|
||||
<script lang="ts">
|
||||
import { Filter, Plus, X, Trash2, Eye } from "@lucide/vue"
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- Uso direto como componente -->
|
||||
<Filter :size="18" :stroke-width="2" />
|
||||
|
||||
<!-- Dentro de botão -->
|
||||
<button>
|
||||
<Plus :size="15" :stroke-width="2.5" />
|
||||
Adicionar
|
||||
</button>
|
||||
</template>
|
||||
```
|
||||
|
||||
**Props úteis**: `:size` (número em px), `:stroke-width` (espessura do traço, padrão 2), `:color` (cor do ícone).
|
||||
|
||||
**Catálogo de referência**: https://lucide.dev/icons — buscar pelo nome do ícone em inglês.
|
||||
|
||||
> Os tokens CSS estão documentados nas tabelas da seção **Paleta de Cores Institucional** acima.
|
||||
> No código, usar `var(--token, #fallback)` — sempre com fallback hardcoded em componentes de biblioteca.
|
||||
|
||||
- Classes devem seguir BEM: `eli-componente__elemento--modificador`
|
||||
- Evitar `!important` — resolver especificidade via seletor mais específico
|
||||
- Usar `var(--cor-eli-primaria)` em vez de valores hex hardcoded no CSS dos componentes
|
||||
- Transições padrão: `transition: all 0.2s ease` para hover/focus
|
||||
|
||||
#### Composição de componentes
|
||||
|
||||
- Componentes filhos devem receber dados via `props` e emitir eventos via `$emit`
|
||||
- Evitar acessar o DOM diretamente; preferir `ref` do Vue
|
||||
- Não duplicar CSS entre componentes — extrair para classe utilitária ou CSS do componente pai
|
||||
|
||||
### 5. Implementar melhorias prioritárias
|
||||
|
||||
Ordenar as melhorias por impacto no usuário:
|
||||
|
||||
1. **Crítico**: elementos que causam confusão ou impedem o uso (falta de feedback, botão invisível, estado vazio sem orientação)
|
||||
2. **Alto**: melhorias que reduzem atrito (espaçamento, hierarquia de botões, responsividade)
|
||||
3. **Médio**: refinamentos visuais (transições, micro-animações, consistência de cores)
|
||||
4. **Baixo**: polish (sombras sutis, arredondamentos, tipografia refinada)
|
||||
|
||||
### 6. Validar resultado
|
||||
|
||||
Após implementar:
|
||||
|
||||
- [ ] A tela renderiza sem erros no console?
|
||||
- [ ] Os estados (vazio, carregando, erro, com dados) estão todos cobertos?
|
||||
- [ ] A paleta de cores está coerente com a base `#688C00`?
|
||||
- [ ] Todos os tokens usados estão definidos na escala primária, de apoio ou neutra?
|
||||
- [ ] Nenhuma cor está hardcoded no CSS do componente (usar `var(--token, #fallback)`)?
|
||||
- [ ] Tokens novos têm fallback hardcoded? (ex: `var(--cor-eli-primaria-suave, #BFC99C)`)?
|
||||
- [ ] Contraste de texto validado: branco sobre `--cor-eli-primaria` e `--cor-eli-primaria-escura`; `--cor-eli-neutro-escuro` sobre `--cor-eli-primaria-suave`?
|
||||
- [ ] Nenhuma ação ficou sem feedback visual?
|
||||
- [ ] O layout não quebra em larguras menores que 1024px?
|
||||
- [ ] Componentes Vuetify recebem props de tema (`color`, `variant`) em vez de override CSS?
|
||||
- [ ] Efeito zebra de tabelas tem fundo branco explícito nas linhas normais (para funcionar sobre qualquer fundo de página)?
|
||||
|
||||
---
|
||||
|
||||
## Anti-padrões a evitar
|
||||
|
||||
| ❌ Anti-padrão | ✅ Alternativa |
|
||||
|---|---|
|
||||
| Botão sem label de texto | Botão com ícone + texto, ou `aria-label` descritivo |
|
||||
| Cor vermelha para ação primária | Vermelho apenas para destrutivas; primária usa `--cor-eli-primaria` |
|
||||
| Modal com scroll interno extenso | Dividir em etapas ou usar drawer lateral |
|
||||
| Tabela com 15+ colunas visíveis | Usar o modal de colunas para esconder as menos usadas |
|
||||
| Placeholder como único label | Label fixo acima do campo + placeholder como exemplo |
|
||||
| Ações alinhadas à esquerda em linha de tabela | Ações à direita, próximas ao fim da linha visual |
|
||||
| Toast/snackbar sem ação de fechar | Sempre incluir botão de fechar ou auto-dismiss com tempo suficiente (5s+) |
|
||||
| Estilos inline em `<template>` | Migrar para `<style scoped>` com classe BEM |
|
||||
| Cor hex hardcoded no componente | Usar `var(--cor-eli-primaria)` e demais tokens com fallback |
|
||||
| Texto escuro (`#333`) sobre `--cor-eli-primaria` | Usar branco (`#FFFFFF`) para garantir contraste WCAG AA |
|
||||
| Amarelo/âmbar para sucesso | Âmbar é reservado para **aviso**; sucesso usa `--cor-eli-sucesso` (`#2E7D32`) |
|
||||
| Misturar stops da paleta fora dos tokens | Usar apenas os tokens definidos; nunca interpolar valores avulsos |
|
||||
| Usar `--cor-eli-media` ou `--cor-eli-acao` como fundo de cabeçalho | Usar `--cor-eli-primaria-suave` (`#BFC99C`) — verde mudo sem efeito limão |
|
||||
| `var(--token)` sem fallback em componente de biblioteca | Sempre declarar `var(--token, #valor)` — o projeto destino pode não ter o token atualizado |
|
||||
| Zebra de tabela sem fundo branco explícito nas linhas normais | Declarar `.eli-tabela__tr .eli-tabela__td { background: var(--cor-eli-superficie, #fff) }` antes da regra zebra |
|
||||
371
IA.md
Normal file
371
IA.md
Normal file
|
|
@ -0,0 +1,371 @@
|
|||
# IA.md — Guia para IAs (consumidoras) do pacote `eli-vue`
|
||||
|
||||
Este arquivo existe para **IAs e automações** que precisam **importar e usar** o pacote `eli-vue` em projetos Vue 3.
|
||||
|
||||
> Fonte da verdade das regras internas do repositório: **`.agent`**.
|
||||
> Este `IA.md` é focado no **uso do pacote como dependência** (projeto consumidor).
|
||||
|
||||
---
|
||||
|
||||
## O que é o `eli-vue`
|
||||
|
||||
Biblioteca (Design System) de componentes para **Vue 3** com **TypeScript** e integração com **Vuetify 3**.
|
||||
|
||||
### Premissas importantes
|
||||
|
||||
- O `eli-vue` **não cria** nem configura Vuetify no seu projeto.
|
||||
- `vue` e `vuetify` são **peerDependencies**: o projeto consumidor precisa ter ambos instalados.
|
||||
|
||||
---
|
||||
|
||||
## Instalação (projeto consumidor)
|
||||
|
||||
> Preferência do repo: `pnpm`.
|
||||
|
||||
```bash
|
||||
pnpm add eli-vue
|
||||
```
|
||||
|
||||
Se o projeto ainda não tiver as peer dependencies, instale também:
|
||||
|
||||
```bash
|
||||
pnpm add vue vuetify
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Uso recomendado
|
||||
|
||||
### 1) Registro global via plugin (recomendado)
|
||||
|
||||
```ts
|
||||
import { createApp } from "vue";
|
||||
import App from "./App.vue";
|
||||
|
||||
// Vuetify
|
||||
import "vuetify/styles";
|
||||
import { createVuetify } from "vuetify";
|
||||
|
||||
// eli-vue
|
||||
import EliVue from "eli-vue";
|
||||
import "eli-vue/dist/eli-vue.css";
|
||||
|
||||
const vuetify = createVuetify({});
|
||||
|
||||
createApp(App)
|
||||
.use(vuetify)
|
||||
.use(EliVue)
|
||||
.mount("#app");
|
||||
```
|
||||
|
||||
### 2) Importação direta (quando não quiser plugin)
|
||||
|
||||
```ts
|
||||
import {
|
||||
EliBotao,
|
||||
EliBadge,
|
||||
EliCartao,
|
||||
EliTabela,
|
||||
EliEntradaTexto,
|
||||
EliEntradaNumero,
|
||||
EliEntradaDataHora,
|
||||
EliEntradaParagrafo,
|
||||
EliEntradaSelecao,
|
||||
} from "eli-vue";
|
||||
```
|
||||
|
||||
> Observação: ainda pode ser necessário importar o CSS do pacote:
|
||||
|
||||
```ts
|
||||
import "eli-vue/dist/eli-vue.css";
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Exemplos mínimos
|
||||
|
||||
### Botão
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<EliBotao @click="salvar">Salvar</EliBotao>
|
||||
</template>
|
||||
```
|
||||
|
||||
### Entradas (EliEntrada*) com v-model
|
||||
|
||||
O `eli-vue` usa uma família de componentes `EliEntrada*` (em vez do antigo `EliInput`).
|
||||
|
||||
#### Texto
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<EliEntradaTexto
|
||||
v-model:value="nome"
|
||||
:opcoes="{ rotulo: 'Nome', placeholder: 'Digite seu nome' }"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from "vue";
|
||||
|
||||
export default defineComponent({
|
||||
setup() {
|
||||
const nome = ref<string | null>("");
|
||||
return { nome };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
#### Parágrafo (textarea)
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<EliEntradaParagrafo
|
||||
v-model:value="descricao"
|
||||
:opcoes="{ rotulo: 'Descrição', placeholder: 'Digite...', linhas: 5 }"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from "vue";
|
||||
|
||||
export default defineComponent({
|
||||
setup() {
|
||||
const descricao = ref<string | null>("");
|
||||
return { descricao };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
#### Seleção (select)
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<EliEntradaSelecao
|
||||
v-model:value="categoria"
|
||||
:opcoes="{
|
||||
rotulo: 'Categoria',
|
||||
placeholder: 'Selecione...',
|
||||
itens: async () => [
|
||||
{ chave: 'a', rotulo: 'Categoria A' },
|
||||
{ chave: 'b', rotulo: 'Categoria B' },
|
||||
],
|
||||
}"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from "vue";
|
||||
|
||||
export default defineComponent({
|
||||
setup() {
|
||||
const categoria = ref<string | null>(null);
|
||||
return { categoria };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
#### Texto com formato/máscara
|
||||
|
||||
> Regra importante: o `value` emitido é **sempre o texto formatado** (igual ao que aparece no input).
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<EliEntradaTexto
|
||||
v-model:value="documento"
|
||||
:opcoes="{ rotulo: 'CPF/CNPJ', formato: 'cpfCnpj' }"
|
||||
/>
|
||||
|
||||
<EliEntradaTexto
|
||||
v-model:value="telefone"
|
||||
:opcoes="{ rotulo: 'Telefone', formato: 'telefone' }"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from "vue";
|
||||
export default defineComponent({
|
||||
setup() {
|
||||
const documento = ref<string | null>("");
|
||||
const telefone = ref<string | null>("");
|
||||
return { documento, telefone };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
### Data e hora (entrada) com suporte a UTC/Z
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<!-- Valor chega do backend em ISO 8601 (UTC/offset), e o componente exibe em horário local -->
|
||||
<EliEntradaDataHora v-model:value="dataHora" :opcoes="{ rotulo: 'Agendamento' }" />
|
||||
|
||||
<!-- Somente data -->
|
||||
<EliEntradaDataHora v-model:value="data" :opcoes="{ rotulo: 'Nascimento', modo: 'data' }" />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from "vue";
|
||||
|
||||
export default defineComponent({
|
||||
setup() {
|
||||
const dataHora = ref<string | null>("2026-01-09T16:15:00Z");
|
||||
const data = ref<string | null>("2026-01-09T00:00:00-03:00");
|
||||
return { dataHora, data };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## EliTabela (com filtro avançado)
|
||||
|
||||
O componente `EliTabela` suporta:
|
||||
- ordenação
|
||||
- paginação
|
||||
- caixa de busca
|
||||
- **filtro avançado (modal)**
|
||||
|
||||
### Contrato da tabela (resumo)
|
||||
|
||||
O tipo principal é `EliTabelaConsulta<T>` (genérico), exportado de `eli-vue`.
|
||||
|
||||
O `filtroAvancado` é uma lista de filtros pré-definidos (o usuário só escolhe quais usar e informa valores):
|
||||
|
||||
```ts
|
||||
filtroAvancado?: {
|
||||
rotulo: string
|
||||
coluna: keyof T
|
||||
operador: string // ex.: "like", "=", ">", "in", "isNull"
|
||||
entrada: ["texto" | "numero" | "dataHora", { rotulo: string; ... }]
|
||||
}[]
|
||||
```
|
||||
|
||||
### Exemplo mínimo
|
||||
|
||||
```ts
|
||||
import { EliTabela, celulaTabela } from "eli-vue";
|
||||
import type { EliTabelaConsulta } from "eli-vue";
|
||||
import type { ComponenteEntrada } from "eli-vue/dist/types/componentes/EliEntrada/tiposEntradas";
|
||||
|
||||
type Linha = { nome: string; documento: string; email: string };
|
||||
|
||||
const tabela: EliTabelaConsulta<Linha> = {
|
||||
nome: "Exemplo",
|
||||
mostrarCaixaDeBusca: true,
|
||||
registros_por_consulta: 10,
|
||||
colunas: [
|
||||
{ rotulo: "Nome", celula: (l) => celulaTabela("textoSimples", { texto: l.nome }), visivel: true },
|
||||
],
|
||||
filtroAvancado: [
|
||||
{
|
||||
rotulo: "Documento",
|
||||
coluna: "documento",
|
||||
operador: "like",
|
||||
entrada: ["texto", { rotulo: "Documento", formato: "cpfCnpj" }] as unknown as ComponenteEntrada,
|
||||
},
|
||||
],
|
||||
consulta: async () => ({
|
||||
cod: 0,
|
||||
eCerto: true,
|
||||
eErro: false,
|
||||
mensagem: undefined,
|
||||
valor: { quantidade: 0, valores: [] },
|
||||
}),
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Células da EliTabela (celulaTabela)
|
||||
|
||||
O `eli-vue` expõe o helper `celulaTabela(tipo, dados)` para construir células tipadas.
|
||||
|
||||
Tipos disponíveis atualmente:
|
||||
|
||||
- `textoSimples`: `{ texto: string; acao?: () => void }`
|
||||
- `textoTruncado`: `{ texto: string; acao?: () => void }`
|
||||
- `numero`: `{ numero: number; prefixo?: string; sufixo?: string; acao?: () => void }`
|
||||
- `tags`: `{ opcoes: { rotulo: string; cor?: string; icone?: LucideIcon; acao?: () => void }[] }`
|
||||
- `data`: `{ valor: string; formato: "data" | "data_hora" | "relativo"; acao?: () => void }`
|
||||
|
||||
### Exemplo: célula `tags`
|
||||
|
||||
```ts
|
||||
import { celulaTabela } from "eli-vue";
|
||||
import { BadgeCheck, Pencil } from "lucide-vue-next";
|
||||
|
||||
celula: (l) =>
|
||||
celulaTabela("tags", {
|
||||
opcoes: [
|
||||
{ rotulo: "Ativo", cor: "success", icone: BadgeCheck },
|
||||
{ rotulo: "Editar", cor: "primary", icone: Pencil, acao: () => editar(l) },
|
||||
],
|
||||
})
|
||||
```
|
||||
|
||||
### Exemplo: célula `data`
|
||||
|
||||
```ts
|
||||
import { celulaTabela } from "eli-vue";
|
||||
|
||||
celula: (l) =>
|
||||
celulaTabela("data", {
|
||||
valor: l.criado_em, // ISO
|
||||
formato: "data", // "data" | "data_hora" | "relativo"
|
||||
})
|
||||
```
|
||||
|
||||
> Observação: em modo simulação/local, a tabela pode buscar uma lista completa e aplicar filtro/paginação localmente.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting (para IAs)
|
||||
|
||||
### 1) “Failed to resolve component”
|
||||
|
||||
Provável causa: componente não foi registrado.
|
||||
|
||||
- Se estiver usando plugin: confirme `app.use(EliVue)`
|
||||
- Se estiver importando direto: registre localmente no componente
|
||||
|
||||
### 2) Estilos não aplicam
|
||||
|
||||
Confirme que o projeto importou:
|
||||
|
||||
- `vuetify/styles`
|
||||
- `eli-vue/dist/eli-vue.css`
|
||||
|
||||
### 3) Ícones não aparecem
|
||||
|
||||
Alguns exemplos usam `<v-icon>` (MDI). O `eli-vue` **não instala** ícones automaticamente no projeto consumidor.
|
||||
|
||||
---
|
||||
|
||||
## Como a IA deve agir ao modificar um projeto consumidor
|
||||
|
||||
Quando for integrar `eli-vue` num projeto existente:
|
||||
|
||||
1) Verifique se **Vue 3** e **Vuetify 3** já estão configurados.
|
||||
2) Prefira usar o **plugin** do `eli-vue` (simplifica registro).
|
||||
3) Garanta o import do CSS do pacote (`eli-vue/dist/eli-vue.css`).
|
||||
4) Ao ver erros de tipos, valide se o projeto está usando TypeScript e se o build está resolvendo `types` corretamente.
|
||||
|
||||
---
|
||||
|
||||
## Quando este arquivo deve ser atualizado
|
||||
|
||||
Atualize este `IA.md` quando houver mudanças em qualquer um destes pontos:
|
||||
|
||||
- caminho/nome do CSS em `dist/`
|
||||
- forma de instalação e/ou peerDependencies
|
||||
- forma de uso do plugin/export principal
|
||||
- lista de exports públicos (novos componentes, renomes, remoções)
|
||||
- mudanças de comportamento relevantes para consumo
|
||||
17
biome.json
17
biome.json
|
|
@ -1,17 +0,0 @@
|
|||
{
|
||||
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
|
||||
"extends": ["./node_modules/p-comuns/Documentos/biome.json"],
|
||||
"files": {
|
||||
"includes": ["src/**/*.{js,ts,jsx,tsx,vue}"]
|
||||
},
|
||||
"linter": {
|
||||
"rules": {
|
||||
"suspicious": {
|
||||
"noExplicitAny": "error"
|
||||
},
|
||||
"style": {
|
||||
"noNonNullAssertion": "error"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
bun audit v1.4.2 (744846f84)
|
||||
|
||||
No vulnerabilities found (checked 358 packages) [259.00ms]
|
||||
827
bun.lock
827
bun.lock
|
|
@ -1,827 +0,0 @@
|
|||
{
|
||||
"lockfileVersion": 2,
|
||||
"configVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "eli-vue",
|
||||
"dependencies": {
|
||||
"@lucide/vue": "^1.16.0",
|
||||
"alasql": "^4.17.3",
|
||||
"cross-fetch": "^4.1.0",
|
||||
"dayjs": "^1.11.19",
|
||||
"p-comuns": "git+https://git2.idz.one/publico/_comuns.git",
|
||||
"p-respostas": "git+https://git2.idz.one/publico/_respostas.git",
|
||||
"uuid": "^13.0.0",
|
||||
"zod": "4.4.3",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^2",
|
||||
"@mdi/font": "^7.4.47",
|
||||
"@types/leaflet": "^1.9.21",
|
||||
"@vitejs/plugin-vue": "^5.0.0",
|
||||
"leaflet": "^1.9.4",
|
||||
"sass": "^1.94.2",
|
||||
"typescript": "^7",
|
||||
"vite": "^6.0.0",
|
||||
"vite-plugin-css-injected-by-js": "^3.5.2",
|
||||
"vite-plugin-vuetify": "^2.1.2",
|
||||
"vue": "^3.5.34",
|
||||
"vue-tsc": "^3.1.6",
|
||||
"vuetify": "^3.12.6",
|
||||
},
|
||||
"peerDependencies": {
|
||||
"leaflet": "^1.9.0",
|
||||
"vue": "^3.4.0",
|
||||
"vuetify": "^3.0.0",
|
||||
},
|
||||
},
|
||||
},
|
||||
"overrides": {
|
||||
"nanoid": "^3.3.18",
|
||||
},
|
||||
"packages": {
|
||||
"@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
|
||||
|
||||
"@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
|
||||
|
||||
"@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="],
|
||||
|
||||
"@babel/generator": ["@babel/generator@7.29.8", "", { "dependencies": { "@babel/parser": "^7.29.8", "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="],
|
||||
|
||||
"@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="],
|
||||
|
||||
"@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="],
|
||||
|
||||
"@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="],
|
||||
|
||||
"@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="],
|
||||
|
||||
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
|
||||
|
||||
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
|
||||
|
||||
"@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="],
|
||||
|
||||
"@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="],
|
||||
|
||||
"@babel/parser": ["@babel/parser@7.29.9", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA=="],
|
||||
|
||||
"@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
|
||||
|
||||
"@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
|
||||
|
||||
"@babel/traverse": ["@babel/traverse@7.29.8", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="],
|
||||
|
||||
"@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="],
|
||||
|
||||
"@biomejs/biome": ["@biomejs/biome@2.5.14", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.14", "@biomejs/cli-darwin-x64": "2.5.14", "@biomejs/cli-linux-arm64": "2.5.14", "@biomejs/cli-linux-arm64-musl": "2.5.14", "@biomejs/cli-linux-x64": "2.5.14", "@biomejs/cli-linux-x64-musl": "2.5.14", "@biomejs/cli-win32-arm64": "2.5.14", "@biomejs/cli-win32-x64": "2.5.14" }, "bin": { "biome": "bin/biome" } }, "sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw=="],
|
||||
|
||||
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ=="],
|
||||
|
||||
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA=="],
|
||||
|
||||
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q=="],
|
||||
|
||||
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ=="],
|
||||
|
||||
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.14", "", { "os": "linux", "cpu": "x64" }, "sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA=="],
|
||||
|
||||
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.14", "", { "os": "linux", "cpu": "x64" }, "sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg=="],
|
||||
|
||||
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg=="],
|
||||
|
||||
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.14", "", { "os": "win32", "cpu": "x64" }, "sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ=="],
|
||||
|
||||
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
|
||||
|
||||
"@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
|
||||
|
||||
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
|
||||
|
||||
"@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
|
||||
|
||||
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
|
||||
|
||||
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
|
||||
|
||||
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
|
||||
|
||||
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
|
||||
|
||||
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
|
||||
|
||||
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
|
||||
|
||||
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
|
||||
|
||||
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
|
||||
|
||||
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
|
||||
|
||||
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
|
||||
|
||||
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
|
||||
|
||||
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
|
||||
|
||||
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
|
||||
|
||||
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
|
||||
|
||||
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
|
||||
|
||||
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
|
||||
|
||||
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
|
||||
|
||||
"@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
|
||||
|
||||
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
|
||||
|
||||
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
|
||||
|
||||
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
|
||||
|
||||
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
|
||||
|
||||
"@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="],
|
||||
|
||||
"@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="],
|
||||
|
||||
"@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="],
|
||||
|
||||
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
|
||||
|
||||
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
|
||||
|
||||
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
|
||||
|
||||
"@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="],
|
||||
|
||||
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="],
|
||||
|
||||
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
|
||||
|
||||
"@lucide/vue": ["@lucide/vue@1.48.0", "", { "peerDependencies": { "vue": ">=3.0.1" } }, "sha512-3/Nwx/RsqQ4ZrrSML1GNsSWCSDyLnBgoF/eEr1q9G6iZymn3+WKtzIj7Dbc/Nxrt9WOPuGrJ58S+CBiamK+36w=="],
|
||||
|
||||
"@mdi/font": ["@mdi/font@7.4.47", "", {}, "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw=="],
|
||||
|
||||
"@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="],
|
||||
|
||||
"@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="],
|
||||
|
||||
"@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.6.0", "", { "os": "android", "cpu": "arm64" }, "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA=="],
|
||||
|
||||
"@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw=="],
|
||||
|
||||
"@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw=="],
|
||||
|
||||
"@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.6.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ=="],
|
||||
|
||||
"@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg=="],
|
||||
|
||||
"@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw=="],
|
||||
|
||||
"@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g=="],
|
||||
|
||||
"@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA=="],
|
||||
|
||||
"@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A=="],
|
||||
|
||||
"@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw=="],
|
||||
|
||||
"@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ=="],
|
||||
|
||||
"@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="],
|
||||
|
||||
"@react-native/asset-utils": ["@react-native/asset-utils@0.87.1", "", {}, "sha512-FeFnbn9ENPs7IVBzZt1bBWfiRGvT4q+CsWwXGFyKVW/1ol3ylBRuTtXBGHIAmcNN4fUR60nSXsCN19pzNHkPgA=="],
|
||||
|
||||
"@react-native/codegen": ["@react-native/codegen@0.87.1", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.29.0", "hermes-parser": "0.36.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "tinyglobby": "^0.2.15", "yargs": "^17.6.2" } }, "sha512-qbaqEdlUfj2vRgvWTpMoNgHnEqAhAYJLUrpGkb0WC9n0kdtqUvgigpz4bDktZwolM9BemXwgGFgyiAnbs3t0xw=="],
|
||||
|
||||
"@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.87.1", "", { "dependencies": { "@react-native/asset-utils": "0.87.1", "@react-native/dev-middleware": "0.87.1", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.87.0", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "0.87.1" }, "optionalPeers": ["@react-native-community/cli", "@react-native/metro-config"] }, "sha512-aGBae6v+ngy8fIpU1EOaVxn/8DOgmJNphEdn5Eb0wTchUCxr8bDjpTJYNdrptyn3qI/elk8r9agQ2OBaFvrRlw=="],
|
||||
|
||||
"@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.87.1", "", {}, "sha512-RNm7soJB+8YSauLnsCCylA1eVfT6JWaDTPUEF01uu9YwDyZ7remKlZbXtmVbtscbNGcp+hbI4iZUdVOpQWsHuA=="],
|
||||
|
||||
"@react-native/debugger-shell": ["@react-native/debugger-shell@0.87.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "debug": "^4.4.0", "fb-dotslash": "0.5.8" } }, "sha512-eNbKjcnseJIjy5XCDwyhKOT1ngOg3Dv1fVxTDtnVFqdqjqsbfY4v9JuJG1RZJ7+mFoRRe05HE8GSQU8B7n5xwQ=="],
|
||||
|
||||
"@react-native/dev-middleware": ["@react-native/dev-middleware@0.87.1", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.87.1", "@react-native/debugger-shell": "0.87.1", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.3.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^7.5.10" } }, "sha512-KgvAGUaVl6/XrWFAPK8e0ojDRbsdBjr4bnwyn6PC3CwxPQc5iv+i7hMoUwYS8ORSkHKfjt+cV86/mBQ4lG8yfA=="],
|
||||
|
||||
"@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.87.1", "", {}, "sha512-bZ5X2BNxaSlfp2KlDtUM910QqW9G1yTIeZXghuv4ag8SAQLzm5Mf9j5GjJfT6ax2Qo2aRT15Vi3Tro/yLGJstA=="],
|
||||
|
||||
"@react-native/normalize-colors": ["@react-native/normalize-colors@0.87.1", "", {}, "sha512-8+AutemzX+a7cuKgTUyb7JUk3sFYgLyrSnlTLrL6LuW/LKDE+FYE8lJGWYhJPJcE51Ge1D8yRzxgQEdEFZtuIw=="],
|
||||
|
||||
"@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.87.1", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.2.0", "react": "*", "react-native": "0.87.1" }, "optionalPeers": ["@types/react"] }, "sha512-qSZjeX3UJrDvyfjf7yc3E68rp1XnzE+5nu8ImklhkVC0+p/XiaHPb/KGkRqDdnQyWHN55BRYSsCMEwgVI6WRNQ=="],
|
||||
|
||||
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.5", "", { "os": "android", "cpu": "arm" }, "sha512-J25QJU+B78T4FhhBsNpLJyVWOi31mwtpcMwywHmOKH65Q9IWGA81gPj+dnwlhU8wktVriYE+tFAaQgrnJRzAZg=="],
|
||||
|
||||
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.5", "", { "os": "android", "cpu": "arm64" }, "sha512-LDopB3zuZM5Ux9TT2luNEBJW/tYbGU2g1d+VpKk6I+gSKDb+/7sYE6M225gRQt4RbMX6MSwMsVR/phdjVUgRLg=="],
|
||||
|
||||
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wlJEERGfeuHeBavCL2qVnNacOK43NDoZM4sjkeRPymd04OAE9T1zBqDJgmZ+CIsPTYKwdzpUC8vmOw84dwY4Tg=="],
|
||||
|
||||
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-4nJJGg5jbo2wwPP4JP+LfEBA3bvP8rU9CLuhp7jWvq9sxEyhjQFTFdrqi+/dHEin/pd8jpT0vcehIpnZtmEdcQ=="],
|
||||
|
||||
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-DrZbyCDF1hneuO6jRbvZ2D7+PIBM6yIwYnJpg2vIk58T+wuFpiaGZrfUr59lDWw45bg+IrpTGLPiNi/Fk4w3Cg=="],
|
||||
|
||||
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-gqfUVMJMB3mehqywxp6hTBFfgtMQykZY19+cfiaYP0toIJLb/1DZRJHVkQQGP13W4TAwfZDWeg1qBcheTRioXQ=="],
|
||||
|
||||
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.5", "", { "os": "linux", "cpu": "arm" }, "sha512-CFmhpvAwzSaWMlN3VN7UtmoTihlZNzoP0juQib5TQRnYUyDV8dXeWOp29sobWAT6gXl/hQgAClLlEiYozQG3OQ=="],
|
||||
|
||||
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Uc9H8eXCOayV6JLTH5bXKMId6qbhNHa818/BgYjm4jrlq3vZquC9cqyvHBw17xy5Mnj5f+I3gFK5JcEf3hSqrw=="],
|
||||
|
||||
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-VcPr/szv/1BFw112Kt//fxulXt/JPqzzidU84iW68L2DdjnOO8QFUv2zTSYBEPHD6movBD4z+bbr5y60GYM7Jw=="],
|
||||
|
||||
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-BnxtJ5/91BrIHYIkGrmjz/lbMhqEHt1dPFqIxIFR+jPn0xVc/oUSCtIT089zfp5ufwGDlYz2UC+Fe1SRBpYFbQ=="],
|
||||
|
||||
"@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.5", "", { "os": "linux", "cpu": "none" }, "sha512-LrYcHZwF+fAMNKHYTOQ5osWM4AZF7YF6D+XtsjDyEvljtt11twc+zHVXBLNEjxVSUnKYsOhvVz4Z213eW02COQ=="],
|
||||
|
||||
"@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.5", "", { "os": "linux", "cpu": "none" }, "sha512-nj7QKQePAAUpCpJHtg0pR0W/b92A9NO17JS3BAQmHDn/yhmkir2p8llrKY9TOhleKIaSzy1JhxS3T9FVld6coA=="],
|
||||
|
||||
"@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-5ylkX6dWMeBKge9nTU+Rxfb+ZfaCIJ9lRqIFaK0eAMcWp7OJbYnLveLgXmm0VrvuLKb8qIK+mHyH0qu88RM+iA=="],
|
||||
|
||||
"@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-oHK4ZHYFDKjZviK34I+NwgfbGxgI7ztrNxj2hPTSSNFgeq1a/lEd7dHV2fdGAuTH4Iym3RHJg+vAbWaWG4B7Zg=="],
|
||||
|
||||
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.5", "", { "os": "linux", "cpu": "none" }, "sha512-UcetmHZ6XOXuUByiKZyQmb55ZPr0LABr3Ec/HB9wKZn6CEAFWZkE+hsJErJ9hbPBC7nI0dKuELx7CoV6IM7TMg=="],
|
||||
|
||||
"@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.5", "", { "os": "linux", "cpu": "none" }, "sha512-C5CmDPQBtvjVo8cgQsBs+w6WB0JLkiixhgi6hVLV11hERWdn/p0XcPU2OUcZzac9BPOFq7SbaHFa8r3SWEysCQ=="],
|
||||
|
||||
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-lHVQHJFKsuuxLMi3MQO9XVL8Tje3JR82CzB+QDKC5NWBcsIWuwsn9uIM5e3lBhI+fF1/s63qnyYqsg65+8rV/w=="],
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.5", "", { "os": "linux", "cpu": "x64" }, "sha512-3W9bTFcQNJn71cSJVM9RKIiZOy8DO/XLDii8Uv/Pm6WKqDRj7JV3ZfuXIEfyuy5LXpIzAbB/1M4Ukp9GKNa7nA=="],
|
||||
|
||||
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.5", "", { "os": "linux", "cpu": "x64" }, "sha512-VDC7rRJlee/scpki96GZ27Omf6yU87s1YXwVTpjE5841faVlDYYT565rgfmoR1U0sqL7z5ivQSDjcsF6VRXyBA=="],
|
||||
|
||||
"@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-z86Ok2p4pTdv5xqCKZsTooO7yBEiaJR/HzU3Wx8RmWsPoLppnMKROhJusQob8B3IE1ghC343kUW9rC2r+Wf3ig=="],
|
||||
|
||||
"@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.5", "", { "os": "none", "cpu": "arm64" }, "sha512-IzQmj+xXwQFGhMAMKMQVXkMwMZN3TqkJgAE0nSsqvVwWWciP4AIPMmWRqOQ2GfX7TUDZr+xqGFcBS36CRPGw0g=="],
|
||||
|
||||
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-F6qpTaPc9bwBH85kjy0/BLmLSW1uv7AoOXCoRIkg2arlgCYlWYcAbiMkvZuAcaWk9TpCRG//okznLAqLGshkMw=="],
|
||||
|
||||
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-igoDsTFhhwECBeGbUuLeIk7t8Y1apa+cs6mDWpx2EZ0ch7oEQgzHbFUXN9euoHekCAQzXdXApAGkV6jznS7tWw=="],
|
||||
|
||||
"@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.5", "", { "os": "win32", "cpu": "x64" }, "sha512-U3teMeMbXFmaM5D+OTJpsOXd+wV/qftIeYF9kBKL4v73641qyJmoXFtA28DQLsnmlyayEsTe72xpLHrArq6vHw=="],
|
||||
|
||||
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.5", "", { "os": "win32", "cpu": "x64" }, "sha512-ypfC34F3RKXvCXBglGqGMsUSMKlgwd1HX9AOAlx9RoZZ6GaI42YHVeKpzg3JG+wpBUJYTG+NNZhqbDWL8tBZkw=="],
|
||||
|
||||
"@sinclair/typebox": ["@sinclair/typebox@0.27.12", "", {}, "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g=="],
|
||||
|
||||
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
|
||||
|
||||
"@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
|
||||
|
||||
"@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="],
|
||||
|
||||
"@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="],
|
||||
|
||||
"@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="],
|
||||
|
||||
"@types/leaflet": ["@types/leaflet@1.9.22", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-h3lhECYEKDasG7LFHu+GiHqAvsgLuQvlJvVZzJDGONo3sEL+wUOqSFLnwkZlK0qVxnxbuGFW8iBlJNYs5wgndA=="],
|
||||
|
||||
"@types/node": ["@types/node@26.6.3", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg=="],
|
||||
|
||||
"@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="],
|
||||
|
||||
"@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="],
|
||||
|
||||
"@typescript/typescript-aix-ppc64": ["@typescript/typescript-aix-ppc64@7.0.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ=="],
|
||||
|
||||
"@typescript/typescript-darwin-arm64": ["@typescript/typescript-darwin-arm64@7.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA=="],
|
||||
|
||||
"@typescript/typescript-darwin-x64": ["@typescript/typescript-darwin-x64@7.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA=="],
|
||||
|
||||
"@typescript/typescript-freebsd-arm64": ["@typescript/typescript-freebsd-arm64@7.0.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ=="],
|
||||
|
||||
"@typescript/typescript-freebsd-x64": ["@typescript/typescript-freebsd-x64@7.0.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw=="],
|
||||
|
||||
"@typescript/typescript-linux-arm": ["@typescript/typescript-linux-arm@7.0.2", "", { "os": "linux", "cpu": "arm" }, "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ=="],
|
||||
|
||||
"@typescript/typescript-linux-arm64": ["@typescript/typescript-linux-arm64@7.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ=="],
|
||||
|
||||
"@typescript/typescript-linux-loong64": ["@typescript/typescript-linux-loong64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ=="],
|
||||
|
||||
"@typescript/typescript-linux-mips64el": ["@typescript/typescript-linux-mips64el@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA=="],
|
||||
|
||||
"@typescript/typescript-linux-ppc64": ["@typescript/typescript-linux-ppc64@7.0.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA=="],
|
||||
|
||||
"@typescript/typescript-linux-riscv64": ["@typescript/typescript-linux-riscv64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ=="],
|
||||
|
||||
"@typescript/typescript-linux-s390x": ["@typescript/typescript-linux-s390x@7.0.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw=="],
|
||||
|
||||
"@typescript/typescript-linux-x64": ["@typescript/typescript-linux-x64@7.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A=="],
|
||||
|
||||
"@typescript/typescript-netbsd-arm64": ["@typescript/typescript-netbsd-arm64@7.0.2", "", { "os": "none", "cpu": "arm64" }, "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA=="],
|
||||
|
||||
"@typescript/typescript-netbsd-x64": ["@typescript/typescript-netbsd-x64@7.0.2", "", { "os": "none", "cpu": "x64" }, "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA=="],
|
||||
|
||||
"@typescript/typescript-openbsd-arm64": ["@typescript/typescript-openbsd-arm64@7.0.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ=="],
|
||||
|
||||
"@typescript/typescript-openbsd-x64": ["@typescript/typescript-openbsd-x64@7.0.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg=="],
|
||||
|
||||
"@typescript/typescript-sunos-x64": ["@typescript/typescript-sunos-x64@7.0.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g=="],
|
||||
|
||||
"@typescript/typescript-win32-arm64": ["@typescript/typescript-win32-arm64@7.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ=="],
|
||||
|
||||
"@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="],
|
||||
|
||||
"@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="],
|
||||
|
||||
"@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="],
|
||||
|
||||
"@volar/source-map": ["@volar/source-map@2.4.28", "", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="],
|
||||
|
||||
"@volar/typescript": ["@volar/typescript@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="],
|
||||
|
||||
"@vue/compiler-core": ["@vue/compiler-core@3.5.43", "", { "dependencies": { "@babel/parser": "^7.29.8", "@vue/shared": "3.5.43", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg=="],
|
||||
|
||||
"@vue/compiler-dom": ["@vue/compiler-dom@3.5.43", "", { "dependencies": { "@vue/compiler-core": "3.5.43", "@vue/shared": "3.5.43" } }, "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ=="],
|
||||
|
||||
"@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.43", "", { "dependencies": { "@babel/parser": "^7.29.8", "@vue/compiler-core": "3.5.43", "@vue/compiler-dom": "3.5.43", "@vue/compiler-ssr": "3.5.43", "@vue/shared": "3.5.43", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.28", "source-map-js": "^1.2.1" } }, "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ=="],
|
||||
|
||||
"@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.43", "", { "dependencies": { "@vue/compiler-dom": "3.5.43", "@vue/shared": "3.5.43" } }, "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg=="],
|
||||
|
||||
"@vue/language-core": ["@vue/language-core@3.3.11", "", { "dependencies": { "@volar/language-core": "2.4.28", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.2.1", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.4" } }, "sha512-QJmpliwAVpC/OxubIByPAhNzsQPRc8/gxlN2qnVzVfIMjMDz/9RnXRFoetjz5yEgXVXyp4LqhXq3V53PjmNzFw=="],
|
||||
|
||||
"@vue/reactivity": ["@vue/reactivity@3.5.43", "", { "dependencies": { "@vue/shared": "3.5.43" } }, "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA=="],
|
||||
|
||||
"@vue/runtime-core": ["@vue/runtime-core@3.5.43", "", { "dependencies": { "@vue/reactivity": "3.5.43", "@vue/shared": "3.5.43" } }, "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw=="],
|
||||
|
||||
"@vue/runtime-dom": ["@vue/runtime-dom@3.5.43", "", { "dependencies": { "@vue/reactivity": "3.5.43", "@vue/runtime-core": "3.5.43", "@vue/shared": "3.5.43", "csstype": "^3.2.3" } }, "sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw=="],
|
||||
|
||||
"@vue/server-renderer": ["@vue/server-renderer@3.5.43", "", { "dependencies": { "@vue/compiler-ssr": "3.5.43", "@vue/runtime-dom": "3.5.43", "@vue/shared": "3.5.43" } }, "sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ=="],
|
||||
|
||||
"@vue/shared": ["@vue/shared@3.5.43", "", {}, "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q=="],
|
||||
|
||||
"@vuetify/loader-shared": ["@vuetify/loader-shared@2.1.2", "", { "dependencies": { "upath": "^2.0.1" }, "peerDependencies": { "vue": "^3.0.0", "vuetify": ">=3" } }, "sha512-X+1jBLmXHkpQEnC0vyOb4rtX2QSkBiFhaFXz8yhQqN2A4vQ6k2nChxN4Ol7VAY5KoqMdFoRMnmNdp/1qYXDQig=="],
|
||||
|
||||
"accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
|
||||
|
||||
"acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="],
|
||||
|
||||
"agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
|
||||
|
||||
"alasql": ["alasql@4.19.1", "", { "dependencies": { "cross-fetch": "4.1.0", "yargs": "16" }, "optionalDependencies": { "react-native-fs": "^2.20.0" }, "bin": { "alasql": "bin/alasql-cli.js" } }, "sha512-SyI0oN/IU31/Lv8q4xmTo4Oo+sWKgTM9bDvJ+7SVdAh/tf100ppF/UqZKlDjeKyr+/JfWSFGft14HmQpXzYLOg=="],
|
||||
|
||||
"alien-signals": ["alien-signals@3.2.1", "", {}, "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g=="],
|
||||
|
||||
"anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="],
|
||||
|
||||
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
|
||||
|
||||
"asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="],
|
||||
|
||||
"babel-plugin-syntax-hermes-parser": ["babel-plugin-syntax-hermes-parser@0.36.1", "", { "dependencies": { "hermes-parser": "0.36.1" } }, "sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA=="],
|
||||
|
||||
"base-64": ["base-64@0.1.0", "", {}, "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA=="],
|
||||
|
||||
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
|
||||
|
||||
"baseline-browser-mapping": ["baseline-browser-mapping@2.11.26", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ=="],
|
||||
|
||||
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
||||
|
||||
"browserslist": ["browserslist@4.29.1", "", { "dependencies": { "baseline-browser-mapping": "^2.11.25", "caniuse-lite": "^1.0.30001810", "electron-to-chromium": "^1.5.438", "node-releases": "^2.0.57", "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-AUdjuRyCNGUYtqpqfTmWyM4fXay8yIQhmLnvYe/THMGfT9B/34X7xQd3ifKxwyNPPpowVBjLb+64BN9Rn1mizw=="],
|
||||
|
||||
"bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="],
|
||||
|
||||
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
|
||||
|
||||
"camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="],
|
||||
|
||||
"caniuse-lite": ["caniuse-lite@1.0.30001812", "", {}, "sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng=="],
|
||||
|
||||
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
|
||||
|
||||
"chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
|
||||
|
||||
"chrome-launcher": ["chrome-launcher@0.15.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="],
|
||||
|
||||
"chromium-edge-launcher": ["chromium-edge-launcher@0.3.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^1.0.4" } }, "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA=="],
|
||||
|
||||
"ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="],
|
||||
|
||||
"cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="],
|
||||
|
||||
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
||||
|
||||
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||
|
||||
"commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
|
||||
|
||||
"connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="],
|
||||
|
||||
"content-type": ["content-type@2.1.0", "", {}, "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag=="],
|
||||
|
||||
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
|
||||
|
||||
"cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="],
|
||||
|
||||
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||
|
||||
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
|
||||
|
||||
"dayjs": ["dayjs@1.11.23", "", {}, "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ=="],
|
||||
|
||||
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||
|
||||
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
|
||||
|
||||
"destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="],
|
||||
|
||||
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
||||
|
||||
"ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
|
||||
|
||||
"electron-to-chromium": ["electron-to-chromium@1.5.439", "", {}, "sha512-qu6QIPXhsb+CRcAiTMNjR4A1y/7tCYKkKjr5CZXRVih6qkDf79peZ2BpEU3qoDBNCRrcy3Mra3X9nG5oruuA7Q=="],
|
||||
|
||||
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
"encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
|
||||
|
||||
"entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="],
|
||||
|
||||
"error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="],
|
||||
|
||||
"esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
|
||||
|
||||
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||
|
||||
"escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
|
||||
|
||||
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
|
||||
|
||||
"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
|
||||
|
||||
"etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
|
||||
|
||||
"exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="],
|
||||
|
||||
"fb-dotslash": ["fb-dotslash@0.5.8", "", { "bin": { "dotslash": "bin/dotslash" } }, "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA=="],
|
||||
|
||||
"fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="],
|
||||
|
||||
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
||||
|
||||
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
|
||||
|
||||
"finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="],
|
||||
|
||||
"flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="],
|
||||
|
||||
"flow-estree": ["flow-estree@0.331.0", "", {}, "sha512-FVLYkSL/ITb/QXBEQvNWPjPooRGswuUtGOwrH+puSlMDneNkxy640+FZsk/TfKL+b7Wbw/Fg9FTUv2bMQDpj2w=="],
|
||||
|
||||
"flow-parser": ["flow-parser@0.331.0", "", { "dependencies": { "flow-estree": "0.331.0" } }, "sha512-vEZcHIlnKeN8JSVtYFczj8sWJfHIJOkz+YG00O/oul/Bete+t1ZhTi+O6JRRLFYvGW+yJkZ0YgL16iStnbkUqQ=="],
|
||||
|
||||
"fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
|
||||
|
||||
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||
|
||||
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
|
||||
|
||||
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
|
||||
|
||||
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||
|
||||
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"hermes-compiler": ["hermes-compiler@250829098.0.17", "", {}, "sha512-qG1PXzTEtriF6oQLZF3vyHhSMxOdW5h2TqqLri0rdpstPustd2fSvRZQMVAPdlhgFwBfYnj3OUZtiO6LjYsEFw=="],
|
||||
|
||||
"hermes-estree": ["hermes-estree@0.36.1", "", {}, "sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw=="],
|
||||
|
||||
"hermes-parser": ["hermes-parser@0.36.1", "", { "dependencies": { "hermes-estree": "0.36.1" } }, "sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ=="],
|
||||
|
||||
"http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
|
||||
|
||||
"https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
|
||||
|
||||
"immutable": ["immutable@5.1.9", "", {}, "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg=="],
|
||||
|
||||
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
|
||||
|
||||
"invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="],
|
||||
|
||||
"is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="],
|
||||
|
||||
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
|
||||
|
||||
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
||||
|
||||
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
|
||||
|
||||
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
||||
|
||||
"is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="],
|
||||
|
||||
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||
|
||||
"jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="],
|
||||
|
||||
"jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="],
|
||||
|
||||
"jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="],
|
||||
|
||||
"jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="],
|
||||
|
||||
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
||||
|
||||
"jsc-safe-url": ["jsc-safe-url@0.2.4", "", {}, "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q=="],
|
||||
|
||||
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
|
||||
|
||||
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
|
||||
|
||||
"leaflet": ["leaflet@1.9.4", "", {}, "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="],
|
||||
|
||||
"leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="],
|
||||
|
||||
"lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="],
|
||||
|
||||
"lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="],
|
||||
|
||||
"loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
|
||||
|
||||
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
|
||||
|
||||
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
||||
|
||||
"marky": ["marky@1.3.0", "", {}, "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ=="],
|
||||
|
||||
"memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="],
|
||||
|
||||
"merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
|
||||
|
||||
"metro": ["metro@0.87.1", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "accepts": "^2.0.0", "connect": "^3.6.5", "debug": "^4.4.0", "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "flow-parser": "0.331.0", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", "metro-babel-transformer": "0.87.1", "metro-cache": "0.87.1", "metro-cache-key": "0.87.1", "metro-config": "0.87.1", "metro-core": "0.87.1", "metro-file-map": "0.87.1", "metro-resolver": "0.87.1", "metro-runtime": "0.87.1", "metro-source-map": "0.87.1", "metro-symbolicate": "0.87.1", "metro-transform-plugins": "0.87.1", "metro-transform-worker": "0.87.1", "mime-types": "^3.0.1", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", "source-map": "^0.5.6", "throat": "^5.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { "metro": "src/cli.js" } }, "sha512-1oyLU9elM7hPAsKIqKooEekwxiuWr27+MZBhUROPhzcbXhMDxK64GPF/hCXwBZVp1F89ODavCrBmJtLx9WtBoQ=="],
|
||||
|
||||
"metro-babel-transformer": ["metro-babel-transformer@0.87.1", "", { "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", "flow-parser": "0.331.0", "metro-cache-key": "0.87.1", "nullthrows": "^1.1.1" } }, "sha512-orvRIGpb0yK1yMbk5YP3dhVKjmoxUkRB9fdltGJxNppEqus/1tFpNuf9KnGFR3Qjg0izoUrJ4z6WgoBvdkXPrA=="],
|
||||
|
||||
"metro-cache": ["metro-cache@0.87.1", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.87.1" } }, "sha512-juNPaj0Xi5tkLp8imXqvbSnEIijwKG36m7OiFFVJMqEkiURwAjkMFVek3/xpix1+LVQqO7kjVp3PvuvIM61mKQ=="],
|
||||
|
||||
"metro-cache-key": ["metro-cache-key@0.87.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-scqVVPMA2c+RVO12I3wyMDp5xCkRPLsyrcG4Qc3xfU5JR0EW/0sz2tjty+5UjMUtG09uiM1KYQ8HjWg7OQXHtw=="],
|
||||
|
||||
"metro-config": ["metro-config@0.87.1", "", { "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", "metro": "0.87.1", "metro-cache": "0.87.1", "metro-core": "0.87.1", "metro-runtime": "0.87.1" } }, "sha512-NmkDlc/qZAdo5gTkVTuO2AKE/khemRKRH5IA+SKfqUBJigI5GqZ5TOXhmEokhlkAqzjt8dyzKhzI6FHvXoXaTQ=="],
|
||||
|
||||
"metro-core": ["metro-core@0.87.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", "metro-resolver": "0.87.1" } }, "sha512-xizzky/4+c/Mkznege8OW05j7bSdM39VPoEps61Se4+hf32UQujmbvLvIE9+UnP6kNEPVomk0Fw8NsBK9iRQmw=="],
|
||||
|
||||
"metro-file-map": ["metro-file-map@0.87.1", "", { "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "nullthrows": "^1.1.1" } }, "sha512-9sPuNCojC3pS4vj+ZPY7FXmHGpdJeckXuKXQrDAfJvZc60AF8owRFTkI8XdwlwrmPIB2w++KraK9FMEXvC4wJw=="],
|
||||
|
||||
"metro-minify-terser": ["metro-minify-terser@0.87.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" } }, "sha512-YK4k1oO1wV48hfE+Nbw2rJCnAgeabzrgT/xH5ha5n9gbK4p3HYFC898cERUiyTl9vRh58CNTiXRc88f7y6PfKg=="],
|
||||
|
||||
"metro-resolver": ["metro-resolver@0.87.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-FXH/brY69wT6sPxaSW8BhMmDGD/6irmBr/cL4rUi+VWwqR3pbvdcfUOfyjcHucgQ7pe5IW3xJY21eHKLVKNumQ=="],
|
||||
|
||||
"metro-runtime": ["metro-runtime@0.87.1", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-kjeuSvInsM6OzBjkCQsWxnkrKZFMKtnkCl38oXWRI9lDGs2L9hGs9Tak9sQYJ9h3gtDujneB7wZio+irgqJKDw=="],
|
||||
|
||||
"metro-source-map": ["metro-source-map@0.87.1", "", { "dependencies": { "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.87.1", "nullthrows": "^1.1.1", "ob1": "0.87.1", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-Bqpm0PBGdy53pigIJb4HRF7QxD2pUOdgSmVh/4AWbP635kSCv+Y6ltVxUZgSnzS/QbSmzyCGijmRPlXMj2/qHw=="],
|
||||
|
||||
"metro-symbolicate": ["metro-symbolicate@0.87.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.87.1", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-rcGvwabrg0lbXGRGRKl14PY3My3+dkno2jZYhdJEuH2DmjTtTkV5bYwgto4JtV/Lbe+sXE6GO1UGg654430uow=="],
|
||||
|
||||
"metro-transform-plugins": ["metro-transform-plugins@0.87.1", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" } }, "sha512-qMiJ/x+VfqumFJJSefKS6nj8uojzC29b2/aK8vlMuFABIqGjDucICEOXd2Yt6k/XMFAgAcaJvShUOT0HLyYaPw=="],
|
||||
|
||||
"metro-transform-worker": ["metro-transform-worker@0.87.1", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "flow-enums-runtime": "^0.0.6", "metro": "0.87.1", "metro-babel-transformer": "0.87.1", "metro-cache": "0.87.1", "metro-cache-key": "0.87.1", "metro-minify-terser": "0.87.1", "metro-source-map": "0.87.1", "metro-transform-plugins": "0.87.1", "nullthrows": "^1.1.1" } }, "sha512-VOzs3OV405FuOLYdAhqA2wsn1F9lvueDVxMDLvCKaQ44U+yknIqphJ9eMjjsGwLDZiJq9sW3DMLhjD27JxQgqQ=="],
|
||||
|
||||
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
|
||||
|
||||
"mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
|
||||
|
||||
"mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
|
||||
|
||||
"mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
|
||||
|
||||
"mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
|
||||
|
||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||
|
||||
"muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
|
||||
|
||||
"nanoid": ["nanoid@3.3.19", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug=="],
|
||||
|
||||
"negotiator": ["negotiator@1.1.0", "", { "dependencies": { "content-type": "^2.1.0" } }, "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg=="],
|
||||
|
||||
"node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
|
||||
|
||||
"node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
|
||||
|
||||
"node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="],
|
||||
|
||||
"node-releases": ["node-releases@2.0.57", "", {}, "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw=="],
|
||||
|
||||
"nullthrows": ["nullthrows@1.1.1", "", {}, "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="],
|
||||
|
||||
"ob1": ["ob1@0.87.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-i8iA8uij0g1YQzS8uOJPSRCgwDjO9warIHUAu1Fqj877Wc3wlfxDYBioYWgKTBF2+URVJttyDWSEpmd99nlvtQ=="],
|
||||
|
||||
"on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="],
|
||||
|
||||
"open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="],
|
||||
|
||||
"p-comuns": ["p-comuns@git+https://git2.idz.one/publico/_comuns.git#314cd46534d3c4d2e01f47290bc8908fe47b0e11", { "peerDependencies": { "dayjs": "^1.11.18", "uuid": "^11.1.0", "zod": "4.4.3" } }, "314cd46534d3c4d2e01f47290bc8908fe47b0e11"],
|
||||
|
||||
"p-respostas": ["p-respostas@git+https://git2.idz.one/publico/_respostas.git#387b928e7fc43d287e3f22d2f209f8712fac5368", { "peerDependencies": { "p-comuns": "git+https://git2.idz.one/publico/_comuns.git", "zod": "4.4.3" } }, "387b928e7fc43d287e3f22d2f209f8712fac5368"],
|
||||
|
||||
"parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
|
||||
|
||||
"path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
|
||||
|
||||
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||
|
||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||
|
||||
"picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="],
|
||||
|
||||
"postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="],
|
||||
|
||||
"pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="],
|
||||
|
||||
"promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="],
|
||||
|
||||
"range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
|
||||
|
||||
"react": ["react@19.3.0", "", {}, "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog=="],
|
||||
|
||||
"react-devtools-core": ["react-devtools-core@6.1.5", "", { "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA=="],
|
||||
|
||||
"react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
|
||||
|
||||
"react-native": ["react-native@0.87.1", "", { "dependencies": { "@react-native/asset-utils": "0.87.1", "@react-native/codegen": "0.87.1", "@react-native/community-cli-plugin": "0.87.1", "@react-native/gradle-plugin": "0.87.1", "@react-native/normalize-colors": "0.87.1", "@react-native/virtualized-lists": "0.87.1", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-plugin-syntax-hermes-parser": "0.36.1", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "hermes-compiler": "250829098.0.17", "invariant": "^2.2.4", "memoize-one": "^5.0.0", "metro-runtime": "^0.87.0", "metro-source-map": "^0.87.0", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.27.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "tinyglobby": "^0.2.15", "whatwg-fetch": "^3.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.1.1", "react": "^19.2.3" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-DJKG6ANoD7BtrE4z9DewiSD7/RxCX73lK5Pu49aUr85P3333Dm2roTiP0rRjQNDZdVizHSOmstWfwF/o9EjCRA=="],
|
||||
|
||||
"react-native-fs": ["react-native-fs@2.20.0", "", { "dependencies": { "base-64": "^0.1.0", "utf8": "^3.0.0" }, "peerDependencies": { "react-native": "*", "react-native-windows": "*" }, "optionalPeers": ["react-native-windows"] }, "sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ=="],
|
||||
|
||||
"react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="],
|
||||
|
||||
"readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="],
|
||||
|
||||
"regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="],
|
||||
|
||||
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
|
||||
|
||||
"rollup": ["rollup@4.63.5", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.5", "@rollup/rollup-android-arm64": "4.63.5", "@rollup/rollup-darwin-arm64": "4.63.5", "@rollup/rollup-darwin-x64": "4.63.5", "@rollup/rollup-freebsd-arm64": "4.63.5", "@rollup/rollup-freebsd-x64": "4.63.5", "@rollup/rollup-linux-arm-gnueabihf": "4.63.5", "@rollup/rollup-linux-arm-musleabihf": "4.63.5", "@rollup/rollup-linux-arm64-gnu": "4.63.5", "@rollup/rollup-linux-arm64-musl": "4.63.5", "@rollup/rollup-linux-loong64-gnu": "4.63.5", "@rollup/rollup-linux-loong64-musl": "4.63.5", "@rollup/rollup-linux-ppc64-gnu": "4.63.5", "@rollup/rollup-linux-ppc64-musl": "4.63.5", "@rollup/rollup-linux-riscv64-gnu": "4.63.5", "@rollup/rollup-linux-riscv64-musl": "4.63.5", "@rollup/rollup-linux-s390x-gnu": "4.63.5", "@rollup/rollup-linux-x64-gnu": "4.63.5", "@rollup/rollup-linux-x64-musl": "4.63.5", "@rollup/rollup-openbsd-x64": "4.63.5", "@rollup/rollup-openharmony-arm64": "4.63.5", "@rollup/rollup-win32-arm64-msvc": "4.63.5", "@rollup/rollup-win32-ia32-msvc": "4.63.5", "@rollup/rollup-win32-x64-gnu": "4.63.5", "@rollup/rollup-win32-x64-msvc": "4.63.5", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-KRWwmNLlPw5M7HcdYfm15oBv9n9LPtjzpzCIxS/phwqvPyxHSoKX6Y2YU3pxSPfy0CLquVgsx/j/hBi6OvH1Nw=="],
|
||||
|
||||
"sass": ["sass@1.105.0", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-4EjSuRTyG8M4yRXXY1PT9OUV5zz23xBxJkbIAprohKHqf6HOU4MCpE3U3vAC+iO1gxobBjESNbcj8rYAQZWnyA=="],
|
||||
|
||||
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
|
||||
|
||||
"semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="],
|
||||
|
||||
"send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="],
|
||||
|
||||
"serialize-error": ["serialize-error@2.1.0", "", {}, "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="],
|
||||
|
||||
"serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="],
|
||||
|
||||
"setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
|
||||
|
||||
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
||||
|
||||
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
||||
|
||||
"shell-quote": ["shell-quote@1.10.0", "", {}, "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA=="],
|
||||
|
||||
"source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
|
||||
|
||||
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||
|
||||
"source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
|
||||
|
||||
"stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="],
|
||||
|
||||
"stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="],
|
||||
|
||||
"statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="],
|
||||
|
||||
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
|
||||
|
||||
"terser": ["terser@5.51.2", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q=="],
|
||||
|
||||
"throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="],
|
||||
|
||||
"tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
|
||||
|
||||
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
|
||||
|
||||
"toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
|
||||
|
||||
"tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
|
||||
|
||||
"type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="],
|
||||
|
||||
"typescript": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="],
|
||||
|
||||
"undici-types": ["undici-types@8.9.0", "", {}, "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg=="],
|
||||
|
||||
"unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
|
||||
|
||||
"upath": ["upath@2.0.1", "", {}, "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w=="],
|
||||
|
||||
"update-browserslist-db": ["update-browserslist-db@1.3.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ=="],
|
||||
|
||||
"utf8": ["utf8@3.0.0", "", {}, "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="],
|
||||
|
||||
"utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="],
|
||||
|
||||
"uuid": ["uuid@13.0.2", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw=="],
|
||||
|
||||
"vite": ["vite@6.4.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A=="],
|
||||
|
||||
"vite-plugin-css-injected-by-js": ["vite-plugin-css-injected-by-js@3.5.2", "", { "peerDependencies": { "vite": ">2.0.0-0" } }, "sha512-2MpU/Y+SCZyWUB6ua3HbJCrgnF0KACAsmzOQt1UvRVJCGF6S8xdA3ZUhWcWdM9ivG4I5az8PnQmwwrkC2CAQrQ=="],
|
||||
|
||||
"vite-plugin-vuetify": ["vite-plugin-vuetify@2.1.3", "", { "dependencies": { "@vuetify/loader-shared": "^2.1.2", "debug": "^4.3.3", "upath": "^2.0.1" }, "peerDependencies": { "vite": ">=5", "vue": "^3.0.0", "vuetify": ">=3" } }, "sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw=="],
|
||||
|
||||
"vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="],
|
||||
|
||||
"vscode-uri": ["vscode-uri@3.2.0", "", {}, "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg=="],
|
||||
|
||||
"vue": ["vue@3.5.43", "", { "dependencies": { "@vue/compiler-dom": "3.5.43", "@vue/compiler-sfc": "3.5.43", "@vue/runtime-dom": "3.5.43", "@vue/server-renderer": "3.5.43", "@vue/shared": "3.5.43" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng=="],
|
||||
|
||||
"vue-tsc": ["vue-tsc@3.3.11", "", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.3.11" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "bin/vue-tsc.js" } }, "sha512-gOb0B9rtU2+f1dszwPqSH5kAieIF9ReeLhD3kSRNHv5WZZUQz/JdVXW0RTdqhNTMlQkqKzrTTviqKr/4FYZraQ=="],
|
||||
|
||||
"vuetify": ["vuetify@3.13.5", "", { "peerDependencies": { "typescript": ">=4.7", "vite-plugin-vuetify": ">=2.1.0", "vue": "^3.5.0", "webpack-plugin-vuetify": ">=3.1.0" }, "optionalPeers": ["typescript", "vite-plugin-vuetify", "webpack-plugin-vuetify"] }, "sha512-1PKESHKgyIj6BfjVbpF1bLWvKIBOvyDqIcP6C0R173fNZDr4jyXH7ssigAZvfqV5nRmVS/N9sGtY/IekGQ9TSQ=="],
|
||||
|
||||
"webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
|
||||
|
||||
"whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="],
|
||||
|
||||
"whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
|
||||
|
||||
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||
|
||||
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||
|
||||
"ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="],
|
||||
|
||||
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
|
||||
|
||||
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
||||
|
||||
"yargs": ["yargs@16.2.2", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w=="],
|
||||
|
||||
"yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="],
|
||||
|
||||
"zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
|
||||
|
||||
"@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
|
||||
|
||||
"@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
|
||||
|
||||
"@react-native/codegen/yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="],
|
||||
|
||||
"chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||
|
||||
"finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||
|
||||
"finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
|
||||
|
||||
"http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
|
||||
|
||||
"jest-util/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
||||
|
||||
"lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||
|
||||
"metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
|
||||
|
||||
"metro/yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="],
|
||||
|
||||
"metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
|
||||
|
||||
"metro-symbolicate/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
|
||||
|
||||
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
||||
|
||||
"react-native/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
||||
|
||||
"react-native/yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="],
|
||||
|
||||
"send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||
|
||||
"send/on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
|
||||
|
||||
"send/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
|
||||
|
||||
"wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"@react-native/codegen/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
|
||||
|
||||
"@react-native/codegen/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||
|
||||
"connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
|
||||
|
||||
"finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
|
||||
|
||||
"lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
|
||||
|
||||
"metro/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
|
||||
|
||||
"metro/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||
|
||||
"react-native/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
|
||||
|
||||
"react-native/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||
|
||||
"send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
|
||||
}
|
||||
}
|
||||
1
dist/eli-vue.css
vendored
Normal file
1
dist/eli-vue.css
vendored
Normal file
File diff suppressed because one or more lines are too long
18352
dist/eli-vue.es.js
vendored
18352
dist/eli-vue.es.js
vendored
File diff suppressed because one or more lines are too long
201
dist/eli-vue.umd.js
vendored
201
dist/eli-vue.umd.js
vendored
File diff suppressed because one or more lines are too long
231
dist/types/componentes/EliEntrada/EliEntradaDataHora.vue.d.ts
vendored
Normal file
231
dist/types/componentes/EliEntrada/EliEntradaDataHora.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
import { PropType } from "vue";
|
||||
import type { CampoDensidade, CampoVariante } from "../../tipos";
|
||||
import type { PadroesEntradas } from "./tiposEntradas";
|
||||
type EntradaDataHora = PadroesEntradas["dataHora"];
|
||||
type PropsAntigas = {
|
||||
modo?: "data" | "dataHora";
|
||||
rotulo?: string;
|
||||
placeholder?: string;
|
||||
desabilitado?: boolean;
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: CampoDensidade;
|
||||
variante?: CampoVariante;
|
||||
min?: string;
|
||||
max?: string;
|
||||
};
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
value: {
|
||||
type: PropType<EntradaDataHora["value"]>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<EntradaDataHora["opcoes"]>;
|
||||
required: false;
|
||||
default: undefined;
|
||||
};
|
||||
modelValue: {
|
||||
type: PropType<string | null>;
|
||||
default: null;
|
||||
};
|
||||
modo: {
|
||||
type: PropType<PropsAntigas["modo"]>;
|
||||
default: undefined;
|
||||
};
|
||||
rotulo: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
placeholder: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
desabilitado: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
limpavel: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
erro: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
mensagensErro: {
|
||||
type: PropType<string | string[]>;
|
||||
default: undefined;
|
||||
};
|
||||
dica: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
dicaPersistente: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
densidade: {
|
||||
type: PropType<CampoDensidade>;
|
||||
default: undefined;
|
||||
};
|
||||
variante: {
|
||||
type: PropType<CampoVariante>;
|
||||
default: undefined;
|
||||
};
|
||||
min: {
|
||||
type: PropType<string | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
max: {
|
||||
type: PropType<string | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
}>, {
|
||||
attrs: {
|
||||
[x: string]: unknown;
|
||||
};
|
||||
valor: import("vue").WritableComputedRef<string, string>;
|
||||
tipoInput: import("vue").ComputedRef<"date" | "datetime-local">;
|
||||
minLocal: import("vue").ComputedRef<string | undefined>;
|
||||
maxLocal: import("vue").ComputedRef<string | undefined>;
|
||||
opcoesEfetivas: import("vue").ComputedRef<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../../tipos").CampoDensidade;
|
||||
variante?: import("../../tipos").CampoVariante;
|
||||
}>;
|
||||
desabilitadoEfetivo: import("vue").ComputedRef<boolean>;
|
||||
emitCompatFocus: () => void;
|
||||
emitCompatBlur: () => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"update:value": (_v: string | null) => true;
|
||||
input: (_v: string | null) => true;
|
||||
change: (_v: string | null) => true;
|
||||
"update:modelValue": (_v: string | null) => true;
|
||||
alterar: (_v: string | null) => true;
|
||||
foco: () => true;
|
||||
desfoco: () => true;
|
||||
focus: () => true;
|
||||
blur: () => true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
value: {
|
||||
type: PropType<EntradaDataHora["value"]>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<EntradaDataHora["opcoes"]>;
|
||||
required: false;
|
||||
default: undefined;
|
||||
};
|
||||
modelValue: {
|
||||
type: PropType<string | null>;
|
||||
default: null;
|
||||
};
|
||||
modo: {
|
||||
type: PropType<PropsAntigas["modo"]>;
|
||||
default: undefined;
|
||||
};
|
||||
rotulo: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
placeholder: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
desabilitado: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
limpavel: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
erro: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
mensagensErro: {
|
||||
type: PropType<string | string[]>;
|
||||
default: undefined;
|
||||
};
|
||||
dica: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
dicaPersistente: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
densidade: {
|
||||
type: PropType<CampoDensidade>;
|
||||
default: undefined;
|
||||
};
|
||||
variante: {
|
||||
type: PropType<CampoVariante>;
|
||||
default: undefined;
|
||||
};
|
||||
min: {
|
||||
type: PropType<string | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
max: {
|
||||
type: PropType<string | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
"onUpdate:value"?: ((_v: string | null) => any) | undefined;
|
||||
onInput?: ((_v: string | null) => any) | undefined;
|
||||
onChange?: ((_v: string | null) => any) | undefined;
|
||||
onFocus?: (() => any) | undefined;
|
||||
onBlur?: (() => any) | undefined;
|
||||
"onUpdate:modelValue"?: ((_v: string | null) => any) | undefined;
|
||||
onAlterar?: ((_v: string | null) => any) | undefined;
|
||||
onFoco?: (() => any) | undefined;
|
||||
onDesfoco?: (() => any) | undefined;
|
||||
}>, {
|
||||
modo: "data" | "dataHora" | undefined;
|
||||
limpavel: boolean;
|
||||
erro: boolean;
|
||||
mensagensErro: string | string[];
|
||||
dica: string;
|
||||
dicaPersistente: boolean;
|
||||
min: string | undefined;
|
||||
max: string | undefined;
|
||||
densidade: CampoDensidade;
|
||||
variante: CampoVariante;
|
||||
opcoes: {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../../tipos").CampoDensidade;
|
||||
variante?: import("../../tipos").CampoVariante;
|
||||
};
|
||||
value: string | null | undefined;
|
||||
placeholder: string;
|
||||
modelValue: string | null;
|
||||
rotulo: string;
|
||||
desabilitado: boolean;
|
||||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
import dayjs from "dayjs";
|
||||
export interface CelulaCalendario {
|
||||
dia: number;
|
||||
data: dayjs.Dayjs;
|
||||
atual: boolean;
|
||||
hoje: boolean;
|
||||
selecionado: boolean;
|
||||
desabilitado: boolean;
|
||||
}
|
||||
export declare const OPCOES_HORAS: string[];
|
||||
export declare const OPCOES_MINUTOS: string[];
|
||||
/**
|
||||
* Gera as 42 células (6 semanas) do calendário para o mês de referência.
|
||||
* Preenche dias do mês anterior, atual e posterior para alinhar a grade.
|
||||
*/
|
||||
export declare function gerarCelulas(referencia: dayjs.Dayjs, diaSelecionado: dayjs.Dayjs | null, min?: string, max?: string): CelulaCalendario[];
|
||||
/**
|
||||
* Formata um valor ISO para exibição no campo.
|
||||
* @param valor - string ISO 8601 ou null
|
||||
* @param modo - "data" exibe apenas a data, "dataHora" inclui hora
|
||||
*/
|
||||
export declare function formatarValor(valor: string | null, modo: "data" | "dataHora"): string;
|
||||
/**
|
||||
* Aplica máscara visual de data/hora (DD/MM/YYYY ou DD/MM/YYYY HH:mm) em texto digitado.
|
||||
*/
|
||||
export declare function aplicarMascaraDataHora(valor: string, modo: "data" | "dataHora"): string;
|
||||
/**
|
||||
* Converte um texto mascarado (ex: "15/08/2026 14:30") em string ISO 8601 com fuso local.
|
||||
*/
|
||||
export declare function converterTextoParaIso(texto: string, modo: "data" | "dataHora", horaMinutoPadrao?: {
|
||||
hora: string;
|
||||
minuto: string;
|
||||
}): string | null;
|
||||
|
|
@ -1,408 +0,0 @@
|
|||
import dayjs from "dayjs";
|
||||
import "dayjs/locale/pt-br";
|
||||
import type { CampoDensidade, CampoVariante } from "../../../tipos";
|
||||
import type { PadroesEntradas } from "../tiposEntradas";
|
||||
import { type CelulaCalendario } from "./calendarioHelpers";
|
||||
import { diasSemana, MESES } from "./useDataHoraProps";
|
||||
export { type CelulaCalendario, diasSemana, MESES };
|
||||
export type EntradaDataHora = PadroesEntradas["dataHora"];
|
||||
type EmitFn = (event: string, payload?: unknown) => void;
|
||||
type Props = {
|
||||
value?: string | null;
|
||||
opcoes?: EntradaDataHora["opcoes"];
|
||||
modelValue?: string | null;
|
||||
modo?: "data" | "dataHora";
|
||||
rotulo?: string;
|
||||
placeholder?: string;
|
||||
desabilitado?: boolean;
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: CampoDensidade;
|
||||
variante?: CampoVariante;
|
||||
min?: string;
|
||||
max?: string;
|
||||
};
|
||||
/** Composable principal do EliEntradaDataHora. */
|
||||
export declare function useDataHora(props: Props, emit: EmitFn): {
|
||||
uid: number;
|
||||
aberto: import("vue").Ref<boolean, boolean>;
|
||||
focado: import("vue").Ref<boolean, boolean>;
|
||||
textoDigitado: import("vue").Ref<string, string>;
|
||||
estiloPopover: import("vue").Ref<Record<string, string>, Record<string, string>>;
|
||||
referencia: import("vue").Ref<{
|
||||
clone: () => dayjs.Dayjs;
|
||||
isValid: () => boolean;
|
||||
year: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
month: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
date: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
day: {
|
||||
(): 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
hour: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
minute: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
second: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
millisecond: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
set: (unit: dayjs.UnitType, value: number) => dayjs.Dayjs;
|
||||
get: (unit: dayjs.UnitType) => number;
|
||||
add: {
|
||||
(value: number, unit?: dayjs.ManipulateType): dayjs.Dayjs;
|
||||
(duration: plugin.Duration): dayjs.Dayjs;
|
||||
};
|
||||
subtract: {
|
||||
(value: number, unit?: dayjs.ManipulateType): dayjs.Dayjs;
|
||||
(duration: plugin.Duration): dayjs.Dayjs;
|
||||
};
|
||||
startOf: (unit: dayjs.OpUnitType) => dayjs.Dayjs;
|
||||
endOf: (unit: dayjs.OpUnitType) => dayjs.Dayjs;
|
||||
format: (template?: string) => string;
|
||||
diff: (date?: dayjs.ConfigType, unit?: dayjs.QUnitType | dayjs.OpUnitType, float?: boolean) => number;
|
||||
valueOf: () => number;
|
||||
unix: () => number;
|
||||
daysInMonth: () => number;
|
||||
toDate: () => Date;
|
||||
toJSON: () => string;
|
||||
toISOString: () => string;
|
||||
toString: () => string;
|
||||
utcOffset: {
|
||||
(): number;
|
||||
(offset: number | string, keepLocalTime?: boolean): dayjs.Dayjs;
|
||||
};
|
||||
isBefore: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isSame: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isAfter: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
locale: {
|
||||
(): string;
|
||||
(preset: string | ILocale, object?: Partial<ILocale>): dayjs.Dayjs;
|
||||
};
|
||||
isSameOrAfter: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isSameOrBefore: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
fromNow: (withoutSuffix?: boolean) => string;
|
||||
from: (compared: dayjs.ConfigType, withoutSuffix?: boolean) => string;
|
||||
toNow: (withoutSuffix?: boolean) => string;
|
||||
to: (compared: dayjs.ConfigType, withoutSuffix?: boolean) => string;
|
||||
tz: (timezone?: string, keepLocalTime?: boolean) => dayjs.Dayjs;
|
||||
offsetName: (type?: 'short' | 'long') => string | undefined;
|
||||
utc: (keepLocalTime?: boolean) => dayjs.Dayjs;
|
||||
local: () => dayjs.Dayjs;
|
||||
isUTC: () => boolean;
|
||||
week: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
}, dayjs.Dayjs | {
|
||||
clone: () => dayjs.Dayjs;
|
||||
isValid: () => boolean;
|
||||
year: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
month: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
date: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
day: {
|
||||
(): 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
hour: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
minute: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
second: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
millisecond: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
set: (unit: dayjs.UnitType, value: number) => dayjs.Dayjs;
|
||||
get: (unit: dayjs.UnitType) => number;
|
||||
add: {
|
||||
(value: number, unit?: dayjs.ManipulateType): dayjs.Dayjs;
|
||||
(duration: plugin.Duration): dayjs.Dayjs;
|
||||
};
|
||||
subtract: {
|
||||
(value: number, unit?: dayjs.ManipulateType): dayjs.Dayjs;
|
||||
(duration: plugin.Duration): dayjs.Dayjs;
|
||||
};
|
||||
startOf: (unit: dayjs.OpUnitType) => dayjs.Dayjs;
|
||||
endOf: (unit: dayjs.OpUnitType) => dayjs.Dayjs;
|
||||
format: (template?: string) => string;
|
||||
diff: (date?: dayjs.ConfigType, unit?: dayjs.QUnitType | dayjs.OpUnitType, float?: boolean) => number;
|
||||
valueOf: () => number;
|
||||
unix: () => number;
|
||||
daysInMonth: () => number;
|
||||
toDate: () => Date;
|
||||
toJSON: () => string;
|
||||
toISOString: () => string;
|
||||
toString: () => string;
|
||||
utcOffset: {
|
||||
(): number;
|
||||
(offset: number | string, keepLocalTime?: boolean): dayjs.Dayjs;
|
||||
};
|
||||
isBefore: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isSame: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isAfter: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
locale: {
|
||||
(): string;
|
||||
(preset: string | ILocale, object?: Partial<ILocale>): dayjs.Dayjs;
|
||||
};
|
||||
isSameOrAfter: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isSameOrBefore: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
fromNow: (withoutSuffix?: boolean) => string;
|
||||
from: (compared: dayjs.ConfigType, withoutSuffix?: boolean) => string;
|
||||
toNow: (withoutSuffix?: boolean) => string;
|
||||
to: (compared: dayjs.ConfigType, withoutSuffix?: boolean) => string;
|
||||
tz: (timezone?: string, keepLocalTime?: boolean) => dayjs.Dayjs;
|
||||
offsetName: (type?: 'short' | 'long') => string | undefined;
|
||||
utc: (keepLocalTime?: boolean) => dayjs.Dayjs;
|
||||
local: () => dayjs.Dayjs;
|
||||
isUTC: () => boolean;
|
||||
week: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
}>;
|
||||
diaSelecionado: import("vue").Ref<{
|
||||
clone: () => dayjs.Dayjs;
|
||||
isValid: () => boolean;
|
||||
year: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
month: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
date: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
day: {
|
||||
(): 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
hour: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
minute: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
second: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
millisecond: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
set: (unit: dayjs.UnitType, value: number) => dayjs.Dayjs;
|
||||
get: (unit: dayjs.UnitType) => number;
|
||||
add: {
|
||||
(value: number, unit?: dayjs.ManipulateType): dayjs.Dayjs;
|
||||
(duration: plugin.Duration): dayjs.Dayjs;
|
||||
};
|
||||
subtract: {
|
||||
(value: number, unit?: dayjs.ManipulateType): dayjs.Dayjs;
|
||||
(duration: plugin.Duration): dayjs.Dayjs;
|
||||
};
|
||||
startOf: (unit: dayjs.OpUnitType) => dayjs.Dayjs;
|
||||
endOf: (unit: dayjs.OpUnitType) => dayjs.Dayjs;
|
||||
format: (template?: string) => string;
|
||||
diff: (date?: dayjs.ConfigType, unit?: dayjs.QUnitType | dayjs.OpUnitType, float?: boolean) => number;
|
||||
valueOf: () => number;
|
||||
unix: () => number;
|
||||
daysInMonth: () => number;
|
||||
toDate: () => Date;
|
||||
toJSON: () => string;
|
||||
toISOString: () => string;
|
||||
toString: () => string;
|
||||
utcOffset: {
|
||||
(): number;
|
||||
(offset: number | string, keepLocalTime?: boolean): dayjs.Dayjs;
|
||||
};
|
||||
isBefore: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isSame: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isAfter: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
locale: {
|
||||
(): string;
|
||||
(preset: string | ILocale, object?: Partial<ILocale>): dayjs.Dayjs;
|
||||
};
|
||||
isSameOrAfter: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isSameOrBefore: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
fromNow: (withoutSuffix?: boolean) => string;
|
||||
from: (compared: dayjs.ConfigType, withoutSuffix?: boolean) => string;
|
||||
toNow: (withoutSuffix?: boolean) => string;
|
||||
to: (compared: dayjs.ConfigType, withoutSuffix?: boolean) => string;
|
||||
tz: (timezone?: string, keepLocalTime?: boolean) => dayjs.Dayjs;
|
||||
offsetName: (type?: 'short' | 'long') => string | undefined;
|
||||
utc: (keepLocalTime?: boolean) => dayjs.Dayjs;
|
||||
local: () => dayjs.Dayjs;
|
||||
isUTC: () => boolean;
|
||||
week: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
} | null, dayjs.Dayjs | {
|
||||
clone: () => dayjs.Dayjs;
|
||||
isValid: () => boolean;
|
||||
year: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
month: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
date: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
day: {
|
||||
(): 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
hour: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
minute: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
second: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
millisecond: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
set: (unit: dayjs.UnitType, value: number) => dayjs.Dayjs;
|
||||
get: (unit: dayjs.UnitType) => number;
|
||||
add: {
|
||||
(value: number, unit?: dayjs.ManipulateType): dayjs.Dayjs;
|
||||
(duration: plugin.Duration): dayjs.Dayjs;
|
||||
};
|
||||
subtract: {
|
||||
(value: number, unit?: dayjs.ManipulateType): dayjs.Dayjs;
|
||||
(duration: plugin.Duration): dayjs.Dayjs;
|
||||
};
|
||||
startOf: (unit: dayjs.OpUnitType) => dayjs.Dayjs;
|
||||
endOf: (unit: dayjs.OpUnitType) => dayjs.Dayjs;
|
||||
format: (template?: string) => string;
|
||||
diff: (date?: dayjs.ConfigType, unit?: dayjs.QUnitType | dayjs.OpUnitType, float?: boolean) => number;
|
||||
valueOf: () => number;
|
||||
unix: () => number;
|
||||
daysInMonth: () => number;
|
||||
toDate: () => Date;
|
||||
toJSON: () => string;
|
||||
toISOString: () => string;
|
||||
toString: () => string;
|
||||
utcOffset: {
|
||||
(): number;
|
||||
(offset: number | string, keepLocalTime?: boolean): dayjs.Dayjs;
|
||||
};
|
||||
isBefore: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isSame: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isAfter: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
locale: {
|
||||
(): string;
|
||||
(preset: string | ILocale, object?: Partial<ILocale>): dayjs.Dayjs;
|
||||
};
|
||||
isSameOrAfter: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
isSameOrBefore: (date?: dayjs.ConfigType, unit?: dayjs.OpUnitType) => boolean;
|
||||
fromNow: (withoutSuffix?: boolean) => string;
|
||||
from: (compared: dayjs.ConfigType, withoutSuffix?: boolean) => string;
|
||||
toNow: (withoutSuffix?: boolean) => string;
|
||||
to: (compared: dayjs.ConfigType, withoutSuffix?: boolean) => string;
|
||||
tz: (timezone?: string, keepLocalTime?: boolean) => dayjs.Dayjs;
|
||||
offsetName: (type?: 'short' | 'long') => string | undefined;
|
||||
utc: (keepLocalTime?: boolean) => dayjs.Dayjs;
|
||||
local: () => dayjs.Dayjs;
|
||||
isUTC: () => boolean;
|
||||
week: {
|
||||
(): number;
|
||||
(value: number): dayjs.Dayjs;
|
||||
};
|
||||
} | null>;
|
||||
horaTemp: import("vue").Ref<string, string>;
|
||||
minutoTemp: import("vue").Ref<string, string>;
|
||||
opcoesEfetivas: import("vue").ComputedRef<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
} & {
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../../../tipos").CampoDensidade;
|
||||
variante?: import("../../../tipos").CampoVariante;
|
||||
}>;
|
||||
modoEfetivo: import("vue").ComputedRef<"data" | "dataHora">;
|
||||
desabilitadoEfetivo: import("vue").ComputedRef<boolean>;
|
||||
valor: import("vue").ComputedRef<string | null>;
|
||||
valorFormatado: import("vue").ComputedRef<string>;
|
||||
mensagensVisiveis: import("vue").ComputedRef<string[]>;
|
||||
nomeMesAtual: import("vue").ComputedRef<string>;
|
||||
anoAtual: import("vue").ComputedRef<number>;
|
||||
mesAtual: import("vue").ComputedRef<number>;
|
||||
listaAnos: import("vue").ComputedRef<number[]>;
|
||||
mudarMes: (mes: number) => void;
|
||||
mudarAno: (ano: number) => void;
|
||||
celulas: import("vue").ComputedRef<CelulaCalendario[]>;
|
||||
abrirSeHabilitado: () => void;
|
||||
alternarPopover: () => void;
|
||||
fechar: () => void;
|
||||
navegarMes: (delta: number) => void;
|
||||
selecionarDia: (cell: CelulaCalendario) => void;
|
||||
definirAgora: () => void;
|
||||
confirmar: () => void;
|
||||
limpar: () => void;
|
||||
onTextInput: (e: Event) => void;
|
||||
onInputFocus: () => void;
|
||||
onInputBlur: () => void;
|
||||
atualizarHoraTemp: (v: string) => void;
|
||||
atualizarMinutoTemp: (v: string) => void;
|
||||
};
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
import { type Ref } from "vue";
|
||||
interface UseDataHoraInputOptions {
|
||||
modoEfetivo: Ref<"data" | "dataHora">;
|
||||
valor: Ref<string | null>;
|
||||
horaTemp: Ref<string>;
|
||||
minutoTemp: Ref<string>;
|
||||
emitirValor: (iso: string | null) => void;
|
||||
emit: (event: string, payload?: unknown) => void;
|
||||
}
|
||||
/**
|
||||
* Composable responsável pelo controle do campo de texto editável com máscara e eventos de foco/blur.
|
||||
*/
|
||||
export declare function useDataHoraInput({ modoEfetivo, valor, horaTemp, minutoTemp, emitirValor, emit, }: UseDataHoraInputOptions): {
|
||||
textoDigitado: Ref<string, string>;
|
||||
focado: Ref<boolean, boolean>;
|
||||
onTextInput: (e: Event) => void;
|
||||
onInputFocus: () => void;
|
||||
onInputBlur: () => void;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
import { type Ref } from "vue";
|
||||
interface UseDataHoraPosicaoOptions {
|
||||
uid: number;
|
||||
modoEfetivo: Ref<"data" | "dataHora">;
|
||||
}
|
||||
/**
|
||||
* Composable responsável por calcular a posição fixed do popover do calendário.
|
||||
*/
|
||||
export declare function useDataHoraPosicao({ uid, modoEfetivo }: UseDataHoraPosicaoOptions): {
|
||||
estiloPopover: Ref<Record<string, string>, Record<string, string>>;
|
||||
calcularPosicao: () => void;
|
||||
adicionarListenersPosicao: () => void;
|
||||
removerListenersPosicao: () => void;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
import dayjs from "dayjs";
|
||||
import { type Ref } from "vue";
|
||||
import type { EntradaDataHora } from "./useDataHora";
|
||||
export declare const MESES: string[];
|
||||
export declare const diasSemana: string[];
|
||||
export interface UseDataHoraPropsOptions {
|
||||
props: {
|
||||
value?: string | null;
|
||||
opcoes?: EntradaDataHora["opcoes"];
|
||||
modelValue?: string | null;
|
||||
modo?: "data" | "dataHora";
|
||||
rotulo?: string;
|
||||
placeholder?: string;
|
||||
desabilitado?: boolean;
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: EntradaDataHora["opcoes"]["densidade"];
|
||||
variante?: EntradaDataHora["opcoes"]["variante"];
|
||||
min?: string;
|
||||
max?: string;
|
||||
};
|
||||
referencia: Ref<dayjs.Dayjs>;
|
||||
diaSelecionado: Ref<dayjs.Dayjs | null>;
|
||||
}
|
||||
/**
|
||||
* Composable responsável pelo cálculo de propriedades derivadas e opções do EliEntradaDataHora.
|
||||
*/
|
||||
export declare function useDataHoraProps({ props, referencia, diaSelecionado }: UseDataHoraPropsOptions): {
|
||||
opcoesEfetivas: import("vue").ComputedRef<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
} & {
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../../..").CampoDensidade;
|
||||
variante?: import("../../..").CampoVariante;
|
||||
}>;
|
||||
modoEfetivo: import("vue").ComputedRef<"data" | "dataHora">;
|
||||
desabilitadoEfetivo: import("vue").ComputedRef<boolean>;
|
||||
effectiveModelValue: import("vue").ComputedRef<string | null>;
|
||||
valor: import("vue").ComputedRef<string | null>;
|
||||
mensagensVisiveis: import("vue").ComputedRef<string[]>;
|
||||
valorFormatado: import("vue").ComputedRef<string>;
|
||||
nomeMesAtual: import("vue").ComputedRef<string>;
|
||||
anoAtual: import("vue").ComputedRef<number>;
|
||||
mesAtual: import("vue").ComputedRef<number>;
|
||||
listaAnos: import("vue").ComputedRef<number[]>;
|
||||
celulas: import("vue").ComputedRef<import("./calendarioHelpers").CelulaCalendario[]>;
|
||||
};
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
/**
|
||||
* Helpers de formatação e parsing numérico usados pelo EliEntradaNumero.
|
||||
* Extraídos do componente Vue para manter o arquivo dentro de 250 linhas.
|
||||
*/
|
||||
export declare function casasDecimaisFromPrecisao(precisao: number): number;
|
||||
/**
|
||||
* Analisa a entrada de texto e converte em um valor numérico válido (float).
|
||||
* Troca a vírgula brasileira por ponto antes de passar para o parser nativo.
|
||||
*
|
||||
* @param texto - O texto bruto digitado ou vindo do estado
|
||||
* @returns O número processado ou `null` caso inválido ou vazio
|
||||
*/
|
||||
export declare function parseNumero(texto: string): number | null;
|
||||
/**
|
||||
* Formata um valor numérico para a exibição na interface (usando vírgula como separador).
|
||||
*
|
||||
* @param value - O valor numérico de fato emitido
|
||||
* @param casas - Opcionalmente, o número exato de casas decimais para fixar
|
||||
* @returns String formatada amigável para exibição em pt-BR
|
||||
*/
|
||||
export declare function formatarNumero(value: number | null | undefined, casas: number | null): string;
|
||||
/**
|
||||
* Retira todo tipo de sujeira de uma string, devolvendo restritamente números (para inteiros).
|
||||
*
|
||||
* @param texto - String de entrada
|
||||
* @returns Apenas dígitos de 0 a 9
|
||||
*/
|
||||
export declare function somenteNumeros(texto: string): string;
|
||||
/**
|
||||
* Higieniza o texto preservando apenas os dígitos e exatamente UM separador decimal.
|
||||
*
|
||||
* @param texto - Texto misto de entrada
|
||||
* @returns String contendo número e (opcionalmente) uma vírgula ou ponto residual
|
||||
*/
|
||||
export declare function somenteNumerosESeparadorDecimal(texto: string): string;
|
||||
/**
|
||||
* Trunca a parte decimal de um texto numérico ao número máximo de casas permitidas.
|
||||
* Aplicado durante a digitação para evitar que o usuário ultrapasse a precisão configurada.
|
||||
*
|
||||
* @param texto - Texto numérico já higienizado (com separador único)
|
||||
* @param casas - Número máximo de casas decimais; `null` = sem limite
|
||||
* @returns Texto com a parte decimal truncada no limite especificado
|
||||
*/
|
||||
export declare function limitarCasasDecimais(texto: string, casas: number | null): string;
|
||||
/**
|
||||
* Resolve o edge-case de digitação transitória parcial terminada em separador (ex: "1,").
|
||||
*
|
||||
* @param texto - O texto já higienizado, tipicamente terminando em vírgula ou ponto
|
||||
* @returns A conversão parcial estrita ou `null` caso falhe
|
||||
*/
|
||||
export declare function valorParcialDecimal(texto: string): number | null;
|
||||
49
dist/types/componentes/EliEntrada/EliEntradaNumero.vue.d.ts
vendored
Normal file
49
dist/types/componentes/EliEntrada/EliEntradaNumero.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
import { PropType } from "vue";
|
||||
import type { PadroesEntradas } from "./tiposEntradas";
|
||||
type EntradaNumero = PadroesEntradas["numero"];
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
/** Interface padrão (EliEntrada): value + opcoes. */
|
||||
value: {
|
||||
type: PropType<EntradaNumero["value"]>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<EntradaNumero["opcoes"]>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
attrs: {
|
||||
[x: string]: unknown;
|
||||
};
|
||||
emit: ((event: "update:value", _v: number | null | undefined) => void) & ((event: "input", _v: number | null | undefined) => void) & ((event: "change", _v: number | null | undefined) => void) & ((event: "focus") => void) & ((event: "blur") => void);
|
||||
displayValue: import("vue").Ref<string, string>;
|
||||
isInteiro: import("vue").ComputedRef<boolean>;
|
||||
onUpdateModelValue: (texto: string) => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"update:value": (_v: EntradaNumero["value"]) => true;
|
||||
/** Compat Vue2 (v-model padrão: value + input) */
|
||||
input: (_v: EntradaNumero["value"]) => true;
|
||||
change: (_v: EntradaNumero["value"]) => true;
|
||||
focus: () => true;
|
||||
blur: () => true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
/** Interface padrão (EliEntrada): value + opcoes. */
|
||||
value: {
|
||||
type: PropType<EntradaNumero["value"]>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<EntradaNumero["opcoes"]>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
"onUpdate:value"?: ((_v: number | null | undefined) => any) | undefined;
|
||||
onInput?: ((_v: number | null | undefined) => any) | undefined;
|
||||
onChange?: ((_v: number | null | undefined) => any) | undefined;
|
||||
onFocus?: (() => any) | undefined;
|
||||
onBlur?: (() => any) | undefined;
|
||||
}>, {
|
||||
value: number | null | undefined;
|
||||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
1642
dist/types/componentes/EliEntrada/EliEntradaParagrafo.vue.d.ts
vendored
Normal file
1642
dist/types/componentes/EliEntrada/EliEntradaParagrafo.vue.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load diff
9858
dist/types/componentes/EliEntrada/EliEntradaSelecao.vue.d.ts
vendored
Normal file
9858
dist/types/componentes/EliEntrada/EliEntradaSelecao.vue.d.ts
vendored
Normal file
File diff suppressed because one or more lines are too long
50
dist/types/componentes/EliEntrada/EliEntradaTexto.vue.d.ts
vendored
Normal file
50
dist/types/componentes/EliEntrada/EliEntradaTexto.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
import { PropType } from "vue";
|
||||
import type { PadroesEntradas } from "./tiposEntradas";
|
||||
type EntradaTexto = PadroesEntradas["texto"];
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
/** Interface padrão (EliEntrada): value + opcoes. */
|
||||
value: {
|
||||
type: PropType<EntradaTexto["value"]>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<EntradaTexto["opcoes"]>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
attrs: {
|
||||
[x: string]: unknown;
|
||||
};
|
||||
emit: ((event: "update:value", _v: string | null | undefined) => void) & ((event: "input", _v: string | null | undefined) => void) & ((event: "change", _v: string | null | undefined) => void) & ((event: "focus") => void) & ((event: "blur") => void);
|
||||
localValue: import("vue").WritableComputedRef<string | null | undefined, string | null | undefined>;
|
||||
inputHtmlType: import("vue").ComputedRef<"text" | "email" | "url">;
|
||||
inputMode: import("vue").ComputedRef<string | undefined>;
|
||||
onInput: (e: Event) => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"update:value": (_v: EntradaTexto["value"]) => true;
|
||||
/** Compat Vue2 (v-model padrão: value + input) */
|
||||
input: (_v: EntradaTexto["value"]) => true;
|
||||
change: (_v: EntradaTexto["value"]) => true;
|
||||
focus: () => true;
|
||||
blur: () => true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
/** Interface padrão (EliEntrada): value + opcoes. */
|
||||
value: {
|
||||
type: PropType<EntradaTexto["value"]>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<EntradaTexto["opcoes"]>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
"onUpdate:value"?: ((_v: string | null | undefined) => any) | undefined;
|
||||
onInput?: ((_v: string | null | undefined) => any) | undefined;
|
||||
onChange?: ((_v: string | null | undefined) => any) | undefined;
|
||||
onFocus?: (() => any) | undefined;
|
||||
onBlur?: (() => any) | undefined;
|
||||
}>, {
|
||||
value: string | null | undefined;
|
||||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
9
dist/types/componentes/EliEntrada/index.d.ts
vendored
9
dist/types/componentes/EliEntrada/index.d.ts
vendored
|
|
@ -1,10 +1,7 @@
|
|||
import EliEntradaConfirmacao from "./EliEntradaConfirmacao.vue";
|
||||
import EliEntradaCoordenadas from "./EliEntradaCoordenadas.vue";
|
||||
import EliEntradaDataHora from "./EliEntradaDataHora/index.vue";
|
||||
import EliEntradaTexto from "./EliEntradaTexto.vue";
|
||||
import EliEntradaNumero from "./EliEntradaNumero.vue";
|
||||
import EliEntradaDataHora from "./EliEntradaDataHora.vue";
|
||||
import EliEntradaParagrafo from "./EliEntradaParagrafo.vue";
|
||||
import EliEntradaSelecao from "./EliEntradaSelecao.vue";
|
||||
import EliEntradaSelecaoMultipla from "./EliEntradaSelecaoMultipla.vue";
|
||||
import EliEntradaTexto from "./EliEntradaTexto.vue";
|
||||
export { EliEntradaTexto, EliEntradaNumero, EliEntradaDataHora, EliEntradaParagrafo, EliEntradaSelecao };
|
||||
export type { PadroesEntradas, TipoEntrada } from "./tiposEntradas";
|
||||
export { EliEntradaConfirmacao, EliEntradaCoordenadas, EliEntradaDataHora, EliEntradaNumero, EliEntradaParagrafo, EliEntradaSelecao, EliEntradaSelecaoMultipla, EliEntradaTexto, };
|
||||
|
|
|
|||
11912
dist/types/componentes/EliEntrada/registryEliEntradas.d.ts
vendored
11912
dist/types/componentes/EliEntrada/registryEliEntradas.d.ts
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1,11 +1,16 @@
|
|||
/**
|
||||
* Tipos base para componentes de entrada (EliEntrada*).
|
||||
* PadroesEntradas[tipo] → tipagem completa (value + opcoes).
|
||||
* TipoEntrada → união de todos os tipos suportados.
|
||||
* Tipos base para componentes de entrada (EliEntrada*)
|
||||
*
|
||||
* Objetivo:
|
||||
* - Padronizar o shape de dados de todos os componentes de entrada.
|
||||
* - Cada entrada possui sempre:
|
||||
* 1) `value`: o valor atual (tipado)
|
||||
* 2) `opcoes`: configuração do componente (rótulo, placeholder e extras por tipo)
|
||||
*
|
||||
* Como usar:
|
||||
* - `PadroesEntradas[tipo]` retorna a tipagem completa (value + opcoes) daquele tipo.
|
||||
* - `TipoEntrada` é a união com todos os tipos suportados (ex.: "texto" | "numero").
|
||||
*/
|
||||
import type { zCoordenadas } from "p-comuns";
|
||||
import type z from "zod";
|
||||
import type { OpcoesSelecaoBase } from "./tiposSelecao";
|
||||
/**
|
||||
* Contrato padrão de uma entrada.
|
||||
*
|
||||
|
|
@ -21,8 +26,6 @@ export type tipoPadraoEntrada<T, Mais extends Record<string, unknown> = {}> = {
|
|||
rotulo: string;
|
||||
/** Texto de ajuda dentro do input quando vazio */
|
||||
placeholder?: string;
|
||||
/** Se true, o campo será somente leitura (não editável) */
|
||||
apenasLeitura?: boolean;
|
||||
} & Mais;
|
||||
};
|
||||
/**
|
||||
|
|
@ -101,34 +104,32 @@ export type PadroesEntradas = {
|
|||
/** Variante do v-text-field (Vuetify). */
|
||||
variante?: import("../../tipos").CampoVariante;
|
||||
}>;
|
||||
/** Seleção simples — ver {@link OpcoesSelecaoBase} para opções disponíveis. */
|
||||
selecao: tipoPadraoEntrada<string | null | undefined, OpcoesSelecaoBase>;
|
||||
/** Seleção múltipla — ver {@link OpcoesSelecaoBase} para opções disponíveis. */
|
||||
selecaoMultipla: tipoPadraoEntrada<string[] | null | undefined, OpcoesSelecaoBase>;
|
||||
confirmacao: tipoPadraoEntrada<boolean, {
|
||||
/** Cor do switch quando ativo (Vuetify color). */
|
||||
cor?: string;
|
||||
/** Se true, desabilita a interação. */
|
||||
desabilitado?: boolean;
|
||||
/** Texto exibido ao lado do switch quando ativo. */
|
||||
rotuloAtivo?: string;
|
||||
/** Texto exibido ao lado do switch quando inativo. */
|
||||
rotuloInativo?: string;
|
||||
selecao: tipoPadraoEntrada<string | null | undefined, {
|
||||
/**
|
||||
* Carrega os itens da seleção (sincrono ou async).
|
||||
* - Cada item precisa ter uma chave estável (value) e um rótulo (title).
|
||||
*/
|
||||
itens: () => {
|
||||
chave: string;
|
||||
rotulo: string;
|
||||
}[] | Promise<{
|
||||
chave: string;
|
||||
rotulo: string;
|
||||
}[]>;
|
||||
/** Se true, mostra ícone para limpar o valor (Vuetify clearable). */
|
||||
limpavel?: boolean;
|
||||
/** Estado de erro (visual). */
|
||||
erro?: boolean;
|
||||
/** Mensagens de erro. */
|
||||
mensagensErro?: string | string[];
|
||||
/** Texto de apoio. */
|
||||
dica?: string;
|
||||
/** Mantém a dica sempre visível. */
|
||||
dicaPersistente?: boolean;
|
||||
/** Densidade do campo (Vuetify). */
|
||||
densidade?: import("../../tipos").CampoDensidade;
|
||||
}>;
|
||||
coordenadas: tipoPadraoEntrada<z.infer<typeof zCoordenadas> | null | undefined, {
|
||||
/** Nível de zoom inicial do mapa Leaflet (default: 4) */
|
||||
zoom?: number;
|
||||
/** Altura do container do mapa em pixels (default: 300) */
|
||||
alturaMapa?: number;
|
||||
/** Camadas vetoriais GeoJSON (contornos do IBGE) */
|
||||
camadas?: {
|
||||
/** Exibir contornos dos estados */
|
||||
estados?: boolean;
|
||||
/** Exibir contornos dos municípios (carregados por UF conforme viewport) */
|
||||
municipios?: boolean;
|
||||
};
|
||||
/** Variante do v-text-field (Vuetify). */
|
||||
variante?: import("../../tipos").CampoVariante;
|
||||
}>;
|
||||
};
|
||||
/**
|
||||
|
|
@ -136,10 +137,7 @@ export type PadroesEntradas = {
|
|||
* Ex.: "texto" | "numero"
|
||||
*/
|
||||
export type TipoEntrada = keyof PadroesEntradas;
|
||||
export type PadraoComponenteEntrada<T extends TipoEntrada> = readonly [
|
||||
T,
|
||||
PadroesEntradas[T]["opcoes"]
|
||||
];
|
||||
export type PadraoComponenteEntrada<T extends TipoEntrada> = readonly [T, PadroesEntradas[T]['opcoes']];
|
||||
export type ComponenteEntrada = {
|
||||
[K in TipoEntrada]: PadraoComponenteEntrada<K>;
|
||||
}[TipoEntrada];
|
||||
|
|
|
|||
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Tipos específicos dos componentes de seleção (simples e múltipla).
|
||||
* Extraído de tiposEntradas.ts para respeitar o limite de 250 linhas.
|
||||
*/
|
||||
import type { CampoDensidade, CampoVariante } from "../../tipos";
|
||||
/** Item padrão dos componentes de seleção. */
|
||||
export type ItemSelecaoOpcoes = {
|
||||
chave: string;
|
||||
rotulo: string;
|
||||
};
|
||||
/** Carregador de itens (síncrono ou async). */
|
||||
export type CarregadorItens = () => ItemSelecaoOpcoes[] | Promise<ItemSelecaoOpcoes[]>;
|
||||
/** Opções compartilhadas entre seleção simples e múltipla. */
|
||||
export type OpcoesSelecaoBase = {
|
||||
/**
|
||||
* Carrega os itens da seleção (sincrono ou async).
|
||||
* - Cada item precisa ter uma chave estável (value) e um rótulo (title).
|
||||
*/
|
||||
itens: CarregadorItens;
|
||||
/**
|
||||
* Lista de chaves (valores de `chave`) que devem aparecer desativadas.
|
||||
* Os itens aparecerão visíveis no menu, mas não poderão ser selecionados.
|
||||
*/
|
||||
desativado?: string[];
|
||||
/** Se true, mostra ícone para limpar o valor (Vuetify clearable). */
|
||||
limpavel?: boolean;
|
||||
/** Estado de erro (visual). */
|
||||
erro?: boolean;
|
||||
/** Mensagens de erro. */
|
||||
mensagensErro?: string | string[];
|
||||
/** Texto de apoio. */
|
||||
dica?: string;
|
||||
/** Mantém a dica sempre visível. */
|
||||
dicaPersistente?: boolean;
|
||||
/** Densidade do campo (Vuetify). */
|
||||
densidade?: CampoDensidade;
|
||||
/** Variante do v-text-field (Vuetify). */
|
||||
variante?: CampoVariante;
|
||||
};
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
import L from "leaflet";
|
||||
export interface OpcoesCamadas {
|
||||
estados?: boolean;
|
||||
municipios?: boolean;
|
||||
}
|
||||
/**
|
||||
* Inicializa camadas vetoriais GeoJSON no mapa Leaflet.
|
||||
* - Estados: overlay imediato
|
||||
* - Municípios: sob demanda por UF, com 3 níveis de detalhe por zoom
|
||||
*/
|
||||
export declare function inicializarCamadas(mapa: L.Map, opcoes: OpcoesCamadas): void;
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
import type { zCoordenadas } from "p-comuns";
|
||||
import type z from "zod";
|
||||
export type TipoCoordenadas = z.infer<typeof zCoordenadas>;
|
||||
/** Centro padrão do Brasil (Brasília) */
|
||||
export declare const COORDENADAS_PADRAO: TipoCoordenadas;
|
||||
/** Zoom padrão do mapa */
|
||||
export declare const ZOOM_PADRAO = 4;
|
||||
/** Altura padrão do mapa em pixels */
|
||||
export declare const ALTURA_MAPA_PADRAO = 300;
|
||||
/** Limites válidos para latitude (-90 a 90) e longitude (-180 a 180) */
|
||||
export declare function coordenadaValida(lat: number, lng: number): boolean;
|
||||
/** Formata número de coordenada para exibição com vírgula (padrão BR) */
|
||||
export declare function formatarCoordenada(valor: number): string;
|
||||
/** Converte texto digitado (aceita vírgula ou ponto) em número. Retorna null se inválido. */
|
||||
export declare function parseCoordenada(v: string | number): number | null;
|
||||
/** Tenta geolocalização do navegador; se falhar, usa GeoIP como fallback */
|
||||
export declare function obterLocalizacao(): Promise<{
|
||||
latitude: number;
|
||||
longitude: number;
|
||||
}>;
|
||||
|
|
@ -1,9 +1 @@
|
|||
/**
|
||||
* Formata um CPF ou CNPJ aplicando a máscara brasileira padrão durante a digitação.
|
||||
* Detecta automaticamente o tipo pelo comprimento (≤11 dígitos = CPF, >11 = CNPJ).
|
||||
* Não valida o dígito verificador — apenas aplica a formatação visual.
|
||||
*
|
||||
* @param v - Valor bruto (pode conter letras, pontos, traços etc.)
|
||||
* @returns String formatada no padrão `000.000.000-00` (CPF) ou `00.000.000/0000-00` (CNPJ)
|
||||
*/
|
||||
export declare function formatarCpfCnpj(v: string): string;
|
||||
|
|
|
|||
|
|
@ -1,15 +0,0 @@
|
|||
/**
|
||||
* Utilitário de filtragem para os componentes de seleção (EliEntradaSelecao e EliEntradaSelecaoMultipla).
|
||||
*
|
||||
* Normaliza a string removendo acentos e convertendo para minúsculas antes de comparar,
|
||||
* garantindo que "São Paulo" seja encontrado digitando "sao paulo" ou "SÃO PAULO".
|
||||
*/
|
||||
/**
|
||||
* Função de filtro customizada para v-autocomplete do Vuetify.
|
||||
*
|
||||
* Vuetify passa (value, query, item):
|
||||
* - `value` → texto do item renderizado (item-title resolvido)
|
||||
* - `query` → texto digitado pelo usuário
|
||||
* - `item` → objeto completo do item (não usado aqui)
|
||||
*/
|
||||
export declare function filtroSelecao(value: string, query: string): boolean;
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
import { type Ref } from "vue";
|
||||
import type { PadroesEntradas } from "../tiposEntradas";
|
||||
type EntradaCoordenadas = PadroesEntradas["coordenadas"];
|
||||
type EmitFn = (event: string, ...args: unknown[]) => void;
|
||||
interface OpcoesComposable {
|
||||
value: () => EntradaCoordenadas["value"];
|
||||
opcoes: () => EntradaCoordenadas["opcoes"];
|
||||
emit: EmitFn;
|
||||
mapaRef: Ref<HTMLElement | null>;
|
||||
}
|
||||
export declare function useCoordenadas({ value, opcoes, emit, mapaRef }: OpcoesComposable): {
|
||||
alturaEfetiva: import("vue").ComputedRef<number>;
|
||||
geolocalizando: Ref<boolean, boolean>;
|
||||
possuiValor: import("vue").ComputedRef<boolean>;
|
||||
latDisplay: import("vue").ComputedRef<string>;
|
||||
lngDisplay: import("vue").ComputedRef<string>;
|
||||
onLatChange: (v: string | number) => void;
|
||||
onLngChange: (v: string | number) => void;
|
||||
usarMinhaLocalizacao: () => Promise<void>;
|
||||
limpar: () => void;
|
||||
};
|
||||
export {};
|
||||
1264
dist/types/componentes/EliTabela/EliTabela.vue.d.ts
vendored
Normal file
1264
dist/types/componentes/EliTabela/EliTabela.vue.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load diff
186
dist/types/componentes/EliTabela/EliTabelaBody.vue.d.ts
vendored
Normal file
186
dist/types/componentes/EliTabela/EliTabelaBody.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
import { PropType } from "vue";
|
||||
import type { EliColuna } from "./types-eli-tabela";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
colunas: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
colunasInvisiveis: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
temColunasInvisiveis: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
linhasExpandidas: {
|
||||
type: PropType<Record<number, boolean>>;
|
||||
required: true;
|
||||
};
|
||||
linhas: {
|
||||
type: PropType<Array<unknown>>;
|
||||
required: true;
|
||||
};
|
||||
temAcoes: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
menuAberto: {
|
||||
type: PropType<number | null>;
|
||||
required: true;
|
||||
};
|
||||
possuiAcoes: {
|
||||
type: PropType<(i: number) => boolean>;
|
||||
required: true;
|
||||
};
|
||||
toggleMenu: {
|
||||
type: PropType<(indice: number, evento: MouseEvent) => void>;
|
||||
required: true;
|
||||
};
|
||||
alternarLinhaExpandida: {
|
||||
type: PropType<(indice: number) => void>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
ChevronRight: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
ChevronDown: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
colunas: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
colunasInvisiveis: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
temColunasInvisiveis: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
linhasExpandidas: {
|
||||
type: PropType<Record<number, boolean>>;
|
||||
required: true;
|
||||
};
|
||||
linhas: {
|
||||
type: PropType<Array<unknown>>;
|
||||
required: true;
|
||||
};
|
||||
temAcoes: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
menuAberto: {
|
||||
type: PropType<number | null>;
|
||||
required: true;
|
||||
};
|
||||
possuiAcoes: {
|
||||
type: PropType<(i: number) => boolean>;
|
||||
required: true;
|
||||
};
|
||||
toggleMenu: {
|
||||
type: PropType<(indice: number, evento: MouseEvent) => void>;
|
||||
required: true;
|
||||
};
|
||||
alternarLinhaExpandida: {
|
||||
type: PropType<(indice: number) => void>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {
|
||||
EliTabelaCelula: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
celula: {
|
||||
type: PropType<import("./types-eli-tabela").ComponenteCelula>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
Componente: import("vue").ComputedRef<import("vue").Component>;
|
||||
dadosParaComponente: import("vue").ComputedRef<{
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
numero: number;
|
||||
prefixo?: string;
|
||||
sufixo?: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
opcoes: {
|
||||
rotulo: string;
|
||||
cor?: string;
|
||||
icone?: import("lucide-vue-next").LucideIcon;
|
||||
acao?: () => void;
|
||||
}[];
|
||||
} | {
|
||||
valor: string;
|
||||
formato: "data" | "data_hora" | "relativo";
|
||||
acao?: () => void;
|
||||
}>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
celula: {
|
||||
type: PropType<import("./types-eli-tabela").ComponenteCelula>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
EliTabelaDetalhesLinha: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
linha: {
|
||||
type: PropType<unknown>;
|
||||
required: true;
|
||||
};
|
||||
colunasInvisiveis: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
linha: {
|
||||
type: PropType<unknown>;
|
||||
required: true;
|
||||
};
|
||||
colunasInvisiveis: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {
|
||||
EliTabelaCelula: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
celula: {
|
||||
type: PropType<import("./types-eli-tabela").ComponenteCelula>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
Componente: import("vue").ComputedRef<import("vue").Component>;
|
||||
dadosParaComponente: import("vue").ComputedRef<{
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
numero: number;
|
||||
prefixo?: string;
|
||||
sufixo?: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
opcoes: {
|
||||
rotulo: string;
|
||||
cor?: string;
|
||||
icone?: import("lucide-vue-next").LucideIcon;
|
||||
acao?: () => void;
|
||||
}[];
|
||||
} | {
|
||||
valor: string;
|
||||
formato: "data" | "data_hora" | "relativo";
|
||||
acao?: () => void;
|
||||
}>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
celula: {
|
||||
type: PropType<import("./types-eli-tabela").ComponenteCelula>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
MoreVertical: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
ChevronRight: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
ChevronDown: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
101
dist/types/componentes/EliTabela/EliTabelaCabecalho.vue.d.ts
vendored
Normal file
101
dist/types/componentes/EliTabela/EliTabelaCabecalho.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
import { PropType } from "vue";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
exibirBusca: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
exibirBotaoColunas: {
|
||||
type: BooleanConstructor;
|
||||
required: false;
|
||||
default: boolean;
|
||||
};
|
||||
exibirBotaoFiltroAvancado: {
|
||||
type: BooleanConstructor;
|
||||
required: false;
|
||||
default: boolean;
|
||||
};
|
||||
valorBusca: {
|
||||
type: StringConstructor;
|
||||
required: true;
|
||||
};
|
||||
acoesCabecalho: {
|
||||
type: PropType<Array<{
|
||||
icone?: any;
|
||||
cor?: string;
|
||||
rotulo: string;
|
||||
acao: () => void;
|
||||
}>>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
temAcoesCabecalho: import("vue").ComputedRef<boolean>;
|
||||
emitBuscar: (texto: string) => void;
|
||||
emitColunas: () => void;
|
||||
emitFiltroAvancado: () => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
buscar(valor: string): boolean;
|
||||
colunas(): true;
|
||||
filtroAvancado(): true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
exibirBusca: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
exibirBotaoColunas: {
|
||||
type: BooleanConstructor;
|
||||
required: false;
|
||||
default: boolean;
|
||||
};
|
||||
exibirBotaoFiltroAvancado: {
|
||||
type: BooleanConstructor;
|
||||
required: false;
|
||||
default: boolean;
|
||||
};
|
||||
valorBusca: {
|
||||
type: StringConstructor;
|
||||
required: true;
|
||||
};
|
||||
acoesCabecalho: {
|
||||
type: PropType<Array<{
|
||||
icone?: any;
|
||||
cor?: string;
|
||||
rotulo: string;
|
||||
acao: () => void;
|
||||
}>>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
onBuscar?: ((valor: string) => any) | undefined;
|
||||
onColunas?: (() => any) | undefined;
|
||||
onFiltroAvancado?: (() => any) | undefined;
|
||||
}>, {
|
||||
exibirBotaoColunas: boolean;
|
||||
exibirBotaoFiltroAvancado: boolean;
|
||||
}, {}, {
|
||||
EliTabelaCaixaDeBusca: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
modelo: {
|
||||
type: StringConstructor;
|
||||
required: false;
|
||||
default: string;
|
||||
};
|
||||
}>, {
|
||||
texto: import("vue").Ref<string, string>;
|
||||
emitirBusca: () => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
buscar(valor: string): boolean;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
modelo: {
|
||||
type: StringConstructor;
|
||||
required: false;
|
||||
default: string;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
onBuscar?: ((valor: string) => any) | undefined;
|
||||
}>, {
|
||||
modelo: string;
|
||||
}, {}, {
|
||||
Search: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
26
dist/types/componentes/EliTabela/EliTabelaCaixaDeBusca.vue.d.ts
vendored
Normal file
26
dist/types/componentes/EliTabela/EliTabelaCaixaDeBusca.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
modelo: {
|
||||
type: StringConstructor;
|
||||
required: false;
|
||||
default: string;
|
||||
};
|
||||
}>, {
|
||||
texto: import("vue").Ref<string, string>;
|
||||
emitirBusca: () => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
buscar(valor: string): boolean;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
modelo: {
|
||||
type: StringConstructor;
|
||||
required: false;
|
||||
default: string;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
onBuscar?: ((valor: string) => any) | undefined;
|
||||
}>, {
|
||||
modelo: string;
|
||||
}, {}, {
|
||||
Search: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
36
dist/types/componentes/EliTabela/EliTabelaDebug.vue.d.ts
vendored
Normal file
36
dist/types/componentes/EliTabela/EliTabelaDebug.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
import { PropType } from "vue";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
isDev: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
menuAberto: {
|
||||
type: PropType<number | null>;
|
||||
required: true;
|
||||
};
|
||||
menuPopupPos: {
|
||||
type: PropType<{
|
||||
top: number;
|
||||
left: number;
|
||||
}>;
|
||||
required: true;
|
||||
};
|
||||
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
isDev: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
menuAberto: {
|
||||
type: PropType<number | null>;
|
||||
required: true;
|
||||
};
|
||||
menuPopupPos: {
|
||||
type: PropType<{
|
||||
top: number;
|
||||
left: number;
|
||||
}>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
60
dist/types/componentes/EliTabela/EliTabelaDetalhesLinha.vue.d.ts
vendored
Normal file
60
dist/types/componentes/EliTabela/EliTabelaDetalhesLinha.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
import { PropType } from "vue";
|
||||
import type { EliColuna } from "./types-eli-tabela";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
linha: {
|
||||
type: PropType<unknown>;
|
||||
required: true;
|
||||
};
|
||||
colunasInvisiveis: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
linha: {
|
||||
type: PropType<unknown>;
|
||||
required: true;
|
||||
};
|
||||
colunasInvisiveis: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {
|
||||
EliTabelaCelula: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
celula: {
|
||||
type: PropType<import("./types-eli-tabela").ComponenteCelula>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
Componente: import("vue").ComputedRef<import("vue").Component>;
|
||||
dadosParaComponente: import("vue").ComputedRef<{
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
numero: number;
|
||||
prefixo?: string;
|
||||
sufixo?: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
opcoes: {
|
||||
rotulo: string;
|
||||
cor?: string;
|
||||
icone?: import("lucide-vue-next").LucideIcon;
|
||||
acao?: () => void;
|
||||
}[];
|
||||
} | {
|
||||
valor: string;
|
||||
formato: "data" | "data_hora" | "relativo";
|
||||
acao?: () => void;
|
||||
}>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
celula: {
|
||||
type: PropType<import("./types-eli-tabela").ComponenteCelula>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
34
dist/types/componentes/EliTabela/EliTabelaEstados.vue.d.ts
vendored
Normal file
34
dist/types/componentes/EliTabela/EliTabelaEstados.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
import { PropType } from "vue";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
carregando: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
erro: {
|
||||
type: PropType<string | null>;
|
||||
required: true;
|
||||
};
|
||||
mensagemVazio: {
|
||||
type: PropType<string | undefined>;
|
||||
required: false;
|
||||
default: undefined;
|
||||
};
|
||||
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
carregando: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
erro: {
|
||||
type: PropType<string | null>;
|
||||
required: true;
|
||||
};
|
||||
mensagemVazio: {
|
||||
type: PropType<string | undefined>;
|
||||
required: false;
|
||||
default: undefined;
|
||||
};
|
||||
}>> & Readonly<{}>, {
|
||||
mensagemVazio: string | undefined;
|
||||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
59
dist/types/componentes/EliTabela/EliTabelaHead.vue.d.ts
vendored
Normal file
59
dist/types/componentes/EliTabela/EliTabelaHead.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
import { PropType } from "vue";
|
||||
import type { EliColuna } from "./types-eli-tabela";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
colunas: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
temAcoes: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
temColunasInvisiveis: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
colunaOrdenacao: {
|
||||
type: PropType<string | null>;
|
||||
required: true;
|
||||
};
|
||||
direcaoOrdenacao: {
|
||||
type: PropType<"asc" | "desc">;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
ArrowUp: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
ArrowDown: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
isOrdenavel: (coluna: any) => boolean;
|
||||
emitAlternarOrdenacao: (chave: string) => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
alternarOrdenacao(chave: string): boolean;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
colunas: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
temAcoes: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
temColunasInvisiveis: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
colunaOrdenacao: {
|
||||
type: PropType<string | null>;
|
||||
required: true;
|
||||
};
|
||||
direcaoOrdenacao: {
|
||||
type: PropType<"asc" | "desc">;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
onAlternarOrdenacao?: ((chave: string) => any) | undefined;
|
||||
}>, {}, {}, {
|
||||
ArrowUp: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
ArrowDown: import("vue").FunctionalComponent<import("lucide-vue-next").LucideProps, {}, any, {}>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
66
dist/types/componentes/EliTabela/EliTabelaMenuAcoes.vue.d.ts
vendored
Normal file
66
dist/types/componentes/EliTabela/EliTabelaMenuAcoes.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
import { PropType } from "vue";
|
||||
import type { EliTabelaAcao } from "./types-eli-tabela";
|
||||
type ItemAcao<T> = {
|
||||
acao: EliTabelaAcao<T>;
|
||||
indice: number;
|
||||
visivel: boolean;
|
||||
};
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
menuAberto: {
|
||||
type: PropType<number | null>;
|
||||
required: true;
|
||||
};
|
||||
posicao: {
|
||||
type: PropType<{
|
||||
top: number;
|
||||
left: number;
|
||||
}>;
|
||||
required: true;
|
||||
};
|
||||
acoes: {
|
||||
type: PropType<Array<ItemAcao<any>>>;
|
||||
required: true;
|
||||
};
|
||||
linha: {
|
||||
type: PropType<unknown | null>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
menuEl: import("vue").Ref<HTMLElement | null, HTMLElement | null>;
|
||||
possuiAcoes: import("vue").ComputedRef<boolean>;
|
||||
emitExecutar: (item: {
|
||||
acao: EliTabelaAcao<any>;
|
||||
}) => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
executar(payload: {
|
||||
acao: EliTabelaAcao<any>;
|
||||
linha: unknown;
|
||||
}): boolean;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
menuAberto: {
|
||||
type: PropType<number | null>;
|
||||
required: true;
|
||||
};
|
||||
posicao: {
|
||||
type: PropType<{
|
||||
top: number;
|
||||
left: number;
|
||||
}>;
|
||||
required: true;
|
||||
};
|
||||
acoes: {
|
||||
type: PropType<Array<ItemAcao<any>>>;
|
||||
required: true;
|
||||
};
|
||||
linha: {
|
||||
type: PropType<unknown | null>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
onExecutar?: ((payload: {
|
||||
acao: EliTabelaAcao<any>;
|
||||
linha: unknown;
|
||||
}) => any) | undefined;
|
||||
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
55
dist/types/componentes/EliTabela/EliTabelaModalColunas.vue.d.ts
vendored
Normal file
55
dist/types/componentes/EliTabela/EliTabelaModalColunas.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
import { PropType } from "vue";
|
||||
import type { EliTabelaColunasConfig } from "./colunasStorage";
|
||||
import type { EliColuna } from "./types-eli-tabela";
|
||||
type OrigemLista = "visiveis" | "invisiveis";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
aberto: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
rotulosColunas: {
|
||||
type: PropType<string[]>;
|
||||
required: true;
|
||||
};
|
||||
configInicial: {
|
||||
type: PropType<EliTabelaColunasConfig>;
|
||||
required: true;
|
||||
};
|
||||
colunas: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
visiveisLocal: import("vue").Ref<string[], string[]>;
|
||||
invisiveisLocal: import("vue").Ref<string[], string[]>;
|
||||
emitFechar: () => void;
|
||||
emitSalvar: () => void;
|
||||
onDragStart: (e: DragEvent, rotulo: string, origem: OrigemLista, index: number) => void;
|
||||
onDropItem: (e: DragEvent, destino: OrigemLista, index: number) => void;
|
||||
onDropLista: (e: DragEvent, destino: OrigemLista, _index: number | null) => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
fechar(): true;
|
||||
salvar(_config: EliTabelaColunasConfig): true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
aberto: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
rotulosColunas: {
|
||||
type: PropType<string[]>;
|
||||
required: true;
|
||||
};
|
||||
configInicial: {
|
||||
type: PropType<EliTabelaColunasConfig>;
|
||||
required: true;
|
||||
};
|
||||
colunas: {
|
||||
type: PropType<Array<EliColuna<any>>>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
onFechar?: (() => any) | undefined;
|
||||
onSalvar?: ((_config: EliTabelaColunasConfig) => any) | undefined;
|
||||
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
525
dist/types/componentes/EliTabela/EliTabelaModalFiltroAvancado.vue.d.ts
vendored
Normal file
525
dist/types/componentes/EliTabela/EliTabelaModalFiltroAvancado.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,525 @@
|
|||
import { PropType } from "vue";
|
||||
import type { ComponenteEntrada } from "../EliEntrada/tiposEntradas";
|
||||
import type { EliTabelaConsulta } from "./types-eli-tabela";
|
||||
type FiltroBase<T> = NonNullable<EliTabelaConsulta<T>["filtroAvancado"]>[number];
|
||||
type LinhaFiltro<T> = {
|
||||
coluna: keyof T;
|
||||
entrada: ComponenteEntrada;
|
||||
operador: string;
|
||||
valor: any;
|
||||
};
|
||||
declare function rotuloDoFiltro(f: FiltroBase<any>): string;
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
aberto: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
filtrosBase: {
|
||||
type: PropType<Array<FiltroBase<any>>>;
|
||||
required: true;
|
||||
};
|
||||
modelo: {
|
||||
type: PropType<Array<any>>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
linhas: import("vue").Ref<{
|
||||
coluna: string | number | symbol;
|
||||
entrada: readonly ["texto", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
limiteCaracteres?: number | undefined;
|
||||
formato?: "texto" | "email" | "url" | "telefone" | "cpfCnpj" | "cep" | undefined;
|
||||
}] | readonly ["dataHora", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
modo?: "data" | "dataHora" | undefined;
|
||||
limpavel?: boolean | undefined;
|
||||
erro?: boolean | undefined;
|
||||
mensagensErro?: string | string[] | undefined;
|
||||
dica?: string | undefined;
|
||||
dicaPersistente?: boolean | undefined;
|
||||
min?: string | undefined;
|
||||
max?: string | undefined;
|
||||
densidade?: import("../../tipos").CampoDensidade | undefined;
|
||||
variante?: import("../../tipos").CampoVariante | undefined;
|
||||
}] | readonly ["numero", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
sufixo?: string | undefined;
|
||||
prefixo?: string | undefined;
|
||||
precisao?: number | undefined;
|
||||
}] | readonly ["paragrafo", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
linhas?: number | undefined;
|
||||
limiteCaracteres?: number | undefined;
|
||||
limpavel?: boolean | undefined;
|
||||
erro?: boolean | undefined;
|
||||
mensagensErro?: string | string[] | undefined;
|
||||
dica?: string | undefined;
|
||||
dicaPersistente?: boolean | undefined;
|
||||
densidade?: import("../../tipos").CampoDensidade | undefined;
|
||||
variante?: import("../../tipos").CampoVariante | undefined;
|
||||
}] | readonly ["selecao", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
itens: () => {
|
||||
chave: string;
|
||||
rotulo: string;
|
||||
}[] | Promise<{
|
||||
chave: string;
|
||||
rotulo: string;
|
||||
}[]>;
|
||||
limpavel?: boolean | undefined;
|
||||
erro?: boolean | undefined;
|
||||
mensagensErro?: string | string[] | undefined;
|
||||
dica?: string | undefined;
|
||||
dicaPersistente?: boolean | undefined;
|
||||
densidade?: import("../../tipos").CampoDensidade | undefined;
|
||||
variante?: import("../../tipos").CampoVariante | undefined;
|
||||
}];
|
||||
operador: string;
|
||||
valor: any;
|
||||
}[], LinhaFiltro<any>[] | {
|
||||
coluna: string | number | symbol;
|
||||
entrada: readonly ["texto", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
limiteCaracteres?: number | undefined;
|
||||
formato?: "texto" | "email" | "url" | "telefone" | "cpfCnpj" | "cep" | undefined;
|
||||
}] | readonly ["dataHora", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
modo?: "data" | "dataHora" | undefined;
|
||||
limpavel?: boolean | undefined;
|
||||
erro?: boolean | undefined;
|
||||
mensagensErro?: string | string[] | undefined;
|
||||
dica?: string | undefined;
|
||||
dicaPersistente?: boolean | undefined;
|
||||
min?: string | undefined;
|
||||
max?: string | undefined;
|
||||
densidade?: import("../../tipos").CampoDensidade | undefined;
|
||||
variante?: import("../../tipos").CampoVariante | undefined;
|
||||
}] | readonly ["numero", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
sufixo?: string | undefined;
|
||||
prefixo?: string | undefined;
|
||||
precisao?: number | undefined;
|
||||
}] | readonly ["paragrafo", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
linhas?: number | undefined;
|
||||
limiteCaracteres?: number | undefined;
|
||||
limpavel?: boolean | undefined;
|
||||
erro?: boolean | undefined;
|
||||
mensagensErro?: string | string[] | undefined;
|
||||
dica?: string | undefined;
|
||||
dicaPersistente?: boolean | undefined;
|
||||
densidade?: import("../../tipos").CampoDensidade | undefined;
|
||||
variante?: import("../../tipos").CampoVariante | undefined;
|
||||
}] | readonly ["selecao", {
|
||||
rotulo: string;
|
||||
placeholder?: string | undefined;
|
||||
itens: () => {
|
||||
chave: string;
|
||||
rotulo: string;
|
||||
}[] | Promise<{
|
||||
chave: string;
|
||||
rotulo: string;
|
||||
}[]>;
|
||||
limpavel?: boolean | undefined;
|
||||
erro?: boolean | undefined;
|
||||
mensagensErro?: string | string[] | undefined;
|
||||
dica?: string | undefined;
|
||||
dicaPersistente?: boolean | undefined;
|
||||
densidade?: import("../../tipos").CampoDensidade | undefined;
|
||||
variante?: import("../../tipos").CampoVariante | undefined;
|
||||
}];
|
||||
operador: string;
|
||||
valor: any;
|
||||
}[]>;
|
||||
opcoesParaAdicionar: import("vue").ComputedRef<{
|
||||
rotulo: string;
|
||||
coluna: string | number | symbol;
|
||||
operador: import("p-comuns").operadores | keyof typeof import("p-comuns").operadores;
|
||||
entrada: ComponenteEntrada;
|
||||
}[]>;
|
||||
colunaParaAdicionar: import("vue").Ref<string, string>;
|
||||
componenteEntrada: (entrada: ComponenteEntrada) => import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
value: {
|
||||
type: PropType<string | null | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
limiteCaracteres?: number;
|
||||
formato?: "texto" | "email" | "url" | "telefone" | "cpfCnpj" | "cep";
|
||||
}>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
attrs: {
|
||||
[x: string]: unknown;
|
||||
};
|
||||
emit: ((event: "update:value", _v: string | null | undefined) => void) & ((event: "input", _v: string | null | undefined) => void) & ((event: "change", _v: string | null | undefined) => void) & ((event: "focus") => void) & ((event: "blur") => void);
|
||||
localValue: import("vue").WritableComputedRef<string | null | undefined, string | null | undefined>;
|
||||
inputHtmlType: import("vue").ComputedRef<"text" | "email" | "url">;
|
||||
inputMode: import("vue").ComputedRef<string | undefined>;
|
||||
onInput: (e: Event) => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"update:value": (_v: string | null | undefined) => true;
|
||||
input: (_v: string | null | undefined) => true;
|
||||
change: (_v: string | null | undefined) => true;
|
||||
focus: () => true;
|
||||
blur: () => true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
value: {
|
||||
type: PropType<string | null | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
limiteCaracteres?: number;
|
||||
formato?: "texto" | "email" | "url" | "telefone" | "cpfCnpj" | "cep";
|
||||
}>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
"onUpdate:value"?: ((_v: string | null | undefined) => any) | undefined;
|
||||
onInput?: ((_v: string | null | undefined) => any) | undefined;
|
||||
onChange?: ((_v: string | null | undefined) => any) | undefined;
|
||||
onFocus?: (() => any) | undefined;
|
||||
onBlur?: (() => any) | undefined;
|
||||
}>, {
|
||||
value: string | null | undefined;
|
||||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any> | import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
value: {
|
||||
type: PropType<number | null | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
sufixo?: string;
|
||||
prefixo?: string;
|
||||
precisao?: number;
|
||||
}>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
attrs: {
|
||||
[x: string]: unknown;
|
||||
};
|
||||
emit: ((event: "update:value", _v: number | null | undefined) => void) & ((event: "input", _v: number | null | undefined) => void) & ((event: "change", _v: number | null | undefined) => void) & ((event: "focus") => void) & ((event: "blur") => void);
|
||||
displayValue: import("vue").Ref<string, string>;
|
||||
isInteiro: import("vue").ComputedRef<boolean>;
|
||||
onUpdateModelValue: (texto: string) => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"update:value": (_v: number | null | undefined) => true;
|
||||
input: (_v: number | null | undefined) => true;
|
||||
change: (_v: number | null | undefined) => true;
|
||||
focus: () => true;
|
||||
blur: () => true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
value: {
|
||||
type: PropType<number | null | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
sufixo?: string;
|
||||
prefixo?: string;
|
||||
precisao?: number;
|
||||
}>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
"onUpdate:value"?: ((_v: number | null | undefined) => any) | undefined;
|
||||
onInput?: ((_v: number | null | undefined) => any) | undefined;
|
||||
onChange?: ((_v: number | null | undefined) => any) | undefined;
|
||||
onFocus?: (() => any) | undefined;
|
||||
onBlur?: (() => any) | undefined;
|
||||
}>, {
|
||||
value: number | null | undefined;
|
||||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any> | import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
value: {
|
||||
type: PropType<string | null | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../../tipos").CampoDensidade;
|
||||
variante?: import("../../tipos").CampoVariante;
|
||||
}>;
|
||||
required: false;
|
||||
default: undefined;
|
||||
};
|
||||
modelValue: {
|
||||
type: PropType<string | null>;
|
||||
default: null;
|
||||
};
|
||||
modo: {
|
||||
type: PropType<"data" | "dataHora" | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
rotulo: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
placeholder: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
desabilitado: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
limpavel: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
erro: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
mensagensErro: {
|
||||
type: PropType<string | string[]>;
|
||||
default: undefined;
|
||||
};
|
||||
dica: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
dicaPersistente: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
densidade: {
|
||||
type: PropType<import("../../tipos").CampoDensidade>;
|
||||
default: undefined;
|
||||
};
|
||||
variante: {
|
||||
type: PropType<import("../../tipos").CampoVariante>;
|
||||
default: undefined;
|
||||
};
|
||||
min: {
|
||||
type: PropType<string | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
max: {
|
||||
type: PropType<string | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
}>, {
|
||||
attrs: {
|
||||
[x: string]: unknown;
|
||||
};
|
||||
valor: import("vue").WritableComputedRef<string, string>;
|
||||
tipoInput: import("vue").ComputedRef<"date" | "datetime-local">;
|
||||
minLocal: import("vue").ComputedRef<string | undefined>;
|
||||
maxLocal: import("vue").ComputedRef<string | undefined>;
|
||||
opcoesEfetivas: import("vue").ComputedRef<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../../tipos").CampoDensidade;
|
||||
variante?: import("../../tipos").CampoVariante;
|
||||
}>;
|
||||
desabilitadoEfetivo: import("vue").ComputedRef<boolean>;
|
||||
emitCompatFocus: () => void;
|
||||
emitCompatBlur: () => void;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"update:value": (_v: string | null) => true;
|
||||
input: (_v: string | null) => true;
|
||||
change: (_v: string | null) => true;
|
||||
"update:modelValue": (_v: string | null) => true;
|
||||
alterar: (_v: string | null) => true;
|
||||
foco: () => true;
|
||||
desfoco: () => true;
|
||||
focus: () => true;
|
||||
blur: () => true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
value: {
|
||||
type: PropType<string | null | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
opcoes: {
|
||||
type: PropType<{
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../../tipos").CampoDensidade;
|
||||
variante?: import("../../tipos").CampoVariante;
|
||||
}>;
|
||||
required: false;
|
||||
default: undefined;
|
||||
};
|
||||
modelValue: {
|
||||
type: PropType<string | null>;
|
||||
default: null;
|
||||
};
|
||||
modo: {
|
||||
type: PropType<"data" | "dataHora" | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
rotulo: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
placeholder: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
desabilitado: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
limpavel: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
erro: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
mensagensErro: {
|
||||
type: PropType<string | string[]>;
|
||||
default: undefined;
|
||||
};
|
||||
dica: {
|
||||
type: StringConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
dicaPersistente: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
densidade: {
|
||||
type: PropType<import("../../tipos").CampoDensidade>;
|
||||
default: undefined;
|
||||
};
|
||||
variante: {
|
||||
type: PropType<import("../../tipos").CampoVariante>;
|
||||
default: undefined;
|
||||
};
|
||||
min: {
|
||||
type: PropType<string | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
max: {
|
||||
type: PropType<string | undefined>;
|
||||
default: undefined;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
"onUpdate:value"?: ((_v: string | null) => any) | undefined;
|
||||
onInput?: ((_v: string | null) => any) | undefined;
|
||||
onChange?: ((_v: string | null) => any) | undefined;
|
||||
onFocus?: (() => any) | undefined;
|
||||
onBlur?: (() => any) | undefined;
|
||||
"onUpdate:modelValue"?: ((_v: string | null) => any) | undefined;
|
||||
onAlterar?: ((_v: string | null) => any) | undefined;
|
||||
onFoco?: (() => any) | undefined;
|
||||
onDesfoco?: (() => any) | undefined;
|
||||
}>, {
|
||||
modo: "data" | "dataHora" | undefined;
|
||||
limpavel: boolean;
|
||||
erro: boolean;
|
||||
mensagensErro: string | string[];
|
||||
dica: string;
|
||||
dicaPersistente: boolean;
|
||||
min: string | undefined;
|
||||
max: string | undefined;
|
||||
densidade: import("../../tipos").CampoDensidade;
|
||||
variante: import("../../tipos").CampoVariante;
|
||||
opcoes: {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
} & {
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../../tipos").CampoDensidade;
|
||||
variante?: import("../../tipos").CampoVariante;
|
||||
};
|
||||
value: string | null | undefined;
|
||||
placeholder: string;
|
||||
modelValue: string | null;
|
||||
rotulo: string;
|
||||
desabilitado: boolean;
|
||||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
opcoesEntrada: (entrada: ComponenteEntrada) => any;
|
||||
adicionar: () => void;
|
||||
remover: (idx: number) => void;
|
||||
emitFechar: () => void;
|
||||
emitSalvar: () => void;
|
||||
emitLimpar: () => void;
|
||||
rotuloDoFiltro: typeof rotuloDoFiltro;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
fechar: () => true;
|
||||
limpar: () => true;
|
||||
salvar: (_linhas: any[]) => true;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
aberto: {
|
||||
type: BooleanConstructor;
|
||||
required: true;
|
||||
};
|
||||
filtrosBase: {
|
||||
type: PropType<Array<FiltroBase<any>>>;
|
||||
required: true;
|
||||
};
|
||||
modelo: {
|
||||
type: PropType<Array<any>>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
onFechar?: (() => any) | undefined;
|
||||
onSalvar?: ((_linhas: any[]) => any) | undefined;
|
||||
onLimpar?: (() => any) | undefined;
|
||||
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
45
dist/types/componentes/EliTabela/EliTabelaPaginacao.vue.d.ts
vendored
Normal file
45
dist/types/componentes/EliTabela/EliTabelaPaginacao.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
pagina: {
|
||||
type: NumberConstructor;
|
||||
required: true;
|
||||
};
|
||||
totalPaginas: {
|
||||
type: NumberConstructor;
|
||||
required: true;
|
||||
};
|
||||
maximoBotoes: {
|
||||
type: NumberConstructor;
|
||||
required: false;
|
||||
};
|
||||
}>, {
|
||||
botoes: import("vue").ComputedRef<{
|
||||
label: string;
|
||||
pagina?: number;
|
||||
ativo?: boolean;
|
||||
ehEllipsis?: boolean;
|
||||
}[]>;
|
||||
irParaPagina: (pagina: number | undefined) => void;
|
||||
anteriorDesabilitado: import("vue").ComputedRef<boolean>;
|
||||
proximaDesabilitada: import("vue").ComputedRef<boolean>;
|
||||
paginaAtual: import("vue").ComputedRef<number>;
|
||||
totalPaginasExibidas: import("vue").ComputedRef<number>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
alterar(pagina: number): boolean;
|
||||
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
pagina: {
|
||||
type: NumberConstructor;
|
||||
required: true;
|
||||
};
|
||||
totalPaginas: {
|
||||
type: NumberConstructor;
|
||||
required: true;
|
||||
};
|
||||
maximoBotoes: {
|
||||
type: NumberConstructor;
|
||||
required: false;
|
||||
};
|
||||
}>> & Readonly<{
|
||||
onAlterar?: ((pagina: number) => any) | undefined;
|
||||
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
41
dist/types/componentes/EliTabela/celulas/EliTabelaCelula.vue.d.ts
vendored
Normal file
41
dist/types/componentes/EliTabela/celulas/EliTabelaCelula.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import type { Component } from "vue";
|
||||
import { PropType } from "vue";
|
||||
import type { ComponenteCelula } from "../types-eli-tabela";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
celula: {
|
||||
type: PropType<ComponenteCelula>;
|
||||
required: true;
|
||||
};
|
||||
}>, {
|
||||
Componente: import("vue").ComputedRef<Component>;
|
||||
dadosParaComponente: import("vue").ComputedRef<{
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
numero: number;
|
||||
prefixo?: string;
|
||||
sufixo?: string;
|
||||
acao?: () => void;
|
||||
} | {
|
||||
opcoes: {
|
||||
rotulo: string;
|
||||
cor?: string;
|
||||
icone?: import("lucide-vue-next").LucideIcon;
|
||||
acao?: () => void;
|
||||
}[];
|
||||
} | {
|
||||
valor: string;
|
||||
formato: "data" | "data_hora" | "relativo";
|
||||
acao?: () => void;
|
||||
}>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
celula: {
|
||||
type: PropType<ComponenteCelula>;
|
||||
required: true;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
22
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaData.vue.d.ts
vendored
Normal file
22
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaData.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
import { PropType } from "vue";
|
||||
import type { TiposTabelaCelulas } from "./tiposTabelaCelulas";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["data"]>;
|
||||
required: false;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
valor: string;
|
||||
formato: "data" | "data_hora" | "relativo";
|
||||
acao?: () => void;
|
||||
} | undefined;
|
||||
textoData: import("vue").ComputedRef<string>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["data"]>;
|
||||
required: false;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
21
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaNumero.vue.d.ts
vendored
Normal file
21
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaNumero.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import { PropType } from "vue";
|
||||
import type { TiposTabelaCelulas } from "./tiposTabelaCelulas";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["numero"]>;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
numero: number;
|
||||
prefixo?: string;
|
||||
sufixo?: string;
|
||||
acao?: () => void;
|
||||
} | undefined;
|
||||
textoNumero: import("vue").ComputedRef<string>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["numero"]>;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
683
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaTags.vue.d.ts
vendored
Normal file
683
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaTags.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,683 @@
|
|||
import { PropType } from "vue";
|
||||
import type { TiposTabelaCelulas } from "./tiposTabelaCelulas";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["tags"]>;
|
||||
required: false;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
opcoes: {
|
||||
rotulo: string;
|
||||
cor?: string;
|
||||
icone?: import("lucide-vue-next").LucideIcon;
|
||||
acao?: () => void;
|
||||
}[];
|
||||
} | undefined;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["tags"]>;
|
||||
required: false;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {
|
||||
VChip: {
|
||||
new (...args: any[]): import("vue").CreateComponentPublicInstanceWithMixins<{
|
||||
style: string | false | import("vue").StyleValue[] | import("vue").CSSProperties | null;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
};
|
||||
modelValue: boolean;
|
||||
} & {
|
||||
theme?: string | undefined;
|
||||
class?: any;
|
||||
border?: string | number | boolean | undefined;
|
||||
elevation?: string | number | undefined;
|
||||
rounded?: string | number | boolean | undefined;
|
||||
color?: string | undefined;
|
||||
value?: any;
|
||||
selectedClass?: string | undefined;
|
||||
href?: string | undefined;
|
||||
to?: string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric | undefined;
|
||||
activeClass?: string | undefined;
|
||||
appendAvatar?: string | undefined;
|
||||
appendIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
baseColor?: string | undefined;
|
||||
link?: boolean | undefined;
|
||||
prependAvatar?: string | undefined;
|
||||
prependIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
text?: string | number | boolean | undefined;
|
||||
onClick?: ((args_0: MouseEvent) => void) | undefined;
|
||||
onClickOnce?: ((args_0: MouseEvent) => void) | undefined;
|
||||
} & {
|
||||
$children?: {
|
||||
default?: ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: (() => import("vue").VNodeChild) | undefined;
|
||||
append?: (() => import("vue").VNodeChild) | undefined;
|
||||
close?: (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: (() => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean | undefined;
|
||||
} | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
"v-slots"?: {
|
||||
default?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
append?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
close?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:append"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:close"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:default"?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:filter"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:label"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:prepend"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onClick?: ((e: KeyboardEvent | MouseEvent) => any) | undefined;
|
||||
"onClick:close"?: ((e: MouseEvent) => any) | undefined;
|
||||
"onGroup:selected"?: ((val: {
|
||||
value: boolean;
|
||||
}) => any) | undefined;
|
||||
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
||||
}, () => false | JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"click:close": (e: MouseEvent) => true;
|
||||
"update:modelValue": (value: boolean) => true;
|
||||
"group:selected": (val: {
|
||||
value: boolean;
|
||||
}) => true;
|
||||
click: (e: KeyboardEvent | MouseEvent) => true;
|
||||
}, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, {
|
||||
style: import("vue").StyleValue;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
rounded: string | number | boolean;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
link: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined;
|
||||
text: string | number | boolean;
|
||||
modelValue: boolean;
|
||||
}, true, {}, import("vue").SlotsType<Partial<{
|
||||
default: (arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
label: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
prepend: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
append: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
close: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
filter: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
}>>, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, {}, any, import("vue").ComponentProvideOptions, {
|
||||
P: {};
|
||||
B: {};
|
||||
D: {};
|
||||
C: {};
|
||||
M: {};
|
||||
Defaults: {};
|
||||
}, {
|
||||
style: string | false | import("vue").StyleValue[] | import("vue").CSSProperties | null;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
};
|
||||
modelValue: boolean;
|
||||
} & {
|
||||
theme?: string | undefined;
|
||||
class?: any;
|
||||
border?: string | number | boolean | undefined;
|
||||
elevation?: string | number | undefined;
|
||||
rounded?: string | number | boolean | undefined;
|
||||
color?: string | undefined;
|
||||
value?: any;
|
||||
selectedClass?: string | undefined;
|
||||
href?: string | undefined;
|
||||
to?: string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric | undefined;
|
||||
activeClass?: string | undefined;
|
||||
appendAvatar?: string | undefined;
|
||||
appendIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
baseColor?: string | undefined;
|
||||
link?: boolean | undefined;
|
||||
prependAvatar?: string | undefined;
|
||||
prependIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
text?: string | number | boolean | undefined;
|
||||
onClick?: ((args_0: MouseEvent) => void) | undefined;
|
||||
onClickOnce?: ((args_0: MouseEvent) => void) | undefined;
|
||||
} & {
|
||||
$children?: {
|
||||
default?: ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: (() => import("vue").VNodeChild) | undefined;
|
||||
append?: (() => import("vue").VNodeChild) | undefined;
|
||||
close?: (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: (() => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean | undefined;
|
||||
} | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
"v-slots"?: {
|
||||
default?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
append?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
close?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:append"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:close"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:default"?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:filter"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:label"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:prepend"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onClick?: ((e: KeyboardEvent | MouseEvent) => any) | undefined;
|
||||
"onClick:close"?: ((e: MouseEvent) => any) | undefined;
|
||||
"onGroup:selected"?: ((val: {
|
||||
value: boolean;
|
||||
}) => any) | undefined;
|
||||
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
||||
}, () => false | JSX.Element, {}, {}, {}, {
|
||||
style: import("vue").StyleValue;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
rounded: string | number | boolean;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
link: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined;
|
||||
text: string | number | boolean;
|
||||
modelValue: boolean;
|
||||
}>;
|
||||
__isFragment?: undefined;
|
||||
__isTeleport?: undefined;
|
||||
__isSuspense?: undefined;
|
||||
} & import("vue").ComponentOptionsBase<{
|
||||
style: string | false | import("vue").StyleValue[] | import("vue").CSSProperties | null;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
};
|
||||
modelValue: boolean;
|
||||
} & {
|
||||
theme?: string | undefined;
|
||||
class?: any;
|
||||
border?: string | number | boolean | undefined;
|
||||
elevation?: string | number | undefined;
|
||||
rounded?: string | number | boolean | undefined;
|
||||
color?: string | undefined;
|
||||
value?: any;
|
||||
selectedClass?: string | undefined;
|
||||
href?: string | undefined;
|
||||
to?: string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric | undefined;
|
||||
activeClass?: string | undefined;
|
||||
appendAvatar?: string | undefined;
|
||||
appendIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
baseColor?: string | undefined;
|
||||
link?: boolean | undefined;
|
||||
prependAvatar?: string | undefined;
|
||||
prependIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
text?: string | number | boolean | undefined;
|
||||
onClick?: ((args_0: MouseEvent) => void) | undefined;
|
||||
onClickOnce?: ((args_0: MouseEvent) => void) | undefined;
|
||||
} & {
|
||||
$children?: {
|
||||
default?: ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: (() => import("vue").VNodeChild) | undefined;
|
||||
append?: (() => import("vue").VNodeChild) | undefined;
|
||||
close?: (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: (() => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean | undefined;
|
||||
} | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
"v-slots"?: {
|
||||
default?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
append?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
close?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:append"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:close"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:default"?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:filter"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:label"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:prepend"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onClick?: ((e: KeyboardEvent | MouseEvent) => any) | undefined;
|
||||
"onClick:close"?: ((e: MouseEvent) => any) | undefined;
|
||||
"onGroup:selected"?: ((val: {
|
||||
value: boolean;
|
||||
}) => any) | undefined;
|
||||
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
||||
}, () => false | JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"click:close": (e: MouseEvent) => true;
|
||||
"update:modelValue": (value: boolean) => true;
|
||||
"group:selected": (val: {
|
||||
value: boolean;
|
||||
}) => true;
|
||||
click: (e: KeyboardEvent | MouseEvent) => true;
|
||||
}, string, {
|
||||
style: import("vue").StyleValue;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
rounded: string | number | boolean;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
link: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined;
|
||||
text: string | number | boolean;
|
||||
modelValue: boolean;
|
||||
}, {}, string, import("vue").SlotsType<Partial<{
|
||||
default: (arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
label: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
prepend: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
append: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
close: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
filter: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
}>>, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & import("vuetify/lib/util/defineComponent.mjs").FilterPropsOptions<{
|
||||
theme: StringConstructor;
|
||||
class: PropType<any>;
|
||||
style: {
|
||||
type: PropType<import("vue").StyleValue>;
|
||||
default: null;
|
||||
};
|
||||
border: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
density: {
|
||||
type: PropType<import("vuetify/lib/composables/density.mjs").Density>;
|
||||
default: string;
|
||||
validator: (v: any) => boolean;
|
||||
};
|
||||
elevation: {
|
||||
type: (NumberConstructor | StringConstructor)[];
|
||||
validator(v: any): boolean;
|
||||
};
|
||||
rounded: {
|
||||
type: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
default: undefined;
|
||||
};
|
||||
tile: BooleanConstructor;
|
||||
tag: Omit<{
|
||||
type: PropType<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
default: string;
|
||||
}, "default" | "type"> & {
|
||||
type: PropType<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
default: NonNullable<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
};
|
||||
color: StringConstructor;
|
||||
variant: Omit<{
|
||||
type: PropType<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
default: string;
|
||||
validator: (v: any) => boolean;
|
||||
}, "default" | "type"> & {
|
||||
type: PropType<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
default: NonNullable<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
};
|
||||
value: null;
|
||||
disabled: BooleanConstructor;
|
||||
selectedClass: StringConstructor;
|
||||
size: {
|
||||
type: (NumberConstructor | StringConstructor)[];
|
||||
default: string;
|
||||
};
|
||||
href: StringConstructor;
|
||||
replace: BooleanConstructor;
|
||||
to: PropType<string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric>;
|
||||
exact: BooleanConstructor;
|
||||
activeClass: StringConstructor;
|
||||
appendAvatar: StringConstructor;
|
||||
appendIcon: PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
baseColor: StringConstructor;
|
||||
closable: BooleanConstructor;
|
||||
closeIcon: {
|
||||
type: PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
default: string;
|
||||
};
|
||||
closeLabel: {
|
||||
type: StringConstructor;
|
||||
default: string;
|
||||
};
|
||||
draggable: BooleanConstructor;
|
||||
filter: BooleanConstructor;
|
||||
filterIcon: {
|
||||
type: PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
default: string;
|
||||
};
|
||||
label: BooleanConstructor;
|
||||
link: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
pill: BooleanConstructor;
|
||||
prependAvatar: StringConstructor;
|
||||
prependIcon: PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
ripple: {
|
||||
type: PropType<boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined>;
|
||||
default: boolean;
|
||||
};
|
||||
text: {
|
||||
type: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
default: undefined;
|
||||
};
|
||||
modelValue: {
|
||||
type: BooleanConstructor;
|
||||
default: boolean;
|
||||
};
|
||||
onClick: PropType<(args_0: MouseEvent) => void>;
|
||||
onClickOnce: PropType<(args_0: MouseEvent) => void>;
|
||||
}, import("vue").ExtractPropTypes<{
|
||||
theme: StringConstructor;
|
||||
class: PropType<any>;
|
||||
style: {
|
||||
type: PropType<import("vue").StyleValue>;
|
||||
default: null;
|
||||
};
|
||||
border: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
density: {
|
||||
type: PropType<import("vuetify/lib/composables/density.mjs").Density>;
|
||||
default: string;
|
||||
validator: (v: any) => boolean;
|
||||
};
|
||||
elevation: {
|
||||
type: (NumberConstructor | StringConstructor)[];
|
||||
validator(v: any): boolean;
|
||||
};
|
||||
rounded: {
|
||||
type: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
default: undefined;
|
||||
};
|
||||
tile: BooleanConstructor;
|
||||
tag: Omit<{
|
||||
type: PropType<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
default: string;
|
||||
}, "default" | "type"> & {
|
||||
type: PropType<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
default: NonNullable<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
};
|
||||
color: StringConstructor;
|
||||
variant: Omit<{
|
||||
type: PropType<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
default: string;
|
||||
validator: (v: any) => boolean;
|
||||
}, "default" | "type"> & {
|
||||
type: PropType<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
default: NonNullable<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
};
|
||||
value: null;
|
||||
disabled: BooleanConstructor;
|
||||
selectedClass: StringConstructor;
|
||||
size: {
|
||||
type: (NumberConstructor | StringConstructor)[];
|
||||
default: string;
|
||||
};
|
||||
href: StringConstructor;
|
||||
replace: BooleanConstructor;
|
||||
to: PropType<string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric>;
|
||||
exact: BooleanConstructor;
|
||||
activeClass: StringConstructor;
|
||||
appendAvatar: StringConstructor;
|
||||
appendIcon: PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
baseColor: StringConstructor;
|
||||
closable: BooleanConstructor;
|
||||
closeIcon: {
|
||||
type: PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
default: string;
|
||||
};
|
||||
closeLabel: {
|
||||
type: StringConstructor;
|
||||
default: string;
|
||||
};
|
||||
draggable: BooleanConstructor;
|
||||
filter: BooleanConstructor;
|
||||
filterIcon: {
|
||||
type: PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
default: string;
|
||||
};
|
||||
label: BooleanConstructor;
|
||||
link: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
pill: BooleanConstructor;
|
||||
prependAvatar: StringConstructor;
|
||||
prependIcon: PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
ripple: {
|
||||
type: PropType<boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined>;
|
||||
default: boolean;
|
||||
};
|
||||
text: {
|
||||
type: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
default: undefined;
|
||||
};
|
||||
modelValue: {
|
||||
type: BooleanConstructor;
|
||||
default: boolean;
|
||||
};
|
||||
onClick: PropType<(args_0: MouseEvent) => void>;
|
||||
onClickOnce: PropType<(args_0: MouseEvent) => void>;
|
||||
}>>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
18
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaTextoSimples.vue.d.ts
vendored
Normal file
18
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaTextoSimples.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
import { PropType } from "vue";
|
||||
import type { TiposTabelaCelulas } from "./tiposTabelaCelulas";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["textoSimples"]>;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | undefined;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["textoSimples"]>;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
18
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaTextoTruncado.vue.d.ts
vendored
Normal file
18
dist/types/componentes/EliTabela/celulas/EliTabelaCelulaTextoTruncado.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
import { PropType } from "vue";
|
||||
import type { TiposTabelaCelulas } from "./tiposTabelaCelulas";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["textoTruncado"]>;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | undefined;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: PropType<TiposTabelaCelulas["textoTruncado"]>;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
|
|
@ -1,18 +1,744 @@
|
|||
/**
|
||||
* Mapa (dispatch table) que associa cada `tipoTabelaCelula` ao seu componente Vue de renderização.
|
||||
* Usado por `EliTabelaCelula.vue` para resolver dinamicamente qual componente renderizar
|
||||
* a partir do tipo retornado por `tipoEliColuna.celula(linha)`.
|
||||
*
|
||||
* Adicionar um novo tipo de célula requer:
|
||||
* 1. Criar o componente `EliTabelaCelula<Tipo>.vue`
|
||||
* 2. Adicionar a chave em `tipoTabelaCelula` (tiposTabelaCelulas.ts)
|
||||
* 3. Registrar aqui no mapa
|
||||
*/
|
||||
export declare const registryTabelaCelulas: {
|
||||
readonly textoSimples: import("vue").DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>;
|
||||
readonly textoTruncado: import("vue").DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>;
|
||||
readonly numero: import("vue").DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>;
|
||||
readonly tags: import("vue").DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>;
|
||||
readonly data: import("vue").DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>;
|
||||
readonly componente: import("vue").DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>;
|
||||
readonly textoSimples: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["textoSimples"]>;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | undefined;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["textoSimples"]>;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
readonly textoTruncado: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["textoTruncado"]>;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
} | undefined;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["textoTruncado"]>;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
readonly numero: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["numero"]>;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
numero: number;
|
||||
prefixo?: string;
|
||||
sufixo?: string;
|
||||
acao?: () => void;
|
||||
} | undefined;
|
||||
textoNumero: import("vue").ComputedRef<string>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["numero"]>;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
readonly tags: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["tags"]>;
|
||||
required: false;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
opcoes: {
|
||||
rotulo: string;
|
||||
cor?: string;
|
||||
icone?: import("lucide-vue-next").LucideIcon;
|
||||
acao?: () => void;
|
||||
}[];
|
||||
} | undefined;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["tags"]>;
|
||||
required: false;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {
|
||||
VChip: {
|
||||
new (...args: any[]): import("vue").CreateComponentPublicInstanceWithMixins<{
|
||||
style: string | false | import("vue").StyleValue[] | import("vue").CSSProperties | null;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
};
|
||||
modelValue: boolean;
|
||||
} & {
|
||||
theme?: string | undefined;
|
||||
class?: any;
|
||||
border?: string | number | boolean | undefined;
|
||||
elevation?: string | number | undefined;
|
||||
rounded?: string | number | boolean | undefined;
|
||||
color?: string | undefined;
|
||||
value?: any;
|
||||
selectedClass?: string | undefined;
|
||||
href?: string | undefined;
|
||||
to?: string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric | undefined;
|
||||
activeClass?: string | undefined;
|
||||
appendAvatar?: string | undefined;
|
||||
appendIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
baseColor?: string | undefined;
|
||||
link?: boolean | undefined;
|
||||
prependAvatar?: string | undefined;
|
||||
prependIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
text?: string | number | boolean | undefined;
|
||||
onClick?: ((args_0: MouseEvent) => void) | undefined;
|
||||
onClickOnce?: ((args_0: MouseEvent) => void) | undefined;
|
||||
} & {
|
||||
$children?: {
|
||||
default?: ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: (() => import("vue").VNodeChild) | undefined;
|
||||
append?: (() => import("vue").VNodeChild) | undefined;
|
||||
close?: (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: (() => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean | undefined;
|
||||
} | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
"v-slots"?: {
|
||||
default?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
append?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
close?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:append"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:close"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:default"?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:filter"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:label"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:prepend"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onClick?: ((e: KeyboardEvent | MouseEvent) => any) | undefined;
|
||||
"onClick:close"?: ((e: MouseEvent) => any) | undefined;
|
||||
"onGroup:selected"?: ((val: {
|
||||
value: boolean;
|
||||
}) => any) | undefined;
|
||||
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
||||
}, () => false | JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"click:close": (e: MouseEvent) => true;
|
||||
"update:modelValue": (value: boolean) => true;
|
||||
"group:selected": (val: {
|
||||
value: boolean;
|
||||
}) => true;
|
||||
click: (e: KeyboardEvent | MouseEvent) => true;
|
||||
}, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, {
|
||||
style: import("vue").StyleValue;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
rounded: string | number | boolean;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
link: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined;
|
||||
text: string | number | boolean;
|
||||
modelValue: boolean;
|
||||
}, true, {}, import("vue").SlotsType<Partial<{
|
||||
default: (arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
label: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
prepend: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
append: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
close: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
filter: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
}>>, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, {}, any, import("vue").ComponentProvideOptions, {
|
||||
P: {};
|
||||
B: {};
|
||||
D: {};
|
||||
C: {};
|
||||
M: {};
|
||||
Defaults: {};
|
||||
}, {
|
||||
style: string | false | import("vue").StyleValue[] | import("vue").CSSProperties | null;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
};
|
||||
modelValue: boolean;
|
||||
} & {
|
||||
theme?: string | undefined;
|
||||
class?: any;
|
||||
border?: string | number | boolean | undefined;
|
||||
elevation?: string | number | undefined;
|
||||
rounded?: string | number | boolean | undefined;
|
||||
color?: string | undefined;
|
||||
value?: any;
|
||||
selectedClass?: string | undefined;
|
||||
href?: string | undefined;
|
||||
to?: string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric | undefined;
|
||||
activeClass?: string | undefined;
|
||||
appendAvatar?: string | undefined;
|
||||
appendIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
baseColor?: string | undefined;
|
||||
link?: boolean | undefined;
|
||||
prependAvatar?: string | undefined;
|
||||
prependIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
text?: string | number | boolean | undefined;
|
||||
onClick?: ((args_0: MouseEvent) => void) | undefined;
|
||||
onClickOnce?: ((args_0: MouseEvent) => void) | undefined;
|
||||
} & {
|
||||
$children?: {
|
||||
default?: ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: (() => import("vue").VNodeChild) | undefined;
|
||||
append?: (() => import("vue").VNodeChild) | undefined;
|
||||
close?: (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: (() => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean | undefined;
|
||||
} | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
"v-slots"?: {
|
||||
default?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
append?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
close?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:append"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:close"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:default"?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:filter"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:label"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:prepend"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onClick?: ((e: KeyboardEvent | MouseEvent) => any) | undefined;
|
||||
"onClick:close"?: ((e: MouseEvent) => any) | undefined;
|
||||
"onGroup:selected"?: ((val: {
|
||||
value: boolean;
|
||||
}) => any) | undefined;
|
||||
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
||||
}, () => false | JSX.Element, {}, {}, {}, {
|
||||
style: import("vue").StyleValue;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
rounded: string | number | boolean;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
link: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined;
|
||||
text: string | number | boolean;
|
||||
modelValue: boolean;
|
||||
}>;
|
||||
__isFragment?: undefined;
|
||||
__isTeleport?: undefined;
|
||||
__isSuspense?: undefined;
|
||||
} & import("vue").ComponentOptionsBase<{
|
||||
style: string | false | import("vue").StyleValue[] | import("vue").CSSProperties | null;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
};
|
||||
modelValue: boolean;
|
||||
} & {
|
||||
theme?: string | undefined;
|
||||
class?: any;
|
||||
border?: string | number | boolean | undefined;
|
||||
elevation?: string | number | undefined;
|
||||
rounded?: string | number | boolean | undefined;
|
||||
color?: string | undefined;
|
||||
value?: any;
|
||||
selectedClass?: string | undefined;
|
||||
href?: string | undefined;
|
||||
to?: string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric | undefined;
|
||||
activeClass?: string | undefined;
|
||||
appendAvatar?: string | undefined;
|
||||
appendIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
baseColor?: string | undefined;
|
||||
link?: boolean | undefined;
|
||||
prependAvatar?: string | undefined;
|
||||
prependIcon?: import("vuetify/lib/composables/icons.mjs").IconValue | undefined;
|
||||
text?: string | number | boolean | undefined;
|
||||
onClick?: ((args_0: MouseEvent) => void) | undefined;
|
||||
onClickOnce?: ((args_0: MouseEvent) => void) | undefined;
|
||||
} & {
|
||||
$children?: {
|
||||
default?: ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: (() => import("vue").VNodeChild) | undefined;
|
||||
append?: (() => import("vue").VNodeChild) | undefined;
|
||||
close?: (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: (() => import("vue").VNodeChild) | undefined;
|
||||
} | {
|
||||
$stable?: boolean | undefined;
|
||||
} | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | import("vue").VNodeChild;
|
||||
"v-slots"?: {
|
||||
default?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
label?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
prepend?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
append?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
close?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
filter?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} | undefined;
|
||||
} & {
|
||||
"v-slot:append"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:close"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:default"?: false | ((arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:filter"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:label"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
"v-slot:prepend"?: false | (() => import("vue").VNodeChild) | undefined;
|
||||
} & {
|
||||
onClick?: ((e: KeyboardEvent | MouseEvent) => any) | undefined;
|
||||
"onClick:close"?: ((e: MouseEvent) => any) | undefined;
|
||||
"onGroup:selected"?: ((val: {
|
||||
value: boolean;
|
||||
}) => any) | undefined;
|
||||
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
||||
}, () => false | JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
||||
"click:close": (e: MouseEvent) => true;
|
||||
"update:modelValue": (value: boolean) => true;
|
||||
"group:selected": (val: {
|
||||
value: boolean;
|
||||
}) => true;
|
||||
click: (e: KeyboardEvent | MouseEvent) => true;
|
||||
}, string, {
|
||||
style: import("vue").StyleValue;
|
||||
density: import("vuetify/lib/composables/density.mjs").Density;
|
||||
rounded: string | number | boolean;
|
||||
tile: boolean;
|
||||
tag: string | import("vuetify/lib/types.mjs").JSXComponent;
|
||||
variant: "elevated" | "flat" | "outlined" | "plain" | "text" | "tonal";
|
||||
disabled: boolean;
|
||||
size: string | number;
|
||||
replace: boolean;
|
||||
exact: boolean;
|
||||
closable: boolean;
|
||||
closeIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
closeLabel: string;
|
||||
draggable: boolean;
|
||||
filter: boolean;
|
||||
filterIcon: import("vuetify/lib/composables/icons.mjs").IconValue;
|
||||
label: boolean;
|
||||
link: boolean;
|
||||
pill: boolean;
|
||||
ripple: boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined;
|
||||
text: string | number | boolean;
|
||||
modelValue: boolean;
|
||||
}, {}, string, import("vue").SlotsType<Partial<{
|
||||
default: (arg: {
|
||||
isSelected: boolean | undefined;
|
||||
selectedClass: boolean | (string | undefined)[] | undefined;
|
||||
select: ((value: boolean) => void) | undefined;
|
||||
toggle: (() => void) | undefined;
|
||||
value: unknown;
|
||||
disabled: boolean;
|
||||
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
label: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
prepend: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
append: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
close: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
filter: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
||||
[key: string]: any;
|
||||
}>[];
|
||||
}>>, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & import("vuetify/lib/util/defineComponent.mjs").FilterPropsOptions<{
|
||||
theme: StringConstructor;
|
||||
class: import("vue").PropType<any>;
|
||||
style: {
|
||||
type: import("vue").PropType<import("vue").StyleValue>;
|
||||
default: null;
|
||||
};
|
||||
border: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
density: {
|
||||
type: import("vue").PropType<import("vuetify/lib/composables/density.mjs").Density>;
|
||||
default: string;
|
||||
validator: (v: any) => boolean;
|
||||
};
|
||||
elevation: {
|
||||
type: (NumberConstructor | StringConstructor)[];
|
||||
validator(v: any): boolean;
|
||||
};
|
||||
rounded: {
|
||||
type: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
default: undefined;
|
||||
};
|
||||
tile: BooleanConstructor;
|
||||
tag: Omit<{
|
||||
type: import("vue").PropType<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
default: string;
|
||||
}, "default" | "type"> & {
|
||||
type: import("vue").PropType<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
default: NonNullable<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
};
|
||||
color: StringConstructor;
|
||||
variant: Omit<{
|
||||
type: import("vue").PropType<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
default: string;
|
||||
validator: (v: any) => boolean;
|
||||
}, "default" | "type"> & {
|
||||
type: import("vue").PropType<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
default: NonNullable<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
};
|
||||
value: null;
|
||||
disabled: BooleanConstructor;
|
||||
selectedClass: StringConstructor;
|
||||
size: {
|
||||
type: (NumberConstructor | StringConstructor)[];
|
||||
default: string;
|
||||
};
|
||||
href: StringConstructor;
|
||||
replace: BooleanConstructor;
|
||||
to: import("vue").PropType<string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric>;
|
||||
exact: BooleanConstructor;
|
||||
activeClass: StringConstructor;
|
||||
appendAvatar: StringConstructor;
|
||||
appendIcon: import("vue").PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
baseColor: StringConstructor;
|
||||
closable: BooleanConstructor;
|
||||
closeIcon: {
|
||||
type: import("vue").PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
default: string;
|
||||
};
|
||||
closeLabel: {
|
||||
type: StringConstructor;
|
||||
default: string;
|
||||
};
|
||||
draggable: BooleanConstructor;
|
||||
filter: BooleanConstructor;
|
||||
filterIcon: {
|
||||
type: import("vue").PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
default: string;
|
||||
};
|
||||
label: BooleanConstructor;
|
||||
link: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
pill: BooleanConstructor;
|
||||
prependAvatar: StringConstructor;
|
||||
prependIcon: import("vue").PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
ripple: {
|
||||
type: import("vue").PropType<boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined>;
|
||||
default: boolean;
|
||||
};
|
||||
text: {
|
||||
type: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
default: undefined;
|
||||
};
|
||||
modelValue: {
|
||||
type: BooleanConstructor;
|
||||
default: boolean;
|
||||
};
|
||||
onClick: import("vue").PropType<(args_0: MouseEvent) => void>;
|
||||
onClickOnce: import("vue").PropType<(args_0: MouseEvent) => void>;
|
||||
}, import("vue").ExtractPropTypes<{
|
||||
theme: StringConstructor;
|
||||
class: import("vue").PropType<any>;
|
||||
style: {
|
||||
type: import("vue").PropType<import("vue").StyleValue>;
|
||||
default: null;
|
||||
};
|
||||
border: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
density: {
|
||||
type: import("vue").PropType<import("vuetify/lib/composables/density.mjs").Density>;
|
||||
default: string;
|
||||
validator: (v: any) => boolean;
|
||||
};
|
||||
elevation: {
|
||||
type: (NumberConstructor | StringConstructor)[];
|
||||
validator(v: any): boolean;
|
||||
};
|
||||
rounded: {
|
||||
type: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
default: undefined;
|
||||
};
|
||||
tile: BooleanConstructor;
|
||||
tag: Omit<{
|
||||
type: import("vue").PropType<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
default: string;
|
||||
}, "default" | "type"> & {
|
||||
type: import("vue").PropType<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
default: NonNullable<string | import("vuetify/lib/types.mjs").JSXComponent>;
|
||||
};
|
||||
color: StringConstructor;
|
||||
variant: Omit<{
|
||||
type: import("vue").PropType<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
default: string;
|
||||
validator: (v: any) => boolean;
|
||||
}, "default" | "type"> & {
|
||||
type: import("vue").PropType<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
default: NonNullable<"elevated" | "flat" | "outlined" | "plain" | "text" | "tonal">;
|
||||
};
|
||||
value: null;
|
||||
disabled: BooleanConstructor;
|
||||
selectedClass: StringConstructor;
|
||||
size: {
|
||||
type: (NumberConstructor | StringConstructor)[];
|
||||
default: string;
|
||||
};
|
||||
href: StringConstructor;
|
||||
replace: BooleanConstructor;
|
||||
to: import("vue").PropType<string | import("vue-router").RouteLocationAsPathGeneric | import("vue-router").RouteLocationAsRelativeGeneric>;
|
||||
exact: BooleanConstructor;
|
||||
activeClass: StringConstructor;
|
||||
appendAvatar: StringConstructor;
|
||||
appendIcon: import("vue").PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
baseColor: StringConstructor;
|
||||
closable: BooleanConstructor;
|
||||
closeIcon: {
|
||||
type: import("vue").PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
default: string;
|
||||
};
|
||||
closeLabel: {
|
||||
type: StringConstructor;
|
||||
default: string;
|
||||
};
|
||||
draggable: BooleanConstructor;
|
||||
filter: BooleanConstructor;
|
||||
filterIcon: {
|
||||
type: import("vue").PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
default: string;
|
||||
};
|
||||
label: BooleanConstructor;
|
||||
link: {
|
||||
type: BooleanConstructor;
|
||||
default: undefined;
|
||||
};
|
||||
pill: BooleanConstructor;
|
||||
prependAvatar: StringConstructor;
|
||||
prependIcon: import("vue").PropType<import("vuetify/lib/composables/icons.mjs").IconValue>;
|
||||
ripple: {
|
||||
type: import("vue").PropType<boolean | {
|
||||
class?: string | undefined;
|
||||
keys?: string[] | undefined;
|
||||
} | undefined>;
|
||||
default: boolean;
|
||||
};
|
||||
text: {
|
||||
type: (BooleanConstructor | NumberConstructor | StringConstructor)[];
|
||||
default: undefined;
|
||||
};
|
||||
modelValue: {
|
||||
type: BooleanConstructor;
|
||||
default: boolean;
|
||||
};
|
||||
onClick: import("vue").PropType<(args_0: MouseEvent) => void>;
|
||||
onClickOnce: import("vue").PropType<(args_0: MouseEvent) => void>;
|
||||
}>>;
|
||||
}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
readonly data: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["data"]>;
|
||||
required: false;
|
||||
};
|
||||
}>, {
|
||||
dados: {
|
||||
valor: string;
|
||||
formato: "data" | "data_hora" | "relativo";
|
||||
acao?: () => void;
|
||||
} | undefined;
|
||||
textoData: import("vue").ComputedRef<string>;
|
||||
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
dados: {
|
||||
type: import("vue").PropType<import("./tiposTabelaCelulas").TiposTabelaCelulas["data"]>;
|
||||
required: false;
|
||||
};
|
||||
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
/**
|
||||
* Tipagem dos dados de entrada dos componentes de celulas
|
||||
*/
|
||||
import type { LucideIcon } from "@lucide/vue";
|
||||
import type { Component } from "vue";
|
||||
export type tiposTabelaCelulas = {
|
||||
import type { LucideIcon } from "lucide-vue-next";
|
||||
export type TiposTabelaCelulas = {
|
||||
textoSimples: {
|
||||
texto: string;
|
||||
acao?: () => void;
|
||||
|
|
@ -40,17 +39,5 @@ export type tiposTabelaCelulas = {
|
|||
/** Ação opcional ao clicar no valor. */
|
||||
acao?: () => void;
|
||||
};
|
||||
/** Célula que renderiza um componente Vue arbitrário com props dinâmicas. */
|
||||
componente: {
|
||||
/** Componente Vue a ser renderizado na célula. */
|
||||
componente: Component;
|
||||
/**
|
||||
* Props passadas ao componente via `v-bind`.
|
||||
* Aceita:
|
||||
* - objeto direto: `{ status: "ativo" }`
|
||||
* - função assíncrona: `() => api.get(...)` — útil quando é necessário resolver dados antes de renderizar
|
||||
*/
|
||||
props?: () => Promise<Record<string, unknown>> | Record<string, unknown>;
|
||||
};
|
||||
};
|
||||
export type tipoTabelaCelula = keyof tiposTabelaCelulas;
|
||||
export type TipoTabelaCelula = keyof TiposTabelaCelulas;
|
||||
|
|
|
|||
|
|
@ -1,36 +1,10 @@
|
|||
export type EliTabelaColunasConfig = {
|
||||
/** Rótulos das colunas visíveis (em ordem). */
|
||||
/** Rotulos das colunas visiveis (em ordem). */
|
||||
visiveis: string[];
|
||||
/** Rótulos das colunas invisíveis. */
|
||||
/** Rotulos das colunas invisiveis. */
|
||||
invisiveis: string[];
|
||||
};
|
||||
/**
|
||||
* Retorna a chave de `localStorage` utilizada para persistir a configuração de colunas de uma tabela.
|
||||
*
|
||||
* @param nomeTabela - Identificador único da tabela (campo `nome` de `tipoEliTabelaConsulta`)
|
||||
* @returns Chave no formato `eli:tabela:<nomeTabela>:colunas`
|
||||
*/
|
||||
export declare function storageKeyColunas(nomeTabela: string): string;
|
||||
/**
|
||||
* Carrega do `localStorage` a configuração de visibilidade e ordem das colunas de uma tabela.
|
||||
* Em caso de dado corrompido ou ausente, retorna configuração vazia (sem colunas fixadas).
|
||||
*
|
||||
* @param nomeTabela - Identificador único da tabela
|
||||
* @returns Configuração salva ou `{ visiveis: [], invisiveis: [] }` como fallback seguro
|
||||
*/
|
||||
export declare function carregarConfigColunas(nomeTabela: string): EliTabelaColunasConfig;
|
||||
/**
|
||||
* Persiste no `localStorage` a configuração de visibilidade e ordem das colunas.
|
||||
* Falhas de armazenamento (modo privado, storage cheio) são silenciadas.
|
||||
*
|
||||
* @param nomeTabela - Identificador único da tabela
|
||||
* @param config - Configuração com listas de colunas visíveis e invisíveis
|
||||
*/
|
||||
export declare function salvarConfigColunas(nomeTabela: string, config: EliTabelaColunasConfig): void;
|
||||
/**
|
||||
* Remove do `localStorage` a configuração de colunas salva para uma tabela.
|
||||
* Usado para restaurar o estado padrão de visibilidade definido nas props.
|
||||
*
|
||||
* @param nomeTabela - Identificador único da tabela
|
||||
*/
|
||||
export declare function limparConfigColunas(nomeTabela: string): void;
|
||||
|
|
|
|||
|
|
@ -1,33 +1,7 @@
|
|||
export type EliTabelaFiltroAvancadoSalvo<T> = {
|
||||
linhas: Array<{
|
||||
chave: keyof T;
|
||||
/** Valor vindo de JSON.parse — tipo desconhecido intencionalmente; faça narrowing no consumidor. */
|
||||
valor: unknown;
|
||||
export type EliTabelaFiltroAvancadoSalvo<T> = Array<{
|
||||
coluna: keyof T;
|
||||
valor: any;
|
||||
}>;
|
||||
formula?: string;
|
||||
};
|
||||
/**
|
||||
* Carrega do `localStorage` as linhas de filtro avançado salvas para uma tabela.
|
||||
* Trata dois formatos legados: array direto de filtros (v1) e objeto `{ linhas, formula }` (v2).
|
||||
* Em caso de dado ausente, corrompido ou formato desconhecido, retorna estado vazio.
|
||||
*
|
||||
* @param nomeTabela - Identificador único da tabela (campo `nome` de `tipoEliTabelaConsulta`)
|
||||
* @returns Estado de filtros salvo, ou `{ linhas: [], formula: '' }` como fallback seguro
|
||||
*/
|
||||
export declare function carregarFiltroAvancado<T>(nomeTabela: string): EliTabelaFiltroAvancadoSalvo<T>;
|
||||
/**
|
||||
* Persiste no `localStorage` o estado do filtro avançado de uma tabela.
|
||||
* Salva tanto as linhas de filtro quanto a fórmula booleana customizada.
|
||||
* Falhas de armazenamento são silenciadas para não interromper o fluxo do usuário.
|
||||
*
|
||||
* @param nomeTabela - Identificador único da tabela
|
||||
* @param filtros - Estado completo dos filtros a persistir
|
||||
*/
|
||||
export declare function salvarFiltroAvancado<T>(nomeTabela: string, filtros: EliTabelaFiltroAvancadoSalvo<T>): void;
|
||||
/**
|
||||
* Remove do `localStorage` os filtros avançados salvos para uma tabela.
|
||||
* Chamado ao executar "Limpar Filtros" no modal de filtro avançado.
|
||||
*
|
||||
* @param nomeTabela - Identificador único da tabela
|
||||
*/
|
||||
export declare function limparFiltroAvancado(nomeTabela: string): void;
|
||||
|
|
|
|||
2
dist/types/componentes/EliTabela/index.d.ts
vendored
2
dist/types/componentes/EliTabela/index.d.ts
vendored
|
|
@ -1,4 +1,4 @@
|
|||
export * from "./celulas/tiposTabelaCelulas";
|
||||
export { default as EliTabela } from "./EliTabela.vue";
|
||||
export * from "./types-eli-tabela";
|
||||
export * from "./celulas/tiposTabelaCelulas";
|
||||
export { celulaTabela } from "./types-eli-tabela";
|
||||
|
|
|
|||
|
|
@ -1,36 +1,20 @@
|
|||
import type { LucideIcon } from "@lucide/vue";
|
||||
import type { tipoCondicaoFiltroDeltaTipado, tipoFiltroDeltaColunaTipada } from "p-comuns";
|
||||
import type { tipoResposta } from "p-respostas";
|
||||
import type { ComponenteEntrada } from "../EliEntrada/tiposEntradas";
|
||||
import type { tiposTabelaCelulas, tipoTabelaCelula } from "./celulas/tiposTabelaCelulas";
|
||||
export type tipoComponenteCelulaBase<T extends tipoTabelaCelula> = readonly [
|
||||
T,
|
||||
tiposTabelaCelulas[T]
|
||||
];
|
||||
export type tipoComponenteCelula = {
|
||||
[K in tipoTabelaCelula]: tipoComponenteCelulaBase<K>;
|
||||
}[tipoTabelaCelula];
|
||||
/**
|
||||
* Cria uma tupla tipada `[tipo, dados]` que representa o conteúdo de uma célula da tabela.
|
||||
* Funciona como type-safe builder: o TypeScript infere o tipo exato de `dados` a partir de `tipo`,
|
||||
* garantindo que não seja possível passar dados incorretos para um tipo de célula.
|
||||
*
|
||||
* Uso esperado dentro de `tipoEliColuna.celula`:
|
||||
* ```ts
|
||||
* celula: (linha) => celulaTabela("textoSimples", { texto: linha.nome })
|
||||
* ```
|
||||
*
|
||||
* @param tipo - Identificador do tipo de célula (chave de `tiposTabelaCelulas`)
|
||||
* @param dados - Dados tipados para o tipo de célula escolhido
|
||||
* @returns Tupla `[tipo, dados]` consumida pelo `EliTabelaCelula.vue`
|
||||
*/
|
||||
export declare const celulaTabela: <T extends tipoTabelaCelula>(tipo: T, dados: tiposTabelaCelulas[T]) => tipoComponenteCelulaBase<T>;
|
||||
export type { tiposTabelaCelulas, tipoTabelaCelula };
|
||||
export type tipoEliColuna<T> = {
|
||||
import type { LucideIcon } from "lucide-vue-next";
|
||||
import type { TipoTabelaCelula, TiposTabelaCelulas } from "./celulas/tiposTabelaCelulas";
|
||||
import { operadores, zFiltro } from "p-comuns";
|
||||
import { ComponenteEntrada } from "../EliEntrada/tiposEntradas";
|
||||
export type tipoFiltro = ReturnType<(typeof zFiltro)["parse"]>;
|
||||
export type ComponenteCelulaBase<T extends TipoTabelaCelula> = readonly [T, TiposTabelaCelulas[T]];
|
||||
export type ComponenteCelula = {
|
||||
[K in TipoTabelaCelula]: ComponenteCelulaBase<K>;
|
||||
}[TipoTabelaCelula];
|
||||
export declare const celulaTabela: <T extends TipoTabelaCelula>(tipo: T, dados: TiposTabelaCelulas[T]) => ComponenteCelulaBase<T>;
|
||||
export type { TipoTabelaCelula, TiposTabelaCelulas };
|
||||
export type EliColuna<T> = {
|
||||
/** Texto exibido no cabeçalho da coluna. */
|
||||
rotulo: string;
|
||||
/** Função responsável por renderizar o conteúdo da célula. */
|
||||
celula: (linha: T) => tipoComponenteCelula;
|
||||
celula: (linha: T) => ComponenteCelula;
|
||||
/** Ação opcional disparada ao clicar na célula. */
|
||||
/**
|
||||
* Campo de ordenação associado à coluna. Caso informado, a coluna passa a
|
||||
|
|
@ -43,13 +27,13 @@ export type tipoEliColuna<T> = {
|
|||
*/
|
||||
visivel: boolean;
|
||||
};
|
||||
export type tipoEliConsultaPaginada<T> = {
|
||||
export type EliConsultaPaginada<T> = {
|
||||
/** Registros retornados na consulta. */
|
||||
valores: T[];
|
||||
/** Total de registros disponíveis no backend. */
|
||||
quantidade: number;
|
||||
};
|
||||
export type tipoEliTabelaAcao<T> = {
|
||||
export type EliTabelaAcao<T> = {
|
||||
/** Ícone (Lucide) exibido para representar a ação. */
|
||||
icone: LucideIcon;
|
||||
/** Cor aplicada ao ícone e rótulo. */
|
||||
|
|
@ -64,15 +48,6 @@ export type tipoEliTabelaAcao<T> = {
|
|||
*/
|
||||
exibir?: boolean | ((linha: T) => Promise<boolean> | boolean);
|
||||
};
|
||||
export type parametrosConsulta<T> = {
|
||||
filtros?: tipoFiltroDeltaColunaTipada<Extract<keyof T, string>>[];
|
||||
coluna_ordem?: keyof T;
|
||||
direcao_ordem?: "asc" | "desc";
|
||||
offSet?: number;
|
||||
limit?: number;
|
||||
/** Texto digitado na caixa de busca, quando habilitada. */
|
||||
texto_busca?: string;
|
||||
};
|
||||
/**
|
||||
* Estrutura de dados para uma tabela alimentada por uma consulta.
|
||||
*
|
||||
|
|
@ -80,37 +55,39 @@ export type parametrosConsulta<T> = {
|
|||
* - `consulta`: função que recupera os dados, com suporte a ordenação/paginação
|
||||
* - `mostrarCaixaDeBusca`: habilita um campo de busca textual no cabeçalho
|
||||
*/
|
||||
export type tipoEliTabelaConsulta<T> = {
|
||||
export type EliTabelaConsulta<T> = {
|
||||
/** nome da tabela, um identificador unico */
|
||||
nome: string;
|
||||
/** Indica se a caixa de busca deve ser exibida acima da tabela. */
|
||||
mostrarCaixaDeBusca?: boolean;
|
||||
/** Habilita seleção múltipla (checkboxes) nas linhas da tabela. */
|
||||
mostrar_selecao?: boolean;
|
||||
/** Chave (ex: "id") para identificar unicamente a linha nas seleções entre páginas. */
|
||||
chave_selecao?: keyof T;
|
||||
/** Lista de colunas da tabela. */
|
||||
colunas: tipoEliColuna<T>[];
|
||||
colunas: EliColuna<T>[];
|
||||
/** Quantidade de registros solicitados por consulta (padrão `10`). */
|
||||
registros_por_consulta?: number;
|
||||
/**
|
||||
* Função responsável por buscar os dados. Recebe parâmetros opcionais de
|
||||
* ordenação (`coluna_ordem`/`direcao_ordem`) e paginação (`offSet`/`limit`).
|
||||
*/
|
||||
consulta: (parametrosConsulta?: parametrosConsulta<T>) => Promise<tipoResposta<tipoEliConsultaPaginada<T>>>;
|
||||
consulta: (parametrosConsulta?: {
|
||||
filtros?: tipoFiltro[];
|
||||
coluna_ordem?: keyof T;
|
||||
direcao_ordem?: "asc" | "desc";
|
||||
offSet?: number;
|
||||
limit?: number;
|
||||
/** Texto digitado na caixa de busca, quando habilitada. */
|
||||
texto_busca?: string;
|
||||
}) => Promise<tipoResposta<EliConsultaPaginada<T>>>;
|
||||
/** Quantidade máxima de botões exibidos na paginação (padrão `7`). */
|
||||
maximo_botoes_paginacao?: number;
|
||||
/** Mensagem exibida quando a consulta retorna ok porém sem dados. */
|
||||
mensagemVazio?: string;
|
||||
/** Ações exibidas à direita de cada linha. */
|
||||
acoesLinha?: tipoEliTabelaAcao<T>[];
|
||||
acoesLinha?: EliTabelaAcao<T>[];
|
||||
/**
|
||||
* Configurações dos botões que serão inseridos a direita da caixa de busca.
|
||||
* Seu uso mais comum será para criar novos registros, mas poderá ter outras utilidades.
|
||||
*/
|
||||
acoesTabela?: {
|
||||
/** superio será exibido a direita da caixa de busca, inferior a direita da paginação */
|
||||
posicao: "superior" | "inferior";
|
||||
/** Ícone (Lucide) exibido no botão */
|
||||
icone?: LucideIcon;
|
||||
/** Cor aplicada ao botão. */
|
||||
|
|
@ -118,27 +95,13 @@ export type tipoEliTabelaConsulta<T> = {
|
|||
/** Texto descritivo da ação. */
|
||||
rotulo: string;
|
||||
/** Função executada ao clicar no botão. */
|
||||
acao: (parametrosConsulta: parametrosConsulta<T> & {
|
||||
/**
|
||||
* Callback opcional para forçar atualização da consulta.
|
||||
* Observação: o componente `EliTabela` pode ignorar isso dependendo do modo de uso.
|
||||
*/
|
||||
atualizarConsulta: () => Promise<void>;
|
||||
/**
|
||||
* Callback opcional para permitir editar a lista localmente (sem refazer consulta).
|
||||
* Observação: o componente `EliTabela` pode ignorar isso dependendo do modo de uso.
|
||||
*/
|
||||
editarLista: (lista: T[]) => Promise<T[]>;
|
||||
}) => void;
|
||||
acao: () => void;
|
||||
}[];
|
||||
/** configuração para aplicação dos filtros padrões */
|
||||
filtroAvancado?: {
|
||||
/** Identificador único do filtro (usado para persistência) */
|
||||
chave: string;
|
||||
/** Rótulo exibido no select de adicionar filtro */
|
||||
rotulo: string;
|
||||
/** vai gerar filtro e mescla com os filtros já existentes , id é gerado de forma altomatica para esse local*/
|
||||
filtro: (valor: unknown) => Pick<tipoCondicaoFiltroDeltaTipado<Extract<keyof T, string>>, "coluna" | "operador" | "valor"> | undefined;
|
||||
/** componente de entrada que vai receber o valor para o filtro */
|
||||
coluna: keyof T;
|
||||
operador: operadores | keyof typeof operadores;
|
||||
entrada: ComponenteEntrada;
|
||||
}[];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,42 +0,0 @@
|
|||
/**
|
||||
* useColunasOrdenacao
|
||||
* Composable que encapsula a lógica de drag-and-drop e sincronização de estado
|
||||
* do modal de configuração de colunas da EliTabela.
|
||||
*
|
||||
* Responsável por:
|
||||
* - Sincronizar colunas visíveis/invisíveis com a configuração persistida
|
||||
* - Aplicar ordem salva e adicionar novas colunas ao final
|
||||
* - Gerenciar eventos de arrastar-e-soltar entre as duas listas
|
||||
*
|
||||
* Extraído de `EliTabelaModalColunas.vue` para manter o componente abaixo de 250 linhas.
|
||||
*/
|
||||
import { type Ref } from "vue";
|
||||
import type { EliTabelaColunasConfig } from "./colunasStorage";
|
||||
import type { tipoEliColuna } from "./types-eli-tabela";
|
||||
type OrigemLista = "visiveis" | "invisiveis";
|
||||
interface UseColunasOrdenacaoOptions {
|
||||
aberto: Ref<boolean>;
|
||||
rotulosColunas: Ref<string[]>;
|
||||
configInicial: Ref<EliTabelaColunasConfig>;
|
||||
colunas: Ref<tipoEliColuna<any>[]>;
|
||||
}
|
||||
/**
|
||||
* Composable de drag-and-drop para reordenação e alternância de visibilidade de colunas.
|
||||
* Sincroniza automaticamente quando `aberto`, `rotulosColunas`, `configInicial` ou `colunas` mudam.
|
||||
*
|
||||
* @param options.aberto - Ref que controla se o modal está aberto (gatilho de sincronização)
|
||||
* @param options.rotulosColunas - Ref com todos os rótulos de colunas da tabela
|
||||
* @param options.configInicial - Ref com a configuração persistida (visíveis + invisíveis)
|
||||
* @param options.colunas - Ref com a definição completa das colunas (para ler `visivel: false` padrão)
|
||||
* @returns Estado reativo e handlers de drag-and-drop prontos para o template
|
||||
*/
|
||||
export declare function useColunasOrdenacao({ aberto, rotulosColunas, configInicial, colunas, }: UseColunasOrdenacaoOptions): {
|
||||
visiveisLocal: Ref<string[], string[]>;
|
||||
invisiveisLocal: Ref<string[], string[]>;
|
||||
itemSendoArrastado: Ref<string | null, string | null>;
|
||||
onDragStart: (e: DragEvent, rotulo: string) => void;
|
||||
onDragEnd: () => void;
|
||||
onDragOverItem: (alvoRotulo: string, destino: OrigemLista) => void;
|
||||
onDragOverLista: (destino: OrigemLista) => void;
|
||||
};
|
||||
export {};
|
||||
136
dist/types/componentes/EliTabela/useEliTabela.d.ts
vendored
136
dist/types/componentes/EliTabela/useEliTabela.d.ts
vendored
|
|
@ -1,136 +0,0 @@
|
|||
import type { tipoEliTabelaConsulta } from "./types-eli-tabela";
|
||||
type TabelaProps = tipoEliTabelaConsulta<any>;
|
||||
export declare function useEliTabela(props: {
|
||||
tabela: TabelaProps;
|
||||
selecionados: unknown[];
|
||||
esconderDebug: boolean;
|
||||
}, emit: (event: "update:selecionados", value: unknown[]) => void): {
|
||||
modalColunasAberto: import("vue").Ref<boolean, boolean>;
|
||||
configColunas: import("vue").Ref<{
|
||||
visiveis: string[];
|
||||
invisiveis: string[];
|
||||
}, import("./colunasStorage").EliTabelaColunasConfig | {
|
||||
visiveis: string[];
|
||||
invisiveis: string[];
|
||||
}>;
|
||||
linhasExpandidas: import("vue").Ref<Record<number, boolean>, Record<number, boolean>>;
|
||||
rotulosColunas: import("vue").ComputedRef<string[]>;
|
||||
colunasEfetivas: import("vue").ComputedRef<any[]>;
|
||||
colunasInvisiveisEfetivas: import("vue").ComputedRef<import("./types-eli-tabela").tipoEliColuna<any>[]>;
|
||||
temColunasInvisiveis: import("vue").ComputedRef<boolean>;
|
||||
totalColunas: import("vue").ComputedRef<number>;
|
||||
abrirModalColunas: () => void;
|
||||
fecharModalColunas: () => void;
|
||||
salvarModalColunas: (cfg: import("./colunasStorage").EliTabelaColunasConfig) => void;
|
||||
alternarLinhaExpandida: (indice: number) => void;
|
||||
isDev: boolean;
|
||||
tabela: import("vue").ComputedRef<tipoEliTabelaConsulta<any>>;
|
||||
carregando: import("vue").Ref<boolean, boolean>;
|
||||
erro: import("vue").Ref<string | null, string | null>;
|
||||
linhas: import("vue").Ref<unknown[], unknown[]>;
|
||||
linhasPaginadas: import("vue").ComputedRef<unknown[]>;
|
||||
quantidade: import("vue").Ref<number, number>;
|
||||
quantidadeFiltrada: import("vue").ComputedRef<number>;
|
||||
acoesVisiveis: import("vue").Ref<boolean[][], boolean[][]>;
|
||||
colunaOrdenacao: import("vue").Ref<string | null, string | null>;
|
||||
direcaoOrdenacao: import("vue").Ref<"asc" | "desc", "asc" | "desc">;
|
||||
registrosPorConsulta: import("vue").ComputedRef<number>;
|
||||
totalPaginas: import("vue").ComputedRef<number>;
|
||||
temAcoes: import("vue").ComputedRef<boolean>;
|
||||
exibirBusca: import("vue").ComputedRef<boolean>;
|
||||
acoesSuperiores: import("vue").ComputedRef<{
|
||||
posicao: "superior" | "inferior";
|
||||
icone?: import("@lucide/vue").LucideIcon;
|
||||
cor?: string;
|
||||
rotulo: string;
|
||||
acao: (parametrosConsulta: import("./types-eli-tabela").parametrosConsulta<any> & {
|
||||
atualizarConsulta: () => Promise<void>;
|
||||
editarLista: (lista: any[]) => Promise<any[]>;
|
||||
}) => void;
|
||||
}[]>;
|
||||
acoesInferiores: import("vue").ComputedRef<{
|
||||
posicao: "superior" | "inferior";
|
||||
icone?: import("@lucide/vue").LucideIcon;
|
||||
cor?: string;
|
||||
rotulo: string;
|
||||
acao: (parametrosConsulta: import("./types-eli-tabela").parametrosConsulta<any> & {
|
||||
atualizarConsulta: () => Promise<void>;
|
||||
editarLista: (lista: any[]) => Promise<any[]>;
|
||||
}) => void;
|
||||
}[]>;
|
||||
temAcoesSuperiores: import("vue").ComputedRef<boolean>;
|
||||
temAcoesInferiores: import("vue").ComputedRef<boolean>;
|
||||
parametrosConsultaAtuais: import("vue").ComputedRef<{
|
||||
filtros?: import("p-comuns").tipoFiltroDeltaColunaTipada<string>[] | undefined;
|
||||
coluna_ordem?: string | number | symbol | undefined;
|
||||
direcao_ordem?: "asc" | "desc";
|
||||
offSet?: number;
|
||||
limit?: number;
|
||||
texto_busca?: string;
|
||||
atualizarConsulta: () => Promise<void>;
|
||||
editarLista: (novaLista: any[]) => Promise<any[]>;
|
||||
}>;
|
||||
carregar: () => Promise<void>;
|
||||
alternarOrdenacao: (chave?: string) => void;
|
||||
atualizarBusca: (texto: string) => void;
|
||||
irParaPagina: (pagina: number) => void;
|
||||
filtrosUi: import("vue").Ref<{
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
}[], {
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
}[] | {
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
}[]>;
|
||||
filtrosFormula: import("vue").Ref<string, string>;
|
||||
modalFiltroAberto: import("vue").Ref<boolean, boolean>;
|
||||
exibirFiltroAvancado: import("vue").ComputedRef<boolean>;
|
||||
filtrosAvancadosAtivos: import("vue").ComputedRef<import("p-comuns").tipoFiltroDeltaColunaTipada<any>[]>;
|
||||
filtrosAtivosResumo: import("vue").ComputedRef<{
|
||||
quantidade: number;
|
||||
rotulos: string[];
|
||||
}>;
|
||||
abrirModalFiltro: () => void;
|
||||
fecharModalFiltro: () => void;
|
||||
limparFiltrosAvancados: () => void;
|
||||
salvarFiltrosAvancados: (novoLinhas: {
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
}[], novaFormula?: string) => void;
|
||||
mostrarSelecao: import("vue").ComputedRef<boolean>;
|
||||
isSelecionado: (linha: unknown) => boolean;
|
||||
alternarSelecao: (linha: unknown) => void;
|
||||
todosSelecionados: import("vue").ComputedRef<boolean>;
|
||||
algunsSelecionados: import("vue").ComputedRef<boolean>;
|
||||
alternarSelecaoTodos: (forcarMarcar?: boolean) => void;
|
||||
menuAberto: import("vue").Ref<number | null, number | null>;
|
||||
menuPopup: import("vue").Ref<{
|
||||
menuEl: HTMLElement | null;
|
||||
} | null, {
|
||||
menuEl: HTMLElement | null;
|
||||
} | {
|
||||
menuEl: HTMLElement | null;
|
||||
} | null>;
|
||||
menuPopupPos: import("vue").Ref<{
|
||||
top: number;
|
||||
left: number;
|
||||
}, {
|
||||
top: number;
|
||||
left: number;
|
||||
} | {
|
||||
top: number;
|
||||
left: number;
|
||||
}>;
|
||||
possuiAcoes: (i: number) => boolean;
|
||||
toggleMenu: (i: number, evento?: MouseEvent) => void;
|
||||
acoesDisponiveisPorLinha: (i: number) => {
|
||||
acao: import("./types-eli-tabela").tipoEliTabelaAcao<any>;
|
||||
indice: number;
|
||||
visivel: boolean;
|
||||
}[];
|
||||
paginaAtual: import("vue").Ref<number, number>;
|
||||
valorBusca: import("vue").Ref<string, string>;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/**
|
||||
* useEliTabelaColunas
|
||||
* Gerencia visibilidade, ordenação e persistência da configuração de colunas da EliTabela.
|
||||
* Controla também o modal de colunas e o estado de linhas expandidas (detalhe de colunas invisíveis).
|
||||
*
|
||||
* @param props - Props do componente (tabela.colunas, tabela.nome)
|
||||
* @param temAcoes - Computed que indica se existem ações por linha (para totalColunas)
|
||||
*/
|
||||
import { type Ref } from "vue";
|
||||
import { type EliTabelaColunasConfig } from "./colunasStorage";
|
||||
import type { tipoEliColuna } from "./types-eli-tabela";
|
||||
type PropsColunas = {
|
||||
tabela: {
|
||||
colunas: tipoEliColuna<any>[];
|
||||
nome: string;
|
||||
};
|
||||
};
|
||||
export declare function useEliTabelaColunas(props: PropsColunas, temAcoes: Ref<boolean>): {
|
||||
modalColunasAberto: Ref<boolean, boolean>;
|
||||
configColunas: Ref<{
|
||||
visiveis: string[];
|
||||
invisiveis: string[];
|
||||
}, EliTabelaColunasConfig | {
|
||||
visiveis: string[];
|
||||
invisiveis: string[];
|
||||
}>;
|
||||
linhasExpandidas: Ref<Record<number, boolean>, Record<number, boolean>>;
|
||||
rotulosColunas: import("vue").ComputedRef<string[]>;
|
||||
colunasEfetivas: import("vue").ComputedRef<any[]>;
|
||||
colunasInvisiveisEfetivas: import("vue").ComputedRef<tipoEliColuna<any>[]>;
|
||||
temColunasInvisiveis: import("vue").ComputedRef<boolean>;
|
||||
totalColunas: import("vue").ComputedRef<number>;
|
||||
abrirModalColunas: () => void;
|
||||
fecharModalColunas: () => void;
|
||||
salvarModalColunas: (cfg: EliTabelaColunasConfig) => void;
|
||||
alternarLinhaExpandida: (indice: number) => void;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
/**
|
||||
* useEliTabelaConsulta
|
||||
* Gerencia o ciclo de consultas da EliTabela: carregamento, paginação, ordenação e busca.
|
||||
* Usa um contador sequencial para descartar respostas de consultas antigas (race condition).
|
||||
*
|
||||
* @param props - Props do componente (tabela, esconderDebug)
|
||||
* @param filtrosAvancadosAtivos - Computed com filtros ativos para envio à API
|
||||
* @param paginaAtual - Ref da página atual (compartilhada com filtros e busca)
|
||||
* @param valorBusca - Ref da busca textual (compartilhada com filtros avançados)
|
||||
* @param linhasExpandidas - Ref das linhas expandidas (resetada ao carregar)
|
||||
*/
|
||||
import type { tipoFiltroDeltaColunaTipada } from "p-comuns";
|
||||
import { type Ref } from "vue";
|
||||
import type { parametrosConsulta, tipoEliTabelaConsulta } from "./types-eli-tabela";
|
||||
type PropsConsulta = {
|
||||
tabela: tipoEliTabelaConsulta<any>;
|
||||
esconderDebug: boolean;
|
||||
};
|
||||
export declare function useEliTabelaConsulta(props: PropsConsulta, filtrosAvancadosAtivos: Ref<tipoFiltroDeltaColunaTipada<any>[]>, paginaAtual: Ref<number>, valorBusca: Ref<string>, linhasExpandidas: Ref<Record<number, boolean>>): {
|
||||
isDev: boolean;
|
||||
tabela: import("vue").ComputedRef<tipoEliTabelaConsulta<any>>;
|
||||
carregando: Ref<boolean, boolean>;
|
||||
erro: Ref<string | null, string | null>;
|
||||
linhas: Ref<unknown[], unknown[]>;
|
||||
linhasPaginadas: import("vue").ComputedRef<unknown[]>;
|
||||
quantidade: Ref<number, number>;
|
||||
quantidadeFiltrada: import("vue").ComputedRef<number>;
|
||||
acoesVisiveis: Ref<boolean[][], boolean[][]>;
|
||||
colunaOrdenacao: Ref<string | null, string | null>;
|
||||
direcaoOrdenacao: Ref<"asc" | "desc", "asc" | "desc">;
|
||||
registrosPorConsulta: import("vue").ComputedRef<number>;
|
||||
totalPaginas: import("vue").ComputedRef<number>;
|
||||
temAcoes: import("vue").ComputedRef<boolean>;
|
||||
exibirBusca: import("vue").ComputedRef<boolean>;
|
||||
acoesSuperiores: import("vue").ComputedRef<{
|
||||
posicao: "superior" | "inferior";
|
||||
icone?: import("@lucide/vue").LucideIcon;
|
||||
cor?: string;
|
||||
rotulo: string;
|
||||
acao: (parametrosConsulta: parametrosConsulta<any> & {
|
||||
atualizarConsulta: () => Promise<void>;
|
||||
editarLista: (lista: any[]) => Promise<any[]>;
|
||||
}) => void;
|
||||
}[]>;
|
||||
acoesInferiores: import("vue").ComputedRef<{
|
||||
posicao: "superior" | "inferior";
|
||||
icone?: import("@lucide/vue").LucideIcon;
|
||||
cor?: string;
|
||||
rotulo: string;
|
||||
acao: (parametrosConsulta: parametrosConsulta<any> & {
|
||||
atualizarConsulta: () => Promise<void>;
|
||||
editarLista: (lista: any[]) => Promise<any[]>;
|
||||
}) => void;
|
||||
}[]>;
|
||||
temAcoesSuperiores: import("vue").ComputedRef<boolean>;
|
||||
temAcoesInferiores: import("vue").ComputedRef<boolean>;
|
||||
parametrosConsultaAtuais: import("vue").ComputedRef<{
|
||||
filtros?: tipoFiltroDeltaColunaTipada<string>[] | undefined;
|
||||
coluna_ordem?: string | number | symbol | undefined;
|
||||
direcao_ordem?: "asc" | "desc";
|
||||
offSet?: number;
|
||||
limit?: number;
|
||||
texto_busca?: string;
|
||||
atualizarConsulta: () => Promise<void>;
|
||||
editarLista: (novaLista: any[]) => Promise<any[]>;
|
||||
}>;
|
||||
carregar: () => Promise<void>;
|
||||
alternarOrdenacao: (chave?: string) => void;
|
||||
atualizarBusca: (texto: string) => void;
|
||||
irParaPagina: (pagina: number) => void;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* useEliTabelaFiltrosAvancados
|
||||
* Gerencia o estado de filtros avançados da EliTabela, incluindo:
|
||||
* - Linhas de filtro ativas (`filtrosUi`) e fórmula booleana (`filtrosFormula`)
|
||||
* - Computed `filtrosAvancadosAtivos` que converte as linhas em FiltroDelta para a API
|
||||
* - Abertura/fechamento e limpeza do modal de filtro avançado
|
||||
*
|
||||
* A fórmula é armazenada no formato `{chave}` (ex: `{email} E {nome}`) e convertida
|
||||
* para IDs globais `{c1} {c2}` durante a montagem do FiltroDelta final.
|
||||
*
|
||||
* @param props - Props do componente (tabela.filtroAvancado, tabela.nome)
|
||||
* @param paginaAtual - Ref da página atual (para resetar ao aplicar filtros)
|
||||
* @param valorBusca - Ref da busca textual (limpa ao aplicar filtros avançados)
|
||||
* @param carregar - Função de recarregamento dos dados
|
||||
*/
|
||||
import type { tipoFiltroDeltaColunaTipada } from "p-comuns";
|
||||
import { type Ref } from "vue";
|
||||
type PropsFiltros = {
|
||||
tabela: {
|
||||
filtroAvancado?: any[];
|
||||
nome: string;
|
||||
};
|
||||
};
|
||||
type LinhaFiltroUI = {
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
};
|
||||
export declare function useEliTabelaFiltrosAvancados(props: PropsFiltros, paginaAtual: Ref<number>, valorBusca: Ref<string>, carregar: () => Promise<void>): {
|
||||
filtrosUi: Ref<{
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
}[], LinhaFiltroUI[] | {
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
}[]>;
|
||||
filtrosFormula: Ref<string, string>;
|
||||
modalFiltroAberto: Ref<boolean, boolean>;
|
||||
exibirFiltroAvancado: import("vue").ComputedRef<boolean>;
|
||||
filtrosAvancadosAtivos: import("vue").ComputedRef<tipoFiltroDeltaColunaTipada<any>[]>;
|
||||
filtrosAtivosResumo: import("vue").ComputedRef<{
|
||||
quantidade: number;
|
||||
rotulos: string[];
|
||||
}>;
|
||||
abrirModalFiltro: () => void;
|
||||
fecharModalFiltro: () => void;
|
||||
limparFiltrosAvancados: () => void;
|
||||
salvarFiltrosAvancados: (novoLinhas: LinhaFiltroUI[], novaFormula?: string) => void;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
/**
|
||||
* useEliTabelaMenu
|
||||
* Gerencia o menu de ações por linha da EliTabela.
|
||||
* Controla abertura/fechamento, posicionamento do popup e detecção de clique externo.
|
||||
*
|
||||
* @param props - Props do componente (tabela.acoesLinha)
|
||||
* @param acoesVisiveis - Ref com matriz de visibilidade das ações por linha
|
||||
*/
|
||||
import { type Ref } from "vue";
|
||||
import type { tipoEliTabelaAcao } from "./types-eli-tabela";
|
||||
type PropsMenu = {
|
||||
tabela: {
|
||||
acoesLinha?: tipoEliTabelaAcao<any>[];
|
||||
};
|
||||
};
|
||||
export declare function useEliTabelaMenu(props: PropsMenu, acoesVisiveis: Ref<boolean[][]>): {
|
||||
menuAberto: Ref<number | null, number | null>;
|
||||
menuPopup: Ref<{
|
||||
menuEl: HTMLElement | null;
|
||||
} | null, {
|
||||
menuEl: HTMLElement | null;
|
||||
} | {
|
||||
menuEl: HTMLElement | null;
|
||||
} | null>;
|
||||
menuPopupPos: Ref<{
|
||||
top: number;
|
||||
left: number;
|
||||
}, {
|
||||
top: number;
|
||||
left: number;
|
||||
} | {
|
||||
top: number;
|
||||
left: number;
|
||||
}>;
|
||||
possuiAcoes: (i: number) => boolean;
|
||||
toggleMenu: (i: number, evento?: MouseEvent) => void;
|
||||
acoesDisponiveisPorLinha: (i: number) => {
|
||||
acao: tipoEliTabelaAcao<any>;
|
||||
indice: number;
|
||||
visivel: boolean;
|
||||
}[];
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
/**
|
||||
* useEliTabelaSelecao
|
||||
* Gerencia a seleção múltipla de linhas na EliTabela.
|
||||
* Suporta seleção por objeto completo ou por chave configurável (`chave_selecao`).
|
||||
*
|
||||
* @param props - Props do componente (selecionados, tabela.chave_selecao, tabela.mostrar_selecao)
|
||||
* @param emit - Função de emit para `update:selecionados`
|
||||
* @param linhasPaginadas - Ref com as linhas da página atual (para todosSelecionados/algunsSelecionados)
|
||||
*/
|
||||
import { type Ref } from "vue";
|
||||
type PropsSelecao = {
|
||||
selecionados: unknown[];
|
||||
tabela: {
|
||||
mostrar_selecao?: boolean;
|
||||
chave_selecao?: string | number | symbol;
|
||||
};
|
||||
};
|
||||
export declare function useEliTabelaSelecao(props: PropsSelecao, emit: (event: "update:selecionados", value: unknown[]) => void, linhasPaginadas: Ref<unknown[]>): {
|
||||
mostrarSelecao: import("vue").ComputedRef<boolean>;
|
||||
isSelecionado: (linha: unknown) => boolean;
|
||||
alternarSelecao: (linha: unknown) => void;
|
||||
todosSelecionados: import("vue").ComputedRef<boolean>;
|
||||
algunsSelecionados: import("vue").ComputedRef<boolean>;
|
||||
alternarSelecaoTodos: (forcarMarcar?: boolean) => void;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,260 +0,0 @@
|
|||
/**
|
||||
* useFiltroAvancado
|
||||
* Composable que encapsula a lógica do modal de filtro avançado da EliTabela.
|
||||
*
|
||||
* Responsável por:
|
||||
* - Gerenciar a lista de linhas de filtro ativas
|
||||
* - Converter fórmulas booleanas entre notação de exibição (`{c1}`) e persistência (`{chave}`)
|
||||
* - Normalizar filtros carregados do localStorage (compatibilidade com formatos legados)
|
||||
* - Resolver o componente de entrada correto por tipo (`texto`, `numero`, `dataHora`)
|
||||
*
|
||||
* Extraído de `EliTabelaModalFiltroAvancado.vue` para manter o componente abaixo de 250 linhas.
|
||||
*/
|
||||
import { type Component, type Ref } from "vue";
|
||||
import type { ComponenteEntrada } from "../EliEntrada/tiposEntradas";
|
||||
import type { tipoEliTabelaConsulta } from "./types-eli-tabela";
|
||||
export type FiltroBase<T> = NonNullable<tipoEliTabelaConsulta<T>["filtroAvancado"]>[number];
|
||||
export type LinhaFiltro = {
|
||||
chave: string;
|
||||
entrada: ComponenteEntrada;
|
||||
/** Valor do campo de filtro — unknown intencionalmente (vem de localStorage ou entrada do usuário). */
|
||||
valor: unknown;
|
||||
};
|
||||
/**
|
||||
* Retorna o rótulo de exibição de uma definição de filtro.
|
||||
* Utilizado no template do modal para exibir o nome do campo ao usuário.
|
||||
*
|
||||
* @param f - Definição de filtro da configuração da tabela
|
||||
* @returns Rótulo textual do filtro
|
||||
*/
|
||||
export declare function rotuloDoFiltro(f: FiltroBase<string>): string;
|
||||
interface UseFiltroAvancadoOptions {
|
||||
aberto: Ref<boolean>;
|
||||
filtrosBase: Ref<FiltroBase<string>[]>;
|
||||
modelo: Ref<Array<{
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
}>>;
|
||||
modeloFormula: Ref<string>;
|
||||
emit: {
|
||||
(event: "fechar"): void;
|
||||
(event: "limpar"): void;
|
||||
(event: "salvar", linhas: Array<{
|
||||
chave: string;
|
||||
valor: unknown;
|
||||
}>, formula?: string): void;
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Composable principal do modal de filtro avançado da EliTabela.
|
||||
* Sincroniza automaticamente quando o modal abre ou o modelo/filtrosBase mudam.
|
||||
*
|
||||
* @param options.aberto - Ref que controla se o modal está aberto
|
||||
* @param options.filtrosBase - Ref com as definições de filtros disponíveis na tabela
|
||||
* @param options.modelo - Ref com as linhas de filtro persistidas (vindo do pai)
|
||||
* @param options.modeloFormula - Ref com a fórmula booleana persistida no pai
|
||||
* @param options.emit - Função de emit do componente Vue pai
|
||||
* @returns Estado reativo e ações do modal de filtro
|
||||
*/
|
||||
export declare function useFiltroAvancado({ aberto, filtrosBase, modelo, modeloFormula, emit, }: UseFiltroAvancadoOptions): {
|
||||
linhas: Ref<{
|
||||
chave: string;
|
||||
entrada: readonly ["confirmacao", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
cor?: string;
|
||||
desabilitado?: boolean;
|
||||
rotuloAtivo?: string;
|
||||
rotuloInativo?: string;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
}] | readonly ["coordenadas", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
zoom?: number;
|
||||
alturaMapa?: number;
|
||||
camadas?: {
|
||||
estados?: boolean;
|
||||
municipios?: boolean;
|
||||
} | undefined;
|
||||
}] | readonly ["dataHora", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
variante?: import("../..").CampoVariante;
|
||||
}] | readonly ["numero", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
sufixo?: string;
|
||||
prefixo?: string;
|
||||
precisao?: number;
|
||||
}] | readonly ["paragrafo", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
linhas?: number;
|
||||
limiteCaracteres?: number;
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
variante?: import("../..").CampoVariante;
|
||||
}] | readonly ["selecao", {
|
||||
itens: import("../EliEntrada/tiposSelecao").CarregadorItens;
|
||||
desativado?: string[];
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
variante?: import("../..").CampoVariante;
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
}] | readonly ["selecaoMultipla", {
|
||||
itens: import("../EliEntrada/tiposSelecao").CarregadorItens;
|
||||
desativado?: string[];
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
variante?: import("../..").CampoVariante;
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
}] | readonly ["texto", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
limiteCaracteres?: number;
|
||||
formato?: "texto" | "email" | "url" | "telefone" | "cpfCnpj" | "cep";
|
||||
}];
|
||||
valor: unknown;
|
||||
}[], LinhaFiltro[] | {
|
||||
chave: string;
|
||||
entrada: readonly ["confirmacao", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
cor?: string;
|
||||
desabilitado?: boolean;
|
||||
rotuloAtivo?: string;
|
||||
rotuloInativo?: string;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
}] | readonly ["coordenadas", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
zoom?: number;
|
||||
alturaMapa?: number;
|
||||
camadas?: {
|
||||
estados?: boolean;
|
||||
municipios?: boolean;
|
||||
} | undefined;
|
||||
}] | readonly ["dataHora", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
modo?: "data" | "dataHora";
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
min?: string;
|
||||
max?: string;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
variante?: import("../..").CampoVariante;
|
||||
}] | readonly ["numero", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
sufixo?: string;
|
||||
prefixo?: string;
|
||||
precisao?: number;
|
||||
}] | readonly ["paragrafo", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
linhas?: number;
|
||||
limiteCaracteres?: number;
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
variante?: import("../..").CampoVariante;
|
||||
}] | readonly ["selecao", {
|
||||
itens: import("../EliEntrada/tiposSelecao").CarregadorItens;
|
||||
desativado?: string[];
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
variante?: import("../..").CampoVariante;
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
}] | readonly ["selecaoMultipla", {
|
||||
itens: import("../EliEntrada/tiposSelecao").CarregadorItens;
|
||||
desativado?: string[];
|
||||
limpavel?: boolean;
|
||||
erro?: boolean;
|
||||
mensagensErro?: string | string[];
|
||||
dica?: string;
|
||||
dicaPersistente?: boolean;
|
||||
densidade?: import("../..").CampoDensidade;
|
||||
variante?: import("../..").CampoVariante;
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
}] | readonly ["texto", {
|
||||
rotulo: string;
|
||||
placeholder?: string;
|
||||
apenasLeitura?: boolean;
|
||||
limiteCaracteres?: number;
|
||||
formato?: "texto" | "email" | "url" | "telefone" | "cpfCnpj" | "cep";
|
||||
}];
|
||||
valor: unknown;
|
||||
}[]>;
|
||||
opcoesParaAdicionar: import("vue").ComputedRef<{
|
||||
chave: string;
|
||||
rotulo: string;
|
||||
filtro: (valor: unknown) => Pick<import("p-comuns").tipoCondicaoFiltroDeltaTipado<"anchor" | "big" | "blink" | "bold" | "charAt" | "charCodeAt" | "codePointAt" | "concat" | "endsWith" | "fixed" | "fontcolor" | "fontsize" | "includes" | "indexOf" | "italics" | "lastIndexOf" | "length" | "link" | "localeCompare" | "match" | "matchAll" | "normalize" | "padEnd" | "padStart" | "repeat" | "replace" | "search" | "slice" | "small" | "split" | "startsWith" | "strike" | "sub" | "substr" | "substring" | "sup" | "toLocaleLowerCase" | "toLocaleUpperCase" | "toLowerCase" | "toString" | "toUpperCase" | "trim" | "trimEnd" | "trimLeft" | "trimRight" | "trimStart" | "valueOf">, "coluna" | "operador" | "valor"> | undefined;
|
||||
entrada: ComponenteEntrada;
|
||||
}[]>;
|
||||
chaveParaAdicionar: Ref<string, string>;
|
||||
formulaCustomizada: Ref<string, string>;
|
||||
formulaGerada: import("vue").ComputedRef<string>;
|
||||
componenteEntrada: (entrada: ComponenteEntrada) => Component;
|
||||
opcoesEntrada: (entrada: ComponenteEntrada) => {
|
||||
rotulo: string;
|
||||
};
|
||||
adicionar: () => void;
|
||||
remover: (idx: number) => void;
|
||||
emitFechar: () => void;
|
||||
emitSalvar: () => void;
|
||||
emitLimpar: () => void;
|
||||
rotuloDoFiltro: typeof rotuloDoFiltro;
|
||||
rotuloDoFiltroAtivo: (chave: string) => string;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
import type { ElementoCapturado, ItemFeedback } from "./tiposFeedback";
|
||||
/** Formata os dados de um elemento capturado como texto para clipboard */
|
||||
export declare function formatarElementoComoTexto(el: ElementoCapturado, url: string): string;
|
||||
/** Formata todos os feedbacks como Markdown para exportação */
|
||||
export declare function formatarComoMarkdown(itens: ItemFeedback[]): string;
|
||||
/** Captura informações identificadoras de um elemento DOM */
|
||||
export declare function capturarElemento(el: HTMLElement): ElementoCapturado;
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
export { default as EliFeedbackWidget } from "./EliFeedbackWidget.vue";
|
||||
export type { ElementoCapturado, ItemFeedback, ModoSelecao } from "./tiposFeedback";
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
/** Informações capturadas do elemento DOM selecionado */
|
||||
export interface ElementoCapturado {
|
||||
/** Seletor CSS que identifica o elemento */
|
||||
seletor: string;
|
||||
/** ID do elemento (se houver) */
|
||||
id: string | null;
|
||||
/** Lista de classes do elemento */
|
||||
classes: string[];
|
||||
/** Tag HTML do elemento */
|
||||
tag: string;
|
||||
/** Texto visível truncado */
|
||||
textoVisivel: string;
|
||||
/** Atributos data-* relevantes */
|
||||
dataAtributos: Record<string, string>;
|
||||
/** Caminho hierárquico simplificado no DOM */
|
||||
caminhoDom: string;
|
||||
}
|
||||
/** Um item de feedback salvo */
|
||||
export interface ItemFeedback {
|
||||
/** Identificador único do feedback */
|
||||
id: string;
|
||||
/** Timestamp ISO da criação */
|
||||
criadoEm: string;
|
||||
/** Elemento capturado */
|
||||
elemento: ElementoCapturado;
|
||||
/** Comentário livre do usuário */
|
||||
comentario: string;
|
||||
/** URL da página onde o feedback foi criado */
|
||||
urlPagina: string;
|
||||
}
|
||||
/** Estado do modo de seleção */
|
||||
export type ModoSelecao = "inativo" | "selecionando" | "selecionando-copiar" | "comentando";
|
||||
/** Chave usada no localStorage */
|
||||
export declare const CHAVE_STORAGE = "eli-feedback-items";
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
import { type ElementoCapturado, type ItemFeedback, type ModoSelecao } from "./tiposFeedback";
|
||||
export declare function useFeedback(): {
|
||||
modo: import("vue").Ref<ModoSelecao, ModoSelecao>;
|
||||
elementoSelecionado: import("vue").Ref<{
|
||||
seletor: string;
|
||||
id: string | null;
|
||||
classes: string[];
|
||||
tag: string;
|
||||
textoVisivel: string;
|
||||
dataAtributos: Record<string, string>;
|
||||
caminhoDom: string;
|
||||
} | null, ElementoCapturado | {
|
||||
seletor: string;
|
||||
id: string | null;
|
||||
classes: string[];
|
||||
tag: string;
|
||||
textoVisivel: string;
|
||||
dataAtributos: Record<string, string>;
|
||||
caminhoDom: string;
|
||||
} | null>;
|
||||
comentario: import("vue").Ref<string, string>;
|
||||
painelAberto: import("vue").Ref<boolean, boolean>;
|
||||
copiouElemento: import("vue").Ref<boolean, boolean>;
|
||||
itens: import("vue").Ref<{
|
||||
id: string;
|
||||
criadoEm: string;
|
||||
elemento: {
|
||||
seletor: string;
|
||||
id: string | null;
|
||||
classes: string[];
|
||||
tag: string;
|
||||
textoVisivel: string;
|
||||
dataAtributos: Record<string, string>;
|
||||
caminhoDom: string;
|
||||
};
|
||||
comentario: string;
|
||||
urlPagina: string;
|
||||
}[], ItemFeedback[] | {
|
||||
id: string;
|
||||
criadoEm: string;
|
||||
elemento: {
|
||||
seletor: string;
|
||||
id: string | null;
|
||||
classes: string[];
|
||||
tag: string;
|
||||
textoVisivel: string;
|
||||
dataAtributos: Record<string, string>;
|
||||
caminhoDom: string;
|
||||
};
|
||||
comentario: string;
|
||||
urlPagina: string;
|
||||
}[]>;
|
||||
totalItens: import("vue").ComputedRef<number>;
|
||||
iniciarSelecao: () => void;
|
||||
iniciarSelecaoParaCopiar: () => void;
|
||||
cancelarSelecao: () => void;
|
||||
salvarFeedback: () => void;
|
||||
exportarMarkdown: () => void;
|
||||
limparTodos: () => void;
|
||||
removerItem: (id: string) => void;
|
||||
};
|
||||
53
dist/types/componentes/botao/EliBotao.vue.d.ts
vendored
Normal file
53
dist/types/componentes/botao/EliBotao.vue.d.ts
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
import { PropType } from "vue";
|
||||
import type { BotaoTamanho, BotaoVariante } from "../../tipos";
|
||||
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
||||
color: {
|
||||
type: StringConstructor;
|
||||
default: string;
|
||||
};
|
||||
variant: {
|
||||
type: PropType<BotaoVariante>;
|
||||
default: string;
|
||||
};
|
||||
size: {
|
||||
type: PropType<BotaoTamanho>;
|
||||
default: string;
|
||||
};
|
||||
disabled: {
|
||||
type: BooleanConstructor;
|
||||
default: boolean;
|
||||
};
|
||||
loading: {
|
||||
type: BooleanConstructor;
|
||||
default: boolean;
|
||||
};
|
||||
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
||||
color: {
|
||||
type: StringConstructor;
|
||||
default: string;
|
||||
};
|
||||
variant: {
|
||||
type: PropType<BotaoVariante>;
|
||||
default: string;
|
||||
};
|
||||
size: {
|
||||
type: PropType<BotaoTamanho>;
|
||||
default: string;
|
||||
};
|
||||
disabled: {
|
||||
type: BooleanConstructor;
|
||||
default: boolean;
|
||||
};
|
||||
loading: {
|
||||
type: BooleanConstructor;
|
||||
default: boolean;
|
||||
};
|
||||
}>> & Readonly<{}>, {
|
||||
color: string;
|
||||
variant: BotaoVariante;
|
||||
size: BotaoTamanho;
|
||||
disabled: boolean;
|
||||
loading: boolean;
|
||||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
||||
declare const _default: typeof __VLS_export;
|
||||
export default _default;
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue