@thibezer/ui-components-kit 2.10.0 → 2.11.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 (66) hide show
  1. package/CHANGELOG.md +499 -436
  2. package/README.md +2 -2
  3. package/dist/camadas.cjs +1 -1
  4. package/dist/camadas.js +1 -1
  5. package/dist/canvas.cjs +74 -74
  6. package/dist/canvas.js +3310 -2819
  7. package/dist/components/ui-canvas-cad/cad-feicoes-edicao.d.ts +13 -0
  8. package/dist/components/ui-canvas-cad/cad-feicoes-ponteiro.d.ts +8 -2
  9. package/dist/components/ui-canvas-cad/cad-feicoes-teclado.d.ts +19 -0
  10. package/dist/components/ui-canvas-cad/cad-feicoes-tipos.d.ts +1 -1
  11. package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +12 -1
  12. package/dist/components/ui-canvas-cad/cad-ferramentas-barra.d.ts +8 -1
  13. package/dist/components/ui-canvas-cad/cad-linha-padrao.d.ts +27 -0
  14. package/dist/components/ui-canvas-cad/cad-snap.d.ts +2 -0
  15. package/dist/components/ui-canvas-cad/index.d.ts +2 -0
  16. package/dist/components/ui-canvas-cad/tipos.d.ts +25 -4
  17. package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +17 -1
  18. package/dist/components/ui-cores/cores-utils.d.ts +2 -0
  19. package/dist/components/ui-cores/tipos.d.ts +9 -2
  20. package/dist/components/ui-cores/ui-controle-cores.d.ts +9 -4
  21. package/dist/components/ui-cores/ui-seletor-cor.d.ts +12 -9
  22. package/dist/components/ui-tabela-propriedades/editores-basicos.d.ts +1 -1
  23. package/dist/components/ui-tabela-propriedades/propriedades-dom-utils.d.ts +5 -0
  24. package/dist/components/ui-tabela-propriedades/propriedades-gerenciador-valores.d.ts +3 -3
  25. package/dist/components/ui-tabela-propriedades/propriedades-valor-misto.d.ts +25 -0
  26. package/dist/components/ui-tabela-propriedades/tipos.d.ts +5 -0
  27. package/dist/components/ui-tabela-propriedades/ui-tabela-propriedades.d.ts +7 -0
  28. package/dist/cores.cjs +1 -1
  29. package/dist/cores.js +12 -11
  30. package/dist/custom-elements.json +5527 -4665
  31. package/dist/data.cjs +1 -1
  32. package/dist/data.js +72 -64
  33. package/dist/gerencigeo-canvas/feature_desenho.d.ts +2 -0
  34. package/dist/gerencigeo-canvas/feature_desenho_controle.d.ts +3 -0
  35. package/dist/gerencigeo-canvas/feature_editor_vertices.d.ts +51 -4
  36. package/dist/gerencigeo-canvas/feature_types.d.ts +17 -0
  37. package/dist/gerencigeo-canvas/motor/estilo.d.ts +8 -0
  38. package/dist/gerencigeo-canvas/motor/index.d.ts +1 -0
  39. package/dist/gerencigeo-canvas/motor/tipos-linha.d.ts +22 -0
  40. package/dist/gerencigeo-canvas/renderers/renderizador_formas.d.ts +2 -0
  41. package/dist/gerencigeo-canvas/types.d.ts +11 -0
  42. package/dist/index.cjs +1 -1
  43. package/dist/index.js +154 -145
  44. package/dist/motor-BCWqlv3e.cjs +1 -0
  45. package/dist/motor-CXjQjVba.js +1386 -0
  46. package/dist/motor.cjs +1 -1
  47. package/dist/motor.js +45 -38
  48. package/dist/register.cjs +1 -1
  49. package/dist/register.js +3 -3
  50. package/dist/tabela.cjs +1 -1
  51. package/dist/tabela.js +66 -58
  52. package/dist/tipos-elementos.d.ts +13 -0
  53. package/dist/tipos-vue.d.ts +11 -0
  54. package/dist/ui-controle-cores-CohlwXJK.cjs +32 -0
  55. package/dist/{ui-controle-cores-BEUKOq4n.js → ui-controle-cores-DMtTUtLk.js} +98 -81
  56. package/dist/ui-seletor-cor-D9iI7yew.js +413 -0
  57. package/dist/ui-seletor-cor-Ft06TEUH.cjs +110 -0
  58. package/dist/ui-tabela-propriedades-B8AwlpqL.cjs +141 -0
  59. package/dist/{ui-tabela-propriedades-DoL4SE0r.js → ui-tabela-propriedades-DuaC4sFX.js} +1295 -1195
  60. package/package.json +1 -1
  61. package/dist/motor-BB6tB6U-.cjs +0 -1
  62. package/dist/motor-CFI84lM2.js +0 -1301
  63. package/dist/ui-controle-cores-BLhrZHMh.cjs +0 -32
  64. package/dist/ui-seletor-cor-2yGryC_Z.cjs +0 -86
  65. package/dist/ui-seletor-cor-BuyhoDZz.js +0 -345
  66. package/dist/ui-tabela-propriedades-CjK2gG14.cjs +0 -141
