@thibezer/ui-components-kit 2.9.0 → 2.10.1

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 (99) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/README.md +7 -4
  3. package/dist/camadas.cjs +53 -55
  4. package/dist/camadas.js +254 -242
  5. package/dist/campo-texto.cjs +1 -1
  6. package/dist/campo-texto.js +1 -1
  7. package/dist/canvas.cjs +73 -72
  8. package/dist/canvas.js +3212 -2690
  9. package/dist/card.cjs +1 -1
  10. package/dist/card.js +1 -1
  11. package/dist/components/ui-area-texto/area-texto-altura.d.ts +16 -0
  12. package/dist/components/ui-area-texto/area-texto-contador.d.ts +6 -0
  13. package/dist/components/ui-area-texto/area-texto-template.d.ts +2 -0
  14. package/dist/components/ui-area-texto/index.d.ts +3 -0
  15. package/dist/components/ui-area-texto/tipos.d.ts +19 -0
  16. package/dist/components/ui-area-texto/ui-area-texto.d.ts +100 -0
  17. package/dist/components/ui-campo-texto/campo-texto-estados.d.ts +5 -1
  18. package/dist/components/ui-campo-texto/ui-campo-texto.d.ts +1 -0
  19. package/dist/components/ui-canvas-cad/cad-acessibilidade.d.ts +7 -1
  20. package/dist/components/ui-canvas-cad/cad-feicoes-edicao.d.ts +13 -0
  21. package/dist/components/ui-canvas-cad/cad-feicoes-ponteiro.d.ts +8 -2
  22. package/dist/components/ui-canvas-cad/cad-feicoes-teclado.d.ts +19 -0
  23. package/dist/components/ui-canvas-cad/cad-feicoes-tipos.d.ts +1 -1
  24. package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +12 -1
  25. package/dist/components/ui-canvas-cad/cad-ferramentas-barra.d.ts +8 -1
  26. package/dist/components/ui-canvas-cad/cad-recusas.d.ts +6 -0
  27. package/dist/components/ui-canvas-cad/cad-snap.d.ts +2 -0
  28. package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +7 -0
  29. package/dist/components/ui-card/card-interacao.d.ts +17 -0
  30. package/dist/components/ui-card/card-secoes.d.ts +10 -0
  31. package/dist/components/ui-card/ui-card.d.ts +23 -0
  32. package/dist/components/ui-cores/cores-utils.d.ts +2 -0
  33. package/dist/components/ui-cores/tipos.d.ts +9 -2
  34. package/dist/components/ui-cores/ui-controle-cores.d.ts +9 -4
  35. package/dist/components/ui-cores/ui-seletor-cor.d.ts +12 -9
  36. package/dist/components/ui-tabela-propriedades/editores-basicos.d.ts +1 -1
  37. package/dist/components/ui-tabela-propriedades/propriedades-dom-utils.d.ts +5 -0
  38. package/dist/components/ui-tabela-propriedades/propriedades-gerenciador-valores.d.ts +3 -3
  39. package/dist/components/ui-tabela-propriedades/propriedades-valor-misto.d.ts +25 -0
  40. package/dist/components/ui-tabela-propriedades/tipos.d.ts +5 -0
  41. package/dist/components/ui-tabela-propriedades/ui-tabela-propriedades.d.ts +7 -0
  42. package/dist/components/ui-texto/ui-texto.d.ts +16 -0
  43. package/dist/core/alvo-digitavel.d.ts +5 -0
  44. package/dist/core/opcoes.d.ts +7 -0
  45. package/dist/cores.cjs +1 -1
  46. package/dist/cores.js +11 -9
  47. package/dist/custom-elements.json +16677 -13587
  48. package/dist/data.cjs +1 -1
  49. package/dist/data.js +72 -64
  50. package/dist/forms.cjs +1 -1
  51. package/dist/forms.d.ts +4 -0
  52. package/dist/forms.js +15 -12
  53. package/dist/gerencigeo-canvas/canvas_interacao.d.ts +2 -0
  54. package/dist/gerencigeo-canvas/feature_desenho.d.ts +15 -1
  55. package/dist/gerencigeo-canvas/feature_desenho_controle.d.ts +6 -0
  56. package/dist/gerencigeo-canvas/feature_edicao_ops.d.ts +9 -0
  57. package/dist/gerencigeo-canvas/feature_editor_vertices.d.ts +64 -6
  58. package/dist/gerencigeo-canvas/mapa_core.d.ts +4 -0
  59. package/dist/gerencigeo-canvas/popup_residual.d.ts +5 -0
  60. package/dist/index.cjs +1 -1
  61. package/dist/index.d.ts +4 -0
  62. package/dist/index.js +204 -191
  63. package/dist/{motor-CFI84lM2.js → motor-BKT2eStP.js} +3 -3
  64. package/dist/motor.js +1 -1
  65. package/dist/opcoes-CupvWVIm.js +24 -0
  66. package/dist/opcoes-vdAUY5OI.cjs +1 -0
  67. package/dist/register.cjs +1 -1
  68. package/dist/register.js +10 -9
  69. package/dist/tabela.cjs +1 -1
  70. package/dist/tabela.js +66 -58
  71. package/dist/tipos-elementos.d.ts +78 -0
  72. package/dist/tipos-react.d.ts +4 -0
  73. package/dist/tipos-vue.d.ts +76 -0
  74. package/dist/{ui-badge-BWhoGgo9.js → ui-badge-B5J_c5P5.js} +1 -1
  75. package/dist/{ui-badge-SIR81R9l.cjs → ui-badge-DC4y6Dik.cjs} +1 -1
  76. package/dist/{ui-campo-texto-B_OHVGiN.js → ui-campo-texto-19tIrmBK.js} +91 -93
  77. package/dist/ui-campo-texto-CH8mzX61.cjs +16 -0
  78. package/dist/ui-card-0wu4rjEX.cjs +20 -0
  79. package/dist/ui-card-DRtpOo3l.js +143 -0
  80. package/dist/ui-controle-cores-CohlwXJK.cjs +32 -0
  81. package/dist/ui-controle-cores-DMtTUtLk.js +292 -0
  82. package/dist/{ui-linha-BYAX4W6x.cjs → ui-linha-C306zxWG.cjs} +6 -6
  83. package/dist/{ui-linha-aqLlaYi7.js → ui-linha-C_azWkcG.js} +103 -99
  84. package/dist/ui-seletor-cor-D9iI7yew.js +413 -0
  85. package/dist/ui-seletor-cor-Ft06TEUH.cjs +110 -0
  86. package/dist/{ui-switch-DO1R0Ce7.js → ui-switch-BL-x_-SM.js} +460 -173
  87. package/dist/ui-switch-C0i_3QXu.cjs +66 -0
  88. package/dist/ui-tabela-propriedades-B8AwlpqL.cjs +141 -0
  89. package/dist/{ui-tabela-propriedades-DoL4SE0r.js → ui-tabela-propriedades-DuaC4sFX.js} +1295 -1195
  90. package/package.json +1 -1
  91. package/dist/opcoes-CJYLi6kd.js +0 -12
  92. package/dist/opcoes-CkyDxBuQ.cjs +0 -1
  93. package/dist/ui-campo-texto-DauJCde3.cjs +0 -16
  94. package/dist/ui-card-BNYCQ7g-.js +0 -119
  95. package/dist/ui-card-BrjBL-yo.cjs +0 -20
  96. package/dist/ui-controle-cores-DgEza3wF.js +0 -612
  97. package/dist/ui-controle-cores-uY__TgwW.cjs +0 -117
  98. package/dist/ui-switch-D9a8XlVX.cjs +0 -53
  99. package/dist/ui-tabela-propriedades-CjK2gG14.cjs +0 -141
