@thibezer/ui-components-kit 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/LICENSE +21 -21
  3. package/README.md +150 -14
  4. package/dist/botao.cjs +1 -1
  5. package/dist/botao.js +1 -1
  6. package/dist/camadas.cjs +65 -65
  7. package/dist/camadas.js +762 -729
  8. package/dist/campo-texto.cjs +1 -1
  9. package/dist/campo-texto.js +1 -1
  10. package/dist/canvas.cjs +105 -146
  11. package/dist/canvas.js +5132 -1199
  12. package/dist/card.cjs +1 -1
  13. package/dist/card.js +1 -1
  14. package/dist/components/ui-botao/ui-botao.d.ts +15 -0
  15. package/dist/components/ui-camadas/camadas-persistencia.d.ts +4 -0
  16. package/dist/components/ui-camadas/ui-camadas.d.ts +10 -0
  17. package/dist/components/ui-campo-texto/ui-campo-texto.d.ts +5 -0
  18. package/dist/components/ui-canvas-cad/cad-estilos-externos.d.ts +16 -0
  19. package/dist/components/ui-canvas-cad/cad-eventos-canvas.d.ts +4 -0
  20. package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +262 -0
  21. package/dist/components/ui-canvas-cad/cad-ferramentas-barra.d.ts +15 -0
  22. package/dist/components/ui-canvas-cad/cad-snap.d.ts +32 -0
  23. package/dist/components/ui-canvas-cad/cad-toolbar-painel.d.ts +1 -0
  24. package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +143 -0
  25. package/dist/components/ui-lista-flutuante/lista-flutuante-posicionamento.d.ts +2 -0
  26. package/dist/components/ui-lista-flutuante/ui-lista-flutuante.d.ts +1 -0
  27. package/dist/components/ui-modal/modal-pilha.d.ts +3 -0
  28. package/dist/components/ui-modal/ui-modal.d.ts +19 -4
  29. package/dist/components/ui-seletor-mapa-base/ui-seletor-mapa-base.d.ts +3 -0
  30. package/dist/components/ui-tabela/tabela-atributos-sync.d.ts +3 -0
  31. package/dist/components/ui-tabela/tabela-corpo.d.ts +2 -0
  32. package/dist/components/ui-tabela/tabela-localizador.d.ts +8 -1
  33. package/dist/components/ui-tabela/tabela-orquestrador-dados.d.ts +4 -0
  34. package/dist/components/ui-tabela/tabela-renderizador.d.ts +1 -0
  35. package/dist/components/ui-tabela/tabela-selecao.d.ts +21 -6
  36. package/dist/components/ui-tabela/tipos.d.ts +6 -0
  37. package/dist/components/ui-tabela/ui-tabela.d.ts +56 -2
  38. package/dist/components/ui-tabela-propriedades/avaliador-expressao.d.ts +0 -5
  39. package/dist/components/ui-tabela-propriedades/propriedades-dom-utils.d.ts +17 -1
  40. package/dist/components/ui-tabela-propriedades/propriedades-flutuante.d.ts +2 -0
  41. package/dist/components/ui-tabela-propriedades/propriedades-gerenciador-valores.d.ts +10 -1
  42. package/dist/components/ui-tabela-propriedades/propriedades-render-arvore.d.ts +3 -1
  43. package/dist/components/ui-tabela-propriedades/ui-tabela-propriedades.d.ts +5 -1
  44. package/dist/components/ui-tooltip/ui-tooltip.d.ts +15 -0
  45. package/dist/core/alvo-digitavel.d.ts +1 -0
  46. package/dist/core/form-submissao.d.ts +16 -0
  47. package/dist/core/index.d.ts +1 -0
  48. package/dist/core/parts.d.ts +6 -0
  49. package/dist/core/rotulo.d.ts +6 -0
  50. package/dist/core/svg-seguro.d.ts +10 -0
  51. package/dist/core/ui-bus.d.ts +13 -2
  52. package/dist/core.cjs +1 -1
  53. package/dist/core.js +14 -12
  54. package/dist/custom-elements.json +32905 -0
  55. package/dist/data.cjs +1 -1
  56. package/dist/data.js +51 -46
  57. package/dist/feedback.cjs +1 -1
  58. package/dist/feedback.js +3 -3
  59. package/dist/form-submissao-C-SPRKgT.js +61 -0
  60. package/dist/form-submissao-DxKO5MHI.cjs +1 -0
  61. package/dist/forms.cjs +1 -1
  62. package/dist/forms.js +2 -2
  63. package/dist/gerencigeo-canvas/canvas_interacao.d.ts +18 -0
  64. package/dist/gerencigeo-canvas/feature_adapters.d.ts +35 -0
  65. package/dist/gerencigeo-canvas/feature_algoritmos.d.ts +45 -0
  66. package/dist/gerencigeo-canvas/feature_amostra.d.ts +4 -0
  67. package/dist/gerencigeo-canvas/feature_caixa.d.ts +19 -0
  68. package/dist/gerencigeo-canvas/feature_cluster.d.ts +61 -0
  69. package/dist/gerencigeo-canvas/feature_cursores.d.ts +17 -0
  70. package/dist/gerencigeo-canvas/feature_desenho.d.ts +53 -0
  71. package/dist/gerencigeo-canvas/feature_desenho_controle.d.ts +91 -0
  72. package/dist/gerencigeo-canvas/feature_edicao_ops.d.ts +19 -0
  73. package/dist/gerencigeo-canvas/feature_editor_vertices.d.ts +62 -0
  74. package/dist/gerencigeo-canvas/feature_formas.d.ts +7 -0
  75. package/dist/gerencigeo-canvas/feature_hud.d.ts +23 -0
  76. package/dist/gerencigeo-canvas/feature_indice.d.ts +36 -0
  77. package/dist/gerencigeo-canvas/feature_metricas.d.ts +16 -0
  78. package/dist/gerencigeo-canvas/feature_popup.d.ts +31 -0
  79. package/dist/gerencigeo-canvas/feature_selecao.d.ts +38 -0
  80. package/dist/gerencigeo-canvas/feature_simplificacao.d.ts +14 -0
  81. package/dist/gerencigeo-canvas/feature_snap.d.ts +25 -0
  82. package/dist/gerencigeo-canvas/feature_types.d.ts +86 -0
  83. package/dist/gerencigeo-canvas/feature_versoes.d.ts +19 -0
  84. package/dist/gerencigeo-canvas/index.d.ts +21 -0
  85. package/dist/gerencigeo-canvas/layer_hit_test.d.ts +30 -0
  86. package/dist/gerencigeo-canvas/layer_manager.d.ts +11 -3
  87. package/dist/gerencigeo-canvas/layer_pane_ops.d.ts +9 -0
  88. package/dist/gerencigeo-canvas/mapa_controller.d.ts +1 -0
  89. package/dist/gerencigeo-canvas/mapa_pontos_shapes.d.ts +24 -5
  90. package/dist/gerencigeo-canvas/renderers/feicoes_renderer.d.ts +89 -0
  91. package/dist/gerencigeo-canvas/renderers/vector_points_renderer.d.ts +1 -0
  92. package/dist/gerencigeo-canvas/renderers/vector_polygons_renderer.d.ts +2 -2
  93. package/dist/gerencigeo-canvas/types.d.ts +12 -0
  94. package/dist/gerencigeo-canvas/utils.d.ts +3 -1
  95. package/dist/index.cjs +1 -1
  96. package/dist/index.d.ts +2 -2
  97. package/dist/index.js +117 -112
  98. package/dist/leaflet-DcO7uRC-.cjs +1 -0
  99. package/dist/{leaflet-DkaFZYc5.js → leaflet-PPDKB6Dd.js} +37 -37
  100. package/dist/mapa.cjs +4 -4
  101. package/dist/mapa.js +2 -2
  102. package/dist/modal.cjs +1 -1
  103. package/dist/modal.js +1 -1
  104. package/dist/parts-CaoQiCfI.js +7 -0
  105. package/dist/parts-vQa2873h.cjs +1 -0
  106. package/dist/register.cjs +1 -1
  107. package/dist/register.js +12 -12
  108. package/dist/seletor-mapa-base.cjs +16 -16
  109. package/dist/seletor-mapa-base.js +111 -61
  110. package/dist/svg-seguro-BsbNQqpd.js +50 -0
  111. package/dist/svg-seguro-C76iLlAZ.cjs +1 -0
  112. package/dist/tabela.cjs +1 -1
  113. package/dist/tabela.js +41 -36
  114. package/dist/tipos-elementos.d.ts +1232 -0
  115. package/dist/tipos-react.d.ts +113 -0
  116. package/dist/tipos-vue.d.ts +1201 -0
  117. package/dist/tools.cjs +1 -1
  118. package/dist/tools.js +1 -1
  119. package/dist/ui-badge-BxT-sDmV.cjs +28 -0
  120. package/dist/ui-badge-C0eKBI8E.js +183 -0
  121. package/dist/ui-botao-OGJV6Vfk.js +165 -0
  122. package/dist/ui-botao-psS1juof.cjs +12 -0
  123. package/dist/ui-campo-texto-Cnn2UAkS.cjs +16 -0
  124. package/dist/{ui-campo-texto-B_JF6POq.js → ui-campo-texto-Uu2dJE_0.js} +81 -63
  125. package/dist/{ui-card-Bhm6k91e.cjs → ui-card-B86lJXTP.cjs} +7 -7
  126. package/dist/{ui-card-BJ8SmvVf.js → ui-card-C_o5_0cB.js} +14 -14
  127. package/dist/ui-kit.css +1 -1
  128. package/dist/ui-modal-CvGFGh1h.cjs +18 -0
  129. package/dist/ui-modal-DBOtSTbR.js +238 -0
  130. package/dist/{ui-paleta-ferramentas-Bpp4XBVg.js → ui-paleta-ferramentas-CEZYcN4J.js} +18 -27
  131. package/dist/{ui-paleta-ferramentas-B6dJ0O6K.cjs → ui-paleta-ferramentas-Dbj1kBS9.cjs} +6 -6
  132. package/dist/ui-segmented-D6b6zxVs.cjs +19 -0
  133. package/dist/{ui-segmented-C8wuycjJ.js → ui-segmented-wUraId2e.js} +68 -67
  134. package/dist/ui-skeleton-DI4_9WOX.js +428 -0
  135. package/dist/ui-skeleton-elhKIh2B.cjs +33 -0
  136. package/dist/{ui-switch-CO9MoS8x.js → ui-switch-BcOqOkiV.js} +92 -62
  137. package/dist/ui-switch-D7iPKDj-.cjs +53 -0
  138. package/dist/ui-tabela-propriedades-BBr5sqki.cjs +145 -0
  139. package/dist/ui-tabela-propriedades-Boy7I5yW.js +2412 -0
  140. package/dist/{ui-toast-CwUmiqyG.js → ui-toast-Bp_NlM5G.js} +51 -51
  141. package/dist/ui-toast-DGTZKne5.cjs +20 -0
  142. package/dist/zero-js-triggers-C_KrvFOQ.js +244 -0
  143. package/dist/zero-js-triggers-C_gtaojZ.cjs +1 -0
  144. package/package.json +27 -7
  145. package/dist/leaflet-Cw6tqYFh.cjs +0 -1
  146. package/dist/ui-badge-92yelKls.js +0 -183
  147. package/dist/ui-badge-B95jSECC.cjs +0 -28
  148. package/dist/ui-botao-BShEouvi.js +0 -124
  149. package/dist/ui-botao-DF1yuUUD.cjs +0 -12
  150. package/dist/ui-campo-texto-BCh5HyCM.cjs +0 -16
  151. package/dist/ui-modal-Bi4isGYh.cjs +0 -18
  152. package/dist/ui-modal-DV-pw2x1.js +0 -194
  153. package/dist/ui-segmented-NC5cBXLh.cjs +0 -19
  154. package/dist/ui-skeleton-B3xQyn0Z.js +0 -396
  155. package/dist/ui-skeleton-D42oQufF.cjs +0 -33
  156. package/dist/ui-switch-C6o4yZUF.cjs +0 -53
  157. package/dist/ui-tabela-propriedades-7yJ9g7ti.cjs +0 -145
  158. package/dist/ui-tabela-propriedades-D-XKNVwK.js +0 -2078
  159. package/dist/ui-toast-CQBqvUm3.cjs +0 -20
  160. package/dist/zero-js-triggers-DdESy0tk.js +0 -205
  161. package/dist/zero-js-triggers-QGD7FOTv.cjs +0 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,92 @@
