@thibezer/ui-components-kit 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/LICENSE +21 -21
  3. package/README.md +150 -14
  4. package/dist/botao.cjs +1 -1
  5. package/dist/botao.js +1 -1
  6. package/dist/camadas.cjs +65 -65
  7. package/dist/camadas.js +762 -729
  8. package/dist/campo-texto.cjs +1 -1
  9. package/dist/campo-texto.js +1 -1
  10. package/dist/canvas.cjs +105 -146
  11. package/dist/canvas.js +5132 -1199
  12. package/dist/card.cjs +1 -1
  13. package/dist/card.js +1 -1
  14. package/dist/components/ui-botao/ui-botao.d.ts +15 -0
  15. package/dist/components/ui-camadas/camadas-persistencia.d.ts +4 -0
  16. package/dist/components/ui-camadas/ui-camadas.d.ts +10 -0
  17. package/dist/components/ui-campo-texto/ui-campo-texto.d.ts +5 -0
  18. package/dist/components/ui-canvas-cad/cad-estilos-externos.d.ts +16 -0
  19. package/dist/components/ui-canvas-cad/cad-eventos-canvas.d.ts +4 -0
  20. package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +262 -0
  21. package/dist/components/ui-canvas-cad/cad-ferramentas-barra.d.ts +15 -0
  22. package/dist/components/ui-canvas-cad/cad-snap.d.ts +32 -0
  23. package/dist/components/ui-canvas-cad/cad-toolbar-painel.d.ts +1 -0
  24. package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +143 -0
  25. package/dist/components/ui-lista-flutuante/lista-flutuante-posicionamento.d.ts +2 -0
  26. package/dist/components/ui-lista-flutuante/ui-lista-flutuante.d.ts +1 -0
  27. package/dist/components/ui-modal/modal-pilha.d.ts +3 -0
  28. package/dist/components/ui-modal/ui-modal.d.ts +19 -4
  29. package/dist/components/ui-seletor-mapa-base/ui-seletor-mapa-base.d.ts +3 -0
  30. package/dist/components/ui-tabela/tabela-atributos-sync.d.ts +3 -0
  31. package/dist/components/ui-tabela/tabela-corpo.d.ts +2 -0
  32. package/dist/components/ui-tabela/tabela-localizador.d.ts +8 -1
  33. package/dist/components/ui-tabela/tabela-orquestrador-dados.d.ts +4 -0
  34. package/dist/components/ui-tabela/tabela-renderizador.d.ts +1 -0
  35. package/dist/components/ui-tabela/tabela-selecao.d.ts +21 -6
  36. package/dist/components/ui-tabela/tipos.d.ts +6 -0
  37. package/dist/components/ui-tabela/ui-tabela.d.ts +56 -2
  38. package/dist/components/ui-tabela-propriedades/avaliador-expressao.d.ts +0 -5
  39. package/dist/components/ui-tabela-propriedades/propriedades-dom-utils.d.ts +17 -1
  40. package/dist/components/ui-tabela-propriedades/propriedades-flutuante.d.ts +2 -0
  41. package/dist/components/ui-tabela-propriedades/propriedades-gerenciador-valores.d.ts +10 -1
  42. package/dist/components/ui-tabela-propriedades/propriedades-render-arvore.d.ts +3 -1
  43. package/dist/components/ui-tabela-propriedades/ui-tabela-propriedades.d.ts +5 -1
  44. package/dist/components/ui-tooltip/ui-tooltip.d.ts +15 -0
  45. package/dist/core/alvo-digitavel.d.ts +1 -0
  46. package/dist/core/form-submissao.d.ts +16 -0
  47. package/dist/core/index.d.ts +1 -0
  48. package/dist/core/parts.d.ts +6 -0
  49. package/dist/core/rotulo.d.ts +6 -0
  50. package/dist/core/svg-seguro.d.ts +10 -0
  51. package/dist/core/ui-bus.d.ts +13 -2
  52. package/dist/core.cjs +1 -1
  53. package/dist/core.js +14 -12
  54. package/dist/custom-elements.json +32905 -0
  55. package/dist/data.cjs +1 -1
  56. package/dist/data.js +51 -46
  57. package/dist/feedback.cjs +1 -1
  58. package/dist/feedback.js +3 -3
  59. package/dist/form-submissao-C-SPRKgT.js +61 -0
  60. package/dist/form-submissao-DxKO5MHI.cjs +1 -0
  61. package/dist/forms.cjs +1 -1
  62. package/dist/forms.js +2 -2
  63. package/dist/gerencigeo-canvas/canvas_interacao.d.ts +18 -0
  64. package/dist/gerencigeo-canvas/feature_adapters.d.ts +35 -0
  65. package/dist/gerencigeo-canvas/feature_algoritmos.d.ts +45 -0
  66. package/dist/gerencigeo-canvas/feature_amostra.d.ts +4 -0
  67. package/dist/gerencigeo-canvas/feature_caixa.d.ts +19 -0
  68. package/dist/gerencigeo-canvas/feature_cluster.d.ts +61 -0
  69. package/dist/gerencigeo-canvas/feature_cursores.d.ts +17 -0
  70. package/dist/gerencigeo-canvas/feature_desenho.d.ts +53 -0
  71. package/dist/gerencigeo-canvas/feature_desenho_controle.d.ts +91 -0
  72. package/dist/gerencigeo-canvas/feature_edicao_ops.d.ts +19 -0
  73. package/dist/gerencigeo-canvas/feature_editor_vertices.d.ts +62 -0
  74. package/dist/gerencigeo-canvas/feature_formas.d.ts +7 -0
  75. package/dist/gerencigeo-canvas/feature_hud.d.ts +23 -0
  76. package/dist/gerencigeo-canvas/feature_indice.d.ts +36 -0
  77. package/dist/gerencigeo-canvas/feature_metricas.d.ts +16 -0
  78. package/dist/gerencigeo-canvas/feature_popup.d.ts +31 -0
  79. package/dist/gerencigeo-canvas/feature_selecao.d.ts +38 -0
  80. package/dist/gerencigeo-canvas/feature_simplificacao.d.ts +14 -0
  81. package/dist/gerencigeo-canvas/feature_snap.d.ts +25 -0
  82. package/dist/gerencigeo-canvas/feature_types.d.ts +86 -0
  83. package/dist/gerencigeo-canvas/feature_versoes.d.ts +19 -0
  84. package/dist/gerencigeo-canvas/index.d.ts +21 -0
  85. package/dist/gerencigeo-canvas/layer_hit_test.d.ts +30 -0
  86. package/dist/gerencigeo-canvas/layer_manager.d.ts +11 -3
  87. package/dist/gerencigeo-canvas/layer_pane_ops.d.ts +9 -0
  88. package/dist/gerencigeo-canvas/mapa_controller.d.ts +1 -0
  89. package/dist/gerencigeo-canvas/mapa_pontos_shapes.d.ts +24 -5
  90. package/dist/gerencigeo-canvas/renderers/feicoes_renderer.d.ts +89 -0
  91. package/dist/gerencigeo-canvas/renderers/vector_points_renderer.d.ts +1 -0
  92. package/dist/gerencigeo-canvas/renderers/vector_polygons_renderer.d.ts +2 -2
  93. package/dist/gerencigeo-canvas/types.d.ts +12 -0
  94. package/dist/gerencigeo-canvas/utils.d.ts +3 -1
  95. package/dist/index.cjs +1 -1
  96. package/dist/index.d.ts +2 -2
  97. package/dist/index.js +117 -112
  98. package/dist/leaflet-DcO7uRC-.cjs +1 -0
  99. package/dist/{leaflet-DkaFZYc5.js → leaflet-PPDKB6Dd.js} +37 -37
  100. package/dist/mapa.cjs +4 -4
  101. package/dist/mapa.js +2 -2
  102. package/dist/modal.cjs +1 -1
  103. package/dist/modal.js +1 -1
  104. package/dist/parts-CaoQiCfI.js +7 -0
  105. package/dist/parts-vQa2873h.cjs +1 -0
  106. package/dist/register.cjs +1 -1
  107. package/dist/register.js +12 -12
  108. package/dist/seletor-mapa-base.cjs +16 -16
  109. package/dist/seletor-mapa-base.js +111 -61
  110. package/dist/svg-seguro-BsbNQqpd.js +50 -0
  111. package/dist/svg-seguro-C76iLlAZ.cjs +1 -0
  112. package/dist/tabela.cjs +1 -1
  113. package/dist/tabela.js +41 -36
  114. package/dist/tipos-elementos.d.ts +1232 -0
  115. package/dist/tipos-react.d.ts +113 -0
  116. package/dist/tipos-vue.d.ts +1201 -0
  117. package/dist/tools.cjs +1 -1
  118. package/dist/tools.js +1 -1
  119. package/dist/ui-badge-BxT-sDmV.cjs +28 -0
  120. package/dist/ui-badge-C0eKBI8E.js +183 -0
  121. package/dist/ui-botao-OGJV6Vfk.js +165 -0
  122. package/dist/ui-botao-psS1juof.cjs +12 -0
  123. package/dist/ui-campo-texto-Cnn2UAkS.cjs +16 -0
  124. package/dist/{ui-campo-texto-B_JF6POq.js → ui-campo-texto-Uu2dJE_0.js} +81 -63
  125. package/dist/{ui-card-Bhm6k91e.cjs → ui-card-B86lJXTP.cjs} +7 -7
  126. package/dist/{ui-card-BJ8SmvVf.js → ui-card-C_o5_0cB.js} +14 -14
  127. package/dist/ui-kit.css +1 -1
  128. package/dist/ui-modal-CvGFGh1h.cjs +18 -0
  129. package/dist/ui-modal-DBOtSTbR.js +238 -0
  130. package/dist/{ui-paleta-ferramentas-Bpp4XBVg.js → ui-paleta-ferramentas-CEZYcN4J.js} +18 -27
  131. package/dist/{ui-paleta-ferramentas-B6dJ0O6K.cjs → ui-paleta-ferramentas-Dbj1kBS9.cjs} +6 -6
  132. package/dist/ui-segmented-D6b6zxVs.cjs +19 -0
  133. package/dist/{ui-segmented-C8wuycjJ.js → ui-segmented-wUraId2e.js} +68 -67
  134. package/dist/ui-skeleton-DI4_9WOX.js +428 -0
  135. package/dist/ui-skeleton-elhKIh2B.cjs +33 -0
  136. package/dist/{ui-switch-CO9MoS8x.js → ui-switch-BcOqOkiV.js} +92 -62
  137. package/dist/ui-switch-D7iPKDj-.cjs +53 -0
  138. package/dist/ui-tabela-propriedades-BBr5sqki.cjs +145 -0
  139. package/dist/ui-tabela-propriedades-Boy7I5yW.js +2412 -0
  140. package/dist/{ui-toast-CwUmiqyG.js → ui-toast-Bp_NlM5G.js} +51 -51
  141. package/dist/ui-toast-DGTZKne5.cjs +20 -0
  142. package/dist/zero-js-triggers-C_KrvFOQ.js +244 -0
  143. package/dist/zero-js-triggers-C_gtaojZ.cjs +1 -0
  144. package/package.json +27 -7
  145. package/dist/leaflet-Cw6tqYFh.cjs +0 -1
  146. package/dist/ui-badge-92yelKls.js +0 -183
  147. package/dist/ui-badge-B95jSECC.cjs +0 -28
  148. package/dist/ui-botao-BShEouvi.js +0 -124
  149. package/dist/ui-botao-DF1yuUUD.cjs +0 -12
  150. package/dist/ui-campo-texto-BCh5HyCM.cjs +0 -16
  151. package/dist/ui-modal-Bi4isGYh.cjs +0 -18
  152. package/dist/ui-modal-DV-pw2x1.js +0 -194
  153. package/dist/ui-segmented-NC5cBXLh.cjs +0 -19
  154. package/dist/ui-skeleton-B3xQyn0Z.js +0 -396
  155. package/dist/ui-skeleton-D42oQufF.cjs +0 -33
  156. package/dist/ui-switch-C6o4yZUF.cjs +0 -53
  157. package/dist/ui-tabela-propriedades-7yJ9g7ti.cjs +0 -145
  158. package/dist/ui-tabela-propriedades-D-XKNVwK.js +0 -2078
  159. package/dist/ui-toast-CQBqvUm3.cjs +0 -20
  160. package/dist/zero-js-triggers-DdESy0tk.js +0 -205
  161. package/dist/zero-js-triggers-QGD7FOTv.cjs +0 -1
