@thibezer/ui-components-kit 2.8.0 → 2.8.2

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 (183) hide show
  1. package/CHANGELOG.md +203 -265
  2. package/README.md +791 -815
  3. package/dist/botao.cjs +1 -1
  4. package/dist/botao.js +1 -1
  5. package/dist/camadas.cjs +94 -94
  6. package/dist/camadas.js +1124 -1218
  7. package/dist/campo-texto.cjs +1 -1
  8. package/dist/campo-texto.js +1 -1
  9. package/dist/canvas.cjs +65 -66
  10. package/dist/canvas.js +3444 -3795
  11. package/dist/card.cjs +1 -1
  12. package/dist/card.js +1 -1
  13. package/dist/components/ui-avatar/ui-avatar.d.ts +0 -11
  14. package/dist/components/ui-badge/ui-badge.d.ts +0 -2
  15. package/dist/components/ui-barra-ferramentas/ferramentas-comum.d.ts +22 -1
  16. package/dist/components/ui-barra-ferramentas/tipos.d.ts +31 -0
  17. package/dist/components/ui-barra-ferramentas/ui-paleta-ferramentas.d.ts +17 -1
  18. package/dist/components/ui-barra-ferramentas/ui-ribbon.d.ts +17 -0
  19. package/dist/components/ui-camadas/camadas-arraste-controles.d.ts +0 -2
  20. package/dist/components/ui-camadas/camadas-arvore-renderer.d.ts +11 -4
  21. package/dist/components/ui-camadas/camadas-drag-drop.d.ts +1 -13
  22. package/dist/components/ui-camadas/ui-camadas.d.ts +5 -3
  23. package/dist/components/ui-canvas-cad/cad-atributos-sync.d.ts +1 -2
  24. package/dist/components/ui-canvas-cad/cad-broadcast.d.ts +1 -1
  25. package/dist/components/ui-canvas-cad/cad-eventos-canvas.d.ts +8 -3
  26. package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +106 -26
  27. package/dist/components/ui-canvas-cad/cad-inicializador.d.ts +1 -3
  28. package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +1 -4
  29. package/dist/components/ui-checkbox/ui-checkbox.d.ts +1 -4
  30. package/dist/components/ui-cores/tipos.d.ts +0 -2
  31. package/dist/components/ui-cores/ui-controle-cores.d.ts +3 -8
  32. package/dist/components/ui-cores/ui-seletor-cor.d.ts +1 -3
  33. package/dist/components/ui-mapa/ui-mapa-linha.d.ts +5 -12
  34. package/dist/components/ui-mapa/ui-mapa-marcador.d.ts +6 -15
  35. package/dist/components/ui-mapa/ui-mapa.d.ts +1 -14
  36. package/dist/components/ui-modal/modal-acessibilidade.d.ts +5 -5
  37. package/dist/components/ui-modal/ui-modal.d.ts +11 -1
  38. package/dist/components/ui-radio/radio-grupo-registry.d.ts +0 -10
  39. package/dist/components/ui-radio/ui-radio.d.ts +2 -9
  40. package/dist/components/ui-skeleton/ui-skeleton.d.ts +0 -9
  41. package/dist/components/ui-switch/ui-switch.d.ts +1 -3
  42. package/dist/components/ui-tabela/ui-tabela.d.ts +19 -1
  43. package/dist/components/ui-tooltip/ui-tooltip.d.ts +1 -24
  44. package/dist/core/index.d.ts +0 -1
  45. package/dist/core.cjs +1 -1
  46. package/dist/core.js +18 -28
  47. package/dist/cores.cjs +1 -1
  48. package/dist/cores.js +1 -1
  49. package/dist/custom-elements.json +18859 -23721
  50. package/dist/data.cjs +1 -1
  51. package/dist/data.js +2 -2
  52. package/dist/feedback.cjs +1 -1
  53. package/dist/feedback.js +2 -2
  54. package/dist/form-validacao-BIOXxt-1.js +140 -0
  55. package/dist/form-validacao-ytRYSF3E.cjs +1 -0
  56. package/dist/forms.cjs +1 -1
  57. package/dist/forms.js +2 -2
  58. package/dist/gerencigeo-canvas/feature_metricas.d.ts +9 -0
  59. package/dist/index.cjs +1 -1
  60. package/dist/index.d.ts +0 -3
  61. package/dist/index.js +178 -179
  62. package/dist/mapa.cjs +16 -11
  63. package/dist/mapa.js +170 -242
  64. package/dist/modal.cjs +1 -1
  65. package/dist/modal.js +1 -1
  66. package/dist/register.cjs +1 -1
  67. package/dist/register.js +11 -11
  68. package/dist/svg-seguro-ChVJ2L2z.js +74 -0
  69. package/dist/svg-seguro-J2RM1Ssf.cjs +1 -0
  70. package/dist/tabela.cjs +1 -1
  71. package/dist/tabela.js +1 -1
  72. package/dist/tipos-elementos.d.ts +17 -35
  73. package/dist/tipos-react.d.ts +0 -2
  74. package/dist/tipos-vue.d.ts +12 -34
  75. package/dist/tools.cjs +1 -1
  76. package/dist/tools.js +1 -1
  77. package/dist/ui-badge-BxT-sDmV.cjs +28 -0
  78. package/dist/ui-badge-C0eKBI8E.js +183 -0
  79. package/dist/ui-botao-BOOnP8ds.cjs +12 -0
  80. package/dist/ui-botao-DfqSivHl.js +165 -0
  81. package/dist/ui-botao-OGJV6Vfk.js +165 -0
  82. package/dist/ui-botao-psS1juof.cjs +12 -0
  83. package/dist/ui-campo-texto-Cnn2UAkS.cjs +16 -0
  84. package/dist/{ui-campo-texto-B_OHVGiN.js → ui-campo-texto-Uu2dJE_0.js} +51 -51
  85. package/dist/ui-card-B86lJXTP.cjs +20 -0
  86. package/dist/{ui-card-BNYCQ7g-.js → ui-card-C_o5_0cB.js} +42 -50
  87. package/dist/ui-controle-cores-BS0WYPdi.js +572 -0
  88. package/dist/ui-controle-cores-Er6ZcQ7U.cjs +111 -0
  89. package/dist/ui-kit.css +1 -1
  90. package/dist/ui-modal-CvGFGh1h.cjs +18 -0
  91. package/dist/{ui-modal-BkYvNP0G.js → ui-modal-DBOtSTbR.js} +140 -116
  92. package/dist/ui-paleta-ferramentas-CEZYcN4J.js +624 -0
  93. package/dist/ui-paleta-ferramentas-CU4icLl0.js +1171 -0
  94. package/dist/{ui-paleta-ferramentas-bDLPbiGA.cjs → ui-paleta-ferramentas-Ccmo-rB5.cjs} +7 -7
  95. package/dist/ui-paleta-ferramentas-DLwZHIDv.cjs +21 -0
  96. package/dist/{ui-paleta-ferramentas-Ksh6gMW3.js → ui-paleta-ferramentas-DNN5i6nL.js} +329 -359
  97. package/dist/ui-paleta-ferramentas-Dbj1kBS9.cjs +18 -0
  98. package/dist/ui-paleta-ferramentas-DbwdWVtT.js +1173 -0
  99. package/dist/ui-paleta-ferramentas-bvqxj1Yd.cjs +21 -0
  100. package/dist/ui-segmented-D6b6zxVs.cjs +19 -0
  101. package/dist/ui-segmented-DyF5YLsV.js +418 -0
  102. package/dist/ui-segmented-rn9RxRGM.cjs +19 -0
  103. package/dist/{ui-linha-nCDh2wPm.js → ui-segmented-wUraId2e.js} +105 -200
  104. package/dist/ui-skeleton-DI4_9WOX.js +428 -0
  105. package/dist/{ui-skeleton-DiOxTBZK.cjs → ui-skeleton-SPYqku8P.cjs} +10 -10
  106. package/dist/{ui-skeleton-B2Rgrv8o.js → ui-skeleton-W9uwIceA.js} +191 -254
  107. package/dist/ui-skeleton-elhKIh2B.cjs +33 -0
  108. package/dist/{ui-switch-DO1R0Ce7.js → ui-switch-BcOqOkiV.js} +128 -187
  109. package/dist/ui-switch-D7iPKDj-.cjs +53 -0
  110. package/dist/ui-tabela-propriedades-BBr5sqki.cjs +145 -0
  111. package/dist/{ui-tabela-propriedades-DzZlyNZ_.cjs → ui-tabela-propriedades-BecPqC-e.cjs} +10 -10
  112. package/dist/{ui-tabela-propriedades-D9Echt2X.js → ui-tabela-propriedades-BokvDD3b.js} +826 -845
  113. package/dist/ui-tabela-propriedades-Boy7I5yW.js +2412 -0
  114. package/dist/ui-tabela-propriedades-C-PeuW1i.cjs +141 -0
  115. package/dist/ui-tabela-propriedades-Df9ajC6M.js +2648 -0
  116. package/dist/ui-toast-Bp_NlM5G.js +156 -0
  117. package/dist/ui-toast-DGTZKne5.cjs +20 -0
  118. package/dist/zero-js-triggers-C_KrvFOQ.js +244 -0
  119. package/dist/zero-js-triggers-C_gtaojZ.cjs +1 -0
  120. package/package.json +3 -3
  121. package/dist/acessibilidade-CSzX-DkG.cjs +0 -1
  122. package/dist/acessibilidade-CUlSXc2X.js +0 -38
  123. package/dist/altura-controle-ukMRPckR.cjs +0 -1
  124. package/dist/altura-controle-vxQiXG4q.js +0 -62
  125. package/dist/components/ui-barra-ferramentas/paleta-atalhos.d.ts +0 -16
  126. package/dist/components/ui-barra-ferramentas/paleta-pressao-longa.d.ts +0 -24
  127. package/dist/components/ui-barra-ferramentas/ribbon-render.d.ts +0 -14
  128. package/dist/components/ui-barra-ferramentas/ribbon-teclado.d.ts +0 -17
  129. package/dist/components/ui-camadas/camadas-colecao.d.ts +0 -27
  130. package/dist/components/ui-camadas/camadas-drop-ops.d.ts +0 -31
  131. package/dist/components/ui-camadas/camadas-hierarquia.d.ts +0 -10
  132. package/dist/components/ui-camadas/camadas-lembranca.d.ts +0 -34
  133. package/dist/components/ui-camadas/camadas-render.d.ts +0 -14
  134. package/dist/components/ui-camadas/camadas-renomear.d.ts +0 -12
  135. package/dist/components/ui-camadas/camadas-selecao-api.d.ts +0 -17
  136. package/dist/components/ui-camadas/camadas-thumb.d.ts +0 -1
  137. package/dist/components/ui-canvas-cad/cad-acessibilidade.d.ts +0 -15
  138. package/dist/components/ui-canvas-cad/cad-evento-coordenadas.d.ts +0 -22
  139. package/dist/components/ui-canvas-cad/cad-feicoes-camera.d.ts +0 -26
  140. package/dist/components/ui-canvas-cad/cad-feicoes-consulta.d.ts +0 -21
  141. package/dist/components/ui-canvas-cad/cad-feicoes-dados.d.ts +0 -39
  142. package/dist/components/ui-canvas-cad/cad-feicoes-desenho.d.ts +0 -68
  143. package/dist/components/ui-canvas-cad/cad-feicoes-edicao.d.ts +0 -37
  144. package/dist/components/ui-canvas-cad/cad-feicoes-operacoes.d.ts +0 -48
  145. package/dist/components/ui-canvas-cad/cad-feicoes-ponteiro.d.ts +0 -24
  146. package/dist/components/ui-canvas-cad/cad-feicoes-selecao-regiao.d.ts +0 -22
  147. package/dist/components/ui-canvas-cad/cad-feicoes-tipos.d.ts +0 -53
  148. package/dist/components/ui-canvas-cad/cad-feicoes-versoes.d.ts +0 -33
  149. package/dist/components/ui-canvas-cad/cad-leaflet-adaptador.d.ts +0 -5
  150. package/dist/components/ui-canvas-cad/cad-selecao-pontos.d.ts +0 -5
  151. package/dist/components/ui-canvas-cad/tipos.d.ts +0 -37
  152. package/dist/components/ui-linha/index.d.ts +0 -1
  153. package/dist/components/ui-linha/ui-linha.d.ts +0 -48
  154. package/dist/components/ui-mapa/mapa-atributos.d.ts +0 -14
  155. package/dist/components/ui-mapa/mapa-basemaps.d.ts +0 -7
  156. package/dist/components/ui-mapa/mapa-icones.d.ts +0 -4
  157. package/dist/components/ui-mapa/mapa-leaflet.d.ts +0 -5
  158. package/dist/components/ui-mapa/mapa-vinculo-pai.d.ts +0 -22
  159. package/dist/components/ui-mapa/tipos.d.ts +0 -13
  160. package/dist/components/ui-modal/modal-foco.d.ts +0 -28
  161. package/dist/components/ui-tabela/tabela-estados.d.ts +0 -16
  162. package/dist/components/ui-tabela/tabela-rolagem.d.ts +0 -44
  163. package/dist/components/ui-tabela/tabela-teclado.d.ts +0 -16
  164. package/dist/components/ui-tooltip/tooltip-popover.d.ts +0 -7
  165. package/dist/components/ui-tooltip/tooltip-posicionamento.d.ts +0 -29
  166. package/dist/core/altura-controle.d.ts +0 -34
  167. package/dist/core/opcoes.d.ts +0 -9
  168. package/dist/core/rotulo-controle.d.ts +0 -13
  169. package/dist/form-validacao-BlQFxUVj.js +0 -104
  170. package/dist/form-validacao-DIeyQVH5.cjs +0 -1
  171. package/dist/opcoes-CJYLi6kd.js +0 -12
  172. package/dist/opcoes-CkyDxBuQ.cjs +0 -1
  173. package/dist/ui-badge-BWhoGgo9.js +0 -197
  174. package/dist/ui-badge-SIR81R9l.cjs +0 -28
  175. package/dist/ui-botao-D24oXySA.cjs +0 -12
  176. package/dist/ui-botao-Dsj08jjw.js +0 -165
  177. package/dist/ui-campo-texto-DauJCde3.cjs +0 -16
  178. package/dist/ui-card-BrjBL-yo.cjs +0 -20
  179. package/dist/ui-controle-cores-DgEza3wF.js +0 -612
  180. package/dist/ui-controle-cores-uY__TgwW.cjs +0 -117
  181. package/dist/ui-linha-C6HBnsaw.cjs +0 -19
  182. package/dist/ui-modal-CUNbpbZ1.cjs +0 -18
  183. package/dist/ui-switch-D9a8XlVX.cjs +0 -53