@@ -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,27 @@
1
+ import { EstiloFeicao } from '../../gerencigeo-canvas/feature_types';
2
+ import { OpcoesLinhaPadrao } from './tipos';
3
+ /** Atributo HTML → chave da linha padrão. */
4
+ export declare const ATRIBUTOS_LINHA_PADRAO: {
5
+ readonly 'linha-cor': "cor";
6
+ readonly 'linha-espessura': "espessura";
7
+ readonly 'linha-tipo': "tipo";
8
+ readonly 'linha-escala': "escala";
9
+ readonly 'linha-tracejado': "tracejado";
10
+ readonly 'linha-deslocamento': "deslocamento";
11
+ readonly 'linha-opacidade': "opacidade";
12
+ readonly 'linha-terminacao': "terminacao";
13
+ readonly 'linha-juncao': "juncao";
14
+ };
15
+ export type AtributoLinhaPadrao = keyof typeof ATRIBUTOS_LINHA_PADRAO;
16
+ export declare function ehAtributoLinhaPadrao(nome: string): nome is AtributoLinhaPadrao;
17
+ /** Valor saneado de uma opção; `undefined` = inválido ou ausente (a opção sai do estilo de desenho). */
18
+ export declare function sanearOpcaoLinha(chave: keyof OpcoesLinhaPadrao, valor: unknown): EstiloFeicao[keyof EstiloFeicao] | undefined;
19
+ /**
20
+ * Mescla `opcoes` no estilo de desenho e devolve o novo estilo (o original não é tocado). Chave presente com valor
21
+ * `null`, `undefined` ou inválido remove a opção; chave ausente fica como está.
22
+ */
23
+ export declare function mesclarLinhaPadrao(estilo: EstiloFeicao, opcoes: Partial<Record<keyof OpcoesLinhaPadrao, unknown>> | null | undefined): EstiloFeicao;
24
+ /** A linha padrão vista a partir do estilo de desenho (só as opções definidas). */
25
+ export declare function lerLinhaPadrao(estilo: EstiloFeicao): OpcoesLinhaPadrao;
26
+ /** Atributo `linha-*` mudou: a opção correspondente, pronta para `mesclarLinhaPadrao`. */
27
+ export declare function opcaoDoAtributo(nome: AtributoLinhaPadrao, valor: string | null): Partial<Record<keyof OpcoesLinhaPadrao, unknown>>;
@@ -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
  }
@@ -2,6 +2,8 @@ export * from './ui-canvas-cad';
2
2
  export * from './cad-painel-camadas';
3
3
  export * from './cad-eventos-canvas';
4
4
  export * from './cad-tamanho-observer';
5
+ export type { OpcoesLinhaPadrao } from './tipos';
6
+ export { ATRIBUTOS_LINHA_PADRAO } from './cad-linha-padrao';
5
7
  export * from '../../gerencigeo-canvas/types';
6
8
  export * from '../../gerencigeo-canvas/layer_manager';
7
9
  export * from '../../gerencigeo-canvas/layer_renderer_factory';
@@ -1,7 +1,4 @@
1
- /**
2
- * Tipos "emprestados" do Leaflet e do contexto do mapa usados pelo <ui-canvas-cad>.
3
- * Responsabilidade única: descrever, em um só lugar, as formas dinâmicas que o código antes acessava com `as any`.
4
- */
1
+ import { JuncaoTraco, TerminacaoTraco, TipoLinha } from '../../gerencigeo-canvas/motor/tipos-linha';
5
2
  /** Contêiner de mapa do Leaflet: o Leaflet marca o elemento com `_leaflet_id` ao inicializar. */
