@thibezer/ui-components-kit 2.0.0 → 2.2.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 (115) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +760 -739
  3. package/dist/botao.cjs +1 -1
  4. package/dist/botao.js +1 -1
  5. package/dist/camadas.cjs +175 -142
  6. package/dist/camadas.js +1335 -1054
  7. package/dist/canvas.cjs +99 -140
  8. package/dist/canvas.js +5552 -1283
  9. package/dist/components/ui-barra-ferramentas/tipos.d.ts +2 -2
  10. package/dist/components/ui-barra-ferramentas/ui-paleta-ferramentas.d.ts +2 -2
  11. package/dist/components/ui-camadas/camadas-adapters.d.ts +45 -0
  12. package/dist/components/ui-camadas/camadas-arvore-renderer.d.ts +9 -0
  13. package/dist/components/ui-camadas/camadas-drag-drop.d.ts +4 -0
  14. package/dist/components/ui-camadas/camadas-metricas.d.ts +8 -1
  15. package/dist/components/ui-camadas/camadas-persistencia.d.ts +5 -0
  16. package/dist/components/ui-camadas/camadas-rodape.d.ts +5 -0
  17. package/dist/components/ui-camadas/index.d.ts +1 -0
  18. package/dist/components/ui-camadas/tipos.d.ts +8 -0
  19. package/dist/components/ui-camadas/ui-camadas.d.ts +11 -0
  20. package/dist/components/ui-canvas-cad/cad-estilos-externos.d.ts +16 -0
  21. package/dist/components/ui-canvas-cad/cad-eventos-canvas.d.ts +4 -0
  22. package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +262 -0
  23. package/dist/components/ui-canvas-cad/cad-ferramentas-barra.d.ts +15 -0
  24. package/dist/components/ui-canvas-cad/cad-snap.d.ts +32 -0
  25. package/dist/components/ui-canvas-cad/cad-toolbar-painel.d.ts +1 -0
  26. package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +143 -0
  27. package/dist/components/ui-lista-flutuante/lista-flutuante-posicionamento.d.ts +2 -0
  28. package/dist/components/ui-lista-flutuante/ui-lista-flutuante.d.ts +1 -0
  29. package/dist/components/ui-seletor-mapa-base/ui-seletor-mapa-base.d.ts +3 -0
  30. package/dist/components/ui-tabela/tabela-atributos-sync.d.ts +3 -0
  31. package/dist/components/ui-tabela/tabela-localizador.d.ts +8 -1
  32. package/dist/components/ui-tabela/tabela-orquestrador-dados.d.ts +4 -0
  33. package/dist/components/ui-tabela/tabela-selecao.d.ts +19 -9
  34. package/dist/components/ui-tabela/tipos.d.ts +6 -0
  35. package/dist/components/ui-tabela/ui-tabela.d.ts +41 -2
  36. package/dist/components/ui-tabela-propriedades/avaliador-expressao.d.ts +0 -5
  37. package/dist/components/ui-tabela-propriedades/propriedades-dom-utils.d.ts +17 -1
  38. package/dist/components/ui-tabela-propriedades/propriedades-flutuante.d.ts +2 -0
  39. package/dist/components/ui-tabela-propriedades/propriedades-gerenciador-valores.d.ts +10 -1
  40. package/dist/components/ui-tabela-propriedades/propriedades-render-arvore.d.ts +3 -1
  41. package/dist/components/ui-tabela-propriedades/ui-tabela-propriedades.d.ts +5 -1
  42. package/dist/core/alvo-digitavel.d.ts +1 -0
  43. package/dist/core/index.d.ts +1 -0
  44. package/dist/core/svg-seguro.d.ts +10 -0
  45. package/dist/core.cjs +1 -1
  46. package/dist/core.js +12 -10
  47. package/dist/custom-elements.json +16586 -12150
  48. package/dist/data.cjs +1 -1
  49. package/dist/data.js +51 -46
  50. package/dist/forms.cjs +1 -1
  51. package/dist/forms.js +1 -1
  52. package/dist/gerencigeo-canvas/canvas_interacao.d.ts +18 -0
  53. package/dist/gerencigeo-canvas/curva_leaflet.d.ts +21 -0
  54. package/dist/gerencigeo-canvas/feature_adapters.d.ts +35 -0
  55. package/dist/gerencigeo-canvas/feature_algoritmos.d.ts +45 -0
  56. package/dist/gerencigeo-canvas/feature_amostra.d.ts +4 -0
  57. package/dist/gerencigeo-canvas/feature_caixa.d.ts +19 -0
  58. package/dist/gerencigeo-canvas/feature_cluster.d.ts +61 -0
  59. package/dist/gerencigeo-canvas/feature_cursores.d.ts +17 -0
  60. package/dist/gerencigeo-canvas/feature_curvas.d.ts +43 -0
  61. package/dist/gerencigeo-canvas/feature_desenho.d.ts +55 -0
  62. package/dist/gerencigeo-canvas/feature_desenho_controle.d.ts +91 -0
  63. package/dist/gerencigeo-canvas/feature_edicao_ops.d.ts +46 -0
  64. package/dist/gerencigeo-canvas/feature_editor_vertices.d.ts +80 -0
  65. package/dist/gerencigeo-canvas/feature_formas.d.ts +7 -0
  66. package/dist/gerencigeo-canvas/feature_hud.d.ts +23 -0
  67. package/dist/gerencigeo-canvas/feature_indice.d.ts +36 -0
  68. package/dist/gerencigeo-canvas/feature_metricas.d.ts +16 -0
  69. package/dist/gerencigeo-canvas/feature_popup.d.ts +31 -0
  70. package/dist/gerencigeo-canvas/feature_selecao.d.ts +38 -0
  71. package/dist/gerencigeo-canvas/feature_simplificacao.d.ts +15 -0
  72. package/dist/gerencigeo-canvas/feature_snap.d.ts +25 -0
  73. package/dist/gerencigeo-canvas/feature_types.d.ts +101 -0
  74. package/dist/gerencigeo-canvas/feature_versoes.d.ts +19 -0
  75. package/dist/gerencigeo-canvas/index.d.ts +21 -0
  76. package/dist/gerencigeo-canvas/layer_hit_test.d.ts +30 -0
  77. package/dist/gerencigeo-canvas/layer_manager.d.ts +11 -3
  78. package/dist/gerencigeo-canvas/layer_pane_ops.d.ts +9 -0
  79. package/dist/gerencigeo-canvas/mapa_controller.d.ts +1 -0
  80. package/dist/gerencigeo-canvas/mapa_pontos_shapes.d.ts +24 -5
  81. package/dist/gerencigeo-canvas/renderers/feicoes_renderer.d.ts +89 -0
  82. package/dist/gerencigeo-canvas/renderers/vector_points_renderer.d.ts +1 -0
  83. package/dist/gerencigeo-canvas/renderers/vector_polygons_renderer.d.ts +2 -2
  84. package/dist/gerencigeo-canvas/types.d.ts +12 -0
  85. package/dist/gerencigeo-canvas/utils.d.ts +4 -2
  86. package/dist/index.cjs +1 -1
  87. package/dist/index.js +132 -121
  88. package/dist/leaflet-DcO7uRC-.cjs +1 -0
  89. package/dist/{leaflet-DkaFZYc5.js → leaflet-PPDKB6Dd.js} +37 -37
  90. package/dist/mapa.cjs +1 -1
  91. package/dist/mapa.js +1 -1
  92. package/dist/register.cjs +1 -1
  93. package/dist/register.js +4 -4
  94. package/dist/seletor-mapa-base.cjs +13 -13
  95. package/dist/seletor-mapa-base.js +101 -51
  96. package/dist/svg-seguro-BsbNQqpd.js +50 -0
  97. package/dist/svg-seguro-C76iLlAZ.cjs +1 -0
  98. package/dist/tabela.cjs +1 -1
  99. package/dist/tabela.js +41 -36
  100. package/dist/tipos-elementos.d.ts +26 -7
  101. package/dist/tipos-vue.d.ts +24 -7
  102. package/dist/tools.cjs +1 -1
  103. package/dist/tools.js +1 -1
  104. package/dist/ui-botao-BOOnP8ds.cjs +12 -0
  105. package/dist/ui-botao-DfqSivHl.js +165 -0
  106. package/dist/{ui-paleta-ferramentas-BIytXQLh.js → ui-paleta-ferramentas-CEZYcN4J.js} +18 -27
  107. package/dist/{ui-paleta-ferramentas-DqLY51qa.cjs → ui-paleta-ferramentas-Dbj1kBS9.cjs} +6 -6
  108. package/dist/{ui-switch-DWLgVVnT.js → ui-switch-BcOqOkiV.js} +124 -96
  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-BNcE6VLX.js → ui-tabela-propriedades-Boy7I5yW.js} +1304 -1072
  112. package/package.json +169 -169
  113. package/dist/leaflet-Cw6tqYFh.cjs +0 -1
  114. package/dist/ui-switch-yZIn3IW0.cjs +0 -53
  115. package/dist/ui-tabela-propriedades-D3pyQvyy.cjs +0 -145