package/CHANGELOG.md CHANGED
@@ -1,265 +1,203 @@
1
- # Changelog
2
-
3
- ## 2.8.0 — 2026-10-17
4
-
5
- ### Controles na mesma linha: altura única e `<ui-linha>`
6
-
7
- - **Novo `<ui-linha>`** (L3): contêiner que alinha botão, campo, lista, segmented e badge na mesma linha. `tamanho`/`densidade` (`sm|md|lg`), `altura`, `alinhar`, `justificar`, `espaco`, `sem-quebra`, `inline`; filhos ganham largura natural (botão e campo deixam de ocupar 100%), campos e listas ocupam o espaço restante e qualquer filho aceita `expandir`.
8
- - **`tamanho`, `densidade` e `altura` agora funcionam** em `ui-botao`, `ui-campo-texto`, `ui-lista-flutuante` e `ui-segmented` (o README já os documentava, mas só `altura` tinha efeito). Lógica única em `src/core/altura-controle.ts` (exportada em `core`): entrada hostil é descartada, `altura` é limitada a 15–200px.
9
- - **`ui-segmented` segue `--ui-campo-altura`** (antes tinha alturas fixas de 28/36/42px, o que o desalinhava do botão e do campo). O host passou a `inline-flex` com `vertical-align: middle`. `tamanho` inválido não vira mais classe CSS arbitrária (cai em `md`).
10
- - **Escala de tokens** `--ui-altura-sm|md|lg` (26/34/42px). **Mudança de comportamento:** a altura padrão dos controles passou de 15px para `--ui-altura-md` (34px), o valor que o README já descrevia como padrão. Quem quiser o antigo define `--ui-campo-altura: 15px`.
11
- - **`ui-badge[controle]`** assume a altura dos controles (e o alvo de toque mínimo no mobile).
12
- - Hosts `inline` de botão, campo e lista ganharam `vertical-align: middle`.
13
- - Teste de contrato `tests/contrato-linha.test.ts` + regressões; guia em `docs/layout-linha.md`.
14
-
15
- ## 2.7.0 — 2026-10-17
16
-
17
- ### `UIBus`: independente do componente de toast
18
-
19
- - `src/core/ui-bus.ts` (L1) deixou de importar `ui-alerta` (L3). Novo `UIBus.registrarProvedorToast(fn | null)`; o `ui-toast` se registra sozinho ao ser carregado (`registrarToastNoBus()`).
20
- - **Mudança de comportamento:** quem importar apenas `core/ui-bus` sem carregar `ui-alerta` (ou o pacote principal) passa a ter `UIBus.notificar()` como no-op, sem erro. Exceções do provedor são capturadas (`console.error`).
21
- - Contratos `UIToastOpcoes`/`UIToastAcao` movidos para `src/core/tipos-toast.ts` e reexportados por `ui-alerta` (nomes públicos inalterados).
22
-
23
- ### `<ui-ribbon>`, `<ui-paleta-ferramentas>` e `<ui-tabela>`: organização interna
24
-
25
- - **Sem mudança de comportamento nem de API.** Teclado, renderização, clique longo, atalhos, rolagem de linhas e estados (erro, anúncio do filtro, aria) passam a viver em módulos próprios com testes unitários.
26
-
27
- ### Componentes simples e de formulário: robustez e acessibilidade
28
-
29
- - **`<ui-skeleton>`:** `linhas` é limitado a 100 (um valor enorme derrubava a página). Decorativo por padrão (`aria-hidden`); com `aria-label` vira `role="status"`.
30
- - **Classes por atributo:** `variante`, `cor`, `peso`, `alinhamento` (`ui-texto`), `elevacao` (`ui-stat`, `ui-card`), `variante`/`estilo` (`ui-badge`) só aceitam valores conhecidos; qualquer outro usa o padrão (antes, o texto virava classes CSS arbitrárias).
31
- - **`<ui-avatar>`:** host com `role="img"` e `aria-label` (nome, e o status quando houver) ou `aria-hidden` sem nome; **a imagem interna agora tem `alt=""`** (antes `alt` = nome ou "Avatar"). `aria-label`/`aria-hidden` do consumidor são respeitados. Tamanho numérico aceito entre 8 e 512 px.
32
- - **`<ui-stat>`:** grupo rotulado e indicador de variação como imagem nomeada. **`<ui-card clicavel>`:** `role="button"`, `aria-disabled`. **`<ui-badge>`:** `disabled` desativa o ✕; nome acessível "Remover …".
33
- - **`<ui-radio>`:** o grupo agora acompanha `setAttribute('name')` depois de conectado, mudança de nome e remoção do formulário; o primeiro radio habilitado entra na ordem de Tab.
34
- - **`<ui-checkbox>`, `<ui-switch>`, `<ui-radio>`:** `focus()` no host foca o controle; checkbox e radio passam a respeitar `<label for>`, `<label>` envolvente e `aria-label` (como o switch).
35
-
36
- ### `<ui-tooltip>` e `<ui-modal>`: correções de comportamento
37
-
38
- - **`<ui-tooltip>`:** o clique no gatilho deixa de ser interrompido (`stopPropagation`) e volta a chegar aos ouvintes de ancestrais; `disabled` fecha o balão aberto (e `aberto` + `disabled` não o mostra); ambientes sem `matchMedia` não lançam; o quadro de animação do posicionamento é cancelado ao fechar/desconectar.
39
- - **`<ui-modal>`:** `Shift+Tab` no botão de fechar agora leva ao último controle do conteúdo (antes o foco escapava do modal); `Tab` no último controle volta ao primeiro. O foco real é lido atravessando Shadow DOMs.
40
- - Ouvintes globais de ambos passam a ser gerenciados por `ListenerBag`. Sem mudança de API.
41
-
42
- ### `<ui-camadas>`: arrastos interrompidos e organização interna
43
-
44
- - Desconectar o painel durante a pintura de controles (olho, cadeado, seleção) deixava `user-select: none` no `body` da página e ouvintes em `window`; o gesto agora é cancelado. O mesmo vale para o arraste por toque de camadas.
45
- - Dados com ciclo de `parentId` não travam mais a verificação de descendência ao aninhar camadas por arraste.
46
- - **Sem mudança de API.** Código dividido em módulos de responsabilidade única (renderização, seleção, lembrança, coleções, regras de soltar, renomear, miniaturas e hierarquia).
47
-
48
- ### `<ui-mapa>`, `<ui-mapa-marcador>` e `<ui-mapa-linha>`: robustez e acessibilidade
49
-
50
- - **Segurança:** `cor` do `<ui-mapa-marcador>` era interpolada em HTML/estilo do ícone (injeção de atributo). O ícone agora é montado com DOM e `cor` só aceita hex, `rgb()`/`hsl()` ou nome de cor; outro valor usa a cor padrão (`#00f5a0`; `#3388ff` na linha).
51
- - `lat`, `lng` e `zoom` inválidos (ou fora de -90..90, -180..180, 0..22) caem no padrão em vez de lançar; `espessura` inválida usa 3.
52
- - Desconectar o `<ui-mapa>` antes de o Leaflet carregar não cria mais um mapa órfão. `<ui-mapa-linha>` reaparece quando o mapa é recriado e ignora pares inválidos em `pontos`.
53
- - **Acessibilidade:** o mapa é uma região com nome (`aria-label` do host, padrão "Mapa"; o atributo passa a ser observado); marcadores são focáveis por teclado (`role=button`) e usam `titulo` como nome acessível.
54
-
55
- ### `<ui-canvas-cad>`: organização interna e acessibilidade
56
-
57
- - **Sem mudança de API.** `GerenciadorFeicoes` virou fachada sobre módulos de responsabilidade única (`cad-feicoes-dados`, `-operacoes`, `-versoes`, `-camera`, `-desenho`, `-edicao`, `-consulta`, `-ponteiro`, `-selecao-regiao`, `-tipos`); tipos do Leaflet em `tipos.ts`, `cad-leaflet-adaptador.ts` e `cad-selecao-pontos.ts` substituem casts `as any`.
58
- - **Acessibilidade:** o canvas é uma região nomeada ("Mapa CAD"), a barra rápida é uma `toolbar` com botões nomeados, o botão de snap expõe `aria-pressed` e uma região viva anuncia a seleção ("2 feições selecionadas") e a ferramenta ativa.
59
-
60
- ### Ferramentas de arquitetura
61
-
62
- - `scripts/check-layers.mjs` verifica o DAG L0→L5 resolvendo imports (estáticos, de efeito colateral, re-exports e dinâmicos); `npm run gate` / `gate:full` agrupam as verificações.
63
-
64
- ## 2.6.1 — 2026-10-17
65
-
66
- ### `<ui-controle-cores>` e `<ui-seletor-cor>`: revisão de erros e visual
67
-
68
- **Correções**
69
-
70
- - O botão "sem cor" ficava por cima da amostra do traço e roubava os cliques da metade inferior esquerda dela. As ações (inverter, sem cor, restaurar padrão) agora ficam numa coluna ao lado das amostras, cada uma com a própria área de clique, sem sobreposição.
71
- - `desabilitado` agora desativa todos os botões (antes só bloqueava o mouse: Tab + Enter ainda inverter/limpar/restaurar) e fecha um seletor aberto; remover o atributo reativa o controle.
72
- - Trocar o alvo pelo controle (`alternarAlvo()`, `definirAlvo()`, clique na outra amostra) agora acompanha a aba do seletor aberto, em vez de deixá-las divergentes.
73
- - `fecharSeletor(false)` agora cancela de verdade: as cores iniciais voltam (com um `ui-cores-change` não confirmado) em vez de ficar a pré-visualização aplicada sem nenhuma confirmação.
74
- - `ui-alvo-change` não é mais emitido em duplicidade no documento (o painel do seletor deixou de repassá-lo ao abrir pelo popover; use `aoTrocarAlvo`).
75
- - Espaço/Enter na amostra ativa com o seletor aberto fecham como o clique, e o Espaço não fecha mais o painel recém-aberto em navegadores que disparam o clique ao soltar a tecla.
76
-
77
- **Acessibilidade**
78
-
79
- - `abrirSeletorCor({ focar: true })` leva o foco ao painel (o controle usa ao abrir por teclado); ao fechar, o foco volta para a âncora. O painel ganha `aria-label` e as amostras da paleta `aria-pressed`.
80
- - O grupo de amostras é anunciado como "Cores de desenho"; a dica/`aria-label` do preenchimento informa a opacidade.
81
-
82
- **Visual**
83
-
84
- - Amostras maiores (`--ui-controle-cores-amostra`, padrão 26px), coluna de ações alinhada, ícone "padrão" refeito e anel de foco visível.
85
- - Ambos os componentes passam a usar os tokens do kit (`--ui-cor-texto`, `--ui-cor-borda`, `--ui-cor-primaria`…) e acompanham o tema claro; antes eram fixos no escuro.
86
- - Seletor: trilha da opacidade preenchida até o valor, rótulos ORIGINAL/NOVA sempre legíveis, diagonal de "sem cor" igual à do controle, aba de preenchimento "sem cor" com a diagonal vermelha, `prefers-reduced-motion` respeitado e painel reposicionado ao redimensionar a janela.
87
-
88
- ## 2.6.0 — 2026-10-17
89
-
90
- ### `<ui-ribbon>` e `<ui-paleta-ferramentas>`: contrato com o consumidor
91
-
92
- - **Valor inicial pendente**: `aba-ativa` / `valor` definidos antes de `abas` / `ferramentas` são aplicados quando os dados chegam; `aba-ativa` reflete a aba realmente ativa.
93
- - **`valor = ''` / `limpar()`** removem a seleção da paleta (`ui-change` com `item: null`). Novas propriedades `orientacao`, `colunas`, `tamanho` (paleta) e `compacto` (ribbon); `valor` reflete no atributo usado (`valor` ou `value`).
94
- - **Eventos**: `ui-ferramenta` agora é cancelável (`preventDefault()` reverte toggle/seleção); `definirAbaVisivel` emite `ui-aba-change` quando a aba ativa muda; novo `ui-recolhido-change`; tipos dos eventos no `HTMLElementEventMap` (`FerramentaDetail`, `AbaChangeDetail`, `PaletaChangeDetail`, `RecolhidoChangeDetail`).
95
- - **Foco e roving tabindex**: re-renderizações preservam o foco; o tabindex acompanha o botão focado; `atualizarItem` não recria o DOM para mudanças de estado (paleta) nem para itens de outra aba (ribbon).
96
- - **Menu/flyout**: `menuitemcheckbox`/`menuitemradio` com `aria-checked`, `aria-controls`, foco devolvido ao botão, fecha ao rolar, `ArrowDown` com menu aberto foca o primeiro item.
97
- - **ARIA**: abas/painel ligados (`aria-controls`/`aria-labelledby`), `aria-label` e `rotulo-abas` configuráveis, `FerramentaItem.rotuloAcessivel`, `aria-keyshortcuts`; o nome acessível não cai mais no `id` quando há `rotulo` ou ícone nomeado.
98
- - **Paleta**: grupo pula filho desabilitado/separador; clique longo cancelado ao arrastar; `suprimirClique` não prende mais o clique seguinte; atalhos ignoram `role=textbox` e `aria-modal`.
99
- - `console.warn` para ids duplicados, `ativar()`/`atualizarItem()`/`selecionarAba()` com id inválido.
100
-
101
- ## 2.5.0
102
-
103
- ### `<ui-tabela>`: robustez, modo remoto e ordenação
104
-
105
- - **Render protegido**: exceção em `coluna.render` deixa só a célula vazia (com `console.error`); o scroll virtual não trava mais após um erro de render.
106
- - **Modo remoto**: `fetchOpcoes` (headers, credentials...), `fetcher` (substitui o `fetch`), `carregarDoEndpoint()`/`recarregar()` resolvem `true`/`false` (antes `void`; nunca rejeitam) e `carregarDoEndpoint(url)` passa a guardar a URL como `src`. `ui-fetch-erro` ganha `origem` (`rede`, `http`, `json`, `render`) e `status`. Novo evento `ui-fetch-cancelado`. Abortar (desconexão ou nova requisição) libera `carregando`; mesma URL em andamento é reaproveitada (sem requisição duplicada ao registrar o elemento depois do HTML).
107
- - **Ordenação**: `ui-sort` agora é cancelável (`preventDefault()` desfaz); atributo/propriedade `ordenacao-remota` para ordenar no servidor. `TabelaColuna.tipo` (`numero`, `data`, `booleano`, `texto`) e `TabelaColuna.comparador`. `Date`, `dd/mm/aaaa` (com `tipo: 'data'`) e booleanos ordenam pelo valor; `Intl.Collator` reutilizado; **nulos ficam sempre no fim** (antes iam para o início em `desc`).
108
- - **Filtro**: ignora acentos; datas entram na busca; `TabelaColuna.textoFiltro` torna pesquisável o texto formatado por `render`; filtra antes de ordenar (mais rápido).
109
- - **Dados do consumidor**: `colunas` é copiado (redimensionar não altera nem falha com objetos congelados/reativos/compartilhados; `tabela.colunas` devolve a cópia interna); entradas `null`/`undefined` em `dados` são descartadas.
110
- - **Seleção**: `id` nulo não marca várias linhas; a identidade do objeto tem prioridade sobre a chave; novo `ui-selecao-atualizada` quando os dados recarregados trazem outro objeto do mesmo registro.
111
- - **Cliques**: botões dentro do shadow DOM de custom elements na célula não selecionam a linha (`composedPath`).
112
- - **Redimensionamento**: clique na alça sem arrastar não emite `ui-column-resize` (antes `"undefined"`); desconectar durante o arraste não bloqueia mais a ordenação; o popover só emite se a largura mudou.
113
- - Eventos do `<ui-tabela>` documentados no README.
114
-
115
- ### `<ui-tabela>`: estética, usabilidade e acessibilidade
116
-
117
- - **Cabeçalho**: sem as larguras fixas de 90px/70px; o vão texto-seta vem de `--ui-tabela-th-gap` (6px) e a seta de `--ui-tabela-th-icone` (16px). Só colunas ordenáveis têm ícone (dois chevrons, o ativo em destaque); `aria-sort="none"` nas ordenáveis inativas. O `sticky` ficou só nos `<th>`.
118
- - **Tokens**: `--ui-tabela-zebra`, `--ui-tabela-hover`, `--ui-tabela-selecionada(-hover)`, `--ui-tabela-cor-foco`. Zebrado visível nos dois temas; texto do botão "Aplicar" usa `--ui-cor-texto-sobre-primaria`. `tabular-nums` e `--ui-fonte-base`.
119
- - **Estados**: erro de carregamento visível (`part="erro"`, `role="alert"`, "Tentar novamente"; atributo `texto-erro`); overlay de carregamento com a cor do tema, `role="status"` e `texto-carregando`; vazio mantém o cabeçalho e o filtro sem resultado usa `texto-sem-resultados` (também anunciado a leitores de tela).
120
- - **Linhas**: `cursor: pointer`, hover só com `(hover: hover)`, foco de teclado (cor do texto) distinto da seleção (primária), texto das células não é selecionado ao clicar (opt-in: `selecionar-texto`).
121
- - **ARIA**: `role="grid"`, `aria-rowcount/colcount`, `aria-rowindex`, `aria-selected` (mantém `aria-current`), espaçadores `aria-hidden`, contêiner `role="region"` com o `aria-label`.
122
- - **Redimensionamento**: toque/caneta (Pointer Events), traço visível em repouso, alça focável (`role="separator"`; ←/→ ajustam, Shift = passo maior, Enter abre o diálogo) e clique na alça não ordena. Diálogo de largura com rótulo, campo numérico, validação inline, posição dentro da janela e retorno do foco.
123
- - `prefers-reduced-motion` (sem transições; spinner lento) e alvos de toque maiores com `pointer: coarse`. Removido o CSS morto do menu de contexto.
124
-
125
- ## 2.3.0 — 2026-10-14
126
-
127
- ### Novos: `<ui-controle-cores>` e `<ui-seletor-cor>` (entrada `@thibezer/ui-components-kit/cores`)
128
-
129
- - **`<ui-controle-cores>`**: par de cores de desenho no estilo Illustrator. Preenchimento na frente, traço atrás; clique na amostra de trás a ativa, clique no alvo ativo (ou duplo clique, Enter, Espaço) abre o seletor. Botões de canto para inverter, "sem cor" no alvo ativo e restaurar o padrão (`padrao-preenchimento`/`padrao-traco`). Estado misto (`definirMisto()`, mostra `?`) e `so-traco` (esmaece o preenchimento).
130
- - Ações do usuário emitem `ui-cores-change` com `{ preenchimento, traco, opacidade, alvo, confirmado, alterados, origem }` (`origem`: `seletor`, `inverter`, `sem-cor` ou `padrao`): `confirmado: false` é pré-visualização com o seletor aberto; na confirmação, `alterados` lista o que mudou desde a abertura. `definirCores()`, `definirAlvo()` e `definirMisto()` não emitem eventos.
131
- - O kit não registra atalhos de teclado: a aplicação chama `alternarAlvo()`, `inverter()`, `semCor()` e `restaurarPadrao()` e pode mostrar as teclas nas dicas com `atalhos`.
132
- - **`<ui-seletor-cor>`** + **`abrirSeletorCor({ ancora, ... })`**: painel flutuante com abas Preenchimento/Traço (modo `duplo`) ou cor única (`simples`), prévia antes × depois, hexadecimal, seletor do sistema, opacidade do preenchimento, cores do projeto, paleta padrão e "sem cor". Um aberto por vez; Concluir, ✕, Enter no hexadecimal, Esc e clique fora confirmam; **Cancelar restaura todas as cores iniciais** (preenchimento, traço e opacidade); `X` alterna o alvo.
133
- - Utilitários: `normalizarCor()`, `normalizarOpacidade()`, `coresUnicas()`, `PALETA_CORES_PADRAO`.
134
-
135
- ## 2.2.2 — 2026-10-14
136
-
137
- ### `<ui-canvas-cad>`: edição de círculo
138
-
139
- - `editarVertices` passa a aceitar `Circle`: alça no centro (move o círculo sem mudar o raio) e alça na borda (define o raio; mínimo 0,5 m). O HUD mostra raio e área ao vivo. `pontosDe`/`comPontos` e `pontoDaBordaDoCirculo` tratam o círculo.
140
-
141
- ### `<ui-camadas>`: arraste sobre controles
142
-
143
- - Clicar e arrastar sobre a coluna de olho, cadeado ou seleção aplica a todos os controles percorridos o estado resultante do primeiro, em vez de reordenar a camada.
144
-
145
- ## 2.2.1 — 2026-10-14
146
-
147
- ### `<ui-camadas>`: miniatura da feição fiel à geometria
148
-
149
- - A miniatura ao lado do nome da feição desenha a geometria real (polígonos com furos, linhas, multi-geometrias), enquadrada com proporção preservada; sem coordenadas, usa o ícone genérico.
150
- - Miniatura maior (20px; 17px no modo compacto).
151
-
152
- ## 2.2.0 — 2026-10-14
153
-
154
- ### `<ui-canvas-cad>`: curvas de Bézier de verdade
155
-
156
- - A **caneta** deixou de quebrar a curva em trechos retos. Linha e polígono ganham `curva` (lista de nós `{ ponto, entrada?, saida? }`, alças em coordenadas absolutas); o desenho é calculado a cada zoom (`bezierCurveTo` no canvas, comandos `C` no SVG), então a curva continua lisa em qualquer escala.
157
- - `coordenadas`/`aneis` seguem existindo como vértices de apoio amostrados sobre a curva (24 por segmento): métricas, snap, seleção e exportação continuam funcionando sem mudança.
158
- - Entrada: `adicionarFeicao`/`definirFeicoes` aceitam `curva` em linha de uma parte e polígono de um anel; nós inválidos são ignorados e a feição vira poligonal.
159
- - Edição de vértices numa feição curva trabalha com os nós: mover leva as alças junto, inserir divide o segmento sem mudar o traçado (de Casteljau) e excluir remove o nó. A caneta mostra as alças enquanto se arrasta.
160
- - **Alças editáveis**: em feição curva, o editor mostra uma alça arrastável por alça (com haste até o nó). A oposta espelha; segurar `Shift` solta a simetria. Duplo clique num nó alterna canto ↔ suave; numa linha/polígono comum isso converte em curva.
161
- - Curvas não são simplificadas por zoom; `deslocarGeometria` move nós e alças.
162
-
163
- ### `<ui-camadas>`: aprimoramento do rodapé e hierarquia de camadas (subcamadas e grupos)
164
-
165
- - **Rodapé Redesenhado e Dual-Mode**:
166
- - Resolução dos conflitos e sobreposição de controles visuais (o contador de camadas não colide mais com o botão de visibilidade nem com o seletor de movimentação).
167
- - **Modo Resumo (sem seleção)**: Exibe contagem limpa e elegante (`X camadas`), tipografia tabular e botões rápidos `+ Grupo` e `+ Camada`.
168
- - **Modo Ações em Massa (com seleção ativa)**: Habilita barra contextual com botões de visibilidade, trava, exclusão, preview circular moderno de cor em lote com aro brilhante (substituindo o input retangular nativo) e seletor compacto de destino com recuo hierárquico e truncamento seguro.
169
- - **Hierarquia de Camadas e Subcamadas**:
170
- - Suporte completo a camadas dentro de outras camadas através de `parentId?: string | null`, `children?: CamadaItem[]` e flag `isGroup?: boolean`. Suporte tanto a arrays planos quanto a árvores aninhadas (com achatamento inteligente e reversão automática).
171
- - **Arrastar e Soltar Hierárquico**: Arraste de camadas para dentro de outras camadas (`drop-into`) na área central da linha para transformar em subcamada, com prevenção automática de ciclos (não permite arrastar um pai para dentro de seus próprios filhos).
172
- - **Drawer e Ferramentas**: Seletor de camada pai e botão `+ Subcamada` integrados no drawer de configurações; botão `Novo Grupo` na toolbar superior.
173
- - **Proteção e Cascata**: Colapsar uma pasta/camada pai recolhe todas as suas subcamadas e feições; excluir um grupo promove automaticamente suas subcamadas para o nível raiz para evitar perda de dados.
174
- - Novos eventos públicos disparados por ação do usuário: `ui-camada-grupo-adicionar` e `ui-camada-mover-hierarquia`.
175
-
176
- ## 2.1.0 — 2026-10-11
177
-
178
- ### `<ui-canvas-cad>`: feições genéricas (migração do MapEngine)
179
-
180
- Tudo é opt-in: o componente **não cria camadas** de feições sozinho. Pontos, segmentos, vizinhos e SIGEF continuam como antes.
181
-
182
- - **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.
183
- - **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`.
184
- - **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.
185
- - **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`).
186
- - **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`.
187
- - **Versões e colaboração**: oficial × prévia (`entidadeId`, `definirPreviasGlobais`, `alternarPrevia`, `cad-previas`); cursores remotos (`atualizarCursorRemoto`, nome escapado e cor só `#hex`).
188
- - **Câmera**: `zoomParaFeicao(s)`, `ajustarTudo`, `ajustarCamada` (ligam camadas e prévias escondidas).
189
- - Exportados pelo entrypoint `./canvas`: modelo `Feicao`, algoritmos (`dividirPoligonoComLinha`, `gerarBuffer`, `juntarLinhas`, `juntarPoligonos`, `ddParaDms`, `dmsParaDd`, `converterComprimento`, `converterArea`...), índice, snap e editores.
190
- - Guia de migração: `docs/guia-migracao-mapengine.md`.
191
-
192
- ### `<ui-canvas-cad>`: opções para integração agnóstica com aplicações externas
193
-
194
- Tudo opt-in: sem os atributos e opções abaixo, o componente se comporta como antes. Detalhes e exemplos em
195
- `docs/guia-migracao-mapengine.md`; eventos em `docs/canvas-cad-eventos.md`; números em `docs/desempenho-feicoes.md`.
196
-
197
- - **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`.
198
- - **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`).
199
- - **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`.
200
- - **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.
201
- - **`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.
202
- - **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.
203
- - **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.
204
- - **Coordenada (0, 0)**: atributo/propriedade `aceitar-origem` / `aceitarOrigem` (padrão `false`) e `{ aceitarOrigem }` nas funções puras de normalização.
205
-
206
- ### Correções da revisão dos componentes
207
-
208
- - **`<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).
209
- - **`<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.
210
- - **`<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.
211
- - **`<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`.
212
- - **`<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.
213
- - **`<ui-tabela-propriedades>`**: `-2^2` agora vale -4 (o sinal unário pesa menos que a potência).
214
-
215
- ### ⚠️ Mudanças de comportamento
216
-
217
- - Ctrl/Cmd/Shift + clique no vazio **não limpa mais** a seleção de pontos (modo aditivo).
218
- - Clique em marcador DOM não é mais repassado às feições do canvas por baixo.
219
- - `MapaConfiguracoes.magnetSnap` está **obsoleto** e sem efeito (o snap agora é do componente).
220
- - `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).
221
- - **`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`.
222
- - **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.
223
- - **`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.
224
- - **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).
225
- - **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.
226
- - Valores novos nos `motivo` de `cad-edicao-recusada`, `cad-uniao-falhou` e `cad-divisao-falhou`: `multiparte`. Quem faz `switch` exaustivo precisa tratá-lo.
227
- - `selecionarFeicoes` e `alternarSelecaoFeicao` ignoram feições `oculta`.
228
- - `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).
229
-
230
- ## 2.0.0
231
-
232
- ### ⚠️ Mudanças que podem exigir ajuste
233
-
234
- - **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.
235
- - **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.
236
- - **`ui-abrir` / `ui-fechar` do modal disparam também ao mudar o atributo `aberto`**, não só pelos métodos `abrir()`/`fechar()`.
237
- - **A seleção de `<ui-tabela>` é mantida ao ordenar, filtrar ou trocar `dados`** (se o item ainda existir). Use `limparSelecao()` para zerar.
238
- - **Variáveis CSS renomeadas:** `--ui-fonte-mono`, `--ui-fonte-familia` e `--ui-fonte-principal` → `--ui-fonte-codigo` / `--ui-fonte-base`; `--ui-radius-*` → `--ui-raio-*`.
239
- - **Cores do tema claro mais escuras** para atingir contraste WCAG AA (primária `#006b40`). No escuro, o botão destrutivo passou para `#d32f2f`.
240
- - Removidos `UIModal._openCount` e o atributo interno `data-scroll-locked`.
241
-
242
- ### Usuário final
243
-
244
- - Textos legíveis nos dois temas (contraste WCAG AA verificado em testes).
245
- - Tabela por teclado: cabeçalhos ordenáveis com Tab + Enter, linhas com setas, Home/End, PageUp/PageDown, Enter para selecionar.
246
- - 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`.
247
- - Tooltip lido por leitores de tela, fecha com Esc e não some ao levar o ponteiro até o balão.
248
- - Botões só com ícone recebem nome acessível (`aria-label` ou `title`).
249
- - Gatilhos Zero-JS ignoram botões desabilitados ou carregando.
250
- - Correção de segurança: o `label` de campos nunca é interpretado como HTML.
251
-
252
- ### Desenvolvedor
253
-
254
- - **Tipos para React e Vue** gerados a partir do Custom Elements Manifest: `@thibezer/ui-components-kit/tipos-react`, `/tipos-vue` e `/tipos-elementos`.
255
- - **`custom-elements.json`** publicado (campo `customElements`), para IDEs, Storybook e documentação.
256
- - **`::part`** nos 14 componentes principais, com estados (`opcao-selecionada`, `linha-selecionada`).
257
- - **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`.
258
- - `<ui-botao>` form-associated: `form="id"`, `<fieldset disabled>`, `name`/`value` no `e.submitter`, `disabled` como propriedade, `click()` no host.
259
- - `UIBus.obterTema()`; `tema:alterado` também quando o sistema troca de tema.
260
- - `<ui-tabela>`: `aria-label` repassado à tabela, `aria-busy` durante o carregamento.
261
- - README corrigido (exemplo React, atributos do catálogo, import map para mapa/CAD via CDN).
262
-
263
- ## 1.0.0
264
-
265
- - Primeira publicação no npm como `@thibezer/ui-components-kit`.
1
+ # Changelog
2
+
3
+ ## 2.8.2 — 2026-10-23
4
+
5
+ ### Canvas de feições: medidas no elipsoide GRS80
6
+
7
+ - **Distância, comprimento e área** (`feature_metricas`) deixam a esfera de 6371 km: distância pela escala local do elipsoide (M e N) até 0,1° e Vincenty acima disso; área por Σ(λ[i+1]−λ[i−1])·sen φ·M·N/2. Antes o erro chegava a 0,5% na distância e 0,45% na área; agora fica abaixo de 0,01% na área e de 2e-7 na distância curta (linha Flinders–Buninyong confere em milímetros).
8
+ - **Deslocamentos, offsets e alça de borda do círculo** (`feature_algoritmos`, `feature_edicao_ops`) usam a mesma escala (`metrosPorGrau`, exportada), para o raio lido da alça bater com o desenhado.
9
+
10
+ ### `<ui-ribbon>` e `<ui-paleta-ferramentas>`: pendências de UX, acessibilidade e robustez
11
+
12
+ - **Harmonização de bordas, raios e alinhamento vertical no Ribbon**: botões pequenos agora utilizam `--ui-raio-sm` (4px) com `padding: 0 8px` proporcional; colunas de ferramentas recebem `gap: 2px` evitando colisão de cantos arredondados entre itens adjacentes; botões grandes têm altura calibrada em 76px (equivalente a 3 slots de 24px + gaps) com área de itens centrada verticalmente; grupos sem rótulo não geram nó vazio, eliminando o espaçamento inferior fantasma e garantindo margens perfeitamente simétricas.
13
+ - **Tooltip estilizado leve (M2)**: substituição do `title` nativo do browser por tooltip no Shadow DOM exibido em `focus-visible` e `pointerover`, com renderização do atalho formatado (`kbd`). Remoção de `aria-label` duplicado em botões que já possuem rótulo visível.
14
+ - **Colapso automático de grupos no Ribbon (A4)**: suporte a `prioridade` em `RibbonGrupo` e colapso dinâmico via `ResizeObserver` quando o espaço é insuficiente, transformando o grupo em botão único com flyout (estilo Office).
15
+ - **Botão dividido e Lançador de Diálogo (M4)**: suporte a `item.dividido` no ribbon (ação primária + gatilho de menu independente) e botão lançador de diálogo opcional (`grupo.lancadorDialogo`) com emissão do evento `ui-grupo-dialogo`.
16
+ - **Atalhos compostos e escopo multi-paletas (M7/B9)**: suporte a atalhos combinados (`Ctrl+Z`, `Shift+V`, `Esc`, etc.) via `correspondeAtalho`. No ribbon, suporte ao atributo `atalhos` e `keytips` (Alt). Conflito entre múltiplas paletas com atalhos na mesma página resolvido via escopo de foco (`:focus-within`) e ordenação DOM.
17
+ - **Navegação em grade de 2 colunas (M9)**: em paletas verticais com `colunas="2"`, navegação bidimensional intuitiva com `ArrowUp`, `ArrowDown`, `ArrowLeft` e `ArrowRight` respeitando a ordem visual e layout RTL.
18
+ - **Ativação manual de abas (M10)**: atributo opt-in `ativacao-manual` e propriedade `ativacaoManual` no ribbon, onde setas apenas transferem o foco do teclado e Enter/Espaço ativam a aba.
19
+ - **Fechamento de menu no window blur (M8)**: removido fechamento indevido em `window blur` para permitir inspeção no DevTools e troca de janelas; menus fecham apenas por clique fora, `Escape` ou rolagem.
20
+ - **Exclusividade configurável de ferramentas no Ribbon (B8)**: suporte a `tipo: 'ferramenta'` com seleção única por grupo e propriedade `grupo.exclusivo` (padrão `true`, `false` para múltipla ativação).
21
+ - **Submenus aninhados**: suporte a múltiplos níveis de `filhos` dentro de `filhos` na paleta e no ribbon, com abertura/fechamento via `ArrowRight` e `ArrowLeft` (respeitando RTL).
22
+ - **Modo controlado sem mutação de dados (A1)**: propriedade `modoControlado` e atributos `modo-controlado` / `copiar-dados` para clonagem profunda na entrada, garantindo que objetos do consumidor não sofram mutações.
23
+ - **IDs em SVG inline e allowlist (B1)**: prefixagem de IDs em `<defs>` de ícones SVG (`url(#...)` e `href`) no `svg-seguro.ts` para evitar colisões no DOM, e aviso em console para elementos descartados pela allowlist.
24
+ - **SSR e prevenção de layout shift (B9)**: reserva de altura mínima no `:host` do ribbon para evitar Cumulative Layout Shift (CLS) antes da hidratação.
25
+
26
+ ## 2.6.0 — 2026-10-17
27
+
28
+ ### `<ui-ribbon>` e `<ui-paleta-ferramentas>`: contrato com o consumidor
29
+
30
+ - **Valor inicial pendente**: `aba-ativa` / `valor` definidos antes de `abas` / `ferramentas` são aplicados quando os dados chegam; `aba-ativa` reflete a aba realmente ativa.
31
+ - **`valor = ''` / `limpar()`** removem a seleção da paleta (`ui-change` com `item: null`). Novas propriedades `orientacao`, `colunas`, `tamanho` (paleta) e `compacto` (ribbon); `valor` reflete no atributo usado (`valor` ou `value`).
32
+ - **Eventos**: `ui-ferramenta` agora é cancelável (`preventDefault()` reverte toggle/seleção); `definirAbaVisivel` emite `ui-aba-change` quando a aba ativa muda; novo `ui-recolhido-change`; tipos dos eventos no `HTMLElementEventMap` (`FerramentaDetail`, `AbaChangeDetail`, `PaletaChangeDetail`, `RecolhidoChangeDetail`).
33
+ - **Foco e roving tabindex**: re-renderizações preservam o foco; o tabindex acompanha o botão focado; `atualizarItem` não recria o DOM para mudanças de estado (paleta) nem para itens de outra aba (ribbon).
34
+ - **Menu/flyout**: `menuitemcheckbox`/`menuitemradio` com `aria-checked`, `aria-controls`, foco devolvido ao botão, fecha ao rolar, `ArrowDown` com menu aberto foca o primeiro item.
35
+ - **ARIA**: abas/painel ligados (`aria-controls`/`aria-labelledby`), `aria-label` e `rotulo-abas` configuráveis, `FerramentaItem.rotuloAcessivel`, `aria-keyshortcuts`; o nome acessível não cai mais no `id` quando há `rotulo` ou ícone nomeado.
36
+ - **Paleta**: grupo pula filho desabilitado/separador; clique longo cancelado ao arrastar; `suprimirClique` não prende mais o clique seguinte; atalhos ignoram `role=textbox` e `aria-modal`.
37
+ - `console.warn` para ids duplicados, `ativar()`/`atualizarItem()`/`selecionarAba()` com id inválido.
38
+
39
+ ## 2.5.0
40
+
41
+ ### `<ui-tabela>`: robustez, modo remoto e ordenação
42
+
43
+ - **Render protegido**: exceção em `coluna.render` deixa só a célula vazia (com `console.error`); o scroll virtual não trava mais após um erro de render.
44
+ - **Modo remoto**: `fetchOpcoes` (headers, credentials...), `fetcher` (substitui o `fetch`), `carregarDoEndpoint()`/`recarregar()` resolvem `true`/`false` (antes `void`; nunca rejeitam) e `carregarDoEndpoint(url)` passa a guardar a URL como `src`. `ui-fetch-erro` ganha `origem` (`rede`, `http`, `json`, `render`) e `status`. Novo evento `ui-fetch-cancelado`. Abortar (desconexão ou nova requisição) libera `carregando`; mesma URL em andamento é reaproveitada (sem requisição duplicada ao registrar o elemento depois do HTML).
45
+ - **Ordenação**: `ui-sort` agora é cancelável (`preventDefault()` desfaz); atributo/propriedade `ordenacao-remota` para ordenar no servidor. `TabelaColuna.tipo` (`numero`, `data`, `booleano`, `texto`) e `TabelaColuna.comparador`. `Date`, `dd/mm/aaaa` (com `tipo: 'data'`) e booleanos ordenam pelo valor; `Intl.Collator` reutilizado; **nulos ficam sempre no fim** (antes iam para o início em `desc`).
46
+ - **Filtro**: ignora acentos; datas entram na busca; `TabelaColuna.textoFiltro` torna pesquisável o texto formatado por `render`; filtra antes de ordenar (mais rápido).
47
+ - **Dados do consumidor**: `colunas` é copiado (redimensionar não altera nem falha com objetos congelados/reativos/compartilhados; `tabela.colunas` devolve a cópia interna); entradas `null`/`undefined` em `dados` são descartadas.
48
+ - **Seleção**: `id` nulo não marca várias linhas; a identidade do objeto tem prioridade sobre a chave; novo `ui-selecao-atualizada` quando os dados recarregados trazem outro objeto do mesmo registro.
49
+ - **Cliques**: botões dentro do shadow DOM de custom elements na célula não selecionam a linha (`composedPath`).
50
+ - **Redimensionamento**: clique na alça sem arrastar não emite `ui-column-resize` (antes `"undefined"`); desconectar durante o arraste não bloqueia mais a ordenação; o popover só emite se a largura mudou.
51
+ - Eventos do `<ui-tabela>` documentados no README.
52
+
53
+ ### `<ui-tabela>`: estética, usabilidade e acessibilidade
54
+
55
+ - **Cabeçalho**: sem as larguras fixas de 90px/70px; o vão texto-seta vem de `--ui-tabela-th-gap` (6px) e a seta de `--ui-tabela-th-icone` (16px). Só colunas ordenáveis têm ícone (dois chevrons, o ativo em destaque); `aria-sort="none"` nas ordenáveis inativas. O `sticky` ficou só nos `<th>`.
56
+ - **Tokens**: `--ui-tabela-zebra`, `--ui-tabela-hover`, `--ui-tabela-selecionada(-hover)`, `--ui-tabela-cor-foco`. Zebrado visível nos dois temas; texto do botão "Aplicar" usa `--ui-cor-texto-sobre-primaria`. `tabular-nums` e `--ui-fonte-base`.
57
+ - **Estados**: erro de carregamento visível (`part="erro"`, `role="alert"`, "Tentar novamente"; atributo `texto-erro`); overlay de carregamento com a cor do tema, `role="status"` e `texto-carregando`; vazio mantém o cabeçalho e o filtro sem resultado usa `texto-sem-resultados` (também anunciado a leitores de tela).
58
+ - **Linhas**: `cursor: pointer`, hover só com `(hover: hover)`, foco de teclado (cor do texto) distinto da seleção (primária), texto das células não é selecionado ao clicar (opt-in: `selecionar-texto`).
59
+ - **ARIA**: `role="grid"`, `aria-rowcount/colcount`, `aria-rowindex`, `aria-selected` (mantém `aria-current`), espaçadores `aria-hidden`, contêiner `role="region"` com o `aria-label`.
60
+ - **Redimensionamento**: toque/caneta (Pointer Events), traço visível em repouso, alça focável (`role="separator"`; ←/→ ajustam, Shift = passo maior, Enter abre o diálogo) e clique na alça não ordena. Diálogo de largura com rótulo, campo numérico, validação inline, posição dentro da janela e retorno do foco.
61
+ - `prefers-reduced-motion` (sem transições; spinner lento) e alvos de toque maiores com `pointer: coarse`. Removido o CSS morto do menu de contexto.
62
+
63
+ ## 2.3.0 — 2026-10-14
64
+
65
+ ### Novos: `<ui-controle-cores>` e `<ui-seletor-cor>` (entrada `@thibezer/ui-components-kit/cores`)
66
+
67
+ - **`<ui-controle-cores>`**: par de cores de desenho no estilo Illustrator. Preenchimento na frente, traço atrás; clique na amostra de trás a ativa, clique no alvo ativo (ou duplo clique, Enter, Espaço) abre o seletor. Botões de canto para inverter, "sem cor" no alvo ativo e restaurar o padrão (`padrao-preenchimento`/`padrao-traco`). Estado misto (`definirMisto()`, mostra `?`) e `so-traco` (esmaece o preenchimento).
68
+ - Ações do usuário emitem `ui-cores-change` com `{ preenchimento, traco, opacidade, alvo, confirmado, alterados, origem }` (`origem`: `seletor`, `inverter`, `sem-cor` ou `padrao`): `confirmado: false` é pré-visualização com o seletor aberto; na confirmação, `alterados` lista o que mudou desde a abertura. `definirCores()`, `definirAlvo()` e `definirMisto()` não emitem eventos.
69
+ - O kit não registra atalhos de teclado: a aplicação chama `alternarAlvo()`, `inverter()`, `semCor()` e `restaurarPadrao()` e pode mostrar as teclas nas dicas com `atalhos`.
70
+ - **`<ui-seletor-cor>`** + **`abrirSeletorCor({ ancora, ... })`**: painel flutuante com abas Preenchimento/Traço (modo `duplo`) ou cor única (`simples`), prévia antes × depois, hexadecimal, seletor do sistema, opacidade do preenchimento, cores do projeto, paleta padrão e "sem cor". Um aberto por vez; Concluir, ✕, Enter no hexadecimal, Esc e clique fora confirmam; **Cancelar restaura todas as cores iniciais** (preenchimento, traço e opacidade); `X` alterna o alvo.
71
+ - Utilitários: `normalizarCor()`, `normalizarOpacidade()`, `coresUnicas()`, `PALETA_CORES_PADRAO`.
72
+
73
+ ## 2.2.2 — 2026-10-14
74
+
75
+ ### `<ui-canvas-cad>`: edição de círculo
76
+
77
+ - `editarVertices` passa a aceitar `Circle`: alça no centro (move o círculo sem mudar o raio) e alça na borda (define o raio; mínimo 0,5 m). O HUD mostra raio e área ao vivo. `pontosDe`/`comPontos` e `pontoDaBordaDoCirculo` tratam o círculo.
78
+
79
+ ### `<ui-camadas>`: arraste sobre controles
80
+
81
+ - Clicar e arrastar sobre a coluna de olho, cadeado ou seleção aplica a todos os controles percorridos o estado resultante do primeiro, em vez de reordenar a camada.
82
+
83
+ ## 2.2.1 — 2026-10-14
84
+
85
+ ### `<ui-camadas>`: miniatura da feição fiel à geometria
86
+
87
+ - A miniatura ao lado do nome da feição desenha a geometria real (polígonos com furos, linhas, multi-geometrias), enquadrada com proporção preservada; sem coordenadas, usa o ícone genérico.
88
+ - Miniatura maior (20px; 17px no modo compacto).
89
+
90
+ ## 2.2.0 — 2026-10-14
91
+
92
+ ### `<ui-canvas-cad>`: curvas de Bézier de verdade
93
+
94
+ - A **caneta** deixou de quebrar a curva em trechos retos. Linha e polígono ganham `curva` (lista de nós `{ ponto, entrada?, saida? }`, alças em coordenadas absolutas); o desenho é calculado a cada zoom (`bezierCurveTo` no canvas, comandos `C` no SVG), então a curva continua lisa em qualquer escala.
95
+ - `coordenadas`/`aneis` seguem existindo como vértices de apoio amostrados sobre a curva (24 por segmento): métricas, snap, seleção e exportação continuam funcionando sem mudança.
96
+ - Entrada: `adicionarFeicao`/`definirFeicoes` aceitam `curva` em linha de uma parte e polígono de um anel; nós inválidos são ignorados e a feição vira poligonal.
97
+ - Edição de vértices numa feição curva trabalha com os nós: mover leva as alças junto, inserir divide o segmento sem mudar o traçado (de Casteljau) e excluir remove o nó. A caneta mostra as alças enquanto se arrasta.
98
+ - **Alças editáveis**: em feição curva, o editor mostra uma alça arrastável por alça (com haste até o nó). A oposta espelha; segurar `Shift` solta a simetria. Duplo clique num nó alterna canto ↔ suave; numa linha/polígono comum isso converte em curva.
99
+ - Curvas não são simplificadas por zoom; `deslocarGeometria` move nós e alças.
100
+
101
+ ### `<ui-camadas>`: aprimoramento do rodapé e hierarquia de camadas (subcamadas e grupos)
102
+
103
+ - **Rodapé Redesenhado e Dual-Mode**:
104
+ - Resolução dos conflitos e sobreposição de controles visuais (o contador de camadas não colide mais com o botão de visibilidade nem com o seletor de movimentação).
105
+ - **Modo Resumo (sem seleção)**: Exibe contagem limpa e elegante (`X camadas`), tipografia tabular e botões rápidos `+ Grupo` e `+ Camada`.
106
+ - **Modo Ações em Massa (com seleção ativa)**: Habilita barra contextual com botões de visibilidade, trava, exclusão, preview circular moderno de cor em lote com aro brilhante (substituindo o input retangular nativo) e seletor compacto de destino com recuo hierárquico e truncamento seguro.
107
+ - **Hierarquia de Camadas e Subcamadas**:
108
+ - Suporte completo a camadas dentro de outras camadas através de `parentId?: string | null`, `children?: CamadaItem[]` e flag `isGroup?: boolean`. Suporte tanto a arrays planos quanto a árvores aninhadas (com achatamento inteligente e reversão automática).
109
+ - **Arrastar e Soltar Hierárquico**: Arraste de camadas para dentro de outras camadas (`drop-into`) na área central da linha para transformar em subcamada, com prevenção automática de ciclos (não permite arrastar um pai para dentro de seus próprios filhos).
110
+ - **Drawer e Ferramentas**: Seletor de camada pai e botão `+ Subcamada` integrados no drawer de configurações; botão `Novo Grupo` na toolbar superior.
111
+ - **Proteção e Cascata**: Colapsar uma pasta/camada pai recolhe todas as suas subcamadas e feições; excluir um grupo promove automaticamente suas subcamadas para o nível raiz para evitar perda de dados.
112
+ - Novos eventos públicos disparados por ação do usuário: `ui-camada-grupo-adicionar` e `ui-camada-mover-hierarquia`.
113
+
114
+ ## 2.1.0 — 2026-10-11
115
+
116
+ ### `<ui-canvas-cad>`: feições genéricas (migração do MapEngine)
117
+
118
+ Tudo é opt-in: o componente **não cria camadas** de feições sozinho. Pontos, segmentos, vizinhos e SIGEF continuam como antes.
119
+
120
+ - **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.
121
+ - **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`.
122
+ - **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.
123
+ - **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`).
124
+ - **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`.
125
+ - **Versões e colaboração**: oficial × prévia (`entidadeId`, `definirPreviasGlobais`, `alternarPrevia`, `cad-previas`); cursores remotos (`atualizarCursorRemoto`, nome escapado e cor só `#hex`).
126
+ - **Câmera**: `zoomParaFeicao(s)`, `ajustarTudo`, `ajustarCamada` (ligam camadas e prévias escondidas).
127
+ - Exportados pelo entrypoint `./canvas`: modelo `Feicao`, algoritmos (`dividirPoligonoComLinha`, `gerarBuffer`, `juntarLinhas`, `juntarPoligonos`, `ddParaDms`, `dmsParaDd`, `converterComprimento`, `converterArea`...), índice, snap e editores.
128
+ - Guia de migração: `docs/guia-migracao-mapengine.md`.
129
+
130
+ ### `<ui-canvas-cad>`: opções para integração agnóstica com aplicações externas
131
+
132
+ Tudo opt-in: sem os atributos e opções abaixo, o componente se comporta como antes. Detalhes e exemplos em
133
+ `docs/guia-migracao-mapengine.md`; eventos em `docs/canvas-cad-eventos.md`; números em `docs/desempenho-feicoes.md`.
134
+
135
+ - **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`.
136
+ - **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`).
137
+ - **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`.
138
+ - **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.
139
+ - **`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.
140
+ - **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.
141
+ - **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.
142
+ - **Coordenada (0, 0)**: atributo/propriedade `aceitar-origem` / `aceitarOrigem` (padrão `false`) e `{ aceitarOrigem }` nas funções puras de normalização.
143
+
144
+ ### Correções da revisão dos componentes
145
+
146
+ - **`<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).
147
+ - **`<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.
148
+ - **`<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.
149
+ - **`<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`.
150
+ - **`<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.
151
+ - **`<ui-tabela-propriedades>`**: `-2^2` agora vale -4 (o sinal unário pesa menos que a potência).
152
+
153
+ ### ⚠️ Mudanças de comportamento
154
+
155
+ - Ctrl/Cmd/Shift + clique no vazio **não limpa mais** a seleção de pontos (modo aditivo).
156
+ - Clique em marcador DOM não é mais repassado às feições do canvas por baixo.
157
+ - `MapaConfiguracoes.magnetSnap` está **obsoleto** e sem efeito (o snap agora é do componente).
158
+ - `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).
159
+ - **`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`.
160
+ - **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.
161
+ - **`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.
162
+ - **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).
163
+ - **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.
164
+ - Valores novos nos `motivo` de `cad-edicao-recusada`, `cad-uniao-falhou` e `cad-divisao-falhou`: `multiparte`. Quem faz `switch` exaustivo precisa tratá-lo.
165
+ - `selecionarFeicoes` e `alternarSelecaoFeicao` ignoram feições `oculta`.
166
+ - `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).
167
+
168
+ ## 2.0.0
169
+
170
+ ### ⚠️ Mudanças que podem exigir ajuste
171
+
172
+ - **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.
173
+ - **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.
174
+ - **`ui-abrir` / `ui-fechar` do modal disparam também ao mudar o atributo `aberto`**, não só pelos métodos `abrir()`/`fechar()`.
175
+ - **A seleção de `<ui-tabela>` é mantida ao ordenar, filtrar ou trocar `dados`** (se o item ainda existir). Use `limparSelecao()` para zerar.
176
+ - **Variáveis CSS renomeadas:** `--ui-fonte-mono`, `--ui-fonte-familia` e `--ui-fonte-principal` → `--ui-fonte-codigo` / `--ui-fonte-base`; `--ui-radius-*` → `--ui-raio-*`.
177
+ - **Cores do tema claro mais escuras** para atingir contraste WCAG AA (primária `#006b40`). No escuro, o botão destrutivo passou para `#d32f2f`.
178
+ - Removidos `UIModal._openCount` e o atributo interno `data-scroll-locked`.
179
+
180
+ ### Usuário final
181
+
182
+ - Textos legíveis nos dois temas (contraste WCAG AA verificado em testes).
183
+ - Tabela por teclado: cabeçalhos ordenáveis com Tab + Enter, linhas com setas, Home/End, PageUp/PageDown, Enter para selecionar.
184
+ - 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`.
185
+ - Tooltip lido por leitores de tela, fecha com Esc e não some ao levar o ponteiro até o balão.
186
+ - Botões só com ícone recebem nome acessível (`aria-label` ou `title`).
187
+ - Gatilhos Zero-JS ignoram botões desabilitados ou carregando.
188
+ - Correção de segurança: o `label` de campos nunca é interpretado como HTML.
189
+
190
+ ### Desenvolvedor
191
+
192
+ - **Tipos para React e Vue** gerados a partir do Custom Elements Manifest: `@thibezer/ui-components-kit/tipos-react`, `/tipos-vue` e `/tipos-elementos`.
193
+ - **`custom-elements.json`** publicado (campo `customElements`), para IDEs, Storybook e documentação.
194
+ - **`::part`** nos 14 componentes principais, com estados (`opcao-selecionada`, `linha-selecionada`).
195
+ - **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`.
196
+ - `<ui-botao>` form-associated: `form="id"`, `<fieldset disabled>`, `name`/`value` no `e.submitter`, `disabled` como propriedade, `click()` no host.
197
+ - `UIBus.obterTema()`; `tema:alterado` também quando o sistema troca de tema.
198
+ - `<ui-tabela>`: `aria-label` repassado à tabela, `aria-busy` durante o carregamento.
199
+ - README corrigido (exemplo React, atributos do catálogo, import map para mapa/CAD via CDN).
200
+
201
+ ## 1.0.0
202
+
203
+ - Primeira publicação no npm como `@thibezer/ui-components-kit`.