@thibezer/ui-components-kit 2.4.0 → 2.5.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 (40) hide show
  1. package/CHANGELOG.md +23 -26
  2. package/README.md +31 -2
  3. package/dist/canvas.cjs +59 -59
  4. package/dist/canvas.js +1395 -1725
  5. package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +1 -15
  6. package/dist/components/ui-canvas-cad/cad-ferramentas-barra.d.ts +1 -8
  7. package/dist/components/ui-canvas-cad/cad-snap.d.ts +0 -2
  8. package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +0 -7
  9. package/dist/components/ui-tabela/tabela-corpo.d.ts +4 -0
  10. package/dist/components/ui-tabela/tabela-dom.d.ts +3 -0
  11. package/dist/components/ui-tabela/tabela-header.d.ts +3 -1
  12. package/dist/components/ui-tabela/tabela-interacao.d.ts +3 -1
  13. package/dist/components/ui-tabela/tabela-ordenacao.d.ts +5 -3
  14. package/dist/components/ui-tabela/tabela-orquestrador-dados.d.ts +13 -1
  15. package/dist/components/ui-tabela/tabela-redimensionamento.d.ts +11 -2
  16. package/dist/components/ui-tabela/tabela-remota.d.ts +17 -4
  17. package/dist/components/ui-tabela/tabela-renderizador.d.ts +2 -0
  18. package/dist/components/ui-tabela/tabela-selecao.d.ts +2 -0
  19. package/dist/components/ui-tabela/tipos.d.ts +15 -0
  20. package/dist/components/ui-tabela/ui-tabela.d.ts +28 -4
  21. package/dist/custom-elements.json +2855 -2466
  22. package/dist/data.cjs +1 -1
  23. package/dist/data.js +54 -50
  24. package/dist/gerencigeo-canvas/canvas_interacao.d.ts +0 -2
  25. package/dist/gerencigeo-canvas/feature_desenho.d.ts +0 -2
  26. package/dist/gerencigeo-canvas/feature_desenho_controle.d.ts +0 -3
  27. package/dist/gerencigeo-canvas/feature_editor_vertices.d.ts +4 -51
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.js +93 -89
  30. package/dist/register.cjs +1 -1
  31. package/dist/register.js +1 -1
  32. package/dist/tabela.cjs +1 -1
  33. package/dist/tabela.js +42 -38
  34. package/dist/tipos-elementos.d.ts +11 -6
  35. package/dist/tipos-vue.d.ts +10 -6
  36. package/dist/ui-botao-OGJV6Vfk.js +165 -0
  37. package/dist/ui-botao-psS1juof.cjs +12 -0
  38. package/dist/ui-tabela-propriedades-BecPqC-e.cjs +141 -0
  39. package/dist/ui-tabela-propriedades-BokvDD3b.js +2648 -0
  40. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,31 +1,28 @@
1
1
  # Changelog
2
2
 