1
+ # Changelog
2
+
3
+ ## 2.1.0 — 2026-10-11
4
+
5
+ ### `<ui-canvas-cad>`: feições genéricas (migração do MapEngine)
6
+
7
+ Tudo é opt-in: o componente **não cria camadas** de feições sozinho. Pontos, segmentos, vizinhos e SIGEF continuam como antes.
8
+
9
+ - **Feições**: `definirFeicoes`, `adicionarFeicao`, `atualizarFeicao`, `removerFeicao`, `obterFeicoes`. Point, LineString, Polygon (com furos), Circle (metros) e Text (arrastável), com estilo por feição, ícones SVG, rótulos permanentes (`area`, `extensao`, propriedades) e atualização incremental.
10
+ - **Seleção e popup**: clique, Ctrl/Cmd/Shift, caixa Window (E→D) / Crossing (D→E) com toque geométrico real, popup único (`cad-selecao`, `cad-feicao-selecionada`, `cad-feicao-acao`), hit-test unificado entre camadas empilhadas (tolerância em px, alternância de cliques), `cad-feicao-hover` e `cad-feicao-menu`.
11
+ - **Desempenho**: índice espacial próprio (sem dependências), culling por viewport acima de 300 feições, clusters de pontos (grade de 55 px), simplificação Douglas-Peucker por zoom. Meta: 100 mil feições.
12
+ - **Snap e edição**: snap vértice > ponto médio > aresta (tecla `S`, `Alt` desliga, botão na barra, `definirSnap`); edição de vértices com alças, fantasmas nos pontos médios, exclusão pelo botão direito e HUD ao vivo (`editarVertices`).
13
+ - **Ferramentas**: `ponto`, `linha`, `poligono`, `retangulo`, `elipse`, `poligono-regular` (hexágono), `estrela`, `circulo`, `texto`, `caneta` (Bézier), `medir-distancia`, `medir-area`, `dividir`, `selecao-laco`, `conta-gotas`. Atributo `ferramentas` mostra uma barra opcional; `definirFerramenta(nome, { fechar, iniciarEm })`, `definirCamadaDesenho`, `definirEstiloDesenho`. Clicar no primeiro vértice fecha polígono, laço, medir área e caneta (3+ vértices); o botão direito com ferramenta ativa conclui, desfaz o último vértice ou sai; `selecao-laco` seleciona feições dentro do laço e encerra. Utilitários: `gerarBuffer`, `duplicarFeicao`, `juntarFeicoes`.
14
+ - **Versões e colaboração**: oficial × prévia (`entidadeId`, `definirPreviasGlobais`, `alternarPrevia`, `cad-previas`); cursores remotos (`atualizarCursorRemoto`, nome escapado e cor só `#hex`).
15
+ - **Câmera**: `zoomParaFeicao(s)`, `ajustarTudo`, `ajustarCamada` (ligam camadas e prévias escondidas).
16
+ - Exportados pelo entrypoint `./canvas`: modelo `Feicao`, algoritmos (`dividirPoligonoComLinha`, `gerarBuffer`, `juntarLinhas`, `juntarPoligonos`, `ddParaDms`, `dmsParaDd`, `converterComprimento`, `converterArea`...), índice, snap e editores.
17
+ - Guia de migração: `docs/guia-migracao-mapengine.md`.
18
+
19
+ ### `<ui-canvas-cad>`: pendências da integração com o ConecteMapas
20
+
21
+ Tudo opt-in: sem os atributos e opções abaixo, o componente se comporta como antes. Detalhes e exemplos em
22
+ `docs/guia-migracao-mapengine.md`; eventos em `docs/canvas-cad-eventos.md`; números em `docs/desempenho-feicoes.md`.
23
+
24
+ - **Montagem só com API pública**: `inicializarAgora(): L.Map | null` (síncrono, idempotente, cancela o agendamento do `connectedCallback`, nunca cria um 2º mapa); atributos `sem-camadas-padrao` (não cria satélite Google, SIGEF/INCRA, homologados, perímetro, vizinhos, vértices nem grade, e o clique nunca consulta o INCRA), `sem-painel-camadas`, `sem-barra-rapida` e `sem-atalho-snap` (a tecla S não alterna o snap desde o primeiro instante); `definirEstilosExternos(css | CSSStyleSheet[] | null)` injeta CSS do app no shadow root (`adoptedStyleSheets`, com `<style>` de reserva; `destroy()` limpa e a reconexão recoloca). Sem referência a `initCAD`/`initTimeout`.
25
+ - **Posição dos HUDs**: `definirMargensHud({ topo, base, esquerda, direita })` (px) e as propriedades CSS `--cad-hud-topo/-base/-esquerda/-direita`. Os HUDs de desenho e de edição de vértices usam a mesma regra: centralizados na área visível, com largura/altura máximas e quebra de linha. Padrões = posição antiga (`base: 16`).
26
+ - **Linha multiparte (MultiLineString)**: `LineString` aceita `partes: LatLonPar[][]` (ou `coordenadas`). *Decisão:* estender `LineString` em vez de criar um tipo `MultiLineString`, porque quebra menos: `coordenadas` continua existindo (é a 1ª parte) e todo código/consumidor que só lê `coordenadas` segue enxergando uma linha válida; uma parte só normaliza para a linha simples de sempre; nenhum `switch (geometria.tipo)` do consumidor ganha um caso novo. Coberto: normalização, desenho, hit-test (tolerância por parte), caixa Window/Crossing, laço, snap (vértices e arestas de todas as partes, sem aresta entre partes), extensão somada (métricas e rótulo), popup, simplificação por zoom, `obterFeicoes`, `duplicarFeicao`. Recusas com motivo: `editarVertices` → `cad-edicao-recusada` `multiparte`; `juntarFeicoes` → `cad-uniao-falhou` `multiparte`; `dividir` com só multilinhas → `cad-divisao-falhou` `multiparte`; `gerarBuffer` de multilinha devolve `null`. Helpers exportados: `partesDaLinha`, `ehMultilinha`, `criarLinha`.
27
+ - **Lote e ordem**: `aplicarLote(camadaId, { adicionar, atualizar, remover }, opcoes)` faz uma regravação e um `aposDados` e devolve `{ adicionadas, atualizadas, removidas, recusadas }`; `adicionarFeicao`/`atualizarFeicao`/`removerFeicao` passam pelo mesmo caminho. O renderizador recebe só a diferença (índice, loja, oficiais e clusters por célula atualizados item a item) e a busca por id é O(1): com 100 mil feições, uma edição caiu de 60–250 ms para ~0,5 ms (ver `docs/desempenho-feicoes.md`). `atualizarFeicao(camadaId, id, parcial, { substituirPropriedades: true })` (e o mesmo em `aplicarLote`) troca as `propriedades` por inteiro em vez de mesclar.
28
+ - **`Feicao.oculta`**: não desenha, não seleciona (clique, caixa, laço, hit-test, hover, `selecionarFeicoes`), não atrai snap e fica fora de `ajustarTudo`/`ajustarCamada`; segue nos dados, não encerra a edição de vértices em andamento, não conta como excluída e participa da regra oficial × prévia como as demais. `excluida` mantém o significado.
29
+ - **Estilo**: texto com selo (`corFundo`, `corBorda`, `opacidadeFundo`, `raioBorda`; o selo substitui o `halo`) e ponto sem ícone com `corContorno`/`espessuraContorno`, separados do preenchimento. Cores só passam por `corSegura`; números só se finitos.
30
+ - **Ferramentas**: `medir-distancia` com 3+ pontos mostra também área e perímetro no HUD e traz `areaM2`/`perimetroM` em `cad-medicao` (sem criar feição); círculo ignora raio < 2 m; `definirOpcoesPopup({ copiarParaAreaDeTransferencia })` torna opcional a escrita da ação "copiar"; evento cancelável `cad-texto-solicitado` (`preventDefault()` + `detalhe.concluir(texto)`) para usar modal próprio. Teste parametrizado cobre as 15 ferramentas: o ouvinte do evento de conclusão pode desativá-las sem efeito colateral e `cad-selecao` nunca sai com a ferramenta ainda ativa quando a seleção é consequência dela.
31
+ - **Coordenada (0, 0)**: atributo/propriedade `aceitar-origem` / `aceitarOrigem` (padrão `false`) e `{ aceitarOrigem }` nas funções puras de normalização.
32
+
33
+ ### Correções da revisão dos componentes
34
+
35
+ - **`<ui-tabela src>`**: deixou de refazer o `fetch` a cada mudança de atributo (chegava a dezenas de requisições); busca só ao conectar e quando o `src` muda. Filtro e ordenação passam a valer juntos, e o filtro olha as colunas declaradas (ignora campos fora delas e objetos).
36
+ - **`<ui-camadas>`**: foco do teclado preservado após redesenhar; novo `emLote(fn)` agrupa mutações numa só renderização; `definirCamadas` troca a camada ativa que sumiu; `selecionarFeicao` alcança feições de camadas recolhidas; a ordem enviada pela aplicação vence a ordem salva do usuário quando ela mudou; excluir uma camada apaga o override guardado; aviso no console quando painéis dividem a chave de persistência padrão.
37
+ - **`<ui-lista-flutuante>`**: `formReset` volta ao valor inicial mesmo após mover o elemento; `input` antes de `change`; Esc no gatilho, Tab, Home/End e foco devolvido ao gatilho; abre para cima quando falta espaço embaixo.
38
+ - **`<ui-seletor-mapa-base>`**: `desabilitado` agora funciona; `selecionar` ignora ids fora da lista; setas/Home/End e foco no mapa ativo ao abrir pelo teclado; miniaturas sem `referrer`.
39
+ - **`<ui-canvas-cad>`**: atalhos (`S`, Backspace, Esc) não disparam mais enquanto se digita em campos com shadow DOM; ferramentas funcionam após reconectar o componente; dividir/juntar não perdem a feição original quando o resultado é recusado; `juntarFeicoes` respeita bloqueios; `tamanhoIcone` não numérico não injeta HTML; texto bloqueado e depois liberado persiste o arraste.
40
+ - **`<ui-tabela-propriedades>`**: `-2^2` agora vale -4 (o sinal unário pesa menos que a potência).
41
+
42
+ ### ⚠️ Mudanças de comportamento
43
+
44
+ - Ctrl/Cmd/Shift + clique no vazio **não limpa mais** a seleção de pontos (modo aditivo).
45
+ - Clique em marcador DOM não é mais repassado às feições do canvas por baixo.
46
+ - `MapaConfiguracoes.magnetSnap` está **obsoleto** e sem efeito (o snap agora é do componente).
47
+ - `adicionarFeicao`/`aplicarLote` com um `id` que já existe **substituem a feição no mesmo lugar**; antes ela ia para o fim da lista (mudava a ordem de empilhamento dentro da camada).
48
+ - **`cad-medicao`** de `medir-distancia` passa a trazer `areaM2` e `perimetroM` quando a régua tem 3 ou mais pontos (antes só `medir-area` trazia). Quem usava `areaM2 !== undefined` para distinguir o tipo deve olhar `tipo`.
49
+ - **Círculo**: o clique que daria raio menor que 2 m é ignorado (antes aceitava qualquer raio > 0). Feições com `Circle` de raio menor continuam válidas na entrada de dados.
50
+ - **`dividir`**: se a feição cortada estava selecionada, a ferramenta encerra antes de a seleção mudar (para `cad-selecao` sair sem ferramenta ativa). Sem seleção envolvida, continua ativa para o próximo corte.
51
+ - **Ordem do aviso nas medições**: `cad-medicao` agora sai depois de a ferramenta estar pronta para a próxima figura; desativar a ferramenta dentro desse evento deixava a sessão "ressuscitar" (corrigido).
52
+ - **HUDs**: ganham `width: max-content`, largura/altura máximas e quebra de linha (o de edição de vértices não quebrava linha). Na posição padrão ficam onde estavam.
53
+ - Valores novos nos `motivo` de `cad-edicao-recusada`, `cad-uniao-falhou` e `cad-divisao-falhou`: `multiparte`. Quem faz `switch` exaustivo precisa tratá-lo.
54
+ - `selecionarFeicoes` e `alternarSelecaoFeicao` ignoram feições `oculta`.
55
+ - `GerenciadorFeicoes.emitir` (uso interno/testes) ganhou um 3º parâmetro opcional `cancelavel` e pode devolver `true` para "cancelado"; o `normalizarFeicaoEntrada`, `normalizarCoordenada` e `parseCoordenada` ganharam um último parâmetro opcional `{ aceitarOrigem }` (compatível).
56
+
57
+ ## 2.0.0
58
+
59
+ ### ⚠️ Mudanças que podem exigir ajuste
60
+
61
+ - **Tema segue o sistema operacional por padrão.** Antes o kit era sempre escuro. Para manter o escuro fixo, use `<html data-tema="escuro">`. `UIBus.definirTema('auto')` volta a seguir o sistema.
62
+ - **Enter em `<ui-campo-texto>` envia o formulário**, como um campo nativo. Formulários com botão `type="submit"` e sem listener de `submit` com `preventDefault()` passam a enviar (e recarregar a página) ao pressionar Enter.
63
+ - **`ui-abrir` / `ui-fechar` do modal disparam também ao mudar o atributo `aberto`**, não só pelos métodos `abrir()`/`fechar()`.
64
+ - **A seleção de `<ui-tabela>` é mantida ao ordenar, filtrar ou trocar `dados`** (se o item ainda existir). Use `limparSelecao()` para zerar.
65
+ - **Variáveis CSS renomeadas:** `--ui-fonte-mono`, `--ui-fonte-familia` e `--ui-fonte-principal` → `--ui-fonte-codigo` / `--ui-fonte-base`; `--ui-radius-*` → `--ui-raio-*`.
66
+ - **Cores do tema claro mais escuras** para atingir contraste WCAG AA (primária `#006b40`). No escuro, o botão destrutivo passou para `#d32f2f`.
67
+ - Removidos `UIModal._openCount` e o atributo interno `data-scroll-locked`.
68
+
69
+ ### Usuário final
70
+
71
+ - Textos legíveis nos dois temas (contraste WCAG AA verificado em testes).
72
+ - Tabela por teclado: cabeçalhos ordenáveis com Tab + Enter, linhas com setas, Home/End, PageUp/PageDown, Enter para selecionar.
73
+ - Modal: foco inicial no conteúdo (ou `[autofocus]`), foco devolvido ao fechar, Esc fecha o modal do topo, segundo modal aberto continua interativo, "✕" oculto com `bloquear-fechamento`.
74
+ - Tooltip lido por leitores de tela, fecha com Esc e não some ao levar o ponteiro até o balão.
75
+ - Botões só com ícone recebem nome acessível (`aria-label` ou `title`).
76
+ - Gatilhos Zero-JS ignoram botões desabilitados ou carregando.
77
+ - Correção de segurança: o `label` de campos nunca é interpretado como HTML.
78
+
79
+ ### Desenvolvedor
80
+
81
+ - **Tipos para React e Vue** gerados a partir do Custom Elements Manifest: `@thibezer/ui-components-kit/tipos-react`, `/tipos-vue` e `/tipos-elementos`.
82
+ - **`custom-elements.json`** publicado (campo `customElements`), para IDEs, Storybook e documentação.
83
+ - **`::part`** nos 14 componentes principais, com estados (`opcao-selecionada`, `linha-selecionada`).
84
+ - **Tokens unificados:** fontes `--ui-fonte-base` / `--ui-fonte-codigo`; escala de raio derivada de `--ui-raio-borda` (`--ui-raio-sm/lg/xl/pill`); novos `--ui-cor-texto-info`, `--ui-cor-texto-sobre-status`, `--ui-cor-fundo-recuado`, `--ui-sombra-sm/md/lg`.
85
+ - `<ui-botao>` form-associated: `form="id"`, `<fieldset disabled>`, `name`/`value` no `e.submitter`, `disabled` como propriedade, `click()` no host.
86
+ - `UIBus.obterTema()`; `tema:alterado` também quando o sistema troca de tema.
87
+ - `<ui-tabela>`: `aria-label` repassado à tabela, `aria-busy` durante o carregamento.
88
+ - README corrigido (exemplo React, atributos do catálogo, import map para mapa/CAD via CDN).
89
+
90
+ ## 1.0.0
91
+
92
+ - Primeira publicação no npm como `@thibezer/ui-components-kit`.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 thibezer
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 thibezer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Biblioteca de **Web Components Nativos Universais e Agnósticos**, construída no padrão oficial **W3C Custom Elements + Shadow DOM**, com TypeScript, Design Tokens em CSS modular e Vite.
4
4
 