@@ -2,7 +2,11 @@ import { default as L } from 'leaflet';
2
2
  import { Ponto, Segmento, BancoPonto, Confrontante, CanvasLayerState, CanvasGraphicScale, ScaleMode, PontoCAD, ConexaoCAD, PoligonoCAD, DestacarElementoOpcoes } from '../../gerencigeo-canvas/types';
3
3
  import { GerenciGeoMapaController } from '../../gerencigeo-canvas/mapa_controller';
4
4
  import { CanvasLayerManager } from '../../gerencigeo-canvas/layer_manager';
5
+ import { UsuarioRemoto } from '../../gerencigeo-canvas/feature_cursores';
6
+ import { OpcoesCamadaFeicoes, OpcoesLote, LoteFeicoes, ResultadoLote, ResultadoFeicoes, ResultadoEdicao, ResultadoFerramenta } from './cad-feicoes';
7
+ import { EstiloFeicao, Feicao } from '../../gerencigeo-canvas/feature_types';
5
8
  import { SafeHTMLElement } from '../../core/ssr-safe';
9
+ import { EstilosExternos } from './cad-estilos-externos';
6
10
  export declare class UICanvasCAD extends SafeHTMLElement {
7
11
  static get observedAttributes(): string[];
8
12
  private shadow;
@@ -13,8 +17,12 @@ export declare class UICanvasCAD extends SafeHTMLElement {
13
17
  private toolbarPainel;
14
18
  private broadcastConfig;
15
19
  private colecoesDados;
20
+ private feicoes;
21
+ private barraFerramentas;
22
+ private hoverListeners;
16
23
  private layerItemListeners;
17
24
  private initTimeout?;
25
+ private estilosExternos;
18
26
  private lastPopupActionEmit?;
19
27
  private lastCanvasClickTime;
20
28
  private _chaveGrupo?;
@@ -25,6 +33,17 @@ export declare class UICanvasCAD extends SafeHTMLElement {
25
33
  disconnectedCallback(): void;
26
34
  invalidateSizeSafely(): void;
27
35
  attributeChangedCallback(name: string, oldVal: string, newVal: string): void;
36
+ /**
37
+ * Cria o mapa agora, sem esperar o agendamento do `connectedCallback`. Idempotente: se o mapa já existe,
38
+ * devolve o mesmo; nunca cria um segundo. Devolve `null` se não houver contêiner (ex.: componente já destruído).
39
+ */
40
+ inicializarAgora(): L.Map | null;
41
+ /**
42
+ * CSS do consumidor dentro do shadow root (popups, rótulos...). Aceita texto ou folhas (`document.styleSheets`,
43
+ * copiadas como texto); cada chamada substitui a anterior, `null`/`[]` remove. `destroy()` tira as folhas do
44
+ * shadow root e uma reconexão as recoloca.
45
+ */
46
+ definirEstilosExternos(css: EstilosExternos): void;
28
47
  private initCAD;
29
48
  private obterContextoEventos;
30
49
  tratarCliqueLivreCanvas(e: MouseEvent | any, latLng?: any, pt?: any): void;
@@ -44,6 +63,12 @@ export declare class UICanvasCAD extends SafeHTMLElement {
44
63
  set confrontantes(val: Confrontante[]);
45
64
  get vizinhos(): Confrontante[];
46
65
  set vizinhos(val: Confrontante[]);
66
+ /**
67
+ * Aceita a coordenada (0, 0) exata nas feições (atributo `aceitar-origem`). Padrão `false`: (0, 0) costuma ser
68
+ * placeholder de erro e a feição com vértice ali é recusada. Vale para as feições enviadas daqui para frente.
69
+ */
70
+ get aceitarOrigem(): boolean;
71
+ set aceitarOrigem(val: boolean);
47
72
  get modoSequencial(): boolean;
48
73
  set modoSequencial(val: boolean);
49
74
  get chaveGrupo(): string | undefined;
@@ -59,6 +84,9 @@ export declare class UICanvasCAD extends SafeHTMLElement {
59
84
  get pontosSelecionados(): (string | number)[];
60
85
  set pontosSelecionados(ids: (string | number)[]);
61
86
  atualizarDestaqueMarcadores(): void;
87
+ selectSegmento(id: string | number | null): void;
88
+ get segmentoSelecionado(): string | number | null;
89
+ set segmentoSelecionado(id: string | number | null);
62
90
  limparSelecao(): void;
63
91
  setLayerVisibility(id: string, visivel: boolean): void;
64
92
  setLayerOpacity(id: string, opacidade: number): void;
@@ -85,6 +113,121 @@ export declare class UICanvasCAD extends SafeHTMLElement {
85
113
  clearOverlays(manterBanco?: boolean): void;
86
114
  getMarkers(): L.Marker[];
87
115
  getVizinhosMarkers(): L.Marker[];
116
+ /** Cria (se preciso) a camada de feições e a preenche. Nenhuma camada de feições existe até esta chamada. */
117
+ definirFeicoes(camadaId: string, feicoes: unknown[], opcoes?: OpcoesCamadaFeicoes): ResultadoFeicoes;
118
+ adicionarFeicao(camadaId: string, feicao: unknown, opcoes?: OpcoesCamadaFeicoes): Feicao | null;
119
+ /**
120
+ * Mescla `parcial` na feição (estilo e propriedades também). Com `opcoes.substituirPropriedades`, as `propriedades`
121
+ * informadas trocam as atuais por inteiro, para refletir atributos apagados no consumidor.
122
+ */
123
+ atualizarFeicao(camadaId: string, id: string, parcial: Record<string, any>, opcoes?: {
124
+ substituirPropriedades?: boolean;
125
+ }): Feicao | null;
126
+ /**
127
+ * Várias mudanças numa só regravação da camada: remove, atualiza e adiciona (nessa ordem). Adicionar um id existente
128
+ * substitui a feição mantendo a posição. Devolve contagens e os ids recusados.
129
+ */
130
+ aplicarLote(camadaId: string, lote: LoteFeicoes, opcoes?: OpcoesLote): ResultadoLote;
131
+ removerFeicao(camadaId: string, id: string): boolean;
132
+ obterFeicoes(camadaId: string): Feicao[];
133
+ selecionarFeicoes(refs: Array<{
134
+ camadaId: string;
135
+ id: string;
136
+ }>, aditivo?: boolean): void;
137
+ selecionarFeicao(camadaId: string, id: string): void;
138
+ alternarSelecaoFeicao(camadaId: string, id: string): void;
139
+ limparSelecaoFeicoes(): void;
140
+ obterFeicoesSelecionadas(): Feicao[];
141
+ /** Edita os vértices da feição (ponto, linha ou polígono de um anel). Recusas também saem em `cad-edicao-recusada`. */
142
+ editarVertices(camadaId: string, id: string): ResultadoEdicao;
143
+ pararEdicaoVertices(): void;
144
+ get editandoVertices(): boolean;
145
+ get snapLigado(): boolean;
146
+ definirSnap(ligado: boolean): void;
147
+ alternarSnap(): void;
148
+ /** Camada que recebe o que for desenhado; criada na primeira feição se ainda não existir. */
149
+ definirCamadaDesenho(camadaId: string | null): void;
150
+ get camadaDesenho(): string | null;
151
+ definirEstiloDesenho(estilo: EstiloFeicao): void;
152
+ obterEstiloDesenho(): EstiloFeicao;
153
+ /**
154
+ * Ferramentas: ponto, linha, poligono, retangulo, elipse, poligono-regular, estrela, circulo, texto, caneta,
155
+ * medir-distancia, medir-area, dividir, selecao-laco, conta-gotas. `iniciarEm` ([lat, lon]) registra o primeiro clique.
156
+ */
157
+ definirFerramenta(nome: string | null, opcoes?: {
158
+ fechar?: boolean;
159
+ iniciarEm?: [number, number];
160
+ }): ResultadoFerramenta;
161
+ get ferramentaAtiva(): string | null;
162
+ limparMedicao(): void;
163
+ /** Vértices já colocados na figura em andamento. */
164
+ get nosDesenho(): number;
165
+ /** Desfaz o último vértice da figura em andamento; devolve se havia algo a desfazer. */
166
+ desfazerVerticeDesenho(): boolean;
167
+ /** Desliga a tecla S do snap para quem já trata a tecla; o botão e `definirSnap` seguem funcionando. */
168
+ definirAtalhoSnap(ligado: boolean): void;
169
+ gerarBuffer(camadaId: string, id: string, metros: number, opcoes?: {
170
+ camadaDestino?: string;
171
+ id?: string;
172
+ }): Feicao | null;
173
+ duplicarFeicao(camadaId: string, id: string, deslocamento?: {
174
+ lesteM?: number;
175
+ norteM?: number;
176
+ }, opcoes?: {
177
+ id?: string;
178
+ }): Feicao | null;
179
+ juntarFeicoes(camadaId: string, ids: string[], opcoes?: {
180
+ toleranciaM?: number;
181
+ id?: string;
182
+ }): Feicao | null;
183
+ zoomParaFeicao(camadaId: string, id: string): boolean;
184
+ zoomParaFeicoes(refs: Array<{
185
+ camadaId: string;
186
+ id: string;
187
+ }>): boolean;
188
+ /** Enquadra todas as feições das camadas de feições visíveis. */
189
+ ajustarTudo(): boolean;
190
+ /** Enquadra a camada; se estiver oculta, torna-a visível. */
191
+ ajustarCamada(camadaId: string): boolean;
192
+ get previasGlobais(): boolean;
193
+ definirPreviasGlobais(ligado: boolean): void;
194
+ alternarPreviasGlobais(): void;
195
+ alternarPrevia(camadaId: string, id: string): boolean | null;
196
+ previaSolicitada(camadaId: string, id: string): boolean;
197
+ /** Cursor de outro operador. Nome e cor vêm da rede: o nome é escapado e a cor só vale como #hex. */
198
+ atualizarCursorRemoto(usuario: UsuarioRemoto, posicao: [number, number] | {
199
+ lat: number;
200
+ lng?: number;
201
+ lon?: number;
202
+ }): boolean;
203
+ removerCursorRemoto(id: string): boolean;
204
+ limparCursoresRemotos(): void;
205
+ fecharPopupFeicao(): void;
206
+ /**
207
+ * Opções do popup. `copiarParaAreaDeTransferencia` (padrão `true`): a ação "copiar" também grava as coordenadas na área de
208
+ * transferência; com `false` só sai `cad-feicao-acao` e o consumidor decide (ex.: para mostrar o próprio aviso).
209
+ */
210
+ definirOpcoesPopup(opcoes: {
211
+ copiarParaAreaDeTransferencia?: boolean;
212
+ }): void;
213
+ /** Distância (px) que o auto-pan do popup mantém de barras, tabelas ou painéis laterais sobrepostos ao mapa. */
214
+ definirMargensPopup(margens: {
215
+ topo?: number;
216
+ base?: number;
217
+ esquerda?: number;
218
+ direita?: number;
219
+ }): void;
220
+ /**
221
+ * Margens (px) de barras e painéis sobrepostos ao mapa; os HUDs de desenho e de edição de vértices se centralizam
222
+ * na área visível. Padrão: `{ topo: 0, base: 16, esquerda: 0, direita: 0 }`. Em CSS: `--cad-hud-base`, `--cad-hud-esquerda`,
223
+ * `--cad-hud-direita` e `--cad-hud-topo` no host.
224
+ */
225
+ definirMargensHud(margens: {
226
+ topo?: number;
227
+ base?: number;
228
+ esquerda?: number;
229
+ direita?: number;
230
+ }): void;
88
231
  getMap(): L.Map | null;
89
232
  getController(): GerenciGeoMapaController;
90
233
  getLayerManager(): CanvasLayerManager;
@@ -10,6 +10,8 @@ export declare class ListaFlutuantePosicionamento {
10
10
  constructor(host: HTMLElement, button: HTMLElement, content: HTMLElement);
11
11
  isMobileOrBottomSheet(): boolean;
12
12
  posicionar: () => void;
13
+ /** Com a lista já visível (medida real): abre para cima se faltar espaço embaixo e não deixa sair pela lateral. */
14
+ private ajustarAoViewport;
13
15
  ativarAcompanhamento(onFechar: () => void): void;
14
16
  desativarAcompanhamento(): void;
15
17
  }
@@ -20,6 +20,7 @@ export declare class UIListaFlutuante extends FormAssociatedElement {
20
20
  private _itens;
21
21
  private _value;
22
22
  private _defaultValue;
23
+ private _defaultCapturado;
23
24
  private observer;
24
25
  private posicionamento;
25
26
  private teclado;
@@ -26,6 +26,8 @@ export declare class UISeletorMapaBase extends SafeHTMLElement {
26
26
  set aberto(valor: boolean);
27
27
  get compacto(): boolean;
28
28
  set compacto(valor: boolean);
29
+ get desabilitado(): boolean;
30
+ set desabilitado(valor: boolean);
29
31
  get mapasBase(): MapaBaseItem[];
30
32
  definirMapasBase(novosMapas: MapaBaseItem[]): void;
31
33
  abrir(): void;
@@ -36,6 +38,7 @@ export declare class UISeletorMapaBase extends SafeHTMLElement {
36
38
  private aplicarEstadoAberto;
37
39
  private atualizarGatilho;
38
40
  private renderizarOpcoes;
41
+ private focarItem;
39
42
  private atualizarSelecaoVisual;
40
43
  private conectarEventos;
41
44
  }
@@ -5,6 +5,9 @@ export interface ContextoAtributosTabela {
5
5
  loadingElement: HTMLDivElement | null;
6
6
  onTextoVazioAlterado: (texto: string) => void;
7
7
  onVirtualizarAlterado: (virtualizar: boolean) => void;
8
+ /** O atributo `src` foi lido (sem buscar nada); `null` = sem atributo. */
9
+ onSrcLido: (src: string | null) => void;
10
+ /** O atributo `src` mudou com o elemento conectado: busca os dados. */
8
11
  onCarregarSrc: (src: string) => void;
9
12
  onCarregandoAlterado: (carregando: boolean) => void;
10
13
  onRenderBody: () => void;
@@ -1,4 +1,11 @@
1
+ /** Converte `idOuIndice` em índice de linha válido, ou -1. Aceita número inteiro ou string só com dígitos. */
2
+ export declare function interpretarIndice(idOuIndice: string | number, total: number): number;
1
3
  /**
2
4
  * Localiza o índice de um item pelo ID, chave customizada, predicado funcional ou índice direto.
5
+ *
6
+ * Ordem de busca: predicado → chave configurada (`chaveId`) em todos os itens → chaves
7
+ * alternativas (`id`, `_id`, `codigo`, `key`), uma de cada vez → índice numérico.
8
+ * Assim um item cujo `codigo` coincide com o valor nunca "rouba" o item da chave configurada.
9
+ * Com `porIndice`, o valor é tratado apenas como índice de linha (sem ambiguidade com IDs numéricos).
3
10
  */
4
- export declare function localizarIndiceItem(dados: Record<string, any>[], idOuIndice: string | number | ((item: any, idx: number) => boolean), chaveId?: string): number;
11
+ export declare function localizarIndiceItem(dados: Record<string, any>[], idOuIndice: string | number | ((item: any, idx: number) => boolean), chaveId?: string, porIndice?: boolean): number;
@@ -5,6 +5,9 @@ export declare class TabelaOrquestradorDados {
5
5
  private colunaOrdenada;
6
6
  private direcaoOrdenacao;
7
7
  private ultimoFiltro;
8
+ /** Colunas declaradas: o filtro olha só elas (vazio = todos os campos do registro). */
9
+ private colunasFiltro;
10
+ setColunasFiltro(ids: string[]): void;
8
11
  getDadosOriginais(): Record<string, any>[];
9
12
  setDadosOriginais(dados: Record<string, any>[]): void;
10
13
  getDadosExibicao(): Record<string, any>[];
@@ -13,6 +16,7 @@ export declare class TabelaOrquestradorDados {
13
16
  getDirecaoOrdenacao(): 'asc' | 'desc' | 'original';
14
17
  setDirecaoOrdenacao(dir: 'asc' | 'desc' | 'original'): void;
15
18
  alternarOrdenacaoColuna(coluna: TabelaColuna): UISortDetail | null;
19
+ /** Recalcula a lista exibida: ordenação da coluna e, por cima, o filtro vigente (os dois valem juntos). */
16
20
  aplicarOrdenacao(): void;
17
21
  filtrar(termo: string): void;
18
22
  }
@@ -1,27 +1,37 @@
1
1
  import { UIRowScrollOptions } from './tipos';
2
+ /**
3
+ * Contexto lido sob demanda (getters): dados, chave e tbody sempre refletem o estado atual da tabela,
4
+ * mesmo após ordenar, filtrar, trocar dados ou mudar `chave-id`.
5
+ */
2
6
  export interface ContextoTabelaSelecao {
3
7
  host: HTMLElement;
4
- tbodyElement: HTMLTableSectionElement | null;
5
- containerElement: HTMLDivElement | null;
6
- dadosExibicao: Record<string, any>[];
7
- chaveId: string;
8
- getRowHeight: () => number;
9
- onRenderBody: () => void;
8
+ getTbody: () => HTMLTableSectionElement | null;
9
+ getDadosExibicao: () => Record<string, any>[];
10
+ getDadosOriginais: () => Record<string, any>[];
11
+ getChaveId: () => string;
12
+ /** Posiciona a linha exibida `indice` na área visível; retorna false se a tabela ainda não foi montada. */
13
+ onRolarParaIndice: (indice: number, comportamento: 'smooth' | 'auto') => boolean;
14
+ /** Chamado quando uma seleção programática muda a linha ativa (foco móvel do teclado). */
15
+ onLinhaAtiva: (indice: number) => void;
10
16
  }
11
17
  export declare class TabelaSelecaoController {
12
18
  private ctx;
13
19
  private itemSelecionado;
14
20
  private indiceSelecionado;
15
21
  constructor(ctx: ContextoTabelaSelecao);
22
+ /** Mesmo objeto ou mesmo valor na chave configurada. */
23
+ private indiceDoItem;
16
24
  getItemSelecionado(): Record<string, any> | null;
17
25
  setItemSelecionado(item: Record<string, any> | null): void;
18
26
  getIndiceSelecionado(): number | null;
19
27
  setIndiceSelecionado(idx: number | null): void;
20
28
  /**
21
- * Reaplica uma seleção anterior após ordenar, filtrar ou trocar os dados:
22
- * mantém o item se ele (ou outro com a mesma chave) ainda estiver na exibição.
29
+ * Reaplica a seleção após ordenar, filtrar ou trocar os dados.
30
+ * - Item ainda exibido: atualiza o índice (e a referência, se veio um objeto novo com a mesma chave).
31
+ * - Item só escondido pelo filtro: mantém a seleção (sem índice) para reaparecer ao limpar o filtro.
32
+ * - Item removido dos dados: limpa a seleção e emite `ui-selecao-removida`.
23
33
  */
24
- restaurarSelecao(item: Record<string, any>): void;
34
+ reconciliar(): void;
25
35
  limparSelecao(): void;
26
36
  isItemSelecionado(item: Record<string, any>, index: number): boolean;
27
37
  atualizarLinhasSelecionadas(): void;
@@ -24,4 +24,10 @@ export interface UIColumnResizeDetail {
24
24
  export interface UIRowScrollOptions {
25
25
  comportamento?: 'smooth' | 'auto';
26
26
  selecionar?: boolean;
27
+ /** Trata o valor apenas como índice da linha exibida, nunca como ID (evita ambiguidade com IDs numéricos). */
28
+ porIndice?: boolean;
29
+ }
30
+ export interface UISelecaoRemovidaDetail {
31
+ /** Item que estava selecionado e deixou de existir nos dados. */
32
+ item: Record<string, any>;
27
33
  }
@@ -1,6 +1,6 @@
1
- import { DensidadeTabela, TabelaColuna, UISortDetail, UIColumnResizeDetail, UIRowScrollOptions } from './tipos';
1
+ import { DensidadeTabela, TabelaColuna, UISortDetail, UIColumnResizeDetail, UIRowScrollOptions, UISelecaoRemovidaDetail } from './tipos';
2
2
  import { SafeHTMLElement } from '../../core/ssr-safe';
3
- export type { DensidadeTabela, TabelaColuna, UISortDetail, UIColumnResizeDetail, UIRowScrollOptions };
3
+ export type { DensidadeTabela, TabelaColuna, UISortDetail, UIColumnResizeDetail, UIRowScrollOptions, UISelecaoRemovidaDetail };
4
4
  export declare class UITabela extends SafeHTMLElement {
5
5
  static get observedAttributes(): string[];
6
6
  private shadow;
@@ -23,6 +23,10 @@ export declare class UITabela extends SafeHTMLElement {
23
23
  private _corpoListeners;
24
24
  /** Linha com o foco móvel (navegação por teclado); null = primeira linha visível. */
25
25
  private _indiceAtivo;
26
+ /** Altura real das linhas medida no DOM; null = usa a estimativa da densidade. */
27
+ private _alturaLinhaMedida;
28
+ /** Cancela a correção pendente de uma rolagem suave anterior. */
29
+ private _cancelarCorrecaoRolagem;
26
30
  private remotaController;
27
31
  private selecaoController;
28
32
  private dadosController;
@@ -66,11 +70,25 @@ export declare class UITabela extends SafeHTMLElement {
66
70
  get textoVazio(): string;
67
71
  set textoVazio(txt: string);
68
72
  private handleHeaderClick;
73
+ /** Altura fixa das linhas em px (`altura-linha`), sobrepõe a densidade; null = vale a densidade. */
74
+ get alturaLinha(): number | null;
75
+ set alturaLinha(val: number | null);
76
+ /** Publica a altura fixa como variável CSS (usada pelo estilo `:host([altura-linha])`). */
77
+ private aplicarAlturaLinha;
78
+ /** Altura usada na virtualização: a fixa (`altura-linha`), a medida no DOM ou a estimativa da densidade. */
69
79
  private getRowHeight;
80
+ /**
81
+ * Mede a altura real das linhas uma vez por configuração (densidade/colunas): padding, fonte e
82
+ * renderizadores customizados mudam a altura, e a estimativa fixa desalinharia a janela virtual.
83
+ * Não remede a cada rolagem para os espaçadores não "pularem" com linhas de alturas diferentes.
84
+ */
85
+ private medirAlturaLinha;
86
+ /** Ordenar, filtrar, trocar os dados ou a chave mantém a linha selecionada (se ainda existir). */
70
87
  private atualizarContextoSelecao;
71
88
  renderTotal(): void;
72
89
  /** Mantém um único tabindex=0 (foco móvel): Tab entra na tabela pela última linha ativa. */
73
90
  private handleFocoLinha;
91
+ private definirLinhaAtiva;
74
92
  /**
75
93
  * Teclado nas linhas: setas, Home/End e PageUp/PageDown movem o foco;
76
94
  * Enter/Espaço selecionam a linha (mesmo caminho do clique, emite `ui-linha-clique`).
@@ -79,10 +97,31 @@ export declare class UITabela extends SafeHTMLElement {
79
97
  private linhasPorPagina;
80
98
  /** Foca a linha, renderizando a janela virtual se necessário, e a mantém visível abaixo do cabeçalho fixo. */
81
99
  private focarLinha;
100
+ /**
101
+ * Quanto o container precisa rolar para a linha ficar inteira na área útil: abaixo do cabeçalho
102
+ * fixo e acima da barra de rolagem horizontal. 0 = já visível. Linha maior que a área alinha pelo topo.
103
+ */
104
+ private deslocamentoAteLinha;
105
+ /** Rola só o container da tabela (nunca a página, ao contrário de `scrollIntoView`). */
106
+ private rolarContainer;
107
+ /**
108
+ * Posiciona a linha exibida `indice` na área visível.
109
+ * Fora da janela virtual, rola até a posição estimada, renderiza a janela e corrige pela posição
110
+ * real da linha. No modo suave a correção ocorre ao fim da animação (`scrollend`, com timeout de
111
+ * segurança para navegadores sem o evento ou quando não há rolagem a fazer).
112
+ */
113
+ private posicionarLinha;
82
114
  private obterContextoRenderizador;
83
115
  private renderHeader;
84
116
  renderBody(): void;
117
+ /**
118
+ * Rola até um item e opcionalmente o seleciona. Aceita ID (pela `chave-id`, depois `id`, `_id`,
119
+ * `codigo`, `key`), predicado ou índice. Um número é procurado primeiro como ID; use
120
+ * `{ porIndice: true }` ou `rolarParaIndice()` para tratá-lo só como índice da linha exibida.
121
+ */
85
122
  rolarPara(idOuIndice: string | number | ((item: any, index: number) => boolean), opcoes?: UIRowScrollOptions): boolean;
123
+ /** Rola até a linha exibida de índice `indice` (posição após ordenação/filtro, base 0). */
124
+ rolarParaIndice(indice: number, opcoes?: Omit<UIRowScrollOptions, 'porIndice'>): boolean;
86
125
  }
87
126
  export * from './tabela-ordenacao';
88
127
  export * from './tabela-localizador';
@@ -1,6 +1 @@
1
- /**
2
- * Avaliador de expressões matemáticas para campos numéricos técnicos (AutoCAD / Revit / Blender).
3
- * Parser seguro de descida recursiva sem eval(), com suporte a +, -, *, /, ^, parênteses,
4
- * porcentagens, constantes (pi, e) e funções matemáticas (sqrt, abs, round, floor, ceil, sin, cos, tan).
5
- */
6
1
  export declare function avaliarExpressaoMatematica(expr: string): number | null;
@@ -1,6 +1,22 @@
1
1
  import { CategoriaPropriedades } from './tipos';
2
- export declare function focarProximoEditor(shadow: ShadowRoot, atual: HTMLElement): void;
2
+ /**
3
+ * Linha de uma propriedade. Compara o atributo em vez de montar um seletor CSS com o id:
4
+ * ids com aspas, colchetes ou barras não quebram a consulta.
5
+ */
6
+ export declare function buscarLinhaPropriedade(raiz: ParentNode | null | undefined, propId: string): HTMLElement | null;
7
+ /** Cada editor registra como refletir um novo valor (usado por `definirValor` e pelo scrubber). */
8
+ export declare function registrarAtualizadorEditor(editor: Element, atualizar: (valor: any) => void): void;
9
+ /**
10
+ * Atualiza o editor na tela para o novo valor, qualquer que seja o tipo (texto, número, seleção,
11
+ * booleano, cores, linha). Não recria a linha: preserva foco e arrastos em andamento.
12
+ */
3
13
  export declare function atualizarCampoVisual(shadow: ShadowRoot, propId: string, novoValor: any): void;
14
+ /**
15
+ * Seleciona a opção correspondente ao valor. Valor fora da lista ganha uma opção própria
16
+ * (`data-externa`) em vez de o select exibir a primeira opção como se fosse o valor real.
17
+ */
18
+ export declare function sincronizarSelect(select: HTMLSelectElement, valor: any, corresponde?: (opcao: string, valor: any) => boolean, rotuloExterno?: (valor: any) => string): void;
19
+ export declare function focarProximoEditor(shadow: ShadowRoot, atual: HTMLElement): void;
4
20
  export declare function expandirTodasCategorias(shadow: ShadowRoot, categorias: CategoriaPropriedades[]): void;
5
21
  export declare function colapsarTodasCategorias(shadow: ShadowRoot, categorias: CategoriaPropriedades[]): void;
6
22
  export declare function alternarCategoria(shadow: ShadowRoot, host: HTMLElement, categorias: CategoriaPropriedades[], idCategoria: string): void;
@@ -1,6 +1,8 @@
1
1
  import { ListenerBag } from '../../core/listener-bag';
2
2
  /**
3
3
  * Aplica ao host o posicionamento flutuante (fixed) ou o restaura ao fluxo normal.
4
+ * Ao acoplar, devolve a largura/altura originais (o painel não fica preso em 300×480);
5
+ * ao flutuar de novo, volta à última posição e tamanho flutuantes.
4
6
  * Retorna o novo estado (true = flutuante).
5
7
  */
6
8
  export declare function alternarPosicionamentoFlutuante(host: HTMLElement): boolean;
@@ -7,20 +7,29 @@ export interface ContextoGerenciadorValores {
7
7
  onRenderCategorias: () => void;
8
8
  isModoManual: () => boolean;
9
9
  }
10
+ /** Igualdade de valores de propriedade: estrita, com null/undefined equivalentes e NaN igual a NaN. */
11
+ export declare function valoresIguais(a: any, b: any): boolean;
10
12
  export declare class GerenciadorValoresPropriedades {
11
13
  private ctx;
12
14
  private valoresOriginais;
13
15
  private valoresAtuais;
14
- private dirty;
15
16
  constructor(ctx: ContextoGerenciadorValores);
16
17
  inicializarCategorias(categorias: CategoriaPropriedades[]): void;
18
+ /** Há alguma propriedade com valor diferente do original (último aplicar/carregar)? */
17
19
  get isDirty(): boolean;
20
+ isModificada(propId: string): boolean;
18
21
  getValores(): Record<string, any>;
22
+ getValoresOriginais(): Record<string, any>;
19
23
  setValores(novosValores: Record<string, any>): void;
20
24
  obterValor(propId: string): any;
25
+ /** Alteração programática: atualiza o editor na tela; não emite se o valor não mudou. */
21
26
  definirValor(propId: string, novoValor: any, emitirEvento?: boolean): void;
27
+ /** Alteração feita pelo usuário num editor. Em modo manual só emite no Aplicar. */
22
28
  registrarAlteracao(categoriaId: string, propId: string, novoValor: any): void;
23
29
  aplicar(): void;
24
30
  desfazer(): void;
31
+ /** Marca/desmarca a linha e recalcula os botões do rodapé (voltar ao original limpa o estado). */
32
+ private aposAlterar;
33
+ private categoriaDe;
25
34
  private emitirAlteracao;
26
35
  }
@@ -2,8 +2,10 @@ import { ItemPropriedade, CategoriaPropriedades } from './tipos';
2
2
  import { ContextoEditorPropriedade } from './propriedades-editores';
3
3
  export interface ContextoLinhaPropriedade {
4
4
  valoresAtuais: Record<string, any>;
5
+ /** Valores do último carregar/aplicar: a linha é marcada como modificada quando difere deles. */
5
6
  valoresOriginais: Record<string, any>;
6
- isDirty: boolean;
7
+ /** @deprecated Não é mais usado: o destaque compara cada valor com o original. */
8
+ isDirty?: boolean;
7
9
  editorCtx: ContextoEditorPropriedade;
8
10
  onAtualizarCampoVisual: (propId: string, novoValor: any) => void;
9
11
  }
@@ -32,7 +32,11 @@ export declare class UITabelaPropriedades extends SafeHTMLElement {
32
32
  constructor();
33
33
  connectedCallback(): void;
34
34
  disconnectedCallback(): void;
35
- attributeChangedCallback(name: string, _oldVal: string | null, newVal: string | null): void;
35
+ /**
36
+ * Cada atributo atualiza só o que depende dele: redesenhar todas as linhas (ex.: ao trocar o
37
+ * `titulo`) tiraria o foco de um campo em edição.
38
+ */
39
+ attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null): void;
36
40
  get categorias(): CategoriaPropriedades[];
37
41
  set categorias(novasCategorias: CategoriaPropriedades[]);
38
42
  get tipos(): SeletorTipoItem[];
@@ -0,0 +1 @@
1
+ export declare function focoEmCampoDeTexto(evento?: Event): boolean;
@@ -5,3 +5,4 @@ export * from './leaflet-loader';
5
5
  export * from './ssr-safe';
6
6
  export * from './form-validacao';
7
7
  export * from './acessibilidade';
8
+ export * from './svg-seguro';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Higienização de ícones SVG vindos de dados (props, APIs, configuração do usuário).
3
+ *
4
+ * Lista de permissão de elementos: tudo fora dela é removido com o conteúdo — inclusive
5
+ * `script`, `foreignObject`, `a`, `image`, `animate`/`set` (que podem reescrever `href`)
6
+ * e `style`. Atributos `on*` são removidos; `href` só aceita referências locais (`#id`);
7
+ * valores com `javascript:`/`data:`/`vbscript:` ou `url()` externo são descartados.
8
+ */
9
+ /** Retorna o `<svg>` higienizado (já pronto para inserir no DOM) ou null se não houver SVG. */
10
+ export declare function higienizarSvg(codigo: string): SVGSVGElement | null;
package/dist/core.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./zero-js-triggers-C_gtaojZ.cjs"),i=require("./listener-bag-D5omxZ9h.cjs"),t=require("./leaflet-loader-94z5VsdY.cjs"),o=require("./ssr-safe-CiHD1adl.cjs"),e=require("./form-validacao-ytRYSF3E.cjs");typeof document<"u"&&r.initZeroJSTriggers();exports.UIBus=r.UIBus;exports.initZeroJSTriggers=r.initZeroJSTriggers;exports.ListenerBag=i.ListenerBag;exports.carregarLeaflet=t.carregarLeaflet;exports.obterLeafletSincrono=t.obterLeafletSincrono;exports.SafeHTMLElement=o.SafeHTMLElement;exports.definirCustomElement=o.definirCustomElement;exports.isBrowser=o.isBrowser;exports.aplicarValidadeInternals=e.aplicarValidadeInternals;exports.cliqueVeioDeRotuloExterno=e.cliqueVeioDeRotuloExterno;exports.gerarIdUnico=e.gerarIdUnico;exports.obterRotuloExterno=e.obterRotuloExterno;exports.validarRestricoesCampoTexto=e.validarRestricoesCampoTexto;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./zero-js-triggers-C_gtaojZ.cjs"),t=require("./listener-bag-D5omxZ9h.cjs"),i=require("./leaflet-loader-94z5VsdY.cjs"),o=require("./ssr-safe-CiHD1adl.cjs"),e=require("./form-validacao-ytRYSF3E.cjs"),a=require("./svg-seguro-C76iLlAZ.cjs");typeof document<"u"&&r.initZeroJSTriggers();exports.UIBus=r.UIBus;exports.initZeroJSTriggers=r.initZeroJSTriggers;exports.ListenerBag=t.ListenerBag;exports.carregarLeaflet=i.carregarLeaflet;exports.obterLeafletSincrono=i.obterLeafletSincrono;exports.SafeHTMLElement=o.SafeHTMLElement;exports.definirCustomElement=o.definirCustomElement;exports.isBrowser=o.isBrowser;exports.aplicarValidadeInternals=e.aplicarValidadeInternals;exports.cliqueVeioDeRotuloExterno=e.cliqueVeioDeRotuloExterno;exports.gerarIdUnico=e.gerarIdUnico;exports.obterRotuloExterno=e.obterRotuloExterno;exports.validarRestricoesCampoTexto=e.validarRestricoesCampoTexto;exports.higienizarSvg=a.higienizarSvg;
package/dist/core.js CHANGED
@@ -1,22 +1,24 @@
1
1
  import { i as e } from "./zero-js-triggers-C_KrvFOQ.js";
2
2
  import { U as t } from "./zero-js-triggers-C_KrvFOQ.js";
3
- import { L as i } from "./listener-bag-DQgv7OON.js";
3
+ import { L as s } from "./listener-bag-DQgv7OON.js";
4
4
  import { c as f, o as m } from "./leaflet-loader-Cjcdgj5R.js";
5
- import { S as p, d as c, i as d } from "./ssr-safe-5cWfJP-s.js";
6
- import { a as u, c as g, g as L, o as E, v as S } from "./form-validacao-BIOXxt-1.js";
5
+ import { S as p, d as x, i as c } from "./ssr-safe-5cWfJP-s.js";
6
+ import { a as g, c as u, g as L, o as S, v as E } from "./form-validacao-BIOXxt-1.js";
7
+ import { h as B } from "./svg-seguro-BsbNQqpd.js";
7
8
  typeof document < "u" && e();
8
9
  export {
9
- i as ListenerBag,
10
+ s as ListenerBag,
10
11
  p as SafeHTMLElement,
11
12
  t as UIBus,
12
- u as aplicarValidadeInternals,
13
+ g as aplicarValidadeInternals,
13
14
  f as carregarLeaflet,
14
- g as cliqueVeioDeRotuloExterno,
15
- c as definirCustomElement,
15
+ u as cliqueVeioDeRotuloExterno,
16
+ x as definirCustomElement,
16
17
  L as gerarIdUnico,
18
+ B as higienizarSvg,
17
19
  e as initZeroJSTriggers,
18
- d as isBrowser,
20
+ c as isBrowser,
19
21
  m as obterLeafletSincrono,
20
- E as obterRotuloExterno,
21
- S as validarRestricoesCampoTexto
22
+ S as obterRotuloExterno,
23
+ E as validarRestricoesCampoTexto
22
24
  };