3
- ## 2.4.0 — 2026-10-15
4
-
5
- ### `<ui-canvas-cad>`: modos de edição de formas revisados
6
-
7
- **Correções**
8
-
9
- - **Alça de Bézier**: arrastá-la não inicia mais uma caixa de seleção (que, ao soltar, esvaziava a seleção e encerrava a edição).
10
- - **Círculo**: o popup passa a oferecer o botão **Editar**; a alça da borda fica onde foi solta (antes voltava para o leste do centro).
11
- - **Fantasma de inserção**: o duplo clique insere um vértice e não o converte mais em curva (`dblclick` até 600 ms depois da inserção é ignorado).
12
- - **Camada ou feição fechada durante a edição**: ocultar, bloquear ou remover a camada, ou bloquear a feição, encerra a edição (`cad-edicao-concluida`) e tira alças e HUD.
13
- - **Caneta**: o arraste da alça termina com o `mouseup` na janela; soltar o botão fora do mapa não deixa mais a alça seguindo o cursor.
14
- - **Snap em curvas**: feição com `curva` atrai pelos nós (vértice) e pelo meio do trecho curvo; os vértices de apoio amostrados só valem como aresta.
15
- - **Mudança externa no meio do arraste** (outro operador, API): a alça arrastada não é destruída; o gesto em curso vence ao soltar.
16
- - **Toque**: arrastar uma alça de edição move a alça, não o mapa.
17
- - **Tecla S** (e Enter) com vários canvases na página só valem no que está sob o mouse ou com foco. Com um único canvas nada muda.
18
-
19
- **Novidades**
20
-
21
- - **Desfazer/refazer/cancelar na edição**: Ctrl+Z, Ctrl+Shift+Z / Ctrl+Y e botões no HUD (100 gestos); **Cancelar** volta à geometria de quando a edição começou. Mudar a geometria por fora recomeça o histórico.
22
- - **Nó selecionado**: clique na alça destaca o nó; Delete/Backspace ou "Excluir nó" o exclui. Recusas (mínimo de nós, ponto, círculo) avisam no HUD.
23
- - **Mais formas de entrar na edição**: duplo clique na feição (novo `cad-feicao-duplo-clique`, cancelável), Enter com uma feição selecionada e botão **Editar** na barra (`ferramentas="editar"` ou `"todas"`). `cad-edicao-recusada` ganha o motivo `sem-selecao`.
24
- - **Retângulo**: arrastar um canto de um retângulo alinhado aos eixos mantém o retângulo (Shift solta).
25
- - **Fantasmas** não aparecem em segmentos com menos de 24 px na tela e voltam ao aproximar o zoom.
26
- - **Ferramentas de desenho avisam no HUD** quando recusam o clique (círculo abaixo de 2 m, cantos alinhados, centro repetido) ou quando Enter/duplo clique chega com pontos de menos.
27
- - A dica do HUD de edição cita Shift (que precisa ser apertado **durante** o arraste).
28
- - O HUD de edição passa a ter vários botões (Desfazer, Refazer, Excluir nó, Cancelar, Concluir): quem buscava o botão pelo seletor `#cm-vertex-edit-hud button` deve usar `[data-acao="concluir"]`.
3
+ ## 2.5.0
4
+
5
+ ### `<ui-tabela>`: robustez, modo remoto e ordenação
6
+
7
+ - **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.
8
+ - **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).
9
+ - **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`).
10
+ - **Filtro**: ignora acentos; datas entram na busca; `TabelaColuna.textoFiltro` torna pesquisável o texto formatado por `render`; filtra antes de ordenar (mais rápido).
11
+ - **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.
12
+ - **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.
13
+ - **Cliques**: botões dentro do shadow DOM de custom elements na célula não selecionam a linha (`composedPath`).
14
+ - **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.
15
+ - Eventos do `<ui-tabela>` documentados no README.
16
+
17
+ ### `<ui-tabela>`: estética, usabilidade e acessibilidade
18
+
19
+ - **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>`.
20
+ - **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`.
21
+ - **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).
22
+ - **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`).
23
+ - **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`.
24
+ - **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.
25
+ - `prefers-reduced-motion` (sem transições; spinner lento) e alvos de toque maiores com `pointer: coarse`. Removido o CSS morto do menu de contexto.
29
26
 
30
27
  ## 2.3.0 — 2026-10-14
31
28
 
package/README.md CHANGED
@@ -453,6 +453,35 @@ tabela.filtrar('M-01'); // Filtra instantaneamente em todas as colunas
453
453
  tabela.recarregar(); // Recarrega os dados da API remota
454
454
  ```
455
455
 