5
- Projetada para funcionar em **qualquer linguagem, framework ou sistema web** (HTML puro, React, Next.js, Vue, Angular, Svelte, PHP, Django, WordPress, Blazor, etc.) com **zero dependências externas**.
5
+ Projetada para funcionar em **qualquer linguagem, framework ou sistema web** (HTML puro, React, Next.js, Vue, Angular, Svelte, PHP, Django, WordPress, Blazor, etc.) com **zero dependências externas** (exceto `<ui-mapa>` e `<ui-canvas-cad>`, que usam o Leaflet como dependência opcional).
6
6
 
7
7
  ---
8
8
 
@@ -54,6 +54,16 @@ Adicione as tags no `<head>` ou antes do fechamento do `</body>`:
54
54
  <ui-botao-primario variante="primary">Clique Aqui</ui-botao-primario>
55
55
  ```
56
56
 
57
+ > **Mapa e CAD via CDN (`<ui-mapa>`, `<ui-canvas-cad>`)**: esses componentes dependem do [Leaflet](https://leafletjs.com/), importado como `leaflet` (especificador "bare"), que o navegador só resolve com um *import map*. Declare-o **antes** do script da biblioteca:
58
+ >
59
+ > ```html
60
+ > <script type="importmap">
61
+ > { "imports": { "leaflet": "https://cdn.jsdelivr.net/npm/leaflet@1.9.4/+esm" } }
62
+ > </script>
63
+ > ```
64
+ >
65
+ > Os demais componentes não precisam do Leaflet. Com npm, basta `npm install leaflet`.
66
+
57
67
  ### Opção 2: NPM / Módulos ES (React, Vue, Next.js, Vite)
58
68
 
59
69
  Instale pelo npm:
@@ -258,6 +268,62 @@ Todos os componentes flutuantes consomem tokens de elevação previsíveis (com
258
268
  <ui-switch aria-label="Camada visível"></ui-switch>
259
269
  ```
