name: antigravity-mapa-modais description: Convenção técnica do inventário de modais, drawers e popovers do Gravity — define como cada componente sobreposto é catalogado na aba "7. Modais" da planilha DDD (arquivo, componente, tipo, páginas que abrem, ações disparadas, rotas API consumidas, patente mínima). Use ao registrar modal novo, auditar conformidade DDD ou propor renomeação. Não toca em código — só lê código para cruzar e só escreve na planilha após aprovação.
Convenção Técnica — Mapa de Modais
⚠️ REGRAS ABSOLUTAS: os nomes (arquivo, componente) seguem
lei/ddd-nomenclatura. O padrão visual e de UX dos modais mora emux/criacao-telaseux/componentes. Cruzamentos com páginas vão paramapa-paginase com rotas paramapa-rotas. Esta skill operacionaliza o inventário de modais — não redefine naming nem padrão visual.
Princípio fundamental
A aba 7. Modais é o inventário de todo componente sobreposto do monorepo (modal, drawer, popover) — uma linha por componente React que monta um overlay (<Dialog>, <Drawer>, <Popover>). Cada linha cruza implementação real (arquivo, componente, tipo) com a forma DDD (arquivo renomeado, componente renomeado), classificação, controle de acesso (patente mínima) e dependências (páginas que abrem, ações disparadas, rotas API consumidas, models lidos). É a fonte da verdade do que existe em sobreposição na UI versus o que deveria existir. Antes de criar, renomear ou auditar qualquer modal, consulte esta aba.
Estrutura obrigatória
Cada linha tem 17 colunas. A relação chave é:
Local + Produto Gravity → Arquivo (.tsx) → Componente (PascalCase)
↓ (página que abre via <Modal/>)
Paginas que abrem
↓ (ddd-nomenclatura)
Arquivo DDD + Componente DDD + Tipo + Patente minima
| # | Coluna | Conteúdo | Fonte |
|---|---|---|---|
| 1 | Local |
Organizacao | Produto | Configurador | Marketplace | Nucleo Global |
código |
| 2 | Nome do arquivo |
nome do .tsx (ex: ModalEditarOrganizacao.tsx) |
código |
| 3 | Nome do arquivo - DDD |
canônico (ver REGRA 3) | esta skill |
| 4 | Utilizado no código |
SIM | NAO (componente importado em pelo menos 1 lugar) |
código (grep) |
| 5 | EXPLICAÇÃO |
1 frase do que o modal faz para o usuário final | esta skill |
| 6 | Nome do componente |
identificador exportado (ex: ModalEditarOrganizacao) |
código |
| 7 | Nome do componente - DDD |
canônico (= arquivo sem .tsx) |
esta skill |
| 8 | Produto Gravity |
slug do produto (ex: pedido, bid-cambio, Configurador, nucleo-global) |
código |
| 9 | Tipo |
Modal | Drawer | Popover (enum fechado) |
código |
| 10 | Paginas que abrem |
nomes dos componentes de página que renderizam este modal | código (grep) |
| 11 | Acoes |
ações que o modal dispara (Salvar, Cancelar, Excluir, Confirmar) |
código |
| 12 | Rotas de API consumidas |
rotas chamadas pelo modal, separadas por | |
código (grep) |
| 13 | Models lidos (heuristico) |
models Prisma derivados das rotas consumidas | cruzamento aba 3 |
| 14 | Patente minima |
tipo_usuario mínima (EN UPPER_SNAKE — REGRA 7) |
esta skill + RBAC |
| 15 | Arquivo |
path completo do .tsx |
código |
| 16 | Status DDD |
OK | RENOMEAR | DEPRECAR | NOVA |
esta skill |
| 17 | Observacoes |
qualquer divergência ou nota técnica | esta skill |
Regras
Uma linha por componente sobreposto. Modal/Drawer/Popover montados como tela inteira (sem página por trás) não vão aqui — vão para
mapa-paginascomTipo de view = Modal. Esta aba só registra overlays disparados a partir de outra tela.Tipoé um enum fechado de 3 valores (extraídos da realidade da planilha):Modal— caixa centralizada, bloqueia o fundo (<Dialog>)Drawer— painel lateral deslizante (<Drawer>/<Sheet>)Popover— flutuante ancorado em um trigger (<Popover>/<Tooltip>interativo)- ❌ inventar (
Toast,Sheet,Overlay,Dialog) — se aparecer um quarto tipo, trava e pergunta.
Nome do arquivo - DDDsegue[Tipo][Acao][Entidade](padrão extraído de 34/47 casos):- PascalCase, sufixo
.tsx - Prefixo = o
Tipopor extenso:Modal,Drawer,Popover - Exceção: quando o overlay é de um produto/contexto específico e não é CRUD (ex:
PaywallDrawer,ExitIntentDrawer), sufixo do tipo é aceito — manter o que está, mas não criar novo com sufixo. - Exemplos canônicos da planilha:
- ✅
ModalEditarOrganizacao.tsx,ModalNovaOrganizacao.tsx,ModalAgendamentoTestes.tsx - ✅
DrawerPedido.tsx(overlay de detalhe — sem ação CRUD direta) - ❌
modal-formulario-abas-global.tsx(kebab-case proibido — viraModalFormularioAbasGlobal.tsx) - ❌
CardKanbanModal.tsx(sufixo — viraModalCardKanban.tsx) - 📝 Caso especial — modais de Dashboard seguem o prefixo
Dashboard*por agrupamento de pacote, não o prefixoModal*(ex:DashboardPainelEditarModal.tsx— alinhado ao Atlas DDD aba 8). Este é o único namespace de modal que não usaModal<Acao><Entidade>por convenção, porque pertence ao componente coletivo@nucleo/dashboard.
- ✅
- PascalCase, sufixo
Nome do componente - DDD=Nome do arquivo - DDDsem.tsx. O componente exportado default deve ter o mesmo nome do arquivo. Constantes auxiliares exportadas (PRIORIDADE_COR,TIPOS_EMPRESA,CHAR_LIMIT) não vão nesta coluna — esta coluna é o componente React, não a primeira const exportada do arquivo.- 🔴 Achado crítico observado na planilha: a coluna
Nome do componenteestá sendo preenchida com a primeira const exportada (ex:cronParaHoraMinuto,PRIORIDADE_COR) em vez do componente React real. Toda linha em queNome do componente≠ identificador derivado do arquivo é divergência a corrigir.
- 🔴 Achado crítico observado na planilha: a coluna
Local,Produto Gravityreusam o vocabulário demapa-paginas+ um valor extra:Local:Organizacao|Produto|Configurador|Marketplace|Nucleo Global(modal compartilhado emnucleo-global/— não existe emmapa-paginas)Produto Gravity: slug da pasta — quandoLocal = Nucleo Global, valor obrigatório énucleo-global.
Utilizado no códigoé binário:SIM(importado em ≥ 1 página/componente) ouNAO(órfão). Modal comNAOé candidato aStatus DDD = DEPRECAR.Paginas que abremcruza com aba6. mapa-paginas. Lista os componentes de página que renderizam este modal, separados por|. Cada nome listado deve existir na aba 6 (colunaNome do componente). Modal sem nenhuma página que abre +Utilizado no código = SIMindica que é aberto por outro modal/componente — registrar emObservacoes.Acoesé uma lista curta de verbos no infinitivo PT-BR, separados por|. Vocabulário canônico:Salvar,Cancelar,Excluir,Confirmar,Aprovar,Rejeitar,Enviar,Importar,Exportar,Duplicar,Disparar- ❌ EN (
Save,Cancel,Delete) - ❌ substantivo (
Salvamento,Confirmação)
Rotas de API consumidascruza com aba5. mapa-rotas. Mesma disciplina demapa-paginasREGRA 9: lista as rotas chamadas pelo modal (viafetch/SDK), separadas por|; cada rota deve existir na aba 5; usar a coluna Atual da rota.Patente minimaem EN UPPER_SNAKE (REGRA 7 doddd-nomenclatura). Mesmo vocabulário fechado demapa-rotasemapa-paginas:SUPER_ADMIN,ADMIN,MANAGER,STANDARD,VIEWER,PUBLIC. Modal deLocal = Configuradorempages/admin/exigeSUPER_ADMIN.Status DDDé o mesmo enum fechado:OK,RENOMEAR,DEPRECAR,NOVA. Modal comUtilizado no código = NAOdeve terStatus DDD = DEPRECAR(a menos que sejaNOVA).Modais órfãos (
.tsxem*Modal*.tsxsem linha) e fantasmas (linha sem.tsx) são achados críticos 🔴.
Conversão: Modal real → linha completa da planilha
| Passo | Regra | Exemplo |
|---|---|---|
| 1 | Localizar .tsx do modal (grep <Dialog/<Drawer/<Popover ou nome com Modal/Drawer) |
servicos-global/configurador/src/pages/admin/ModalEditarOrganizacao.tsx |
| 2 | Ler export default function <Componente> (NÃO a primeira const) |
Nome do componente = ModalEditarOrganizacao |
| 3 | Identificar Tipo pelo wrapper (<Dialog> → Modal; <Drawer> → Drawer; <Popover> → Popover) |
Modal |
| 4 | Aplicar REGRA 3 ao nome | Nome do arquivo - DDD = ModalEditarOrganizacao.tsx |
| 5 | Grep import .* ModalEditarOrganizacao para listar páginas que abrem |
OrganizacaoDetalhe, Tenants |
| 6 | Listar handlers on... chamados (onSalvar, onCancelar) → Acoes |
`Salvar |
| 7 | Listar rotas API consumidas (grep fetch( / api.) e cruzar com aba 5 |
/api/v1/admin/tenants/:id |
| 8 | Cruzar com RBAC para Patente minima (Configurador/admin → SUPER_ADMIN) |
SUPER_ADMIN |
| 9 | Comparar Atual vs DDD: igual → OK; diferente → RENOMEAR |
Status DDD = OK |
Exemplo completo
Modal em servicos-global/configurador/src/pages/admin/ModalEditarOrganizacao.tsx, importado por TenantDetail.tsx (futura OrganizacaoDetalhe.tsx), que dispara PUT /api/v1/admin/tenants/:id e tem botões "Salvar" e "Cancelar":
| Coluna | Valor |
|---|---|
| Local | Configurador |
| Nome do arquivo | ModalEditarOrganizacao.tsx |
| Nome do arquivo - DDD | ModalEditarOrganizacao.tsx |
| Utilizado no código | SIM |
| EXPLICAÇÃO | Edita os dados cadastrais de uma organização (nome, CNPJ, contatos). |
| Nome do componente | TIPOS_EMPRESA (linha original — divergência) |
| Nome do componente - DDD | ModalEditarOrganizacao |
| Produto Gravity | Configurador |
| Tipo | Modal |
| Paginas que abrem | OrganizacaoDetalhe |
| Acoes | Salvar | Cancelar |
| Rotas de API consumidas | /api/admin/tenants/:id |
| Models lidos (heuristico) | Organizacao |
| Patente minima | SUPER_ADMIN |
| Arquivo | servicos-global/configurador/src/pages/admin/ModalEditarOrganizacao.tsx |
| Status DDD | RENOMEAR |
| Observacoes | Coluna Nome do componente original aponta para a const TIPOS_EMPRESA em vez do componente exportado — corrigir. Rota Atual ainda usa tenants em vez de organizacoes — depende de mapa-rotas aprovar renomeação. |
Achados a reportar:
- 🔴
Nome do componente=TIPOS_EMPRESA(const auxiliar, não componente) — divergência de extração (REGRA 4) - 🟡 Rota Atual ainda em
/admin/tenants/...— propagarRENOMEARpara aba 5 - 🟡 Página que abre é
TenantDetail— renomear na aba 6 antes de fechar esta linha
Checklist de validação (aplicar a cada linha da aba 7. Modais)
-
Local∈ {Organizacao,Produto,Configurador,Marketplace,Nucleo Global}? -
Tipo∈ {Modal,Drawer,Popover}? -
Nome do arquivo - DDDem PascalCase, com prefixoModal/Drawer/Popover(salvo exceções de domínio da REGRA 3)? -
Nome do componente - DDD=Nome do arquivo - DDDsem.tsx? -
Nome do componente(atual) é o componente exportado default, não a primeira const auxiliar? -
Utilizado no código∈ {SIM,NAO}? SeNAO,Status DDDéDEPRECAR? - Cada página em
Paginas que abremexiste na aba6. mapa-paginas? - Cada rota em
Rotas de API consumidasexiste na aba5. mapa-rotas? -
Acoescontém apenas verbos no infinitivo PT-BR do vocabulário canônico (REGRA 8)? -
Patente minimaem EN UPPER_SNAKE? Modais empages/admin/=SUPER_ADMIN? -
Status DDD∈ {OK,RENOMEAR,DEPRECAR,NOVA}? - Não há modal órfão (
.tsxsem linha) ou fantasma (linha sem.tsx)?
Limites duros
- ❌ Editar código (
.tsx) - ❌ Renomear arquivo no repositório (refactor é fora do escopo)
- ❌ Inventar valor fora dos enums fechados (
Tipo,Local,Status DDD) - ❌ Decidir patente mínima sem cruzar com RBAC do Configurador
- ❌ Sobrescrever o
.xlsxoriginal - ✅ Auditar a aba
7. Modais - ✅ Propor preenchimento/correção de células após aprovação
- ✅ Marcar modais órfãos como
DEPRECAR(após confirmação)
Skills vizinhas (referência apenas)
lei/ddd-nomenclatura— naming canônico (arquivo, componente)ux/criacao-telas— padrão visual de modais e drawersux/componentes— uso de<Dialog>/<Drawer>do nucleo-globalconvencao-tecnica/mapa-paginas— cruzamento da colunaPaginas que abremconvencao-tecnica/mapa-rotas— cruzamento da colunaRotas de API consumidasseguranca/permissoes— patentes (tipo_usuario)