@@ -1,6 +1,5 @@
1
1
  import { SafeHTMLElement } from '../../core/ssr-safe';
2
2
  export declare class UIModal extends SafeHTMLElement {
3
- static _openCount: number;
4
3
  static get observedAttributes(): string[];
5
4
  private backdropElement;
6
5
  private dialogElement;
@@ -9,21 +8,37 @@ export declare class UIModal extends SafeHTMLElement {
9
8
  private _elementoGatilho;
10
9
  private _focables;
11
10
  private _tituloId;
12
- private _elementosInertes;
11
+ /** Estado já aplicado (pilha, inert, scroll, eventos); difere de `aberto` durante uma transição. */
12
+ private _estaAberto;
13
13
  constructor();
14
14
  connectedCallback(): void;
15
15
  disconnectedCallback(): void;
16
- attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
16
+ attributeChangedCallback(_name: string, _old: string | null, _value: string | null): void;
17
17
  private handleSlotChange;
18
18
  get aberto(): boolean;
19
19
  set aberto(val: boolean);
20
20
  abrir(): void;
21
+ /** Fecha o modal, exceto com `bloquear-fechamento` (remova o atributo ou use `aberto = false` para forçar). */
21
22
  fechar(): void;
23
+ /**
24
+ * Abrir/fechar pelo método, pela propriedade ou pelo atributo (`aberto`/`open`, comum em
25
+ * React/Vue) passa sempre por aqui: mesmos eventos, mesmo foco e mesma camada de inert.
26
+ */
27
+ private aoAbrir;
28
+ private aoFechar;
29
+ /**
30
+ * Foco inicial: `[autofocus]`, senão o primeiro controle do conteúdo/rodapé.
31
+ * O botão "✕" não recebe o foco inicial, evitando fechar o modal com um Enter acidental;
32
+ * sem controles, o próprio diálogo é focado para que o leitor de tela anuncie o título.
33
+ */
34
+ private focarConteudoInicial;
22
35
  private syncState;
23
36
  private handleBackdropClick;
24
37
  private handleCloseClick;
38
+ private static ehFocavel;
39
+ /** Focáveis do conteúdo projetado (corpo e rodapé), na ordem dos slots. */
40
+ private obterFocaveisDoConteudo;
25
41
  private _atualizarFocables;
26
- private _isTopMostModal;
27
42
  private handleKeyDown;
28
43
  }
29
44
  export declare class UIDialog extends UIModal {
@@ -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;
@@ -9,6 +9,8 @@ export interface ContextoCorpoTabela {
9
9
  chaveId: string;
10
10
  virtualizar: boolean;
11
11
  rowHeight: number;
12
+ /** Linha que recebe tabindex=0 (foco móvel); fora da janela renderizada, vale a primeira visível. */
13
+ indiceAtivo?: number | null;
12
14
  isItemSelecionado: (item: Record<string, any>, index: number) => boolean;
13
15
  onLinhaClique: (item: Record<string, any>, index: number) => void;
14
16
  formatWidth: (largura?: string | number) => string;
@@ -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
  }
@@ -19,6 +19,7 @@ export interface ContextoOrquestradorRender {
19
19
  chaveId: string;
20
20
  virtualizar: boolean;
21
21
  rowHeight: number;
22
+ indiceAtivo: number | null;
22
23
  onSetIsResizing: (resizing: boolean) => void;
23
24
  onActiveResizeCleanup: (cleanup: (() => void) | null) => void;
24
25
  onHeaderClick: (col: TabelaColuna) => void;
@@ -1,22 +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;
28
+ /**
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`.
33
+ */
34
+ reconciliar(): void;
20
35
  limparSelecao(): void;
21
36
  isItemSelecionado(item: Record<string, any>, index: number): boolean;
22
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;
@@ -20,6 +20,13 @@ export declare class UITabela extends SafeHTMLElement {
20
20
  private _scrollHandler;
21
21
  private _activeResizeCleanup;
22
22
  private _headerListeners;
23
+ private _corpoListeners;
24
+ /** Linha com o foco móvel (navegação por teclado); null = primeira linha visível. */
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;
23
30
  private remotaController;
24
31
  private selecaoController;
25
32
  private dadosController;
@@ -27,6 +34,8 @@ export declare class UITabela extends SafeHTMLElement {
27
34
  connectedCallback(): void;
28
35
  disconnectedCallback(): void;
29
36
  attributeChangedCallback(name: string, _oldVal: string | null, newVal: string | null): void;
37
+ /** Nome acessível vem do host (`aria-label`); `aria-busy` acompanha o carregamento remoto. */
38
+ private sincronizarAria;
30
39
  private syncAttributes;
31
40
  private obterContextoAtributos;
32
41
  get src(): string | null;
@@ -61,13 +70,58 @@ export declare class UITabela extends SafeHTMLElement {
61
70
  get textoVazio(): string;
62
71
  set textoVazio(txt: string);
63
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. */
64
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). */
65
87
  private atualizarContextoSelecao;
66
88
  renderTotal(): void;
89
+ /** Mantém um único tabindex=0 (foco móvel): Tab entra na tabela pela última linha ativa. */
90
+ private handleFocoLinha;
91
+ private definirLinhaAtiva;
92
+ /**
93
+ * Teclado nas linhas: setas, Home/End e PageUp/PageDown movem o foco;
94
+ * Enter/Espaço selecionam a linha (mesmo caminho do clique, emite `ui-linha-clique`).
95
+ */
96
+ private handleTecladoCorpo;
97
+ private linhasPorPagina;
98
+ /** Foca a linha, renderizando a janela virtual se necessário, e a mantém visível abaixo do cabeçalho fixo. */
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;
67
114
  private obterContextoRenderizador;
68
115
  private renderHeader;
69
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
+ */
70
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;
71
125
  }
72
126
  export * from './tabela-ordenacao';
73
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[];
@@ -4,6 +4,9 @@ export declare class UITooltip extends SafeHTMLElement {
4
4
  private containerElement;
5
5
  private bubbleElement;
6
6
  private _posicionamentoAtivo;
7
+ private _timerOcultar;
8
+ /** Gatilho que recebeu `aria-description` deste tooltip (para remover depois). */
9
+ private _gatilhoDescrito;
7
10
  constructor();
8
11
  connectedCallback(): void;
9
12
  disconnectedCallback(): void;
@@ -18,6 +21,18 @@ export declare class UITooltip extends SafeHTMLElement {
18
21
  private syncState;
19
22
  private handleMouseEnter;
20
23
  private handleMouseLeave;
24
+ private cancelarOcultar;
25
+ /**
26
+ * Escape fecha o tooltip sem mover o foco (WCAG 1.4.13). Ouvido na captura e interrompido,
27
+ * para que dentro de um modal o primeiro Escape feche só o tooltip.
28
+ */
29
+ private handleEscape;
30
+ /**
31
+ * O balão vive no Shadow DOM, fora do alcance de `aria-describedby` do gatilho (light DOM).
32
+ * O texto é exposto como `aria-description` no gatilho, sem sobrescrever uma descrição do consumidor.
33
+ */
34
+ private sincronizarDescricao;
35
+ private removerDescricao;
21
36
  private handleClick;
22
37
  private handleClickOutside;
23
38
  }
@@ -0,0 +1 @@
1
+ export declare function focoEmCampoDeTexto(evento?: Event): boolean;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Submissão de formulários a partir de controles encapsulados no Shadow DOM.
3
+ * O <button> e o <input> internos não pertencem ao <form> do consumidor, então
4
+ * o navegador não reconhece o botão como "submitter" nem o Enter no campo como
5
+ * submissão implícita. Estas funções reproduzem o comportamento nativo.
6
+ */
7
+ /**
8
+ * Submete o formulário com validação nativa. Quando `nome` é informado, um <button>
9
+ * temporário leva o par nome/valor ao FormData, como faria um submitter nativo.
10
+ */
11
+ export declare function submeterFormulario(form: HTMLFormElement, nome?: string | null, valor?: string | null): void;
12
+ /**
13
+ * Submissão implícita (Enter em um campo de texto): aciona o botão padrão do formulário
14
+ * ou, sem botão, submete apenas se houver um único campo de texto.
15
+ */
16
+ export declare function submeterImplicitamente(form: HTMLFormElement): void;
@@ -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,6 @@
1
+ /**
2
+ * Liga ou desliga um nome no atributo `part`, expondo estados ao CSS do consumidor
3
+ * (ex.: `ui-tabela::part(linha-selecionada)`). Usa o atributo em vez de `Element.part`
4
+ * para funcionar também em ambientes sem DOMTokenList de part (SSR, happy-dom).
5
+ */
6
+ export declare function alternarPart(el: Element, nome: string, ativo: boolean): void;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Escreve o texto do rótulo sempre como texto puro (nunca HTML), evitando que um
3
+ * `label` vindo de dados do servidor injete marcação. Quando obrigatório, acrescenta
4
+ * o asterisco decorativo, oculto de leitores de tela.
5
+ */
6
+ export declare function renderizarRotulo(rotulo: HTMLElement, texto: string, obrigatorio: boolean, classeAsterisco: string): void;
@@ -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;
@@ -28,6 +28,7 @@ export interface UIBusEventsMap {
28
28
  export type UIEmitterCallback<T = any> = (dados?: T) => void;
29
29
  declare class UIBusManager {
30
30
  private listeners;
31
+ constructor();
31
32
  /**
32
33
  * Registra um ouvinte para um canal ou evento global tipado.
33
34
  */
@@ -54,6 +55,7 @@ declare class UIBusManager {
54
55
  abrirModal(idModal: string): boolean;
55
56
  /**
56
57
  * Fecha um modal pelo seu ID ou todos os modais abertos se nenhum ID for passado.
58
+ * Retorna `false` se o modal não existir ou continuar aberto (`bloquear-fechamento`).
57
59
  */
58
60
  fecharModal(idModal?: string): boolean;
59
61
  /**
@@ -77,9 +79,18 @@ declare class UIBusManager {
77
79
  */
78
80
  definirDensidade(densidade: 'compacta' | 'normal' | 'padrao' | 'relaxada' | number): void;
79
81
  /**
80
- * Alterna ou define o tema visual global.
82
+ * Tema em vigor: o forçado na raiz (`data-tema`, `data-theme`, `.dark`/`.light`)
83
+ * ou, sem nenhum, o do sistema operacional (`prefers-color-scheme`).
81
84
  */
82
- definirTema(tema?: 'claro' | 'escuro'): string;
85
+ obterTema(): 'claro' | 'escuro';
86
+ /**
87
+ * Define o tema global. Sem argumento, alterna o tema em vigor;
88
+ * `'auto'` remove o tema forçado e volta a seguir o sistema operacional.
89
+ */
90
+ definirTema(tema?: 'claro' | 'escuro' | 'auto'): 'claro' | 'escuro';
91
+ /** Com o tema seguindo o SO, avisa `tema:alterado` quando o usuário troca o tema do sistema. */
92
+ private observarTemaDoSistema;
93
+ private _observandoSistema;
83
94
  }
84
95
  export declare const UIBus: UIBusManager;
85
96
  export {};
package/dist/core.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./zero-js-triggers-QGD7FOTv.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
- import { i as e } from "./zero-js-triggers-DdESy0tk.js";
2
- import { U as t } from "./zero-js-triggers-DdESy0tk.js";
3
- import { L as i } from "./listener-bag-DQgv7OON.js";
1
+ import { i as e } from "./zero-js-triggers-C_KrvFOQ.js";
2
+ import { U as t } from "./zero-js-triggers-C_KrvFOQ.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
  };