456
+ **Autenticação e opções do `fetch`** (o `src` sozinho faz um `GET` sem headers):
457
+
458
+ ```javascript
459
+ tabela.fetchOpcoes = { headers: { Authorization: `Bearer ${token}` }, credentials: 'include' };
460
+ // ou troque a função de busca (renovação de token, mocks):
461
+ tabela.fetcher = (url, init) => meuFetchAutenticado(url, init);
462
+
463
+ const ok = await tabela.carregarDoEndpoint('/api/v1/vertices'); // true em sucesso; nunca rejeita
464
+ ```
465
+
466
+ **Ordenação no servidor**: `<ui-tabela ordenacao-remota>` (ou `tabela.ordenacaoRemota = true`) atualiza o indicador e emite `ui-sort`, mas não reordena; busque os dados já ordenados. Sem o atributo, chame `evento.preventDefault()` em `ui-sort` para recusar a ordenação.
467
+
468
+ **Eventos de `<ui-tabela>`** (todos `bubbles` e `composed`; só `ui-sort` é cancelável):
469
+
470
+ | Evento | `detail` | Quando |
471
+ |---|---|---|
472
+ | `ui-sort` (cancelável) | `{ idColuna, direcao }` | Clique no cabeçalho ordenável. `direcao: 'original'` com `idColuna: null` = ordenação removida |
473
+ | `ui-column-resize` | `{ idColuna, largura }` (`"120px"` ou `"auto"`) | Fim do arraste, popover ou duplo clique; não dispara em clique sem arrastar |
474
+ | `ui-linha-clique` | `{ item, indice }` | Clique/Enter/Espaço numa linha. `indice` é a posição **exibida** (após ordenar/filtrar): use `item` |
475
+ | `ui-linha-selecionada` | `{ item, indice }` | `rolarPara(..., { selecionar: true })` |
476
+ | `ui-selecao-removida` | `{ item }` | O item selecionado saiu dos `dados` |
477
+ | `ui-selecao-atualizada` | `{ item, anterior }` | Os dados foram recarregados e o registro selecionado agora é outro objeto |
478
+ | `ui-fetch-start` | `{ url }` | Início da requisição do `src` |
479
+ | `ui-fetch-sucesso` | `{ url, total, dados }` | Dados recebidos |
480
+ | `ui-fetch-erro` | `{ url, erro, origem, status? }` | Falha. `origem`: `rede`, `http` (com `status`), `json` ou `render` |
481
+ | `ui-fetch-cancelado` | `{ url }` | Requisição abortada ou substituída (fecha o par do `ui-fetch-start`) |
482
+
483
+ Boas práticas: trate `dados` como imutável (atribua sempre um array novo), mantenha `chave-id` única e não nula, memorize `colunas` (atribuí-las de novo refaz a tabela) e coloque controles interativos das células com `data-prevent-select` se não quiser que o clique selecione a linha. `render` devolvendo `string` vira texto (não HTML); devolva um `HTMLElement` novo por chamada.
484
+
456
485
  ---
457
486
 
458
487
  ## 💻 Exemplos de Uso por Tecnologia
@@ -694,7 +723,7 @@ window.addEventListener('message', (event) => {
694
723
  | `<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` | - |
695
724
  | `<ui-skeleton>` | Placeholder de carregamento animado com pulsos. | `tipo`, `largura`, `altura`, `animado` | - |
696
725
  | `<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` |
726
+ | `<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` (demais eventos: ver seção 4) |
698
727
  | `<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` |
699
728
  | `<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` |
700
729
  | `<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` |
@@ -702,7 +731,7 @@ window.addEventListener('message', (event) => {
702
731
  | `<ui-seletor-cor>` | Painel de cor flutuante: abas Preenchimento/Traço (ou cor única), prévia antes × depois, hexadecimal, seletor do sistema, opacidade, cores do projeto, paleta e "sem cor". Abra com `abrirSeletorCor({ ancora, ... })`: um por vez, Esc/clique fora confirmam, Cancelar restaura, `X` alterna o alvo. | `abrirSeletorCor()`, `fecharSeletorCor()`, `configurar()`, `modo` (`duplo`, `simples`), `alvo`, `preenchimento`, `traco`, `cor`, `opacidade`, `mostrarOpacidade`, `misto`, `coresProjeto`, `paleta` | `ui-cor-input`, `ui-cor-confirmar`, `ui-cor-cancelar`, `ui-alvo-change` |
703
732
  | `<ui-mapa>` | Mapa geográfico interativo com camadas OpenStreetMap. | `lat`, `lng`, `zoom`, `camadas` | - |
704
733
  | `<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` |
705
- | `<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 (duplo clique ou Enter abre; desfazer/refazer/cancelar), 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`) |
734
+ | `<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`) |
706
735
 
707
736
  #### `<ui-canvas-cad>`: montar só com API pública (2.1)
708
737