6
3
  export type ContainerLeaflet = HTMLElement & {
7
4
  _leaflet_id?: number;
@@ -35,3 +32,27 @@ export interface ElementoComCoordenadas {
35
32
  latitude?: number | string;
36
33
  longitude?: number | string;
37
34
  }
35
+ /**
36
+ * Linha padrão do <ui-canvas-cad> (`definirLinhaPadrao` e atributos `linha-*`): o traço das feições desenhadas daqui
37
+ * para frente. Cada opção vira um campo do estilo de desenho (`EstiloFeicao`).
38
+ */
39
+ export interface OpcoesLinhaPadrao {
40
+ /** Cor do traço (hex, rgb/hsl ou nome) → `corTraco`. */
41
+ cor?: string;
42
+ /** Espessura em px (0 a 100) → `espessuraTraco`. */
43
+ espessura?: number;
44
+ /** Tipo de linha CAD → `tipoLinha`. */
45
+ tipo?: TipoLinha;
46
+ /** Escala do tipo de linha (LTSCALE) → `escalaTipoLinha`. */
47
+ escala?: number;
48
+ /** Tracejado explícito ("8 4 2 4"), vence `tipo` → `dashArray`. */
49
+ tracejado?: string;
50
+ /** Deslocamento do tracejado em px → `deslocamentoTracejado`. */
51
+ deslocamento?: number;
52
+ /** Opacidade do traço, 0 a 1 → `opacidadeTraco`. */
53
+ opacidade?: number;
54
+ /** Pontas do traço → `terminacaoTraco`. */
55
+ terminacao?: TerminacaoTraco;
56
+ /** Cantos do traço → `juncaoTraco`. */
57
+ juncao?: JuncaoTraco;
58
+ }
@@ -6,7 +6,7 @@ import { ModoPopups } from '../../gerencigeo-canvas/popup_gate';
6
6
  import { ModoRenderizador } from '../../gerencigeo-canvas/renderers/feicoes_despachante';
7
7
  import { EstatisticasFeicoes } from '../../gerencigeo-canvas/renderers/renderizador_feicoes_tipos';
8
8
  import { UsuarioRemoto } from '../../gerencigeo-canvas/feature_cursores';
9
- import { EventoMapaCad, LatLngEvento } from './tipos';
9
+ import { EventoMapaCad, LatLngEvento, OpcoesLinhaPadrao } from './tipos';
10
10
  import { PontoPixel } from './cad-evento-coordenadas';
11
11
  import { OpcoesCamadaFeicoes, OpcoesLote, LoteFeicoes, ResultadoLote, ResultadoFeicoes, ResultadoEdicao, ResultadoFerramenta } from './cad-feicoes';
12
12
  import { EstiloFeicao, Feicao } from '../../gerencigeo-canvas/feature_types';
@@ -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;
@@ -177,6 +184,15 @@ export declare class UICanvasCAD extends SafeHTMLElement {
177
184
  get camadaDesenho(): string | null;
178
185
  definirEstiloDesenho(estilo: EstiloFeicao): void;
179
186
  obterEstiloDesenho(): EstiloFeicao;
187
+ /**
188
+ * Linha padrão das feições desenhadas daqui para frente (cor, espessura, tipo de linha CAD, escala, tracejado,
189
+ * deslocamento, opacidade, terminação e junção). Mescla no estilo de desenho; `null` numa opção a remove e valor
190
+ * inválido é ignorado (a opção volta ao padrão). Os atributos `linha-*` fazem o mesmo.
191
+ */
192
+ definirLinhaPadrao(opcoes: {
193
+ [K in keyof OpcoesLinhaPadrao]?: OpcoesLinhaPadrao[K] | null;
194
+ }): void;
195
+ obterLinhaPadrao(): OpcoesLinhaPadrao;
180
196
  /**
181
197
  * Ferramentas: ponto, linha, poligono, retangulo, elipse, poligono-regular, estrela, circulo, texto, caneta,
182
198
  * medir-distancia, medir-area, dividir, selecao-laco, conta-gotas. `iniciarEm` ([lat, lon]) registra o primeiro clique.
@@ -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;
@@ -16,6 +16,11 @@ export declare function atualizarCampoVisual(shadow: ShadowRoot, propId: string,
16
16
  * (`data-externa`) em vez de o select exibir a primeira opção como se fosse o valor real.
17
17
  */
18
18
  export declare function sincronizarSelect(select: HTMLSelectElement, valor: any, corresponde?: (opcao: string, valor: any) => boolean, rotuloExterno?: (valor: any) => string): void;
19
+ /**
20
+ * Exibe o estado misto ("Varia") no select: opção oculta e desabilitada, que o usuário não
21
+ * consegue escolher; qualquer outra opção vira o valor de todos os objetos.
22
+ */
23
+ export declare function marcarSelectMisto(select: HTMLSelectElement, texto: string): void;
19
24
  export declare function focarProximoEditor(shadow: ShadowRoot, atual: HTMLElement): void;
20
25
  export declare function expandirTodasCategorias(shadow: ShadowRoot, categorias: CategoriaPropriedades[]): void;
21
26
  export declare function colapsarTodasCategorias(shadow: ShadowRoot, categorias: CategoriaPropriedades[]): void;
@@ -1,4 +1,6 @@
1
1
  import { CategoriaPropriedades } from './tipos';
2
+ import { valoresIguais } from './propriedades-valor-misto';
3
+ export { valoresIguais };
2
4
  export interface ContextoGerenciadorValores {
3
5
  hostElement: HTMLElement;
4
6
  getCategorias: () => CategoriaPropriedades[];
@@ -7,8 +9,6 @@ export interface ContextoGerenciadorValores {
7
9
  onRenderCategorias: () => void;
8
10
  isModoManual: () => boolean;
9
11
  }
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;
12
12
  export declare class GerenciadorValoresPropriedades {
13
13
  private ctx;
14
14
  private valoresOriginais;
@@ -28,7 +28,7 @@ export declare class GerenciadorValoresPropriedades {
28
28
  registrarAlteracao(categoriaId: string, propId: string, novoValor: any): void;
29
29
  aplicar(): void;
30
30
  desfazer(): void;
31
- /** Marca/desmarca a linha e recalcula os botões do rodapé (voltar ao original limpa o estado). */
31
+ /** Marca/desmarca a linha (modificada e mista) e recalcula os botões do rodapé (voltar ao original limpa o estado). */
32
32
  private aposAlterar;
33
33
  private categoriaDe;
34
34
  private emitirAlteracao;
@@ -0,0 +1,25 @@
1
+ import { ContextoEditorPropriedade, ItemPropriedade } from './tipos';
2
+ /**
3
+ * Valor de uma propriedade que difere entre os objetos selecionados. `Symbol.for` mantém a
4
+ * identidade mesmo com duas cópias do pacote carregadas.
5
+ */
6
+ export declare const VALOR_MISTO: unique symbol;
7
+ /** Texto exibido no lugar do valor misto quando a aplicação não define `texto-misto`. */
8
+ export declare const TEXTO_MISTO_PADRAO = "Varia";
9
+ export declare function isValorMisto(valor: unknown): valor is typeof VALOR_MISTO;
10
+ /** Texto do estado misto definido pela aplicação, com fallback para "Varia". */
11
+ export declare function textoMistoDe(ctx: Pick<ContextoEditorPropriedade, 'obterTextoMisto'>): string;
12
+ /** Igualdade de valores de propriedade: estrita, com null/undefined equivalentes e NaN igual a NaN. */
13
+ export declare function valoresIguais(a: any, b: any): boolean;
14
+ /** Valor inicial de um item: `misto: true` tem precedência sobre `valor`. */
15
+ export declare function valorInicialDaPropriedade(prop: ItemPropriedade): any;
16
+ /**
17
+ * Valor comum a todos os itens, ou `VALOR_MISTO` se algum diferir. Lista vazia → `undefined`.
18
+ */
19
+ export declare function valorComum(valores: readonly unknown[]): any;
20
+ /**
21
+ * Combina as propriedades dos objetos selecionados: cada chave recebe o valor comum ou
22
+ * `VALOR_MISTO`. Chave ausente em algum objeto conta como valor diferente.
23
+ * Uso: `painel.valores = combinarValores(formas.map(f => f.propriedades))`.
24
+ */
25
+ export declare function combinarValores(registros: readonly unknown[]): Record<string, any>;
@@ -10,7 +10,10 @@ export interface ItemPropriedade {
10
10
  id: string;
11
11
  rotulo: string;
12
12
  tipo: TipoPropriedade;
13
+ /** Valor atual; `VALOR_MISTO` quando difere entre os objetos selecionados (exibe "Varia"). */
13
14
  valor: any;
15
+ /** Atalho para `valor: VALOR_MISTO`: a propriedade difere entre os objetos selecionados. */
16
+ misto?: boolean;
14
17
  unidade?: string;
15
18
  casasDecimais?: number;
16
19
  opcoes?: OpcaoPropriedade[];
@@ -45,4 +48,6 @@ export interface ContextoEditorPropriedade {
45
48
  registrarAlteracao: (categoriaId: string, propId: string, novoValor: any) => void;
46
49
  focarProximoEditor: (elementoAtual: HTMLElement) => void;
47
50
  despacharEventoAcao: (prop: ItemPropriedade, categoriaId: string) => void;
51
+ /** Texto exibido para valores mistos (atributo `texto-misto`); padrão "Varia". */
52
+ obterTextoMisto?: () => string;
48
53
  }
@@ -11,6 +11,7 @@ export * from './propriedades-painel-controles';
11
11
  export * from './propriedades-dom-utils';
12
12
  export * from './propriedades-flutuante';
13
13
  export * from './propriedades-densidade';
14
+ export * from './propriedades-valor-misto';
14
15
  export declare class UITabelaPropriedades extends SafeHTMLElement {
15
16
  static get observedAttributes(): string[];
16
17
  private shadow;
@@ -39,6 +40,12 @@ export declare class UITabelaPropriedades extends SafeHTMLElement {
39
40
  attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null): void;
40
41
  get categorias(): CategoriaPropriedades[];
41
42
  set categorias(novasCategorias: CategoriaPropriedades[]);
43
+ /**
44
+ * Texto exibido nas propriedades cujo valor difere entre os objetos selecionados
45
+ * (`VALOR_MISTO`). Reflete o atributo `texto-misto`; padrão "Varia".
46
+ */
47
+ get textoMisto(): string;
48
+ set textoMisto(texto: string);
42
49
  get tipos(): SeletorTipoItem[];
43
50
  set tipos(novosTipos: SeletorTipoItem[]);
44
51
  get tipoSelecionado(): string;
package/dist/cores.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */const r=require("./ui-seletor-cor-2yGryC_Z.cjs"),e=require("./ui-controle-cores-BLhrZHMh.cjs");exports.PALETA_CORES_PADRAO=r.PALETA_CORES_PADRAO;exports.UISeletorCor=r.UISeletorCor;exports.abrirSeletorCor=r.abrirSeletorCor;exports.coresUnicas=r.coresUnicas;exports.escaparHtml=r.escaparHtml;exports.fecharSeletorCor=r.fecharSeletorCor;exports.normalizarCor=r.normalizarCor;exports.normalizarOpacidade=r.normalizarOpacidade;exports.UIControleCores=e.UIControleCores;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */const r=require("./ui-seletor-cor-Ft06TEUH.cjs"),e=require("./ui-controle-cores-CohlwXJK.cjs");exports.PALETA_CORES_PADRAO=r.PALETA_CORES_PADRAO;exports.UISeletorCor=r.UISeletorCor;exports.abrirSeletorCor=r.abrirSeletorCor;exports.coresUnicas=r.coresUnicas;exports.escaparHtml=r.escaparHtml;exports.fecharSeletorCor=r.fecharSeletorCor;exports.normalizarCor=r.normalizarCor;exports.normalizarEspessura=r.normalizarEspessura;exports.normalizarOpacidade=r.normalizarOpacidade;exports.UIControleCores=e.UIControleCores;
package/dist/cores.js CHANGED
@@ -1,14 +1,15 @@
1
1
  /* empty css */
2
- import { P as e, U as s, a as t, c as l, e as C, f as c, n as i, b as m } from "./ui-seletor-cor-BuyhoDZz.js";
3
- import { U as p } from "./ui-controle-cores-BEUKOq4n.js";
2
+ import { P as s, U as e, a as l, c as t, e as i, f as m, n as C, b as c, d as n } from "./ui-seletor-cor-D9iI7yew.js";
3
+ import { U } from "./ui-controle-cores-DMtTUtLk.js";
4
4
  export {
5
- e as PALETA_CORES_PADRAO,
6
- p as UIControleCores,
7
- s as UISeletorCor,
8
- t as abrirSeletorCor,
9
- l as coresUnicas,
10
- C as escaparHtml,
11
- c as fecharSeletorCor,
12
- i as normalizarCor,
13
- m as normalizarOpacidade
5
+ s as PALETA_CORES_PADRAO,
6
+ U as UIControleCores,
7
+ e as UISeletorCor,
8
+ l as abrirSeletorCor,
9
+ t as coresUnicas,
10
+ i as escaparHtml,
11
+ m as fecharSeletorCor,
12
+ C as normalizarCor,
13
+ c as normalizarEspessura,
14
+ n as normalizarOpacidade
14
15
  };