260
270
 
271
+ ### 8. Temas Claro e Escuro
272
+ Sem configuração, o kit **segue o tema do sistema operacional** (`prefers-color-scheme`). Para fixar um tema, use o atributo na raiz — ou em qualquer elemento, para fixar só aquele trecho:
273
+ ```html
274
+ <html data-tema="escuro"> <!-- ou "claro"; também aceitos: class="dark|light" e data-theme="dark|light" -->
275
+ <aside data-tema="claro">…</aside> <!-- trecho claro dentro de uma página escura -->
276
+ ```
277
+ ```javascript
278
+ UIBus.definirTema('auto'); // volta a seguir o SO
279
+ UIBus.on('tema:alterado', ({ tema }) => { /* também dispara quando o SO muda, se o tema não estiver fixado */ });
280
+ ```
281
+ Os componentes recebem o tema **apenas pelos tokens de cor** (`--ui-cor-*`, `--ui-sombra-*`), que atravessam o Shadow DOM. Todo token de texto atinge contraste **WCAG AA (4,5:1)** nos dois temas, inclusive sobre fundos tingidos de status e no texto sobre a cor primária e o botão destrutivo — verificado em `tests/tema.test.ts`.
282
+
283
+ | Token | Uso |
284
+ | :--- | :--- |
285
+ | `--ui-cor-texto-sucesso` / `-erro` / `-alerta` / `-info` | Texto e tons de status (alertas, badges, toasts) |
286
+ | `--ui-cor-texto-sobre-status` | Texto sobre fundo sólido de status (badge sólido) |
287
+ | `--ui-cor-fundo-recuado` | Faixas rebaixadas (rodapés de modal e drawer) |
288
+ | `--ui-sombra-sm` / `-md` / `-lg` | Sombras: densas no escuro, suaves no claro |
289
+
290
+ ### 9. Tipografia e Raios
291
+ Todos os componentes usam apenas dois tokens de família de fonte e uma escala de raios derivada de `--ui-raio-borda`. Sobrescreva no `:root` (a escala é calculada lá):
292
+ ```css
293
+ :root {
294
+ --ui-fonte-base: 'Roboto', sans-serif; /* textos da interface */
295
+ --ui-fonte-codigo: 'JetBrains Mono', monospace; /* coordenadas, valores técnicos, código */
296
+
297
+ --ui-raio-borda: 4px; /* base: botões, campos, menus */
298
+ /* derivados automaticamente: --ui-raio-sm (2/3), --ui-raio-lg (5/3), --ui-raio-xl (8/3) */
299
+ /* --ui-raio-borda: 0 → interface totalmente reta */
300
+ }
301
+ ```
302
+
303
+ ### 10. Estilização Interna com `::part`
304
+ O Shadow DOM isola o CSS, mas os elementos internos principais são expostos com `part`, com nomes consistentes entre componentes (uma regra serve para vários):
305
+
306
+ | Componente | Parts |
307
+ | :--- | :--- |
308
+ | `<ui-botao>` / `<ui-botao-primario>` | `base`, `spinner` |
309
+ | `<ui-campo-texto>` / `<ui-input>` | `rotulo`, `campo`, `input`, `icone`, `icone-esquerda`, `icone-direita`, `ajuda` |
310
+ | `<ui-lista-flutuante>` / `<ui-select>` | `rotulo`, `campo`, `valor`, `seta`, `lista`, `opcao`, `opcao-selecionada` |
311
+ | `<ui-checkbox>`, `<ui-radio>`, `<ui-switch>` | `base`, `controle`, `indicador`, `rotulo` |
312
+ | `<ui-segmented>` | `base`, `indicador`, `opcao`, `opcao-selecionada` |
313
+ | `<ui-modal>`, `<ui-drawer>` | `fundo`, `painel`, `cabecalho`, `titulo`, `descricao` (drawer), `fechar`, `corpo`, `rodape` |
314
+ | `<ui-card>` | `base`, `midia`, `cabecalho`, `corpo`, `rodape` |
315
+ | `<ui-badge>` / `<ui-chip>` | `base`, `rotulo`, `remover` |
316
+ | `<ui-alerta>` / toasts | `base`, `icone`, `conteudo`, `titulo`, `mensagem`, `acao`, `fechar`, `progresso` |
317
+ | `<ui-tooltip>` | `balao`, `texto`, `seta` |
318
+ | `<ui-tabela>` | `base`, `tabela`, `celula-cabecalho`, `ordenar`, `linha`, `linha-selecionada`, `celula`, `vazio`, `carregando` |
319
+
320
+ ```css
321
+ ui-campo-texto::part(campo) { border-width: 2px; }
322
+ ui-modal::part(painel) { max-width: 720px; }
323
+ ui-tabela::part(linha-selecionada) { background: #0b3d2a; }
324
+ :is(ui-checkbox, ui-radio, ui-switch)::part(rotulo) { font-weight: 600; }
325
+ ```
326
+
261
327
  ---