package/dist/card.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */const e=require("./ui-card-BrjBL-yo.cjs");exports.UICard=e.UICard;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */const e=require("./ui-card-0wu4rjEX.cjs");exports.UICard=e.UICard;
package/dist/card.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { U as m } from "./ui-card-BNYCQ7g-.js";
2
+ import { U as m } from "./ui-card-DRtpOo3l.js";
3
3
  export {
4
4
  m as UICard
5
5
  };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Altura automática da área de texto (atributo `auto-altura`).
3
+ * `calcularAlturaAutomatica` é pura; `ajustarAlturaAutomatica` aplica o resultado no DOM.
4
+ */
5
+ /**
6
+ * Altura (px) a aplicar para o conteúdo caber sem rolagem, ou `null` quando o conteúdo cabe nas linhas
7
+ * mínimas (a altura volta a ser definida por `rows`). Medidas inválidas resultam em `null`.
8
+ */
9
+ export declare function calcularAlturaAutomatica(alturaConteudo: number, alturaVisivel: number): number | null;
10
+ /**
11
+ * Faz o `textarea` crescer com o conteúdo. O envoltorio segura a altura atual durante a medição, para a
12
+ * página não encolher (e rolar sozinha) quando a área está no fim de um documento comprido.
13
+ */
14
+ export declare function ajustarAlturaAutomatica(textarea: HTMLTextAreaElement, envoltorio: HTMLElement): void;
15
+ /** Devolve a altura ao controle de `rows`/redimensionamento do navegador. */
16
+ export declare function limparAlturaAutomatica(textarea: HTMLTextAreaElement, envoltorio: HTMLElement): void;
@@ -0,0 +1,6 @@
1
+ import { EstadoContador } from './tipos';
2
+ /**
3
+ * Estado do contador de caracteres. Função pura: tolera tamanho/limite inválidos (`NaN`, negativos, `Infinity`)
4
+ * e só gera anúncio para leitores de tela perto do limite, evitando falar a cada tecla.
5
+ */
6
+ export declare function calcularContador(tamanho: number, limite: number | null): EstadoContador;
@@ -0,0 +1,2 @@
1
+ export declare const ATRIBUTOS_OBSERVADOS_AREA_TEXTO: string[];
2
+ export declare function criarTemplateAreaTexto(): string;
@@ -0,0 +1,3 @@
1
+ export * from './ui-area-texto';
2
+ export * from './tipos';
3
+ export { calcularContador } from './area-texto-contador';
@@ -0,0 +1,19 @@
1
+ /** Direções em que o usuário pode redimensionar a área de texto (atributo `redimensionar`). */
2
+ export type RedimensionamentoAreaTexto = 'nenhum' | 'vertical' | 'horizontal' | 'ambos';
3
+ /** `detail` de `ui-input` e `ui-change`. */
4
+ export interface DetalheValorAreaTexto {
5
+ value: string;
6
+ }
7
+ /** `detail` de `ui-enviar` (Ctrl/Cmd + Enter). */
8
+ export interface DetalheEnviarAreaTexto {
9
+ value: string;
10
+ }
11
+ /** Nível visual do contador de caracteres. */
12
+ export type NivelContador = 'normal' | 'aviso' | 'excedido';
13
+ export interface EstadoContador {
14
+ /** Texto visível: `42` ou `42 / 500`. */
15
+ texto: string;
16
+ nivel: NivelContador;
17
+ /** Mensagem para leitores de tela; vazia enquanto o nível for `normal`. */
18
+ anuncio: string;
19
+ }
@@ -0,0 +1,100 @@
1
+ import { FormAssociatedElement } from '../../core/form-associated-element';
2
+ /**
3
+ * Área de texto de várias linhas (descrições, observações, laudos) com rótulo, ajuda/erro, contador de
4
+ * caracteres e altura automática. Participa de `<form>` (FACE).
5
+ *
6
+ * @element ui-area-texto
7
+ *
8
+ * @attr {string} label - Rótulo visível (sempre texto puro).
9
+ * @attr {string} placeholder - Texto de apoio quando vazio.
10
+ * @attr {string} value - Valor inicial (também restaurado por `form.reset()`).
11
+ * @attr {boolean} obrigatorio - Campo obrigatório (alias `required`).
12
+ * @attr {number} minlength - Mínimo de caracteres.
13
+ * @attr {number} maxlength - Máximo de caracteres; também é o limite do contador.
14
+ * @attr {string} helper-text - Texto de ajuda abaixo do campo.
15
+ * @attr {boolean} erro - Marca o campo como inválido.
16
+ * @attr {string} mensagem-erro - Mensagem exibida junto com `erro`.
17
+ * @attr {string} mensagem-validacao - Substitui as mensagens de validação nativas.
18
+ * @attr {boolean} disabled - Desabilita o campo.
19
+ * @attr {boolean} readonly - Somente leitura (continua focável e selecionável).
20
+ * @attr {number} linhas - Linhas visíveis (1–50, padrão 4).
21
+ * @attr {boolean} auto-altura - O campo cresce com o conteúdo.
22
+ * @attr {number} linhas-max - Com `auto-altura`, limite de linhas antes de rolar.
23
+ * @attr {string} redimensionar - `nenhum` | `vertical` (padrão) | `horizontal` | `ambos`.
24
+ * @attr {boolean} contador - Exibe o contador de caracteres.
25
+ *
26
+ * @fires ui-input - A cada edição. `detail: { value }`.
27
+ * @fires ui-change - Ao confirmar a edição (blur). `detail: { value }`.
28
+ * @fires ui-enviar - Ctrl/Cmd + Enter. `detail: { value }`. Enter comum insere quebra de linha.
29
+ * @fires input - Evento nativo, reemitido no host.
30
+ * @fires change - Evento nativo, reemitido no host.
31
+ *
32
+ * @csspart rotulo - Rótulo.
33
+ * @csspart campo - Invólucro com borda.
34
+ * @csspart input - O `<textarea>` interno.
35
+ * @csspart rodape - Linha de ajuda e contador.
36
+ * @csspart ajuda - Texto de ajuda ou erro.
37
+ * @csspart contador - Contador de caracteres.
38
+ */
39
+ export declare class UIAreaTexto extends FormAssociatedElement {
40
+ static get observedAttributes(): string[];
41
+ private labelElement;
42
+ private wrapperElement;
43
+ private textareaElement;
44
+ private helperElement;
45
+ private contadorElement;
46
+ private anuncioElement;
47
+ private listeners;
48
+ private _focado;
49
+ private _textareaId;
50
+ private _defaultValue;
51
+ private _nivelAnunciado;
52
+ constructor();
53
+ connectedCallback(): void;
54
+ disconnectedCallback(): void;
55
+ attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
56
+ focus(options?: FocusOptions): void;
57
+ blur(): void;
58
+ /** Seleciona todo o texto. */
59
+ select(): void;
60
+ /** Define a seleção; índices inválidos são ignorados pelo navegador, nunca lançam. */
61
+ setSelectionRange(inicio: number, fim: number, direcao?: 'forward' | 'backward' | 'none'): void;
62
+ /** Apaga o texto programaticamente (sem disparar eventos de edição). */
63
+ limpar(): void;
64
+ get value(): string;
65
+ set value(val: string);
66
+ get name(): string;
67
+ set name(val: string);
68
+ get type(): string;
69
+ get disabled(): boolean;
70
+ set disabled(val: boolean);
71
+ get readOnly(): boolean;
72
+ set readOnly(val: boolean);
73
+ get minLength(): number;
74
+ set minLength(val: number);
75
+ get maxLength(): number;
76
+ set maxLength(val: number);
77
+ formResetCallback(): void;
78
+ formStateRestoreCallback(state: unknown, _mode: 'restore' | 'autocomplete'): void;
79
+ atualizarValidade(): void;
80
+ protected syncState(): void;
81
+ private sincronizarRotulo;
82
+ private sincronizarLimites;
83
+ private sincronizarEstadoInterativo;
84
+ private sincronizarFeedback;
85
+ private sincronizarContador;
86
+ private sincronizarAltura;
87
+ private emitirEdicao;
88
+ private handleInput;
89
+ private handleChange;
90
+ private handleFocus;
91
+ private handleBlur;
92
+ /** Ctrl/Cmd + Enter pede o envio sem submeter o `<form>`; Enter comum continua inserindo quebra de linha. */
93
+ private handleKeyDown;
94
+ /** Clique em `<label>` externo associado ao host foca o textarea. */
95
+ private handleHostClick;
96
+ private handleResize;
97
+ }
98
+ /** Alias semântico: `<ui-textarea>` é idêntico a `<ui-area-texto>`. */
99
+ export declare class UITextarea extends UIAreaTexto {
100
+ }
@@ -9,4 +9,8 @@ export interface ContextoLabelPlaceholder {
9
9
  }