262
328
 
263
329
  ## ⚡ Recursos Inteligentes de Alta Produtividade
@@ -299,7 +365,7 @@ Você pode acionar modais, fechar janelas, disparar notificações toast ou copi
299
365
  | `toast-alerta="msg"` | Dispara uma notificação flutuante de aviso. | `toast-alerta="Preencha os campos obrigatórios."` |
300
366
  | `copiar-texto="texto\|#id"` | Copia o texto ou o valor do elemento referenciado. | `copiar-texto="#campo-pix"` |
301
367
  | `limpar-form="id"` | Reseta todos os campos do formulário indicado. | `limpar-form="form-cadastro"` |
302
- | `alternar-tema` | Alterna entre tema claro e escuro globalmente. | `alternar-tema` |
368
+ | `alternar-tema` | Alterna entre tema claro e escuro globalmente (a partir do tema em vigor, inclusive o do SO). | `alternar-tema` |
303
369
 
304
370
  ---
305
371
 
@@ -331,6 +397,8 @@ form.addEventListener('submit', (e) => {
331
397
  });
332
398
  ```
333
399
 
400
+ Assim como nos campos nativos, **Enter** em um `<ui-campo-texto>` submete o formulário pelo botão de envio padrão (`<ui-botao-primario type="submit">` ou `<button>`), que também pode estar fora do `<form>` com `form="id-do-form"`. Para impedir, chame `preventDefault()` no `keydown`. O `name`/`value` do botão que submeteu chega como `e.submitter` (use `new FormData(form, e.submitter)`), e gatilhos Zero-JS em botões `disabled` ou `carregando` são ignorados.
401
+
334
402
  ---
335
403
 
336
404
  ### 3. Barramento Global de Orquestração (`UIBus`)
@@ -345,7 +413,8 @@ UIBus.fecharModal('modal-confirmacao');
345
413
  UIBus.notificar({ tipo: 'sucesso', mensagem: 'Operação concluída!' });
346
414
  UIBus.copiar('Texto para a área de transferência', 'Copiado!');
347
415
  UIBus.definirDensidade('compacta'); // 'compacta' | 'normal' | 'relaxada'
348
- UIBus.definirTema('escuro'); // 'claro' | 'escuro'
416
+ UIBus.definirTema('escuro'); // 'claro' | 'escuro' | 'auto' (segue o SO); sem argumento, alterna
417
+ UIBus.obterTema(); // tema em vigor: 'claro' | 'escuro'
349
418
 
350
419
  // 2. Comunicação Desacoplada (Pub/Sub):
351
420
  UIBus.on('vertice:selecionado', (dadosVertice) => {
@@ -422,6 +491,26 @@ tabela.recarregar(); // Recarrega os dados da API remota
422
491
 
423
492
  A biblioteca é **100% SSR-safe**: todas as classes herdam de `SafeHTMLElement` e o registro de tags utiliza verificações de segurança para ambientes sem DOM (Node.js). Isso garante que você pode importar tipos, classes e constantes tanto no servidor quanto no cliente sem encontrar `ReferenceError: HTMLElement is not defined` ou `customElements is not defined`.
424
493
 
494
+ #### Tipos no TSX (autocompletar e checagem)
495
+ O pacote gera tipos para todas as tags a partir do Custom Elements Manifest. Registre-os uma vez no `tsconfig.json`:
496
+
497
+ ```json
498
+ { "compilerOptions": { "types": ["@thibezer/ui-components-kit/tipos-react"] } }
499
+ ```
500
+
501
+ A partir daí o editor sugere atributos, propriedades e eventos de cada tag, e o TypeScript recusa valores inválidos:
502
+
503
+ ```tsx
504
+ <ui-tabela
505
+ colunas={[{ id: 'ponto', rotulo: 'Ponto', ordenavel: true }]} // tipado como TabelaColuna[]
506
+ densidade="compacta" // 'compacta' | 'normal' | 'relaxada'
507
+ onui-sort={(e) => console.log(e.detail)} // eventos ui-* no formato do React 19
508
+ />
509
+ <ui-tabela densidade="enorme" /> // ❌ erro de tipo
510
+ ```
511
+
512
+ Outros JSX (Preact, Solid etc.) podem usar o mapa agnóstico `ElementosUI` de `@thibezer/ui-components-kit/tipos-elementos`.
513
+
425
514
  #### No Next.js (App Router):
426
515
 
427
516
  Crie um componente cliente provedor ou registre no topo do seu layout/página cliente:
@@ -451,9 +540,10 @@ import '@thibezer/ui-components-kit/forms';
451
540
  import '@thibezer/ui-components-kit/botao';
452
541
  import '@thibezer/ui-components-kit/tabela';
453
542
  import { UIBus } from '@thibezer/ui-components-kit/core';
543
+ import type { UITabela } from '@thibezer/ui-components-kit/tabela';
454
544
 
455
545
  export default function DashboardPropriedades() {
456
- const tabelaRef = useRef<any>(null);
546
+ const tabelaRef = useRef<UITabela>(null);
457
547
  const [nome, setNome] = useState('');
458
548
 
459
549
  useEffect(() => {
@@ -474,8 +564,10 @@ export default function DashboardPropriedades() {
474
564
  label="Pesquisar Imóvel"
475
565
  value={nome}
476
566
  onInput={(e: any) => {
477
- setNome(e.detail?.value || '');
478
- tabelaRef.current?.filtrar(e.detail?.value || '');
567
+ // Os eventos nativos `input`/`change` não têm `detail`: leia o valor do próprio elemento
568
+ const valor = e.target.value;
569
+ setNome(valor);
570
+ tabelaRef.current?.filtrar(valor);
479
571
  }}
480
572
  ></ui-campo-texto>
481
573
 
@@ -494,6 +586,18 @@ export default function DashboardPropriedades() {
494
586
  ---
495
587
 
496
588
  ### Vue.js
589
+
590
+ Para autocompletar e checar props e eventos nos templates (Volar), registre os tipos no `tsconfig.json` e informe ao Vue que tags `ui-*` são custom elements:
591
+
592
+ ```json
593
+ { "compilerOptions": { "types": ["@thibezer/ui-components-kit/tipos-vue"] } }
594
+ ```
595
+
596
+ ```javascript
597
+ // vite.config.js
598
+ vue({ template: { compilerOptions: { isCustomElement: (tag) => tag.startsWith('ui-') } } })
599
+ ```
600
+
497
601
  ```vue
498
602
  <template>
499
603
  <div class="container">
@@ -563,7 +667,7 @@ window.addEventListener('message', (event) => {
563
667
  ### 🟢 Camada 1: Fundamentos
564
668
  | Tag | Descrição | Principais Atributos / Props | Eventos Emitidos |
565
669
  | :--- | :--- | :--- | :--- |
566
- | `<ui-botao-primario>` | Botão com estados de loading, ícone e variantes. | `variante`, `carregando`, `disabled`, `target-modal` | `ui-click` |
670
+ | `<ui-botao-primario>` | Botão com estados de loading, ícone e variantes. Form-associated (`type="submit"`/`"reset"`, `name`/`value`, `form`). Só com ícone, informe `aria-label` (ou `title`). | `variante`, `carregando`, `disabled`, `type`, `aria-label`, `target-modal` | `ui-click` |
567
671
  | `<ui-campo-texto>` | Input de texto com Floating Label, validação e senha. | `label`, `value`, `tipo`, `obrigatorio`, `name` | `ui-input`, `ui-change` |
568
672
  | `<ui-lista-flutuante>` | Select/Dropdown com Bottom Sheet no mobile. | `itens`, `value`, `placeholder`, `name` | `ui-selecionar` |
569
673
  | `<ui-texto>` | Tipografia semântica (H1-H6, corpo, caption, código). | `variante`, `cor`, `peso` | - |
@@ -577,26 +681,52 @@ window.addEventListener('message', (event) => {
577
681
  | `<ui-switch>` | Chave de alternância liga/desliga física instantânea. | `ativo`, `name`, `value` | `ui-change` |
578
682
  | `<ui-segmented>` | Controle segmentado de opções (Pills/Tabs deslizantes). | `opcoes`, `value`, `name`, `tamanho` | `ui-change`, `ui-selecionar` |
579
683
  | `<ui-badge>` / `<ui-chip>` | Tags de status e chips com botão de remoção. | `variante`, `removivel`, `value` | `ui-remove` |
580
- | `<ui-avatar>` | Avatar com fotos, iniciais e status online. | `nome`, `foto`, `status`, `tamanho` | - |
684
+ | `<ui-avatar>` | Avatar com fotos, iniciais e status online. | `nome`, `src`, `status`, `tamanho` | - |
581
685
 
582
686
  ### 🟣 Camada 3: Contêineres, Overlays, Dados & GIS
583
687
  | Tag | Descrição | Principais Atributos / Props | Eventos Emitidos |
584
688
  | :--- | :--- | :--- | :--- |
585
689
  | `<ui-card>` | Cartão de conteúdo com slots nomeados e elevação. | `elevacao`, `clicavel` | `ui-click` |
586
- | `<ui-modal>` | Modal centralizado no PC e Bottom Sheet no Mobile. | `aberto`, `titulo`, `bottom-sheet` | `ui-abrir`, `ui-fechar` |
587
- | `<ui-drawer>` | Painel lateral deslizante (Sheet/Gaveta direita/esquerda). | `aberto`, `lado`, `titulo`, `largura` | `ui-abrir`, `ui-fechar` |
690
+ | `<ui-modal>` | Modal centralizado no PC e Bottom Sheet no Mobile. Abrir/fechar por `abrir()`/`fechar()` ou pelo atributo `aberto` tem o mesmo efeito (eventos, foco, `inert`). Foco inicial no `[autofocus]` ou no primeiro controle do conteúdo; ao fechar, volta ao gatilho. Modais empilhados: só o último aberto é interativo. | `aberto`, `titulo`, `bottom-sheet`, `bloquear-fechamento` (oculta o "✕" e ignora Esc/fundo) | `ui-abrir`, `ui-fechar` |
691
+ | `<ui-drawer>` | Painel lateral deslizante (Sheet/Gaveta direita/esquerda). | `aberto`, `posicao` (`direita`, `esquerda`, `baixo`, `cima`), `titulo`, `largura` | `ui-abrir`, `ui-fechar` |
588
692
  | `<ui-alerta>` | Banner de notificação contextual fixo. | `variante`, `titulo`, `fechavel` | `ui-fechar` |
589
693
  | `<ui-toast>` | Notificações flutuantes inteligentes com pilha flex. | `UIToast.notificar({ tipo, mensagem })` | - |
590
- | `<ui-tooltip>` | Dica contextual inteligente (Hover PC / Toque Mobile). | `texto`, `posicao`, `gatilho` | - |
694
+ | `<ui-tooltip>` | Dica contextual inteligente (Hover PC / Toque Mobile). O texto vira `aria-description` do gatilho (lido pelo leitor de tela, também repassado pelo `<ui-botao>`); **Esc** fecha sem mover o foco; o balão não some ao levar o ponteiro até ele. | `texto`, `posicao`, `gatilho` | - |
591
695
  | `<ui-skeleton>` | Placeholder de carregamento animado com pulsos. | `tipo`, `largura`, `altura`, `animado` | - |
592
- | `<ui-stat>` | Cartão KPI de estatísticas, métricas e tendências. | `rotulo`, `valor`, `variacao`, `tipo-variacao` | - |
593
- | `<ui-tabela>` | Tabela orientada a dados, virtualizada tipo Excel. | `colunas`, `dados`, `src`, `densidade` | `ui-sort`, `ui-column-resize` |
696
+ | `<ui-stat>` | Cartão KPI de estatísticas, métricas e tendências. | `rotulo`, `valor`, `variacao`, `tendencia` (`alta`, `baixa`, `neutro`) | - |
697
+ | `<ui-tabela>` | Tabela orientada a dados, virtualizada tipo Excel. **Teclado**: cabeçalhos ordenáveis são botões (Tab + Enter/Espaço, com `aria-sort`); nas linhas, ↑/↓, Home/End e PageUp/PageDown movem o foco e Enter/Espaço selecionam (`aria-current`). A seleção é mantida ao ordenar e filtrar. Nome acessível via `aria-label`. | `colunas`, `dados`, `src`, `densidade`, `aria-label` | `ui-sort`, `ui-column-resize`, `ui-linha-clique` |
594
698
  | `<ui-tabela-propriedades>` | Inspetor de propriedades técnicas padrão AutoCAD & Revit com cálculos matemáticos inline (+, -, *, /, ^, %), arraste de valor contínuo (scrubbing), splitter redimensionável e editores CAD. | `categorias`, `tipo-objeto`, `splitter-pos`, `modo-aplicar`, `filtro` | `ui-propriedade-alterada`, `ui-aplicar`, `ui-desfazer`, `ui-editar-tipo`, `ui-acao-clique`, `ui-quick-select`, `ui-calculadora` |
595
699
  | `<ui-ribbon>` | Barra de ferramentas em abas e grupos (estilo AutoCAD / Word / Excel): botões grandes e pequenos em colunas de 3, toggles, menus suspensos, abas contextuais, modo recolhido (duplo clique na aba) e navegação por teclado (roving tabindex). | `abas`, `aba-ativa`, `recolhido`, `compacto` | `ui-ferramenta`, `ui-aba-change` |
596
700
  | `<ui-paleta-ferramentas>` | Paleta de ferramentas (estilo Illustrator / Photoshop): seleção exclusiva, grupos com flyout (clique longo, botão direito ou seta), 1 ou 2 colunas, vertical/horizontal e atalhos de teclado que percorrem o grupo. | `ferramentas`, `valor`, `orientacao`, `colunas`, `tamanho`, `atalhos` | `ui-change`, `ui-selecionar`, `ui-ferramenta` |
597
701
  | `<ui-mapa>` | Mapa geográfico interativo com camadas OpenStreetMap. | `lat`, `lng`, `zoom`, `camadas` | - |
598
702
  | `<ui-camadas>` | Painel de camadas vetoriais CAD/GIS com hierarquia em árvore, barra de arraste vertical (`redimensionavel`), estabilidade de altura sem colapso, drag-and-drop, métricas geodésicas e persistência no LocalStorage. | `redimensionavel`, `altura`, `min-altura`, `max-altura`, `flutuante`, `colapsado`, `camada-ativa`, `persistir` | `ui-redimensionar-altura`, `ui-camada-selecionada`, `ui-camada-visibilidade`, `ui-camadas-reordenadas`, `ui-acao-massa` |
599
- | `<ui-canvas-cad>` | Mesa CAD/GIS para poligonais e vértices geodésicos. | `pontos`, `segmentos`, `fitBounds()` | `ui-ponto-selecionado` |
703
+ | `<ui-canvas-cad>` | Mesa CAD/GIS para poligonais, vértices geodésicos e **feições genéricas** (ponto, linha, polígono, círculo, texto) que você cria: seleção por clique e caixa, popup, edição de vértices, snap, 15 ferramentas de desenho/medição, oficial × prévia, cursores remotos e culling/clusters para 100 mil feições. Linha multiparte, feição `oculta`, selo de texto e contorno de ponto. Nenhuma camada vem pronta. Guia: [`docs/guia-migracao-mapengine.md`](docs/guia-migracao-mapengine.md). | `pontos`, `segmentos`, `ferramentas`, `sem-camadas-padrao`, `sem-painel-camadas`, `sem-barra-rapida`, `sem-atalho-snap`, `aceitar-origem`, `inicializarAgora()`, `definirFeicoes()`, `aplicarLote()`, `definirFerramenta()`, `editarVertices()`, `definirMargensHud()`, `definirEstilosExternos()`, `fitBounds()` | `ui-ponto-selecionado`, `cad-selecao`, `cad-feicao-selecionada`, `cad-feicao-criada`, `cad-feicao-atualizada`, `cad-feicao-hover`, `cad-feicao-menu`, `cad-snap`, `cad-previas` e outros (ver `docs/canvas-cad-eventos.md`) |
704
+
705
+ #### `<ui-canvas-cad>`: montar só com API pública (2.1)
706
+
707
+ ```html
708
+ <ui-canvas-cad id="mesa" sem-camadas-padrao sem-painel-camadas sem-barra-rapida sem-atalho-snap aceitar-origem></ui-canvas-cad>
709
+ ```
710
+ ```js
711
+ const mapa = mesa.inicializarAgora(); // L.Map síncrono (idempotente; nunca cria um 2º mapa)
712
+ mesa.definirEstilosExternos([...document.styleSheets]); // CSS do app dentro do shadow root (string ou folhas)
713
+ mesa.definirMargensHud({ base: 56, direita: 320 }); // HUDs de desenho/edição fora de barras e painéis
714
+ mesa.aplicarLote('glebas', { adicionar, atualizar, remover }); // uma regravação, ordem preservada
715
+ mesa.atualizarFeicao('glebas', 'g1', { propriedades }, { substituirPropriedades: true });
716
+ mesa.definirOpcoesPopup({ copiarParaAreaDeTransferencia: false });
717
+ ```
718
+
719
+ - Camadas de fábrica (satélite, SIGEF, homologados, perímetro, vizinhos, vértices, grade) só somem com `sem-camadas-padrao`; sem
720
+ o atributo continuam como sempre.
721
+ - `Feicao.oculta` (não desenha nem seleciona, mas existe) ≠ `Feicao.excluida`. Linha multiparte: `geometria.partes`.
722
+ - Tudo, com exemplos: [`docs/guia-migracao-mapengine.md`](docs/guia-migracao-mapengine.md) · eventos e ordem das ferramentas:
723
+ [`docs/canvas-cad-eventos.md`](docs/canvas-cad-eventos.md) · números de desempenho: [`docs/desempenho-feicoes.md`](docs/desempenho-feicoes.md).
724
+
725
+
726
+ ---
727
+
728
+ ### Custom Elements Manifest
729
+ O pacote publica `custom-elements.json` (campo `customElements` do `package.json`), o formato padrão que IDEs, Storybook e geradores de documentação leem para listar tags, atributos, propriedades, eventos e `::part` de cada componente. Ele é gerado no `npm run build` pelo [`@custom-elements-manifest/analyzer`](https://custom-elements-manifest.open-wc.org/), e os tipos React/Vue são derivados dele — por isso nunca ficam desatualizados em relação ao código.
600
730
 
601
731
  ---
602
732
 
@@ -622,3 +752,9 @@ window.addEventListener('message', (event) => {
622
752
  * `dist/index.cjs` e `dist/<modulo>.cjs` (CommonJS para `require`)
623
753
  * `dist/*.d.ts` (Tipagens TypeScript)
624
754
  * `dist/ui-kit.css` (Design Tokens compilados, 100% autocontido — o build falha se restar qualquer `@import`)
755
+ * `dist/custom-elements.json` (Custom Elements Manifest) e `dist/tipos-react.d.ts`, `dist/tipos-vue.d.ts`, `dist/tipos-elementos.d.ts`
756
+
757
+ 4. **Verificar os tipos gerados** (depois do build):
758
+ ```bash
759
+ npm run test:tipos
760
+ ```
package/dist/botao.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */const o=require("./ui-botao-DF1yuUUD.cjs");exports.UIBotao=o.UIBotao;exports.UIBotaoPrimario=o.UIBotaoPrimario;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */const o=require("./ui-botao-psS1juof.cjs");exports.UIBotao=o.UIBotao;exports.UIBotaoPrimario=o.UIBotaoPrimario;
package/dist/botao.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { U as t, a as i } from "./ui-botao-BShEouvi.js";
2
+ import { U as t, a as i } from "./ui-botao-OGJV6Vfk.js";
3
3
  export {
4
4
  t as UIBotao,
5
5
  i as UIBotaoPrimario