10
10
  export declare function sincronizarLabelEPlaceholder(ctx: ContextoLabelPlaceholder): void;
11
11
  export declare function sincronizarIconeSenha(container: HTMLSpanElement, ehSenhaOuAlternar: boolean, senhaVisivel: boolean): void;
12
- export declare function sincronizarFeedbackErro(wrapper: HTMLDivElement, input: HTMLInputElement, helper: HTMLDivElement, temErro: boolean, mensagemErro: string | null, helperText: string | null): void;
12
+ /**
13
+ * Reflete erro e texto de ajuda no campo. `prefixo` é o bloco BEM do componente (padrão `ui-campo-texto`),
14
+ * permitindo que `<ui-area-texto>` reutilize a mesma regra com suas próprias classes.
15
+ */
16
+ export declare function sincronizarFeedbackErro(wrapper: HTMLElement, input: HTMLInputElement | HTMLTextAreaElement, helper: HTMLElement, temErro: boolean, mensagemErro: string | null, helperText: string | null, prefixo?: string): void;
@@ -8,6 +8,7 @@ export declare class UICampoTexto extends FormAssociatedElement {
8
8
  private rightIconContainer;
9
9
  private leftSlotElement;
10
10
  private _senhaVisivel;
11
+ private listeners;
11
12
  private _checkTimer;
12
13
  private _focado;
13
14
  private _inputId;
@@ -11,5 +11,11 @@ export declare function textoSelecao(quantidade: number): string;
11
11
  export declare function textoFerramenta(ferramenta: string | null): string;
12
12
  /** Escreve na região viva (`#cad-status`); trocar o texto é o que dispara o anúncio. */
13
13
  export declare function anunciar(shadow: ShadowRoot, texto: string): void;
14
- /** Liga os anúncios aos eventos que o próprio componente emite; devolve a função que desliga. */
14
+ /** Tempo (ms) que o aviso visível de uma recusa fica na tela. */
15
+ export declare const TEMPO_AVISO_MS = 5000;
16
+ /**
17
+ * Liga os anúncios aos eventos que o próprio componente emite; devolve a função que desliga.
18
+ * Recusas de desenho e de edição viram aviso visível e anúncio, a menos que o host tenha o atributo `sem-avisos`
19
+ * (o consumidor mostra o próprio aviso a partir de `cad-desenho-recusado` / `cad-edicao-recusada`).
20
+ */
15
21
  export declare function conectarAnuncios(host: HTMLElement, shadow: ShadowRoot): () => void;
@@ -20,10 +20,15 @@ export interface PortasEdicao {
20
20
  snapAtivo: () => boolean;
21
21
  alternarSnap: () => void;
22
22
  buscarSnapEm: (coord: [number, number], excluir?: ExcluirSnap) => ReturnType<typeof import('../../gerencigeo-canvas/feature_snap').buscarSnap>;
23
+ /** Feições selecionadas agora (o botão "Editar" e o Enter editam quando há exatamente uma). */
24
+ selecionadas: () => Feicao[];
25
+ /** A edição começou (`true`) ou terminou (`false`), para refletir no botão "Editar" da barra. */
26
+ aoEdicao?: (ativa: boolean) => void;
23
27
  }
24
28
  export declare class EdicaoFeicoes {
25
29
  private p;
26
30
  private editor;
31
+ private pararDeVigiarCamada;
27
32
  constructor(p: PortasEdicao);
28
33
  get editando(): boolean;
29
34
  /** @internal Editor de vértices da camada L2 (`null` fora da edição). */
@@ -33,5 +38,13 @@ export declare class EdicaoFeicoes {
33
38
  sincronizar(feicao: Feicao): void;
34
39
  atualizarSnapNoHud(): void;
35
40
  iniciarEdicao(camadaId: string, id: string): ResultadoEdicao;
41
+ /** Camada ocultada, bloqueada ou removida no meio da edição encerra a edição (as alças gravariam numa camada que não aceita). */
42
+ private vigiarCamada;
43
+ /** A única feição selecionada, se puder ser editada agora (sem emitir recusa). */
44
+ private selecionadaEditavel;
45
+ /** Enter: edita a única feição selecionada, se ela for editável. Devolve se a edição começou. */
46
+ editarSelecionada(): boolean;
47
+ /** Botão "Editar" da barra: encerra a edição em curso ou edita a feição selecionada (uma só). */
48
+ alternarEdicaoDaSelecao(): ResultadoEdicao;
36
49
  parar(): void;
37
50
  }
@@ -1,6 +1,7 @@
1
1
  import { Feicao, LatLonPar } from '../../gerencigeo-canvas/feature_types';
2
2
  export interface PortasPonteiro {
3
- emitir: (evento: string, detalhe: unknown) => unknown;
3
+ /** Com `cancelavel`, devolve `true` se algum ouvinte chamou `preventDefault()`. */
4
+ emitir: (evento: string, detalhe: unknown, cancelavel?: boolean) => unknown;
4
5
  feicaoSob: (clientX: number, clientY: number) => {
5
6
  feicao: Feicao | null;
6
7
  coordenada: LatLonPar;
@@ -11,6 +12,8 @@ export interface PortasPonteiro {
11
12
  botaoDireitoDaFerramenta: () => boolean;
12
13
  /** Pedido explícito de informações: abre o popup da feição. */
13
14
  abrirPopup?: (feicao: Feicao) => void;
15
+ /** O duplo clique pode abrir o popup (falso com `popups="desligado"`). Sem a função, pode. */
16
+ popupNoDuploClique?: () => boolean;
14
17
  }
15
18
  export declare class PonteiroFeicoes {
16
19
  private p;
@@ -21,7 +24,10 @@ export declare class PonteiroFeicoes {
21
24
  aoMoverMouse(e: MouseEvent): void;
22
25
  /** Botão direito: emite `cad-feicao-menu` com a feição sob o cursor (ou `null`), para o consumidor abrir o próprio menu. */
23
26
  menuContexto(e: MouseEvent): void;
24
- /** Duplo clique sobre uma feição: pedido de informações (popup). Ignorado durante desenho ou edição de vértices. */
27
+ /**
28
+ * Duplo clique sobre uma feição: emite `cad-feicao-duplo-clique` (cancelável, para o consumidor assumir o gesto) e,
29
+ * se ninguém chamar `preventDefault()`, abre o popup (pedido de informações). Ignorado durante desenho ou edição de vértices.
30
+ */
25
31
  duploClique(e: MouseEvent): void;
26
32
  /** Esquece a feição sob o cursor (ao destruir o componente). */
27
33
  limpar(): void;
@@ -0,0 +1,19 @@
1
+ export interface PortasTecladoEdicao {
2
+ /** Edição de vértices ou ferramenta de desenho em andamento: elas tratam o próprio Enter. */
3
+ ocupado: () => boolean;
4
+ /** Os atalhos do canvas valem agora (mouse sobre ele, foco dentro dele ou canvas único na página)? */
5
+ atalhosValem: () => boolean;
6
+ /** Edita a única feição selecionada, se houver uma editável. Devolve se a edição começou. */
7
+ editarSelecionada: () => boolean;
8
+ }
9
+ /** Enter "limpo": sem modificadores, não tratado antes, fora de campos de texto e de botões/links em foco. */
10
+ export declare function enterLivre(e: KeyboardEvent): boolean;
11
+ export declare class TecladoEdicao {
12
+ private p;
13
+ private ouvintes;
14
+ constructor(p: PortasTecladoEdicao);
15
+ /** Idempotente: reconectar não duplica o ouvinte. */
16
+ conectar(alvo?: EventTarget): void;
17
+ desconectar(): void;
18
+ private aoTecla;
19
+ }
@@ -49,5 +49,5 @@ export interface ResultadoFerramenta {
49
49
  }
50
50
  export interface ResultadoEdicao {
51
51
  ok: boolean;
52
- motivo?: MotivoRecusaEdicao | 'inexistente' | 'sem-mapa';
52
+ motivo?: MotivoRecusaEdicao | 'inexistente' | 'sem-mapa' | 'sem-selecao';
53
53
  }
@@ -33,6 +33,13 @@ interface Contexto {
33
33
  modoPopups?: () => ModoPopups;
34
34
  /** Executa a abertura de um popup como pedido explícito, passando pelo portão de popups do mapa. */
35
35
  liberarPopups?: <T>(fn: () => T) => T;
36
+ /** A edição de vértices começou (`true`) ou terminou (`false`), para refletir no botão da barra. */
37
+ aoEdicao?: (ativa: boolean) => void;
38
+ /**
39
+ * Os atalhos de teclado do canvas (S do snap, Enter para editar) valem agora? O componente responde que sim com o mouse
40
+ * sobre ele ou o foco dentro dele; sem esta função, valem sempre (a edição e as ferramentas em andamento também sempre valem).
41
+ */
42
+ atalhoValido?: () => boolean;
36
43
  }
37
44
  export declare class GerenciadorFeicoes {
38
45
  private contexto;
@@ -40,6 +47,7 @@ export declare class GerenciadorFeicoes {
40
47
  private selecao;
41
48
  private popup;
42
49
  private edicao;
50
+ private teclado;
43
51
  private consulta;
44
52
  private ponteiro;
45
53
  private regiao;
@@ -91,7 +99,7 @@ export declare class GerenciadorFeicoes {
91
99
  private modoPopups;
92
100
  /** Pedido explícito: abre o popup da feição (vale em qualquer modo). `false` se não existe, foi excluída ou não está na tela. */
93
101
  abrirPopupFeicao(camadaId: string, id: string): boolean;
94
- /** Duplo clique no mapa: abre o popup da feição sob o cursor (a não ser que os popups estejam desligados). */
102
+ /** Duplo clique no mapa: `cad-feicao-duplo-clique` (cancelável) e, se ninguém assumir, o popup da feição sob o cursor. */
95
103
  aoDuploClique(e: MouseEvent): void;
96
104
  /** Opções do popup (hoje: se "copiar" escreve na área de transferência). Mescla com o que já foi definido. */
97
105
  definirOpcoesPopup(opcoes: OpcoesPopup): void;
@@ -140,6 +148,9 @@ export declare class GerenciadorFeicoes {
140
148
  alternarSnap(): void;
141
149
  conectarTeclado(): void;
142
150
  desconectarTeclado(): void;
151
+ private atalhosValem;
152
+ /** Botão "Editar" da barra: encerra a edição em curso ou edita a feição selecionada (uma só). */
153
+ alternarEdicaoDaSelecao(): ResultadoEdicao;
143
154
  /** Feições visíveis cujo envelope toca um quadrado de `tolPx` px em volta de `coord`. */
144
155
  private candidatasEm;
145
156
  /** Snap de uma coordenada contra as feições visíveis de todas as camadas de feições (via índice espacial). */
@@ -1,15 +1,22 @@
1
1
  import { Ferramenta } from '../../gerencigeo-canvas/feature_desenho';
2
2
  /** Interpreta o atributo; nomes desconhecidos são ignorados e a ordem da barra é sempre a canônica. */
3
3
  export declare function interpretarFerramentas(valor: string | null): Ferramenta[];
4
+ /** O atributo pede o botão "Editar" (edição de vértices da feição selecionada)? Vale em "todas" ou com a palavra `editar`. */
5
+ export declare function barraPedeEdicao(valor: string | null): boolean;
4
6
  export interface ContextoBarraFerramentas {
5
7
  raiz: HTMLElement;
6
8
  aoEscolher: (ferramenta: Ferramenta) => void;
9
+ /** Clique em "Editar". Sem isto o botão não é montado. */
10
+ aoEditar?: () => void;
7
11
  }
8
12
  export declare class BarraFerramentas {
9
13
  private ctx;
10
14
  private barra;
11
15
  constructor(ctx: ContextoBarraFerramentas);
12
- montar(ferramentas: Ferramenta[]): void;
16
+ montar(ferramentas: Ferramenta[], comEdicao?: boolean): void;
17
+ private editando;
18
+ /** Reflete no botão "Editar" se a edição está em curso. */
19
+ marcarEdicao(ativa: boolean): void;
13
20
  marcar(ativa: Ferramenta | null): void;
14
21
  desmontar(): void;
15
22
  }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Textos (pt-BR) das recusas do <ui-canvas-cad>: o motivo que sai em `cad-desenho-recusado` e `cad-edicao-recusada`
3
+ * vira uma frase para o aviso visível e para o leitor de tela. Funções puras; motivo desconhecido recebe um texto genérico.
4
+ */
5
+ export declare function textoDesenhoRecusado(motivo: unknown): string;
6
+ export declare function textoEdicaoRecusada(motivo: unknown): string;
@@ -5,6 +5,8 @@ export interface ContextoControleSnap {
5
5
  ligado: boolean;
6
6
  temporario: boolean;
7
7
  }) => void;
8
+ /** A tecla S só vale quando isto devolve `true` (ex.: mouse sobre o canvas ou foco dentro dele). Sem a função, vale sempre. */
9
+ aplica?: () => boolean;
8
10
  /** Alvo dos listeners de teclado (padrão: window). */
9
11
  alvo?: Pick<Window, 'addEventListener' | 'removeEventListener'>;
10
12
  }
@@ -31,10 +31,17 @@ export declare class UICanvasCAD extends SafeHTMLElement {
31
31
  private estilosExternos;
32
32
  private lastPopupActionEmit?;
33
33
  private lastCanvasClickTime;
34
+ /** Mouse sobre o componente: junto com o foco dentro dele, decide se S e Enter valem quando há vários canvases na página. */
35
+ private ponteiroSobre;
34
36
  private _chaveGrupo?;
35
37
  private _zonaProjecao;
36
38
  constructor();
37
39
  connectedCallback(): void;
40
+ private montarBarra;
41
+ /** Único canvas da página: os atalhos valem em qualquer lugar (comportamento de sempre). Com vários, só no que está sob o mouse ou com foco. */
42
+ private ehUnicoCanvas;
43
+ /** O foco do teclado está dentro do componente (inclusive no shadow DOM)? */
44
+ private matchesFocoInterno;
38
45
  destroy(): void;
39
46
  disconnectedCallback(): void;
40
47
  invalidateSizeSafely(): void;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Quando um clique ou uma tecla vinda de dentro do card deve ativá-lo.
3
+ * Responsabilidade única: decidir, sem tocar no DOM, se o evento pertence ao card ou a um controle interno.
4
+ */
5
+ /**
6
+ * O alvo é (ou está dentro de) um controle com comportamento próprio, entre ele e a `raiz` (o host do card)?
7
+ * Aceita `Element`, e não só `HTMLElement`: o alvo de um clique num ícone é o `<path>` do SVG.
8
+ * Controles fora da `raiz` não contam (um card dentro de um `<a>` ou `<label>` continua clicável), e o próprio
9
+ * host e o `role="button"` da base do card não são "controle interno".
10
+ */
11
+ export declare function ehControleInterno(alvo: EventTarget | null | undefined, raiz: Element): boolean;
12
+ /**
13
+ * A tecla ativa o card? Só Enter/Espaço pressionados no próprio card, sem repetição (tecla mantida) e sem
14
+ * Ctrl/Alt/Meta. Teclas vindas de controles internos (campo, botão) não são do card: ativá-lo e chamar
15
+ * `preventDefault` impediria digitar espaço num `<input>` ou acionar o botão.
16
+ */
17
+ export declare function teclaAtivaCard(e: Pick<KeyboardEvent, 'key' | 'repeat' | 'ctrlKey' | 'altKey' | 'metaKey' | 'target'>, base: EventTarget): boolean;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Seções opcionais do card (mídia, cabeçalho, rodapé).
3
+ * Responsabilidade única: dizer se um grupo de slots (nome em português e alias em inglês) tem conteúdo.
4
+ */
5
+ /**
6
+ * Há conteúdo atribuído a algum dos slots `nomes`? Conta elementos e texto não vazio (espaços e quebras de linha
7
+ * entre as tags não contam). Também olha os filhos diretos do host com `slot="..."`, que cobre o intervalo antes do
8
+ * `slotchange`. Só filhos diretos: um `[slot]` aninhado em outro elemento pertence a outro componente.
9
+ */
10
+ export declare function secaoTemConteudo(raiz: ShadowRoot | null, host: Element, nomes: readonly string[]): boolean;
@@ -1,4 +1,24 @@
1
1
  import { SafeHTMLElement } from '../../core/ssr-safe';
2
+ /**
3
+ * Cartão de conteúdo com mídia, cabeçalho, corpo e rodapé opcionais; pode ser clicável (vira um botão).
4
+ *
5
+ * @attr {'plano'|'elevado'|'destaque'} elevacao - Profundidade visual (alias `elevation`).
6
+ * @attr {'plano'|'elevado'|'destaque'} variante - Estilo adicional (alias `variant`); valores desconhecidos são ignorados.
7
+ * @attr {boolean} clicavel - Torna o card um botão focável que emite `ui-clique` (alias `clickable`).
8
+ * @attr {boolean} compacto - Reduz os espaçamentos internos (alias `compact`).
9
+ * @attr {boolean} disabled - Desativa a interação e reduz a opacidade.
10
+ * @attr {string} aria-label - Nome acessível do card clicável (um card sem clique não é anunciado como controle).
11
+ * @slot - Corpo do card.
12
+ * @slot midia - Imagem ou vídeo no topo (alias `media`).
13
+ * @slot cabecalho - Título e ações (alias `header`); a seção some quando vazia.
14
+ * @slot rodape - Ações e metadados (alias `footer`); a seção some quando vazia.
15
+ * @csspart base - O contêiner do card.
16
+ * @csspart midia - A seção de mídia.
17
+ * @csspart cabecalho - A seção de cabeçalho.
18
+ * @csspart corpo - A seção do corpo.
19
+ * @csspart rodape - A seção de rodapé.
20
+ * @fires ui-clique - Card clicável ativado por clique, Enter ou Espaço (`detail.id`); também emitido como `ui-click`.
21
+ */
2
22
  export declare class UICard extends SafeHTMLElement {
3
23
  static get observedAttributes(): string[];
4
24
  private cardElement;
@@ -8,6 +28,8 @@ export declare class UICard extends SafeHTMLElement {
8
28
  disconnectedCallback(): void;
9
29
  attributeChangedCallback(_name: string, _old: string | null, _value: string | null): void;
10
30
  private handleSlotChange;
31
+ /** Leva o foco ao card clicável e habilitado; nos demais casos mantém o comportamento nativo do host. */
32
+ focus(options?: FocusOptions): void;
11
33
  get clicavel(): boolean;
12
34
  set clicavel(val: boolean);
13
35
  get disabled(): boolean;
@@ -15,4 +37,5 @@ export declare class UICard extends SafeHTMLElement {
15
37
  private syncState;
16
38
  private handleClick;
17
39
  private handleKeyDown;
40
+ private emitirClique;
18
41
  }
@@ -8,6 +8,8 @@ export declare const PALETA_CORES_PADRAO: readonly string[];
8
8
  export declare function normalizarCor(cor: unknown): ValorCor | null;
9
9
  /** Limita a opacidade a [0, 1]; valores inválidos viram `padrao`. */
10
10
  export declare function normalizarOpacidade(valor: unknown, padrao?: number): number;
11
+ /** Limita a espessura do traço (em px) a [0.5, 50]; valores inválidos viram `padrao` (2.5). */
12
+ export declare function normalizarEspessura(valor: unknown, padrao?: number): number;
11
13
  /** Lista de cores válidas e sem repetição, na ordem recebida. */
12
14
  export declare function coresUnicas(cores: unknown): string[];
13
15
  export declare function escaparHtml(texto: unknown): string;
@@ -15,6 +15,8 @@ export interface DetalheSeletorCor {
15
15
  traco: ValorCor;
16
16
  /** Opacidade do preenchimento, de 0 a 1. */
17
17
  opacidade: number;
18
+ /** Espessura do traçado em pixels (para linhas, contornos e formas CAD). */
19
+ espessuraTraco?: number;
18
20
  }
19
21
  /** Opções de `abrirSeletorCor()`. */
20
22
  export interface OpcoesSeletorCor {
@@ -35,6 +37,10 @@ export interface OpcoesSeletorCor {
35
37
  opacidade?: number;
36
38
  /** Mostra o controle de opacidade. Padrão: só quando o alvo é o preenchimento. */
37
39
  mostrarOpacidade?: boolean;
40
+ /** Espessura inicial do traçado em pixels (padrão 2.5). */
41
+ espessuraTraco?: number;
42
+ /** Mostra o controle de espessura do traçado. Padrão: só quando o alvo é o traço. */
43
+ mostrarEspessura?: boolean;
38
44
  /** A cor inicial representa uma seleção com cores diferentes (mostra "MISTO"). */
39
45
  misto?: boolean;
40
46
  /** Cores extras oferecidas em "Cores do projeto" (duplicadas e inválidas são ignoradas). */
@@ -64,13 +70,14 @@ export interface DetalheControleCores {
64
70
  preenchimento: ValorCor;
65
71
  traco: ValorCor;
66
72
  opacidade: number;
73
+ espessuraTraco?: number;
67
74
  alvo: AlvoCor;
68
75
  /** `false` durante a pré-visualização no seletor; `true` quando a alteração deve ser gravada. */
69
76
  confirmado: boolean;
70
77
  /** Quais valores mudaram. */
71
- alterados: Array<'preenchimento' | 'traco' | 'opacidade'>;
78
+ alterados: Array<'preenchimento' | 'traco' | 'opacidade' | 'espessuraTraco'>;
72
79
  /** O que gerou a mudança. */
73
- origem: 'seletor' | 'inverter' | 'sem-cor' | 'padrao';
80
+ origem: 'seletor' | 'inverter' | 'sem-cor' | 'padrao' | 'espessura';
74
81
  }
75
82
  /** Textos de atalho exibidos nas dicas dos botões (o kit não registra os atalhos; quem usa decide). */
76
83
  export interface AtalhosControleCores {
@@ -2,7 +2,7 @@ import { SafeHTMLElement } from '../../core/ssr-safe';
2
2
  import { AlvoCor, AtalhosControleCores, ValorCor } from './tipos';
3
3
  /**
4
4
  * <ui-controle-cores> — par de cores de desenho no estilo Illustrator: preenchimento na frente,
5
- * traço atrás, e botões de canto para inverter, "sem cor" e restaurar o padrão.
5
+ * traço atrás, espessura do traçado e botões de canto para inverter, "sem cor" e restaurar o padrão.
6
6
  *
7
7
  * - Clique na amostra de trás: ela vira o alvo ativo. Clique no alvo ativo (ou duplo clique,
8
8
  * Enter, Espaço): abre o `<ui-seletor-cor>` ao lado.
@@ -11,9 +11,9 @@ import { AlvoCor, AtalhosControleCores, ValorCor } from './tipos';
11
11
  * - O kit não registra atalhos de teclado; quem usa chama `alternarAlvo()`, `inverter()`,
12
12
  * `semCor()` e `restaurarPadrao()` e pode exibir as teclas nas dicas via `atalhos`.
13
13
  *
14
- * Atributos: preenchimento, traco, opacidade, alvo (preenchimento|traco), padrao-preenchimento,
14
+ * Atributos: preenchimento, traco, opacidade, espessura-traco, alvo (preenchimento|traco), padrao-preenchimento,
15
15
  * padrao-traco, titulo-seletor, so-traco, desabilitado
16
- * Propriedades: preenchimento, traco, opacidade, alvo, coresProjeto, atalhos, seletorAberto
16
+ * Propriedades: preenchimento, traco, opacidade, espessuraTraco, alvo, coresProjeto, atalhos, seletorAberto
17
17
  * Métodos: definirCores(), obterCores(), definirAlvo(), alternarAlvo(), definirMisto(), inverter(),
18
18
  * semCor(), restaurarPadrao(), abrirSeletor(), fecharSeletor()
19
19
  * Eventos: ui-cores-change (DetalheControleCores), ui-alvo-change { alvo }
@@ -26,6 +26,7 @@ export declare class UIControleCores extends SafeHTMLElement {
26
26
  private _preenchimento;
27
27
  private _traco;
28
28
  private _opacidade;
29
+ private _espessuraTraco;
29
30
  private _alvo;
30
31
  private _misto;
31
32
  private _padrao;
@@ -43,6 +44,8 @@ export declare class UIControleCores extends SafeHTMLElement {
43
44
  set traco(v: ValorCor);
44
45
  get opacidade(): number;
45
46
  set opacidade(v: number);
47
+ get espessuraTraco(): number;
48
+ set espessuraTraco(v: number);
46
49
  get alvo(): AlvoCor;
47
50
  set alvo(v: AlvoCor);
48
51
  /** Cores oferecidas em "Cores do projeto" no seletor. */
@@ -52,16 +55,18 @@ export declare class UIControleCores extends SafeHTMLElement {
52
55
  get atalhos(): AtalhosControleCores;
53
56
  set atalhos(v: AtalhosControleCores);
54
57
  get seletorAberto(): boolean;
55
- /** Define cores e/ou opacidade sem emitir eventos. Valores inválidos são ignorados; uma cor definida deixa de ser "mista". */
58
+ /** Define cores, opacidade e/ou espessura sem emitir eventos. Valores inválidos são ignorados; uma cor definida deixa de ser "mista". */
56
59
  definirCores(cores?: {
57
60
  preenchimento?: ValorCor;
58
61
  traco?: ValorCor;
59
62
  opacidade?: number;
63
+ espessuraTraco?: number;
60
64
  }): void;
61
65
  obterCores(): {
62
66
  preenchimento: ValorCor;
63
67
  traco: ValorCor;
64
68
  opacidade: number;
69
+ espessuraTraco: number;
65
70
  alvo: AlvoCor;
66
71
  };
67
72
  /** Marca a amostra como ativa sem emitir eventos. */
@@ -3,14 +3,11 @@ import { AlvoCor, DetalheSeletorCor, OpcoesSeletorCor, SeletorCorAberto, ValorCo
3
3
  /** Configuração aceita por `UISeletorCor.configurar()` (as opções de `abrirSeletorCor` sem âncora e callbacks). */
4
4
  export type ConfiguracaoSeletorCor = Omit<OpcoesSeletorCor, 'ancora' | 'focar' | 'aoAlterar' | 'aoConfirmar' | 'aoCancelar' | 'aoTrocarAlvo'>;
5
5
  /**
6
- * <ui-seletor-cor> — painel de cor no estilo Illustrator: abas Preenchimento/Traço, prévia
7
- * antes × depois, hexadecimal, seletor do sistema, opacidade do preenchimento, cores do projeto,
8
- * paleta padrão e "sem cor".
6
+ * <ui-seletor-cor> — painel de cor e estilo CAD: abas Preenchimento/Traço, prévia
7
+ * antes × depois com espessura real, hexadecimal, seletor do sistema, espessura do traçado (px),
8
+ * opacidade do preenchimento, cores do projeto, paleta padrão e "sem cor".
9
9
  *
10
- * Normalmente aberto por `abrirSeletorCor()`, que posiciona o painel junto a uma âncora e cuida
11
- * de fechar com Esc ou clique fora. Pode também ser usado direto no DOM.
12
- *
13
- * Métodos: configurar(opcoes), trocarAlvo(alvo), definirCor(cor), definirOpacidade(v),
10
+ * Métodos: configurar(opcoes), trocarAlvo(alvo), definirCor(cor), definirOpacidade(v), definirEspessura(v),
14
11
  * confirmar(), cancelar(), obterEstado()
15
12
  * Eventos: ui-cor-input (pré-visualização), ui-cor-confirmar, ui-cor-cancelar — detail: DetalheSeletorCor;
16
13
  * ui-alvo-change { alvo }
@@ -25,6 +22,8 @@ export declare class UISeletorCor extends SafeHTMLElement {
25
22
  private _traco;
26
23
  private _opacidade;
27
24
  private _mostrarOpacidade;
25
+ private _espessura;
26
+ private _mostrarEspessura;
28
27
  private _misto;
29
28
  private _coresProjeto;
30
29
  private _paleta;
@@ -38,6 +37,7 @@ export declare class UISeletorCor extends SafeHTMLElement {
38
37
  /** Cor do alvo em edição. */
39
38
  get cor(): ValorCor;
40
39
  get opacidade(): number;
40
+ get espessura(): number;
41
41
  obterEstado(): DetalheSeletorCor;
42
42
  /** Alterna entre Preenchimento e Traço (só no modo duplo). */
43
43
  trocarAlvo(alvo: AlvoCor): void;
@@ -45,10 +45,13 @@ export declare class UISeletorCor extends SafeHTMLElement {
45
45
  definirCor(cor: ValorCor): void;
46
46
  /** Opacidade do preenchimento (0 a 1); emite `ui-cor-input`. */
47
47
  definirOpacidade(valor: number): void;
48
+ /** Espessura do traço em pixels (0.5 a 50); emite `ui-cor-input`. */
49
+ definirEspessura(valor: number): void;
48
50
  confirmar(): void;
49
- /** Restaura as cores iniciais (emitindo `ui-cor-input`) e emite `ui-cor-cancelar`. */
51
+ /** Restaura os valores iniciais (emitindo `ui-cor-input`) e emite `ui-cor-cancelar`. */
50
52
  cancelar(): void;
51
53
  private get opacidadeVisivel();
54
+ private get espessuraVisivel();
52
55
  private renderizar;
53
56
  private atualizarVisual;
54
57
  /** `activeElement` lança em alguns DOMs simulados quando o foco está em outra árvore de sombra. */
@@ -60,7 +63,7 @@ export declare class UISeletorCor extends SafeHTMLElement {
60
63
  * Abre um `<ui-seletor-cor>` flutuante ao lado de `ancora` (à direita; à esquerda se não couber).
61
64
  * Só um seletor fica aberto por vez: abrir outro descarta o anterior sem confirmar.
62
65
  * Fecha confirmando com Concluir, ✕, Enter no hexadecimal, Esc ou clique fora; "Cancelar"
63
- * restaura as cores iniciais. `X` alterna Preenchimento/Traço enquanto ele está aberto.
66
+ * restaura as cores e espessura iniciais. `X` alterna Preenchimento/Traço enquanto ele está aberto.
64
67
  */
65
68
  export declare function abrirSeletorCor(opcoes: OpcoesSeletorCor): SeletorCorAberto;
66
69
  /** Fecha o seletor aberto por `abrirSeletorCor()`, se houver. */
@@ -1,5 +1,5 @@
1
1
  import { ItemPropriedade, ContextoEditorPropriedade } from './tipos';
2
- export declare function criarEditorReadonly(valorAtual: any): HTMLElement;
2
+ export declare function criarEditorReadonly(valorAtual: any, obterTextoMisto?: () => string): HTMLElement;
3
3
  export declare function criarEditorBooleano(categoriaId: string, prop: ItemPropriedade, valorAtual: any, ctx: ContextoEditorPropriedade): HTMLElement;
4
4
  export declare function criarEditorSelecao(categoriaId: string, prop: ItemPropriedade, valorAtual: any, ctx: ContextoEditorPropriedade): HTMLElement;
5
5
  export declare function criarEditorAcao(categoriaId: string, prop: ItemPropriedade, ctx: ContextoEditorPropriedade): HTMLElement;