@thibezer/ui-components-kit 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +760 -739
  3. package/dist/botao.cjs +1 -1
  4. package/dist/botao.js +1 -1
  5. package/dist/camadas.cjs +175 -142
  6. package/dist/camadas.js +1335 -1054
  7. package/dist/canvas.cjs +99 -140
  8. package/dist/canvas.js +5552 -1283
  9. package/dist/components/ui-barra-ferramentas/tipos.d.ts +2 -2
  10. package/dist/components/ui-barra-ferramentas/ui-paleta-ferramentas.d.ts +2 -2
  11. package/dist/components/ui-camadas/camadas-adapters.d.ts +45 -0
  12. package/dist/components/ui-camadas/camadas-arvore-renderer.d.ts +9 -0
  13. package/dist/components/ui-camadas/camadas-drag-drop.d.ts +4 -0
  14. package/dist/components/ui-camadas/camadas-metricas.d.ts +8 -1
  15. package/dist/components/ui-camadas/camadas-persistencia.d.ts +5 -0
  16. package/dist/components/ui-camadas/camadas-rodape.d.ts +5 -0
  17. package/dist/components/ui-camadas/index.d.ts +1 -0
  18. package/dist/components/ui-camadas/tipos.d.ts +8 -0
  19. package/dist/components/ui-camadas/ui-camadas.d.ts +11 -0
  20. package/dist/components/ui-canvas-cad/cad-estilos-externos.d.ts +16 -0
  21. package/dist/components/ui-canvas-cad/cad-eventos-canvas.d.ts +4 -0
  22. package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +262 -0
  23. package/dist/components/ui-canvas-cad/cad-ferramentas-barra.d.ts +15 -0
  24. package/dist/components/ui-canvas-cad/cad-snap.d.ts +32 -0
  25. package/dist/components/ui-canvas-cad/cad-toolbar-painel.d.ts +1 -0
  26. package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +143 -0
  27. package/dist/components/ui-lista-flutuante/lista-flutuante-posicionamento.d.ts +2 -0
  28. package/dist/components/ui-lista-flutuante/ui-lista-flutuante.d.ts +1 -0
  29. package/dist/components/ui-seletor-mapa-base/ui-seletor-mapa-base.d.ts +3 -0
  30. package/dist/components/ui-tabela/tabela-atributos-sync.d.ts +3 -0
  31. package/dist/components/ui-tabela/tabela-localizador.d.ts +8 -1
  32. package/dist/components/ui-tabela/tabela-orquestrador-dados.d.ts +4 -0
  33. package/dist/components/ui-tabela/tabela-selecao.d.ts +19 -9
  34. package/dist/components/ui-tabela/tipos.d.ts +6 -0
  35. package/dist/components/ui-tabela/ui-tabela.d.ts +41 -2
  36. package/dist/components/ui-tabela-propriedades/avaliador-expressao.d.ts +0 -5
  37. package/dist/components/ui-tabela-propriedades/propriedades-dom-utils.d.ts +17 -1
  38. package/dist/components/ui-tabela-propriedades/propriedades-flutuante.d.ts +2 -0
  39. package/dist/components/ui-tabela-propriedades/propriedades-gerenciador-valores.d.ts +10 -1
  40. package/dist/components/ui-tabela-propriedades/propriedades-render-arvore.d.ts +3 -1
  41. package/dist/components/ui-tabela-propriedades/ui-tabela-propriedades.d.ts +5 -1
  42. package/dist/core/alvo-digitavel.d.ts +1 -0
  43. package/dist/core/index.d.ts +1 -0
  44. package/dist/core/svg-seguro.d.ts +10 -0
  45. package/dist/core.cjs +1 -1
  46. package/dist/core.js +12 -10
  47. package/dist/custom-elements.json +16586 -12150
  48. package/dist/data.cjs +1 -1
  49. package/dist/data.js +51 -46
  50. package/dist/forms.cjs +1 -1
  51. package/dist/forms.js +1 -1
  52. package/dist/gerencigeo-canvas/canvas_interacao.d.ts +18 -0
  53. package/dist/gerencigeo-canvas/curva_leaflet.d.ts +21 -0
  54. package/dist/gerencigeo-canvas/feature_adapters.d.ts +35 -0
  55. package/dist/gerencigeo-canvas/feature_algoritmos.d.ts +45 -0
  56. package/dist/gerencigeo-canvas/feature_amostra.d.ts +4 -0
  57. package/dist/gerencigeo-canvas/feature_caixa.d.ts +19 -0
  58. package/dist/gerencigeo-canvas/feature_cluster.d.ts +61 -0
  59. package/dist/gerencigeo-canvas/feature_cursores.d.ts +17 -0
  60. package/dist/gerencigeo-canvas/feature_curvas.d.ts +43 -0
  61. package/dist/gerencigeo-canvas/feature_desenho.d.ts +55 -0
  62. package/dist/gerencigeo-canvas/feature_desenho_controle.d.ts +91 -0
  63. package/dist/gerencigeo-canvas/feature_edicao_ops.d.ts +46 -0
  64. package/dist/gerencigeo-canvas/feature_editor_vertices.d.ts +80 -0
  65. package/dist/gerencigeo-canvas/feature_formas.d.ts +7 -0
  66. package/dist/gerencigeo-canvas/feature_hud.d.ts +23 -0
  67. package/dist/gerencigeo-canvas/feature_indice.d.ts +36 -0
  68. package/dist/gerencigeo-canvas/feature_metricas.d.ts +16 -0
  69. package/dist/gerencigeo-canvas/feature_popup.d.ts +31 -0
  70. package/dist/gerencigeo-canvas/feature_selecao.d.ts +38 -0
  71. package/dist/gerencigeo-canvas/feature_simplificacao.d.ts +15 -0
  72. package/dist/gerencigeo-canvas/feature_snap.d.ts +25 -0
  73. package/dist/gerencigeo-canvas/feature_types.d.ts +101 -0
  74. package/dist/gerencigeo-canvas/feature_versoes.d.ts +19 -0
  75. package/dist/gerencigeo-canvas/index.d.ts +21 -0
  76. package/dist/gerencigeo-canvas/layer_hit_test.d.ts +30 -0
  77. package/dist/gerencigeo-canvas/layer_manager.d.ts +11 -3
  78. package/dist/gerencigeo-canvas/layer_pane_ops.d.ts +9 -0
  79. package/dist/gerencigeo-canvas/mapa_controller.d.ts +1 -0
  80. package/dist/gerencigeo-canvas/mapa_pontos_shapes.d.ts +24 -5
  81. package/dist/gerencigeo-canvas/renderers/feicoes_renderer.d.ts +89 -0
  82. package/dist/gerencigeo-canvas/renderers/vector_points_renderer.d.ts +1 -0
  83. package/dist/gerencigeo-canvas/renderers/vector_polygons_renderer.d.ts +2 -2
  84. package/dist/gerencigeo-canvas/types.d.ts +12 -0
  85. package/dist/gerencigeo-canvas/utils.d.ts +4 -2
  86. package/dist/index.cjs +1 -1
  87. package/dist/index.js +132 -121
  88. package/dist/leaflet-DcO7uRC-.cjs +1 -0
  89. package/dist/{leaflet-DkaFZYc5.js → leaflet-PPDKB6Dd.js} +37 -37
  90. package/dist/mapa.cjs +1 -1
  91. package/dist/mapa.js +1 -1
  92. package/dist/register.cjs +1 -1
  93. package/dist/register.js +4 -4
  94. package/dist/seletor-mapa-base.cjs +13 -13
  95. package/dist/seletor-mapa-base.js +101 -51
  96. package/dist/svg-seguro-BsbNQqpd.js +50 -0
  97. package/dist/svg-seguro-C76iLlAZ.cjs +1 -0
  98. package/dist/tabela.cjs +1 -1
  99. package/dist/tabela.js +41 -36
  100. package/dist/tipos-elementos.d.ts +26 -7
  101. package/dist/tipos-vue.d.ts +24 -7
  102. package/dist/tools.cjs +1 -1
  103. package/dist/tools.js +1 -1
  104. package/dist/ui-botao-BOOnP8ds.cjs +12 -0
  105. package/dist/ui-botao-DfqSivHl.js +165 -0
  106. package/dist/{ui-paleta-ferramentas-BIytXQLh.js → ui-paleta-ferramentas-CEZYcN4J.js} +18 -27
  107. package/dist/{ui-paleta-ferramentas-DqLY51qa.cjs → ui-paleta-ferramentas-Dbj1kBS9.cjs} +6 -6
  108. package/dist/{ui-switch-DWLgVVnT.js → ui-switch-BcOqOkiV.js} +124 -96
  109. package/dist/ui-switch-D7iPKDj-.cjs +53 -0
  110. package/dist/ui-tabela-propriedades-BBr5sqki.cjs +145 -0
  111. package/dist/{ui-tabela-propriedades-BNcE6VLX.js → ui-tabela-propriedades-Boy7I5yW.js} +1304 -1072
  112. package/package.json +169 -169
  113. package/dist/leaflet-Cw6tqYFh.cjs +0 -1
  114. package/dist/ui-switch-yZIn3IW0.cjs +0 -53
  115. package/dist/ui-tabela-propriedades-D3pyQvyy.cjs +0 -145
package/dist/camadas.js CHANGED
@@ -1,11 +1,11 @@
1
- var ge = Object.defineProperty;
2
- var ve = (a, i, e) => i in a ? ge(a, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[i] = e;
3
- var x = (a, i, e) => ve(a, typeof i != "symbol" ? i + "" : i, e);
1
+ var Le = Object.defineProperty;
2
+ var Ce = (e, o, a) => o in e ? Le(e, o, { enumerable: !0, configurable: !0, writable: !0, value: a }) : e[o] = a;
3
+ var y = (e, o, a) => Ce(e, typeof o != "symbol" ? o + "" : o, a);
4
4
  /* empty css */
5
- import { d as G, S as be } from "./ssr-safe-5cWfJP-s.js";
6
- import { L as xe } from "./listener-bag-DQgv7OON.js";
7
- import { UIMapaBase as pa, UISeletorMapaBase as fa } from "./seletor-mapa-base.js";
8
- const m = {
5
+ import { d as ee, S as $e } from "./ssr-safe-5cWfJP-s.js";
6
+ import { L as Se } from "./listener-bag-DQgv7OON.js";
7
+ import { UIMapaBase as $a, UISeletorMapaBase as Sa } from "./seletor-mapa-base.js";
8
+ const g = {
9
9
  camadas: `<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
10
10
  <polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>
11
11
  <polyline points="2 17 12 22 22 17"></polyline>
@@ -103,47 +103,60 @@ const m = {
103
103
  <line x1="9" y1="3" x2="9" y2="21"></line>
104
104
  <line x1="15" y1="3" x2="15" y2="21"></line>
105
105
  </svg>`
106
- }, V = 6378137;
107
- function ye(a, i) {
108
- if (!a || !i) return 0;
109
- const e = a[0] * Math.PI / 180, t = a[1] * Math.PI / 180, r = i[0] * Math.PI / 180, o = i[1] * Math.PI / 180, s = r - e, c = o - t, n = Math.sin(s / 2) * Math.sin(s / 2) + Math.cos(e) * Math.cos(r) * Math.sin(c / 2) * Math.sin(c / 2);
110
- return V * 2 * Math.atan2(Math.sqrt(n), Math.sqrt(1 - n));
106
+ }, X = 6378137;
107
+ function ze(e, o) {
108
+ if (!e || !o) return 0;
109
+ const a = e[0] * Math.PI / 180, t = e[1] * Math.PI / 180, i = o[0] * Math.PI / 180, r = o[1] * Math.PI / 180, s = i - a, n = r - t, l = Math.sin(s / 2) * Math.sin(s / 2) + Math.cos(a) * Math.cos(i) * Math.sin(n / 2) * Math.sin(n / 2);
110
+ return X * 2 * Math.atan2(Math.sqrt(l), Math.sqrt(1 - l));
111
111
  }
112
- function te(a) {
113
- if (!Array.isArray(a) || a.length < 2) return 0;
114
- if (Array.isArray(a[0]) && Array.isArray(a[0][0]))
115
- return a.reduce((e, t) => e + te(t), 0);
116
- let i = 0;
117
- for (let e = 0; e < a.length - 1; e++) {
118
- const t = a[e], r = a[e + 1];
119
- Array.isArray(t) && Array.isArray(r) && t.length >= 2 && r.length >= 2 && (i += ye([t[0], t[1]], [r[0], r[1]]));
120
- }
121
- return i;
112
+ function de(e) {
113
+ if (!Array.isArray(e) || e.length < 2) return 0;
114
+ if (Array.isArray(e[0]) && Array.isArray(e[0][0]))
115
+ return e.reduce((a, t) => a + de(t), 0);
116
+ let o = 0;
117
+ for (let a = 0; a < e.length - 1; a++) {
118
+ const t = e[a], i = e[a + 1];
119
+ Array.isArray(t) && Array.isArray(i) && t.length >= 2 && i.length >= 2 && (o += ze([t[0], t[1]], [i[0], i[1]]));
120
+ }
121
+ return o;
122
122
  }
123
- function re(a) {
124
- if (!Array.isArray(a) || a.length === 0) return 0;
125
- if (Array.isArray(a[0]) && Array.isArray(a[0][0]))
126
- return a.reduce((r, o) => r + re(o), 0);
127
- const i = a.length;
128
- if (i < 3) return 0;
129
- let e = 0;
130
- for (let r = 0; r < i; r++) {
131
- const o = a[r], s = a[(r + 1) % i], c = a[(r + 2) % i];
132
- if (!Array.isArray(o) || !Array.isArray(s) || !Array.isArray(c)) continue;
133
- const n = (s[1] - o[1]) * (Math.PI / 180), l = (s[0] - o[0]) * (Math.PI / 180), d = (c[1] - s[1]) * (Math.PI / 180), p = (c[0] - s[0]) * (Math.PI / 180);
134
- e += n * p - l * d;
135
- }
136
- const t = Math.abs(e * (V * V) / 2);
123
+ function Q(e) {
124
+ if (!Array.isArray(e)) return 0;
125
+ const o = e.length;
126
+ if (o < 3) return 0;
127
+ let a = 0;
128
+ for (let i = 0; i < o; i++) {
129
+ const r = e[i], s = e[(i + 1) % o], n = e[(i + 2) % o];
130
+ if (!Array.isArray(r) || !Array.isArray(s) || !Array.isArray(n)) continue;
131
+ const l = (s[1] - r[1]) * (Math.PI / 180), c = (s[0] - r[0]) * (Math.PI / 180), f = (n[1] - s[1]) * (Math.PI / 180), u = (n[0] - s[0]) * (Math.PI / 180);
132
+ a += l * u - c * f;
133
+ }
134
+ const t = Math.abs(a * (X * X) / 2);
137
135
  return isNaN(t) ? 0 : t;
138
136
  }
139
- function ie(a) {
140
- if (!a || a.length === 0) return "";
141
- const i = a.filter(
137
+ function ue(e) {
138
+ if (!Array.isArray(e) || e.length === 0) return 0;
139
+ if (Array.isArray(e[0]) && typeof e[0][0] == "number")
140
+ return Q(e);
141
+ if (Array.isArray(e[0]) && Array.isArray(e[0][0])) {
142
+ if (Array.isArray(e[0][0][0]))
143
+ return e.reduce((t, i) => t + ue(i), 0);
144
+ const o = Q(e[0]);
145
+ let a = 0;
146
+ for (let t = 1; t < e.length; t++)
147
+ a += Q(e[t]);
148
+ return Math.max(0, o - a);
149
+ }
150
+ return 0;
151
+ }
152
+ function pe(e) {
153
+ if (!e || e.length === 0) return "";
154
+ const o = e.filter(
142
155
  (t) => t.type === "Polygon" || t.type === "MultiPolygon" || t.geometryType === "Polygon"
143
156
  );
144
- if (i.length > 0) {
145
- const t = i.reduce(
146
- (r, o) => r + (re(o.coordinates) || 0),
157
+ if (o.length > 0) {
158
+ const t = o.reduce(
159
+ (i, r) => i + (ue(r.coordinates) || 0),
147
160
  0
148
161
  );
149
162
  return t >= 1e4 ? `${(t / 1e4).toLocaleString("pt-BR", {
@@ -151,12 +164,12 @@ function ie(a) {
151
164
  maximumFractionDigits: 2
152
165
  })} ha` : `${Math.round(t).toLocaleString("pt-BR")} m²`;
153
166
  }
154
- const e = a.filter(
167
+ const a = e.filter(
155
168
  (t) => t.type === "LineString" || t.type === "MultiLineString" || t.geometryType === "LineString"
156
169
  );
157
- if (e.length > 0) {
158
- const t = e.reduce(
159
- (r, o) => r + (te(o.coordinates) || 0),
170
+ if (a.length > 0) {
171
+ const t = a.reduce(
172
+ (i, r) => i + (de(r.coordinates) || 0),
160
173
  0
161
174
  );
162
175
  return t >= 1e3 ? `${(t / 1e3).toLocaleString("pt-BR", {
@@ -166,57 +179,57 @@ function ie(a) {
166
179
  }
167
180
  return "";
168
181
  }
169
- function k(a) {
170
- return a == null ? "" : String(a).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
182
+ function L(e) {
183
+ return e == null ? "" : String(e).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
171
184
  }
172
- const we = /^(#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})|(?:rgb|hsl)a?\(\s*[\w.%\s,/+-]+\)|[a-z]{3,30})$/i;
173
- function D(a, i = "#00E08A") {
174
- if (!a || typeof a != "string") return i;
175
- const e = a.trim();
176
- return we.test(e) ? e : i;
185
+ const Me = /^(#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})|(?:rgb|hsl)a?\(\s*[\w.%\s,/+-]+\)|[a-z]{3,30})$/i;
186
+ function G(e, o = "#00E08A") {
187
+ if (!e || typeof e != "string") return o;
188
+ const a = e.trim();
189
+ return Me.test(a) ? a : o;
177
190
  }
178
- function H(a) {
179
- return Math.max(0, Math.min(255, Math.round(a))).toString(16).padStart(2, "0");
191
+ function J(e) {
192
+ return Math.max(0, Math.min(255, Math.round(e))).toString(16).padStart(2, "0");
180
193
  }
181
- function Ee(a, i, e) {
182
- const t = i / 100, r = e / 100, o = (n) => (n + a / 30) % 12, s = t * Math.min(r, 1 - r), c = (n) => r - s * Math.max(-1, Math.min(o(n) - 3, Math.min(9 - o(n), 1)));
183
- return [c(0) * 255, c(8) * 255, c(4) * 255];
194
+ function Fe(e, o, a) {
195
+ const t = o / 100, i = a / 100, r = (l) => (l + e / 30) % 12, s = t * Math.min(i, 1 - i), n = (l) => i - s * Math.max(-1, Math.min(r(l) - 3, Math.min(9 - r(l), 1)));
196
+ return [n(0) * 255, n(8) * 255, n(4) * 255];
184
197
  }
185
- function Ae(a, i = "#000000") {
186
- if (!a || typeof a != "string") return i;
187
- const e = a.trim().toLowerCase(), t = /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.exec(e);
198
+ function Be(e, o = "#000000") {
199
+ if (!e || typeof e != "string") return o;
200
+ const a = e.trim().toLowerCase(), t = /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.exec(a);
188
201
  if (t) {
189
- const o = t[1];
190
- return o.length <= 4 ? `#${o[0]}${o[0]}${o[1]}${o[1]}${o[2]}${o[2]}` : `#${o.slice(0, 6)}`;
191
- }
192
- const r = /^(rgb|hsl)a?\(([^)]+)\)$/.exec(e);
193
- if (r) {
194
- const o = r[2].split(/[\s,/]+/).filter(Boolean).map((s) => parseFloat(s));
195
- if (o.length >= 3 && o.slice(0, 3).every((s) => !isNaN(s))) {
196
- const [s, c, n] = o, [l, d, p] = r[1] === "rgb" ? [s, c, n] : Ee(s, c, n);
197
- return `#${H(l)}${H(d)}${H(p)}`;
202
+ const r = t[1];
203
+ return r.length <= 4 ? `#${r[0]}${r[0]}${r[1]}${r[1]}${r[2]}${r[2]}` : `#${r.slice(0, 6)}`;
204
+ }
205
+ const i = /^(rgb|hsl)a?\(([^)]+)\)$/.exec(a);
206
+ if (i) {
207
+ const r = i[2].split(/[\s,/]+/).filter(Boolean).map((s) => parseFloat(s));
208
+ if (r.length >= 3 && r.slice(0, 3).every((s) => !isNaN(s))) {
209
+ const [s, n, l] = r, [c, f, u] = i[1] === "rgb" ? [s, n, l] : Fe(s, n, l);
210
+ return `#${J(c)}${J(f)}${J(u)}`;
198
211
  }
199
212
  }
200
- return i;
213
+ return o;
201
214
  }
202
- function S(a, i, e) {
203
- const t = a.querySelectorAll(`[${i}]`);
204
- for (let r = 0; r < t.length; r++)
205
- if (t[r].getAttribute(i) === e) return t[r];
215
+ function M(e, o, a) {
216
+ const t = e.querySelectorAll(`[${o}]`);
217
+ for (let i = 0; i < t.length; i++)
218
+ if (t[i].getAttribute(o) === a) return t[i];
206
219
  return null;
207
220
  }
208
- function oe(a, i = 80) {
209
- let e = null;
221
+ function fe(e, o = 80) {
222
+ let a = null;
210
223
  return (...t) => {
211
- e && clearTimeout(e), e = setTimeout(() => {
212
- a(...t), e = null;
213
- }, i);
224
+ a && clearTimeout(a), a = setTimeout(() => {
225
+ e(...t), a = null;
226
+ }, o);
214
227
  };
215
228
  }
216
- function $(a, i) {
217
- a.setAttribute("title", i), a.setAttribute("aria-label", i);
229
+ function F(e, o) {
230
+ e.setAttribute("title", o), e.setAttribute("aria-label", o);
218
231
  }
219
- const se = [
232
+ const me = [
220
233
  {
221
234
  id: "none",
222
235
  nome: "Sem Mapa",
@@ -259,17 +272,17 @@ const se = [
259
272
  thumbnailUrl: "https://images.unsplash.com/photo-1518709268805-4e9042af9f23?w=160&auto=format&fit=crop&q=80"
260
273
  }
261
274
  ];
262
- function ke(a = se, i = "satelite") {
263
- return !a || a.length === 0 ? "" : `
275
+ function qe(e = me, o = "satelite") {
276
+ return !e || e.length === 0 ? "" : `
264
277
  <div class="ui-basemap-section">
265
278
  <div class="ui-basemap-title">Mapa Base</div>
266
279
  <div class="ui-basemap-grid">
267
- ${a.map((t) => {
268
- const r = i === t.id, o = k(t.id), s = k(t.nome), c = k(t.descricao || t.nome);
269
- let n = "";
270
- return t.thumbnailUrl ? n = `<img class="ui-basemap-preview" src="${k(t.thumbnailUrl)}" alt="" loading="lazy" referrerpolicy="no-referrer" data-basemap-thumb />` : n = `<div class="ui-basemap-preview-none">${m.gradeCad}</div>`, `
271
- <div class="ui-basemap-card ${r ? "active" : ""}" data-basemap-id="${o}" role="button" tabindex="0" aria-pressed="${r}" title="${c}">
272
- ${n}
280
+ ${e.map((t) => {
281
+ const i = o === t.id, r = L(t.id), s = L(t.nome), n = L(t.descricao || t.nome);
282
+ let l = "";
283
+ return t.thumbnailUrl ? l = `<img class="ui-basemap-preview" src="${L(t.thumbnailUrl)}" alt="" loading="lazy" referrerpolicy="no-referrer" data-basemap-thumb />` : l = `<div class="ui-basemap-preview-none">${g.gradeCad}</div>`, `
284
+ <div class="ui-basemap-card ${i ? "active" : ""}" data-basemap-id="${r}" role="button" tabindex="0" aria-pressed="${i}" title="${n}">
285
+ ${l}
273
286
  <span>${s}</span>
274
287
  </div>
275
288
  `;
@@ -278,1031 +291,1203 @@ function ke(a = se, i = "satelite") {
278
291
  </div>
279
292
  `;
280
293
  }
281
- function Ie(a, i, e) {
282
- const t = i.filter((l) => e.has(l.id)), r = t.length > 0, o = ie(t), s = r ? t.length : a.length, c = r ? t.length > 1 ? "selecionados" : "selecionado" : a.length > 1 ? "camadas" : "camada", n = a.map((l) => `<option value="${k(l.id)}">${k(l.name)}</option>`).join("");
294
+ function De(e) {
295
+ const o = /* @__PURE__ */ new Map();
296
+ e.forEach((r) => o.set(r.id, r));
297
+ const a = /* @__PURE__ */ new Map(), t = [];
298
+ e.forEach((r) => {
299
+ r.parentId && o.has(r.parentId) ? (a.has(r.parentId) || a.set(r.parentId, []), a.get(r.parentId).push(r)) : t.push(r);
300
+ });
301
+ const i = (r, s) => {
302
+ const n = a.get(r.id) || (Array.isArray(r.children) ? r.children : []), l = s > 0 ? "&nbsp;&nbsp;".repeat(s) + "↳ " : n.length > 0 || r.isGroup ? "📁 " : "", c = `<option value="${L(r.id)}">${l}${L(r.name)}</option>`, f = n.map((u) => i(u, s + 1)).join("");
303
+ return c + f;
304
+ };
305
+ return t.map((r) => i(r, 0)).join("");
306
+ }
307
+ function Te(e, o, a) {
308
+ const t = o.filter((c) => a.has(c.id)), i = t.length > 0, r = pe(t), s = i ? t.length : e.length, n = i ? t.length > 1 ? "selecionados" : "selecionado" : e.length > 1 ? "camadas" : "camada", l = De(e);
283
309
  return `
284
- <div class="ui-tree-footer">
310
+ <div class="ui-tree-footer ${i ? "tem-selecao" : "sem-selecao"}">
285
311
  <div class="ui-footer-left">
286
312
  <span class="ui-footer-count" id="footer-count">${s}</span>
287
- <span class="ui-footer-label" id="footer-label">${c}</span>
288
- <span class="ui-footer-metric" style="display: ${o ? "inline-flex" : "none"};">${o ? `${m.reguaMetrica} ${o}` : ""}</span>
313
+ <span class="ui-footer-label" id="footer-label">${n}</span>
314
+ <span class="ui-footer-metric" id="footer-metric" style="display: ${r ? "inline-flex" : "none"};">${r ? `${g.reguaMetrica} ${r}` : ""}</span>
289
315
  </div>
290
- <div class="ui-footer-right">
291
- <button class="ui-footer-btn ${r ? "" : "disabled"}" id="btn-footer-vis" title="Alternar visibilidade coletiva" aria-label="Alternar visibilidade coletiva" ${r ? "" : "disabled"}>
292
- ${m.olhoAberto}
316
+
317
+ <!-- Ações de topo/gerais quando não há nada selecionado -->
318
+ <div class="ui-footer-actions-gerais" style="display: ${i ? "none" : "flex"};">
319
+ <button class="ui-footer-chip-btn" id="btn-footer-new-group" title="Criar Nova Pasta/Grupo de Camadas" aria-label="Criar Grupo de Camadas">
320
+ ${g.moverPasta}
321
+ <span>+ Grupo</span>
322
+ </button>
323
+ <button class="ui-footer-chip-btn primario" id="btn-footer-new-layer" title="Criar Nova Camada Vetorial" aria-label="Criar Nova Camada">
324
+ ${g.mais}
325
+ <span>+ Camada</span>
293
326
  </button>
327
+ </div>
294
328
 
295
- <button class="ui-footer-btn ${r ? "" : "disabled"}" id="btn-footer-lock" title="Alternar bloqueio coletivo" aria-label="Alternar bloqueio coletivo" ${r ? "" : "disabled"}>
296
- ${m.cadeadoTrancado}
329
+ <!-- Ações em massa ativadas quando há seleção -->
330
+ <div class="ui-footer-right ui-footer-bulk-actions" style="display: ${i ? "flex" : "none"};">
331
+ <button class="ui-footer-btn ${i ? "" : "disabled"}" id="btn-footer-vis" title="Alternar visibilidade coletiva" aria-label="Alternar visibilidade coletiva" ${i ? "" : "disabled"}>
332
+ ${g.olhoAberto}
297
333
  </button>
298
334
 
299
- <div class="ui-footer-color-wrapper ${r ? "" : "disabled"}" title="Alterar cor dos selecionados">
300
- <input type="color" id="input-footer-color" aria-label="Cor dos selecionados" value="#00E08A" class="ui-footer-color" ${r ? "" : "disabled"} />
335
+ <button class="ui-footer-btn ${i ? "" : "disabled"}" id="btn-footer-lock" title="Alternar bloqueio coletivo" aria-label="Alternar bloqueio coletivo" ${i ? "" : "disabled"}>
336
+ ${g.cadeadoTrancado}
337
+ </button>
338
+
339
+ <div class="ui-footer-color-wrapper ${i ? "" : "disabled"}" title="Alterar cor dos selecionados">
340
+ <span class="ui-footer-color-preview" id="preview-footer-color" style="background-color: #00E08A;"></span>
341
+ <input type="color" id="input-footer-color" aria-label="Cor dos selecionados" value="#00E08A" class="ui-footer-color" ${i ? "" : "disabled"} />
301
342
  </div>
302
343
 
303
- <div class="ui-footer-move-wrapper ${r ? "" : "disabled"}" title="Mover selecionados para outra camada">
304
- <select id="select-footer-move" aria-label="Mover selecionados para outra camada" class="ui-footer-select" ${r ? "" : "disabled"}>
305
- <option value="" disabled selected>📂</option>
306
- ${n}
344
+ <div class="ui-footer-move-wrapper ${i ? "" : "disabled"}" title="Mover selecionados para outra camada">
345
+ <select id="select-footer-move" aria-label="Mover selecionados para outra camada" class="ui-footer-select" ${i ? "" : "disabled"}>
346
+ <option value="" disabled selected>📂 Mover para...</option>
347
+ ${l}
307
348
  </select>
308
349
  </div>
309
350
 
310
- <button class="ui-footer-btn" id="btn-footer-new-layer" title="Criar Nova Camada" aria-label="Criar Nova Camada">
311
- ${m.mais}
312
- </button>
313
-
314
- <button class="ui-footer-btn ${r ? "" : "disabled"}" id="btn-footer-del" title="Excluir selecionados" aria-label="Excluir selecionados" ${r ? "" : "disabled"}>
315
- ${m.lixeira}
351
+ <button class="ui-footer-btn btn-danger-footer ${i ? "" : "disabled"}" id="btn-footer-del" title="Excluir selecionados" aria-label="Excluir selecionados" ${i ? "" : "disabled"}>
352
+ ${g.lixeira}
316
353
  </button>
317
354
 
318
- ${r ? `<button class="ui-footer-btn" id="btn-footer-clear" title="Limpar seleção" aria-label="Limpar seleção">${m.fechar}</button>` : ""}
355
+ ${i ? `<button class="ui-footer-btn btn-clear-footer" id="btn-footer-clear" title="Limpar seleção" aria-label="Limpar seleção">${g.fechar}</button>` : ""}
319
356
  </div>
320
357
  </div>
321
358
  `;
322
359
  }
323
- const ne = 80;
324
- function K(a, i) {
325
- const e = (i || "").trim().toLowerCase();
326
- return e ? a.filter(
327
- (t) => (t.name || "").toLowerCase().includes(e) || (t.category || "").toLowerCase().includes(e) || (t.type || "").toLowerCase().includes(e)
328
- ) : a;
360
+ const he = 80;
361
+ function ae(e, o) {
362
+ const a = (o || "").trim().toLowerCase();
363
+ return a ? e.filter(
364
+ (t) => (t.name || "").toLowerCase().includes(a) || (t.category || "").toLowerCase().includes(a) || (t.type || "").toLowerCase().includes(a)
365
+ ) : e;
329
366
  }
330
- function Le(a, i, e, t = "", r = ne) {
331
- const o = (t || "").trim() !== "", s = [], c = /* @__PURE__ */ new Map();
332
- for (let n = 0; n < i.length; n++) {
333
- const l = i[n], d = l.layerId || "";
334
- c.has(d) || c.set(d, []), c.get(d).push(l);
335
- }
336
- for (let n = 0; n < a.length; n++) {
337
- const l = a[n];
338
- if (o || e.has(l.id)) {
339
- const d = K(c.get(l.id) || [], t).slice(0, r);
340
- for (let p = 0; p < d.length; p++)
341
- s.push(d[p].id);
367
+ function Pe(e, o, a, t = "", i = he) {
368
+ const r = (t || "").trim() !== "", s = [], n = /* @__PURE__ */ new Map();
369
+ for (let l = 0; l < o.length; l++) {
370
+ const c = o[l], f = c.layerId || "";
371
+ n.has(f) || n.set(f, []), n.get(f).push(c);
372
+ }
373
+ for (let l = 0; l < e.length; l++) {
374
+ const c = e[l];
375
+ if (r || a.has(c.id)) {
376
+ const f = ae(n.get(c.id) || [], t).slice(0, i);
377
+ for (let u = 0; u < f.length; u++)
378
+ s.push(f[u].id);
342
379
  }
343
380
  }
344
381
  return s;
345
382
  }
346
- function Ce(a, i, e, t, r, o) {
347
- if (!a.includes(t)) return null;
348
- const s = new Set(i);
349
- let c = e;
350
- if (o && e && a.includes(e)) {
351
- const n = a.indexOf(e), l = a.indexOf(t), d = Math.min(n, l), p = Math.max(n, l);
352
- r || s.clear();
353
- for (let u = d; u <= p; u++)
354
- s.add(a[u]);
355
- } else r ? (s.has(t) ? s.delete(t) : s.add(t), c = t) : (s.clear(), s.add(t), c = t);
356
- return { selecionados: s, ultimoClicadoId: c };
383
+ function Oe(e, o, a, t, i, r) {
384
+ if (!e.includes(t)) return null;
385
+ const s = new Set(o);
386
+ let n = a;
387
+ if (r && a && e.includes(a)) {
388
+ const l = e.indexOf(a), c = e.indexOf(t), f = Math.min(l, c), u = Math.max(l, c);
389
+ i || s.clear();
390
+ for (let p = f; p <= u; p++)
391
+ s.add(e[p]);
392
+ } else i ? (s.has(t) ? s.delete(t) : s.add(t), n = t) : (s.clear(), s.add(t), n = t);
393
+ return { selecionados: s, ultimoClicadoId: n };
394
+ }
395
+ function je(e, o) {
396
+ if (e.size === 0) return;
397
+ const a = new Set(o.map((t) => t.id));
398
+ for (const t of e)
399
+ a.has(t) || e.delete(t);
357
400
  }
358
- function $e(a, i) {
359
- if (a.size === 0) return;
360
- const e = new Set(i.map((t) => t.id));
361
- for (const t of a)
362
- e.has(t) || a.delete(t);
401
+ function Re(e, o) {
402
+ const a = G(o, "#00E08A"), t = (e || "").toLowerCase();
403
+ return t === "polygon" || t === "multipolygon" ? `<svg viewBox="0 0 16 16" width="11" height="11"><polygon points="2,14 14,14 12,2 4,4" fill="${a}" fill-opacity="0.45" stroke="${a}" stroke-width="1.5"/></svg>` : t === "linestring" || t === "multilinestring" ? `<svg viewBox="0 0 16 16" width="11" height="11"><polyline points="2,13 8,3 14,10" fill="none" stroke="${a}" stroke-width="2"/></svg>` : t === "text" ? `<svg viewBox="0 0 16 16" width="11" height="11"><text x="8" y="12" font-size="12" font-weight="bold" fill="${a}" text-anchor="middle" font-family="sans-serif">T</text></svg>` : `<svg viewBox="0 0 16 16" width="11" height="11"><circle cx="8" cy="8" r="4.2" fill="${a}" stroke="#ffffff" stroke-width="1.2"/></svg>`;
363
404
  }
364
- function Se(a, i) {
365
- const e = D(i, "#00E08A"), t = (a || "").toLowerCase();
366
- return t === "polygon" || t === "multipolygon" ? `<svg viewBox="0 0 16 16" width="11" height="11"><polygon points="2,14 14,14 12,2 4,4" fill="${e}" fill-opacity="0.45" stroke="${e}" stroke-width="1.5"/></svg>` : t === "linestring" || t === "multilinestring" ? `<svg viewBox="0 0 16 16" width="11" height="11"><polyline points="2,13 8,3 14,10" fill="none" stroke="${e}" stroke-width="2"/></svg>` : t === "text" ? `<svg viewBox="0 0 16 16" width="11" height="11"><text x="8" y="12" font-size="12" font-weight="bold" fill="${e}" text-anchor="middle" font-family="sans-serif">T</text></svg>` : `<svg viewBox="0 0 16 16" width="11" height="11"><circle cx="8" cy="8" r="4.2" fill="${e}" stroke="#ffffff" stroke-width="1.2"/></svg>`;
405
+ function Ne(e) {
406
+ const o = /* @__PURE__ */ new Map();
407
+ e.forEach((r) => o.set(r.id, r));
408
+ const a = /* @__PURE__ */ new Map(), t = [];
409
+ e.forEach((r) => {
410
+ r.parentId && o.has(r.parentId) && r.parentId !== r.id ? (a.has(r.parentId) || a.set(r.parentId, []), a.get(r.parentId).push(r)) : t.push(r);
411
+ });
412
+ function i(r, s) {
413
+ const n = a.get(r.id) || (Array.isArray(r.children) ? r.children : []);
414
+ return {
415
+ camada: r,
416
+ depth: s,
417
+ subcamadas: n.map((l) => i(l, s + 1))
418
+ };
419
+ }
420
+ return t.map((r) => i(r, 0));
367
421
  }
368
- function Me(a) {
422
+ function He(e) {
369
423
  const {
370
- camadas: i,
371
- feicoes: e,
424
+ camadas: o,
425
+ feicoes: a,
372
426
  camadaAtivaId: t,
373
- expandedLayers: r,
374
- selectedFeatureIds: o,
427
+ expandedLayers: i,
428
+ selectedFeatureIds: r,
375
429
  activeSettingsLayerId: s,
376
- editingLayerId: c,
377
- editingFeatureId: n,
378
- searchQuery: l,
379
- limiteFeicoesPorCamada: d = ne,
380
- mostrarBotaoColapsar: p = !1
381
- } = a, u = (l || "").trim().toLowerCase(), f = /* @__PURE__ */ new Map();
382
- for (let h = 0; h < e.length; h++) {
383
- const v = e[h], w = v.layerId || "";
384
- f.has(w) || f.set(w, []), f.get(w).push(v);
385
- }
386
- const g = i.every((h) => h.visible !== !1), b = i.length > 0 && i.every((h) => r.has(h.id)), E = `
430
+ editingLayerId: n,
431
+ editingFeatureId: l,
432
+ searchQuery: c,
433
+ limiteFeicoesPorCamada: f = he,
434
+ mostrarBotaoColapsar: u = !1
435
+ } = e, p = (c || "").trim().toLowerCase(), d = /* @__PURE__ */ new Map();
436
+ for (let x = 0; x < a.length; x++) {
437
+ const w = a[x], $ = w.layerId || "";
438
+ d.has($) || d.set($, []), d.get($).push(w);
439
+ }
440
+ const m = o.every((x) => x.visible !== !1), h = o.length > 0 && o.every((x) => i.has(x.id)), k = `
387
441
  <div class="ui-tree-toolbar">
388
442
  <div class="ui-tree-title-group">
389
443
  <span class="ui-tree-section-title">CAMADAS</span>
390
- <span class="ui-tree-count-badge">${i.length}</span>
444
+ <span class="ui-tree-count-badge">${o.length}</span>
391
445
  </div>
392
446
  <div class="ui-tree-actions">
393
- <button id="btn-toggle-all-vis" class="ui-tree-action-btn" title="${g ? "Ocultar Todas as Camadas" : "Exibir Todas as Camadas"}" aria-label="${g ? "Ocultar Todas as Camadas" : "Exibir Todas as Camadas"}">
394
- ${g ? m.olhoAberto : m.olhoFechado}
447
+ <button id="btn-toggle-all-vis" class="ui-tree-action-btn" title="${m ? "Ocultar Todas as Camadas" : "Exibir Todas as Camadas"}" aria-label="${m ? "Ocultar Todas as Camadas" : "Exibir Todas as Camadas"}">
448
+ ${m ? g.olhoAberto : g.olhoFechado}
395
449
  </button>
396
- <button id="btn-toggle-all-expand" class="ui-tree-action-btn" aria-label="${b ? "Recolher Todos os Grupos" : "Expandir Todos os Grupos"}" title="${b ? "Recolher Todos os Grupos" : "Expandir Todos os Grupos"}">
397
- <span class="ui-chevron-icon ${b ? "open" : ""}">${m.chevronDir}</span>
450
+ <button id="btn-toggle-all-expand" class="ui-tree-action-btn" aria-label="${h ? "Recolher Todos os Grupos" : "Expandir Todos os Grupos"}" title="${h ? "Recolher Todos os Grupos" : "Expandir Todos os Grupos"}">
451
+ <span class="ui-chevron-icon ${h ? "open" : ""}">${g.chevronDir}</span>
452
+ </button>
453
+ <button id="btn-add-group" class="ui-tree-btn-group" title="Criar grupo / pasta de camadas" aria-label="Criar grupo de camadas">
454
+ ${g.moverPasta} Grupo
398
455
  </button>
399
456
  <button id="btn-add-layer" class="ui-tree-btn-new" title="Adicionar nova camada vetorial">
400
- ${m.mais} Camada
457
+ ${g.mais} Camada
401
458
  </button>
402
- ${p ? `<button id="btn-colapsar" class="ui-camadas-btn-colapsar" title="Recolher painel" aria-label="Recolher painel">${m.recolherPainel}</button>` : ""}
459
+ ${u ? `<button id="btn-colapsar" class="ui-camadas-btn-colapsar" title="Recolher painel" aria-label="Recolher painel">${g.recolherPainel}</button>` : ""}
403
460
  </div>
404
461
  </div>
405
462
 
406
463
  <div class="ui-tree-search-wrapper">
407
- <span class="ui-tree-search-icon">${m.busca}</span>
408
- <input type="text" class="ui-tree-search-input" id="input-layer-search" aria-label="Buscar camada ou feição" placeholder="Buscar camada ou feição..." value="${k(
409
- l
464
+ <span class="ui-tree-search-icon">${g.busca}</span>
465
+ <input type="text" class="ui-tree-search-input" id="input-layer-search" aria-label="Buscar camada ou feição" placeholder="Buscar camada ou feição..." value="${L(
466
+ c
410
467
  )}" />
411
- ${l ? `<button class="ui-tree-search-clear" id="btn-clear-layer-search" title="Limpar busca" aria-label="Limpar busca">${m.fechar}</button>` : ""}
468
+ ${c ? `<button class="ui-tree-search-clear" id="btn-clear-layer-search" title="Limpar busca" aria-label="Limpar busca">${g.fechar}</button>` : ""}
412
469
  </div>
413
- `, y = i.map((h) => {
414
- const v = k(h.id), w = k(h.name || "Camada"), L = D(h.color, "#00E08A"), F = h.visible !== !1, M = h.locked === !0, B = u ? !0 : r.has(h.id), O = s === h.id, Y = t === h.id, I = K(f.get(h.id) || [], u), J = I.length > 0 && I.every((A) => o.has(A.id)), ce = !J && I.some((A) => o.has(A.id)), de = I.slice(0, d), ue = I.length > d, pe = de.map((A) => {
415
- const C = k(A.id), X = k(A.name || "Feição"), Z = D(A.color, L), q = A.visible !== !1, P = M, j = A.locked === !0 || P, ee = P ? "Bloqueada pela camada" : j ? "Desbloquear Feição" : "Bloquear Feição", R = o.has(A.id), ae = A.status;
416
- let N = "";
417
- return ae === "oficial" ? N = '<span class="ui-geom-tag oficial" title="Geometria Oficial">OFICIAL</span>' : ae === "previa" && (N = '<span class="ui-geom-tag previa" title="Geometria Prévia">PRÉVIA</span>'), `
418
- <div class="ui-feat-row ${R ? "selected-row" : ""} ${q ? "" : "hidden-row"}" data-feat-row="${C}" data-feat-select="${C}" data-feat-layer="${v}" role="treeitem" aria-selected="${R}" tabindex="-1" draggable="true" title="Clique para selecionar | Arraste para reordenar">
419
- <div class="ui-col ui-col-eye" data-feat-eye="${C}" role="button" tabindex="0" aria-label="${q ? "Ocultar Feição" : "Exibir Feição"}" title="${q ? "Ocultar Feição" : "Exibir Feição"}">
420
- ${q ? m.olhoAberto : m.olhoFechado}
421
- </div>
422
-
423
- <div class="ui-col ui-col-lock ${j ? "" : "ui-lock-open"}" data-feat-lock="${C}" ${P ? 'data-locked-by-layer="true"' : ""} role="button" tabindex="0" aria-label="${ee}" title="${ee}">
424
- ${j ? m.cadeadoTrancado : m.cadeadoAberto}
425
- </div>
470
+ `, v = (x) => {
471
+ const w = x.camada, $ = x.depth, C = x.subcamadas, D = !!(w.isGroup || C.length > 0), A = L(w.id), te = L(w.name || (D ? "Novo Grupo" : "Camada")), B = G(w.color, "#00E08A"), j = w.visible !== !1, T = w.locked === !0, R = p ? !0 : i.has(w.id), V = s === w.id, re = t === w.id, S = ae(d.get(w.id) || [], p), ie = S.length > 0 && S.every((E) => r.has(E.id)), ve = !ie && S.some((E) => r.has(E.id)), be = S.slice(0, f), xe = S.length > f, ye = be.map((E) => {
472
+ const z = L(E.id), se = L(E.name || "Feição"), ne = G(E.color, B), N = E.visible !== !1, U = T, _ = E.locked === !0 || U, le = U ? "Bloqueada pela camada" : _ ? "Desbloquear Feição" : "Bloquear Feição", K = r.has(E.id), ce = E.status;
473
+ let Y = "";
474
+ return ce === "oficial" ? Y = '<span class="ui-geom-tag oficial" title="Geometria Oficial">OFICIAL</span>' : ce === "previa" && (Y = '<span class="ui-geom-tag previa" title="Geometria Prévia">PRÉVIA</span>'), `
475
+ <div class="ui-feat-row ${K ? "selected-row" : ""} ${N ? "" : "hidden-row"}" data-feat-row="${z}" data-feat-select="${z}" data-feat-layer="${A}" role="treeitem" aria-selected="${K}" tabindex="-1" draggable="true" title="Clique para selecionar | Arraste para reordenar">
476
+ <div class="ui-col ui-col-eye" data-feat-eye="${z}" role="button" tabindex="0" aria-label="${N ? "Ocultar Feição" : "Exibir Feição"}" title="${N ? "Ocultar Feição" : "Exibir Feição"}">
477
+ ${N ? g.olhoAberto : g.olhoFechado}
478
+ </div>
426
479
 
427
- <div class="ui-col ui-col-colorbar" style="background: ${Z};"></div>
428
- <div class="ui-col ui-col-branch"><span style="opacity: 0.35;">└─</span></div>
429
- <div class="ui-col ui-col-thumb">
430
- <div class="ui-thumb-box">${Se(A.type || A.geometryType, Z)}</div>
431
- </div>
480
+ <div class="ui-col ui-col-lock ${_ ? "" : "ui-lock-open"}" data-feat-lock="${z}" ${U ? 'data-locked-by-layer="true"' : ""} role="button" tabindex="0" aria-label="${le}" title="${le}">
481
+ ${_ ? g.cadeadoTrancado : g.cadeadoAberto}
482
+ </div>
432
483
 
433
- <div class="ui-col ui-col-name" data-feat-name-trigger="${C}" title="Duplo clique para renomear">
434
- ${n === A.id ? `<input type="text" class="ui-inline-rename-input" data-inline-feat-input="${C}" value="${X}" />` : `<span class="ui-name-text">${X}</span>${N}`}
435
- </div>
484
+ <div class="ui-col ui-col-colorbar" style="background: ${ne};"></div>
485
+ <div class="ui-col ui-col-branch"><span style="opacity: 0.35;">└─</span></div>
486
+ <div class="ui-col ui-col-thumb">
487
+ <div class="ui-thumb-box">${Re(E.type || E.geometryType, ne)}</div>
488
+ </div>
436
489
 
437
- <div class="ui-col ui-col-actions">
438
- <button class="ui-micro-btn" data-feat-fit="${C}" title="Enquadrar no mapa" aria-label="Enquadrar feição no mapa">${m.alvoEnquadrar}</button>
439
- </div>
490
+ <div class="ui-col ui-col-name" data-feat-name-trigger="${z}" title="Duplo clique para renomear">
491
+ ${l === E.id ? `<input type="text" class="ui-inline-rename-input" data-inline-feat-input="${z}" value="${se}" />` : `<span class="ui-name-text">${se}</span>${Y}`}
492
+ </div>
440
493
 
441
- <div class="ui-col ui-col-target" data-feat-target="${C}" role="button" tabindex="0" aria-label="Selecionar feição" title="Selecionar feição">
442
- <div class="ui-target-circle ${R ? "selected" : ""}"></div>
443
- </div>
494
+ <div class="ui-col ui-col-actions">
495
+ <button class="ui-micro-btn" data-feat-fit="${z}" title="Enquadrar no mapa" aria-label="Enquadrar feição no mapa">${g.alvoEnquadrar}</button>
444
496
  </div>
445
- `;
446
- }).join(""), fe = ue ? `<div style="padding: 4px 10px; font-size: 10px; color: var(--ui-cor-texto-secundario, #888899); font-style: italic; background: rgba(0,0,0,0.2);">Exibindo ${d} de ${I.length} feições. Use a busca acima para filtrar.</div>` : "", W = h.opacity !== void 0 ? h.opacity : 1, me = Math.round(W * 100), he = O ? `
447
- <div class="ui-layer-settings-drawer" id="settings-drawer-${v}" style="--drawer-cor-camada: ${L};">
448
- <div class="ui-drawer-header">
449
- <div class="ui-drawer-header-left">
450
- <span class="ui-drawer-icon">${m.engrenagem}</span>
451
- <span class="ui-drawer-title">Configurações da Camada</span>
497
+
498
+ <div class="ui-col ui-col-target" data-feat-target="${z}" role="button" tabindex="0" aria-label="Selecionar feição" title="Selecionar feição">
499
+ <div class="ui-target-circle ${K ? "selected" : ""}"></div>
452
500
  </div>
453
- <button type="button" class="ui-drawer-btn-fechar" data-layer-settings-close="${v}" title="Fechar configurações (Esc)" aria-label="Fechar configurações">
454
- ${m.fechar}
455
- </button>
456
501
  </div>
502
+ `;
503
+ }).join(""), we = xe ? `<div style="padding: 4px 10px; font-size: 10px; color: var(--ui-cor-texto-secundario, #888899); font-style: italic; background: rgba(0,0,0,0.2);">Exibindo ${f} de ${S.length} feições. Use a busca acima para filtrar.</div>` : "", oe = w.opacity !== void 0 ? w.opacity : 1, Ee = Math.round(oe * 100), Ae = o.filter((E) => E.id !== w.id).map(
504
+ (E) => `<option value="${L(E.id)}" ${w.parentId === E.id ? "selected" : ""}>${E.isGroup ? "📁 " : ""}${L(E.name)}</option>`
505
+ ).join(""), ke = V ? `
506
+ <div class="ui-layer-settings-drawer" id="settings-drawer-${A}" style="--drawer-cor-camada: ${B};">
507
+ <div class="ui-drawer-header">
508
+ <div class="ui-drawer-header-left">
509
+ <span class="ui-drawer-icon">${g.engrenagem}</span>
510
+ <span class="ui-drawer-title">Configurações da Camada</span>
511
+ </div>
512
+ <button type="button" class="ui-drawer-btn-fechar" data-layer-settings-close="${A}" title="Fechar configurações (Esc)" aria-label="Fechar configurações">
513
+ ${g.fechar}
514
+ </button>
515
+ </div>
457
516
 
458
- <div class="ui-drawer-body">
459
- <!-- Cor da Camada -->
460
- <div class="ui-drawer-row">
461
- <div class="ui-drawer-row-label">
462
- <span>Cor do Vetor</span>
463
- </div>
464
- <div class="ui-drawer-color-group">
465
- <label class="ui-drawer-color-pill" title="Clique para alterar a cor da camada">
466
- <span class="ui-drawer-color-sample" id="sample-color-${v}" style="background-color: ${L};"></span>
467
- <span class="ui-drawer-color-hex" id="hex-color-${v}">${L.toUpperCase()}</span>
468
- <input type="color" aria-label="Cor da camada" data-layer-color-picker="${v}" value="${Ae(L, "#00e08a")}" class="ui-drawer-color-native" />
469
- </label>
470
- </div>
517
+ <div class="ui-drawer-body">
518
+ <!-- Cor da Camada -->
519
+ <div class="ui-drawer-row">
520
+ <div class="ui-drawer-row-label">
521
+ <span>Cor do Vetor</span>
522
+ </div>
523
+ <div class="ui-drawer-color-group">
524
+ <label class="ui-drawer-color-pill" title="Clique para alterar a cor da camada">
525
+ <span class="ui-drawer-color-sample" id="sample-color-${A}" style="background-color: ${B};"></span>
526
+ <span class="ui-drawer-color-hex" id="hex-color-${A}">${B.toUpperCase()}</span>
527
+ <input type="color" aria-label="Cor da camada" data-layer-color-picker="${A}" value="${Be(B, "#00e08a")}" class="ui-drawer-color-native" />
528
+ </label>
471
529
  </div>
530
+ </div>
472
531
 
473
- <!-- Opacidade da Camada -->
474
- <div class="ui-drawer-row">
475
- <div class="ui-drawer-row-label">
476
- <span>Opacidade</span>
477
- <span class="ui-drawer-badge" id="badge-op-${v}">${me}%</span>
478
- </div>
479
- <div class="ui-drawer-slider-container">
480
- <input type="range" aria-label="Opacidade da camada" min="0.05" max="1" step="0.05" value="${Number(W) || 0}" data-layer-opacity-slider="${v}" class="ui-drawer-slider" />
481
- </div>
532
+ <!-- Opacidade da Camada -->
533
+ <div class="ui-drawer-row">
534
+ <div class="ui-drawer-row-label">
535
+ <span>Opacidade</span>
536
+ <span class="ui-drawer-badge" id="badge-op-${A}">${Ee}%</span>
537
+ </div>
538
+ <div class="ui-drawer-slider-container">
539
+ <input type="range" aria-label="Opacidade da camada" min="0.05" max="1" step="0.05" value="${Number(oe) || 0}" data-layer-opacity-slider="${A}" class="ui-drawer-slider" />
482
540
  </div>
483
541
  </div>
484
542
 
485
- <div class="ui-drawer-footer">
486
- <div class="ui-drawer-meta-info">
487
- <span>${I.length} ${I.length === 1 ? "feição" : "feições"} nesta camada</span>
543
+ <!-- Hierarquia / Grupo Pai -->
544
+ <div class="ui-drawer-row">
545
+ <div class="ui-drawer-row-label">
546
+ <span>Pertence ao Grupo</span>
488
547
  </div>
489
- <div class="ui-drawer-actions">
490
- <button type="button" class="ui-drawer-btn-danger" data-delete-layer="${v}" title="Excluir esta camada e todas as suas feições">
491
- ${m.lixeira}
492
- <span class="ui-btn-label">Excluir Camada</span>
493
- </button>
548
+ <div class="ui-drawer-select-wrapper">
549
+ <select class="ui-drawer-select" data-layer-parent-select="${A}" aria-label="Grupo pai da camada">
550
+ <option value="" ${w.parentId ? "" : "selected"}>(Nenhum - Nível Principal)</option>
551
+ ${Ae}
552
+ </select>
494
553
  </div>
495
554
  </div>
496
555
  </div>
497
- ` : "";
556
+
557
+ <div class="ui-drawer-footer">
558
+ <div class="ui-drawer-meta-info">
559
+ <span>${C.length > 0 ? `${C.length} subcamadas · ` : ""}${S.length} ${S.length === 1 ? "feição" : "feições"}</span>
560
+ </div>
561
+ <div class="ui-drawer-actions">
562
+ <button type="button" class="ui-drawer-btn-sublayer" data-add-sublayer="${A}" title="Adicionar nova camada dentro desta">
563
+ ${g.mais} Subcamada
564
+ </button>
565
+ <button type="button" class="ui-drawer-btn-danger" data-delete-layer="${A}" title="Excluir esta camada e suas feições">
566
+ ${g.lixeira}
567
+ <span class="ui-btn-label">Excluir</span>
568
+ </button>
569
+ </div>
570
+ </div>
571
+ </div>
572
+ ` : "", Ie = C.map((E) => v(E)).join("");
498
573
  return `
499
- <div class="ui-layer-group" data-layer-id="${v}" role="treeitem" aria-expanded="${B}">
500
- <div class="ui-layer-row ${F ? "" : "hidden-layer"} ${Y ? "active-drawing-layer" : ""}" data-layer-row="${v}" data-layer-id="${v}" tabindex="-1" draggable="true" style="--layer-active-color: ${L};">
501
- <div class="ui-col ui-col-drag" title="Arrastar para reordenar Z-Index">${m.dragHandle}</div>
574
+ <div class="ui-layer-group ${$ > 0 ? "is-sublayer-group" : ""}" data-layer-id="${A}" data-layer-depth="${$}" role="treeitem" aria-expanded="${R}">
575
+ <div class="ui-layer-row ${j ? "" : "hidden-layer"} ${re ? "active-drawing-layer" : ""} ${$ > 0 ? "is-sublayer" : ""} ${D ? "is-group-row" : ""}" data-layer-row="${A}" data-layer-id="${A}" tabindex="-1" draggable="true" style="--layer-depth: ${$}; --layer-active-color: ${B};">
576
+ <div class="ui-col ui-col-drag" title="Arrastar para reordenar Z-Index">${g.dragHandle}</div>
502
577
 
503
- <div class="ui-col ui-col-eye" data-layer-eye="${v}" role="button" tabindex="0" aria-label="${F ? "Ocultar Camada" : "Exibir Camada"}" title="${F ? "Ocultar Camada" : "Exibir Camada"}">
504
- ${F ? m.olhoAberto : m.olhoFechado}
505
- </div>
578
+ <div class="ui-col ui-col-eye" data-layer-eye="${A}" role="button" tabindex="0" aria-label="${j ? "Ocultar Camada" : "Exibir Camada"}" title="${j ? "Ocultar Camada" : "Exibir Camada"}">
579
+ ${j ? g.olhoAberto : g.olhoFechado}
580
+ </div>
506
581
 
507
- <div class="ui-col ui-col-lock ${M ? "" : "ui-lock-open"}" data-layer-lock="${v}" role="button" tabindex="0" aria-label="${M ? "Desbloquear Camada" : "Bloquear Camada"}" title="${M ? "Desbloquear Camada" : "Bloquear Camada"}">
508
- ${M ? m.cadeadoTrancado : m.cadeadoAberto}
509
- </div>
582
+ <div class="ui-col ui-col-lock ${T ? "" : "ui-lock-open"}" data-layer-lock="${A}" role="button" tabindex="0" aria-label="${T ? "Desbloquear Camada" : "Bloquear Camada"}" title="${T ? "Desbloquear Camada" : "Bloquear Camada"}">
583
+ ${T ? g.cadeadoTrancado : g.cadeadoAberto}
584
+ </div>
510
585
 
511
- <div class="ui-col ui-col-colorbar" style="background: ${L};"></div>
586
+ <div class="ui-col ui-col-colorbar" style="background: ${B};"></div>
512
587
 
513
- <div class="ui-col ui-col-chevron" data-layer-expand="${v}" role="button" tabindex="0" aria-label="${B ? "Recolher grupo" : "Expandir grupo"}">
514
- <span class="ui-chevron-icon ${B ? "open" : ""}">${m.chevronDir}</span>
515
- </div>
588
+ <div class="ui-col ui-col-chevron" data-layer-expand="${A}" role="button" tabindex="0" aria-label="${R ? "Recolher grupo" : "Expandir grupo"}">
589
+ <span class="ui-chevron-icon ${R ? "open" : ""}">${g.chevronDir}</span>
590
+ </div>
516
591
 
517
- <div class="ui-col ui-col-name" data-layer-name-trigger="${v}" title="Clique para ativar camada de desenho | Duplo clique para renomear">
518
- ${c === h.id ? `<input type="text" class="ui-inline-rename-input" data-inline-layer-input="${v}" value="${w}" />` : `<span class="ui-name-text">${w}</span>
519
- ${Y ? '<span class="ui-active-badge" title="Camada ativa para novos desenhos">✓ Ativa</span>' : ""}
520
- <span class="ui-count-chip">${I.length}</span>`}
521
- </div>
592
+ <div class="ui-col ui-col-name" data-layer-name-trigger="${A}" title="Clique para ativar camada de desenho | Duplo clique para renomear">
593
+ ${n === w.id ? `<input type="text" class="ui-inline-rename-input" data-inline-layer-input="${A}" value="${te}" />` : `${D ? `<span class="ui-group-folder-icon" title="Grupo/Pasta">${g.moverPasta}</span>` : ""}
594
+ <span class="ui-name-text">${te}</span>
595
+ ${re ? '<span class="ui-active-badge" title="Camada ativa para novos desenhos">✓ Ativa</span>' : ""}
596
+ ${C.length > 0 ? `<span class="ui-group-badge" title="${C.length} subcamadas">${C.length} sub</span>` : ""}
597
+ ${S.length > 0 || !D ? `<span class="ui-count-chip">${S.length}</span>` : ""}`}
598
+ </div>
522
599
 
523
- <div class="ui-col ui-col-actions">
524
- <button class="ui-micro-btn" data-layer-fit="${v}" title="Enquadrar camada no mapa" aria-label="Enquadrar camada no mapa">${m.alvoEnquadrar}</button>
525
- <button class="ui-micro-btn ${O ? "active" : ""}" data-layer-settings="${v}" title="Ajustar cor, opacidade e excluir" aria-label="Configurações da camada" aria-expanded="${O}">${m.engrenagem}</button>
526
- </div>
600
+ <div class="ui-col ui-col-actions">
601
+ <button class="ui-micro-btn" data-layer-fit="${A}" title="Enquadrar camada no mapa" aria-label="Enquadrar camada no mapa">${g.alvoEnquadrar}</button>
602
+ <button class="ui-micro-btn ${V ? "active" : ""}" data-layer-settings="${A}" title="Ajustar cor, hierarquia, opacidade e excluir" aria-label="Configurações da camada" aria-expanded="${V}">${g.engrenagem}</button>
603
+ </div>
527
604
 
528
- <div class="ui-col ui-col-target" data-layer-target="${v}" role="button" tabindex="0" aria-label="Selecionar todas as feições deste grupo" title="Selecionar todas as feições deste grupo">
529
- <div class="ui-target-circle ${J ? "selected" : ce ? "partial" : ""}"></div>
530
- </div>
605
+ <div class="ui-col ui-col-target" data-layer-target="${A}" role="button" tabindex="0" aria-label="Selecionar todas as feições deste grupo" title="Selecionar todas as feições deste grupo">
606
+ <div class="ui-target-circle ${ie ? "selected" : ve ? "partial" : ""}"></div>
531
607
  </div>
608
+ </div>
532
609
 
533
- ${he}
610
+ ${ke}
534
611
 
535
- <div class="ui-children-container" role="group" style="display: ${B ? "block" : "none"};">
536
- ${pe}
537
- ${fe}
538
- ${I.length === 0 ? `<div class="ui-empty-row"><span>${u ? "Nenhum item correspondente" : "Nenhum elemento neste grupo"}</span></div>` : ""}
539
- </div>
612
+ <div class="ui-children-container ${$ > 0 ? "is-subchildren" : ""}" role="group" style="display: ${R ? "block" : "none"};">
613
+ ${Ie}
614
+ ${ye}
615
+ ${we}
616
+ ${C.length === 0 && S.length === 0 ? `<div class="ui-empty-row"><span>${p ? "Nenhum item correspondente" : D ? "Grupo vazio (adicione subcamadas ou feições)" : "Nenhum elemento neste grupo"}</span></div>` : ""}
540
617
  </div>
541
- `;
542
- }).join("");
618
+ </div>
619
+ `;
620
+ }, I = Ne(o).map((x) => v(x)).join("");
543
621
  return `
544
- ${E}
622
+ ${k}
545
623
  <div class="ui-panel-box">
546
624
  <div class="ui-layer-tree" id="ui-layer-tree-mount" role="tree" aria-label="Camadas e feições" aria-multiselectable="true">
547
- ${y}
625
+ ${I}
548
626
  </div>
549
627
  </div>
550
628
  `;
551
629
  }
552
- class ze {
553
- constructor(i, e) {
554
- x(this, "host");
555
- x(this, "shadow");
556
- this.host = i, this.shadow = e;
630
+ function Ge(e, o, a) {
631
+ let t = e.find((i) => i.id === o);
632
+ for (; t && t.parentId; ) {
633
+ if (t.parentId === a) return !0;
634
+ t = e.find((i) => i.id === (t == null ? void 0 : t.parentId));
635
+ }
636
+ return !1;
637
+ }
638
+ class Ve {
639
+ constructor(o, a) {
640
+ y(this, "host");
641
+ y(this, "shadow");
642
+ this.host = o, this.shadow = a;
557
643
  }
558
644
  bindAll() {
559
- this.bindInlineRename(), this.bindDragAndDrop();
645
+ this.bindInlineRename(), this.bindDragAndDrop(), this.bindTouchDragAndDrop();
560
646
  }
561
647
  bindInlineRename() {
562
- this.shadow.querySelectorAll("[data-layer-name-trigger]").forEach((i) => {
563
- i.addEventListener("dblclick", (e) => {
564
- e.stopPropagation();
565
- const t = i.getAttribute("data-layer-name-trigger");
648
+ this.shadow.querySelectorAll("[data-layer-name-trigger]").forEach((o) => {
649
+ o.addEventListener("dblclick", (a) => {
650
+ a.stopPropagation();
651
+ const t = o.getAttribute("data-layer-name-trigger");
566
652
  if (!t) return;
567
653
  this.host.editingLayerId = t, this.host.solicitarRenderizacao();
568
- const r = S(
654
+ const i = M(
569
655
  this.shadow,
570
656
  "data-inline-layer-input",
571
657
  t
572
658
  );
573
- if (r) {
574
- r.focus(), r.select();
575
- let o = !1;
576
- const s = (c) => {
577
- var n, l;
578
- if (!o) {
579
- if (o = !0, this.host.editingLayerId = null, c) {
580
- const d = r.value.trim(), p = this.host.camadas.find((u) => u.id === t);
581
- d && p && p.name !== d && (p.name = d, (l = (n = this.host).salvarLembrancaEstado) == null || l.call(n), this.host.dispararEvento("ui-camada-renomeada", {
659
+ if (i) {
660
+ i.focus(), i.select();
661
+ let r = !1;
662
+ const s = (n) => {
663
+ var l, c;
664
+ if (!r) {
665
+ if (r = !0, this.host.editingLayerId = null, n) {
666
+ const f = i.value.trim(), u = this.host.camadas.find((p) => p.id === t);
667
+ f && u && u.name !== f && (u.name = f, (c = (l = this.host).salvarLembrancaEstado) == null || c.call(l), this.host.dispararEvento("ui-camada-renomeada", {
582
668
  camadaId: t,
583
- novoNome: d,
584
- camada: p
669
+ novoNome: f,
670
+ camada: u
585
671
  }));
586
672
  }
587
673
  this.host.solicitarRenderizacao();
588
674
  }
589
675
  };
590
- r.addEventListener("keydown", (c) => {
591
- c.key === "Enter" ? (c.preventDefault(), s(!0)) : c.key === "Escape" && (c.preventDefault(), s(!1));
592
- }), r.addEventListener("blur", () => s(!0));
676
+ i.addEventListener("keydown", (n) => {
677
+ n.key === "Enter" ? (n.preventDefault(), s(!0)) : n.key === "Escape" && (n.preventDefault(), s(!1));
678
+ }), i.addEventListener("blur", () => s(!0));
593
679
  }
594
680
  });
595
- }), this.shadow.querySelectorAll("[data-feat-name-trigger]").forEach((i) => {
596
- i.addEventListener("dblclick", (e) => {
597
- e.stopPropagation();
598
- const t = i.getAttribute("data-feat-name-trigger");
681
+ }), this.shadow.querySelectorAll("[data-feat-name-trigger]").forEach((o) => {
682
+ o.addEventListener("dblclick", (a) => {
683
+ a.stopPropagation();
684
+ const t = o.getAttribute("data-feat-name-trigger");
599
685
  if (!t) return;
600
686
  this.host.editingFeatureId = t, this.host.solicitarRenderizacao();
601
- const r = S(
687
+ const i = M(
602
688
  this.shadow,
603
689
  "data-inline-feat-input",
604
690
  t
605
691
  );
606
- if (r) {
607
- r.focus(), r.select();
608
- let o = !1;
609
- const s = (c) => {
610
- if (!o) {
611
- if (o = !0, this.host.editingFeatureId = null, c) {
612
- const n = r.value.trim(), l = this.host.feicoes.find((d) => d.id === t);
613
- n && l && l.name !== n && (l.name = n, this.host.dispararEvento("ui-feicao-renomeada", {
692
+ if (i) {
693
+ i.focus(), i.select();
694
+ let r = !1;
695
+ const s = (n) => {
696
+ if (!r) {
697
+ if (r = !0, this.host.editingFeatureId = null, n) {
698
+ const l = i.value.trim(), c = this.host.feicoes.find((f) => f.id === t);
699
+ l && c && c.name !== l && (c.name = l, this.host.dispararEvento("ui-feicao-renomeada", {
614
700
  feicaoId: t,
615
- novoNome: n,
616
- feicao: l
701
+ novoNome: l,
702
+ feicao: c
617
703
  }));
618
704
  }
619
705
  this.host.solicitarRenderizacao();
620
706
  }
621
707
  };
622
- r.addEventListener("keydown", (c) => {
623
- c.key === "Enter" ? (c.preventDefault(), s(!0)) : c.key === "Escape" && (c.preventDefault(), s(!1));
624
- }), r.addEventListener("blur", () => s(!0));
708
+ i.addEventListener("keydown", (n) => {
709
+ n.key === "Enter" ? (n.preventDefault(), s(!0)) : n.key === "Escape" && (n.preventDefault(), s(!1));
710
+ }), i.addEventListener("blur", () => s(!0));
625
711
  }
626
712
  });
627
713
  });
628
714
  }
629
715
  bindDragAndDrop() {
630
- let i = null, e = null, t = null;
631
- const r = () => {
632
- this.shadow.querySelectorAll(".ui-layer-row, .ui-feat-row, .ui-layer-group").forEach((o) => {
633
- o.classList.remove("dragging", "drop-above", "drop-below", "drop-into");
716
+ let o = null, a = null, t = null;
717
+ const i = () => {
718
+ this.shadow.querySelectorAll(".ui-layer-row, .ui-feat-row, .ui-layer-group").forEach((r) => {
719
+ r.classList.remove("dragging", "drop-above", "drop-below", "drop-into");
634
720
  });
635
721
  };
636
- this.shadow.querySelectorAll('.ui-layer-row[draggable="true"]').forEach((o) => {
637
- const s = o.getAttribute("data-layer-id");
638
- s && (o.addEventListener("dragstart", (c) => {
639
- const n = c;
640
- if (n.target.closest("input, button, select") || this.host.editingLayerId || this.host.editingFeatureId) {
641
- n.preventDefault();
722
+ this.shadow.querySelectorAll('.ui-layer-row[draggable="true"]').forEach((r) => {
723
+ const s = r.getAttribute("data-layer-id");
724
+ s && (r.addEventListener("dragstart", (n) => {
725
+ const l = n;
726
+ if (l.target.closest("input, button, select") || this.host.editingLayerId || this.host.editingFeatureId) {
727
+ l.preventDefault();
642
728
  return;
643
729
  }
644
- i = "layer", e = s, n.dataTransfer && (n.dataTransfer.setData("text/plain", JSON.stringify({ type: "layer", id: s })), n.dataTransfer.effectAllowed = "move"), o.classList.add("dragging");
645
- }), o.addEventListener("dragover", (c) => {
646
- const n = c;
647
- if (n.preventDefault(), n.stopPropagation(), n.dataTransfer && (n.dataTransfer.dropEffect = "move"), i === "layer") {
648
- if (e === s) return;
649
- const l = o.getBoundingClientRect(), d = n.clientY - l.top < l.height / 2;
650
- o.classList.toggle("drop-above", d), o.classList.toggle("drop-below", !d);
651
- } else i === "feature" && o.classList.add("drop-into");
652
- }), o.addEventListener("dragleave", (c) => {
653
- const n = c.relatedTarget;
654
- n && o.contains(n) || o.classList.remove("drop-above", "drop-below", "drop-into");
655
- }), o.addEventListener("drop", (c) => {
656
- var d, p;
657
- const n = c;
658
- n.preventDefault(), n.stopPropagation();
659
- const l = o.classList.contains("drop-above");
660
- if (r(), i === "layer") {
661
- if (!e || e === s) return;
662
- const u = this.host.camadas.findIndex((b) => b.id === e);
663
- if (u === -1) return;
664
- const [f] = this.host.camadas.splice(u, 1), g = this.host.camadas.findIndex((b) => b.id === s);
665
- g === -1 ? this.host.camadas.push(f) : this.host.camadas.splice(l ? g : g + 1, 0, f), (p = (d = this.host).salvarLembrancaEstado) == null || p.call(d), this.host.dispararEvento("ui-camadas-reordenadas", {
730
+ o = "layer", a = s, l.dataTransfer && (l.dataTransfer.setData("text/plain", JSON.stringify({ type: "layer", id: s })), l.dataTransfer.effectAllowed = "move"), r.classList.add("dragging");
731
+ }), r.addEventListener("dragover", (n) => {
732
+ const l = n;
733
+ if (l.preventDefault(), l.stopPropagation(), l.dataTransfer && (l.dataTransfer.dropEffect = "move"), o === "layer") {
734
+ if (a === s) return;
735
+ const c = r.getBoundingClientRect(), f = (l.clientY - c.top) / c.height;
736
+ f < 0.25 ? (r.classList.add("drop-above"), r.classList.remove("drop-below", "drop-into")) : f > 0.75 ? (r.classList.add("drop-below"), r.classList.remove("drop-above", "drop-into")) : (r.classList.add("drop-into"), r.classList.remove("drop-above", "drop-below"));
737
+ } else o === "feature" && r.classList.add("drop-into");
738
+ }), r.addEventListener("dragleave", (n) => {
739
+ const l = n.relatedTarget;
740
+ l && r.contains(l) || r.classList.remove("drop-above", "drop-below", "drop-into");
741
+ }), r.addEventListener("drop", (n) => {
742
+ var u, p;
743
+ const l = n;
744
+ l.preventDefault(), l.stopPropagation();
745
+ const c = r.classList.contains("drop-above"), f = r.classList.contains("drop-into");
746
+ if (i(), o === "layer") {
747
+ if (!a || a === s) return;
748
+ const d = this.host.camadas.find((h) => h.id === a), m = this.host.camadas.find((h) => h.id === s);
749
+ if (!d || !m) return;
750
+ if (f)
751
+ Ge(this.host.camadas, m.id, d.id) || (d.parentId = m.id, "expandedLayers" in this.host && this.host.expandedLayers && this.host.expandedLayers.add(m.id), this.host.dispararEvento("ui-camada-mover-hierarquia", {
752
+ camadaId: d.id,
753
+ novoParentId: m.id,
754
+ camada: d
755
+ }));
756
+ else {
757
+ const h = this.host.camadas.findIndex((v) => v.id === a);
758
+ if (h === -1) return;
759
+ this.host.camadas.splice(h, 1);
760
+ const k = this.host.camadas.findIndex((v) => v.id === s);
761
+ k === -1 ? this.host.camadas.push(d) : this.host.camadas.splice(c ? k : k + 1, 0, d), d.parentId = m.parentId ?? null;
762
+ }
763
+ (p = (u = this.host).salvarLembrancaEstado) == null || p.call(u), this.host.dispararEvento("ui-camadas-reordenadas", {
666
764
  camadas: [...this.host.camadas]
667
765
  }), this.host.solicitarRenderizacao();
668
- } else if (i === "feature") {
766
+ } else if (o === "feature") {
669
767
  if (!t) return;
670
- const u = this.host.feicoes.find((g) => g.id === t), f = this.host.camadas.find((g) => g.id === s);
671
- if (u && f && u.layerId !== s) {
672
- const g = u.layerId;
673
- u.layerId = s, this.host.dispararEvento("ui-feicao-movida", {
674
- feicaoId: u.id,
675
- camadaOrigemId: g,
768
+ const d = this.host.feicoes.find((h) => h.id === t), m = this.host.camadas.find((h) => h.id === s);
769
+ if (d && m && d.layerId !== s) {
770
+ const h = d.layerId;
771
+ d.layerId = s, this.host.dispararEvento("ui-feicao-movida", {
772
+ feicaoId: d.id,
773
+ camadaOrigemId: h,
676
774
  camadaDestinoId: s,
677
- feicao: u
775
+ feicao: d
678
776
  }), this.host.solicitarRenderizacao();
679
777
  }
680
778
  }
681
- }), o.addEventListener("dragend", () => {
682
- i = null, e = null, t = null, r();
779
+ }), r.addEventListener("dragend", () => {
780
+ o = null, a = null, t = null, i();
683
781
  }));
684
- }), this.shadow.querySelectorAll('.ui-feat-row[draggable="true"]').forEach((o) => {
685
- const s = o.getAttribute("data-feat-row"), c = o.getAttribute("data-feat-layer");
686
- s && (o.addEventListener("dragstart", (n) => {
687
- const l = n;
688
- if (l.target.closest("input, button, select") || this.host.editingLayerId || this.host.editingFeatureId) {
689
- l.preventDefault();
782
+ }), this.shadow.querySelectorAll('.ui-feat-row[draggable="true"]').forEach((r) => {
783
+ const s = r.getAttribute("data-feat-row"), n = r.getAttribute("data-feat-layer");
784
+ s && (r.addEventListener("dragstart", (l) => {
785
+ const c = l;
786
+ if (c.target.closest("input, button, select") || this.host.editingLayerId || this.host.editingFeatureId) {
787
+ c.preventDefault();
690
788
  return;
691
789
  }
692
- l.stopPropagation(), i = "feature", t = s, e = c, l.dataTransfer && (l.dataTransfer.setData(
790
+ c.stopPropagation(), o = "feature", t = s, a = n, c.dataTransfer && (c.dataTransfer.setData(
693
791
  "text/plain",
694
- JSON.stringify({ type: "feature", id: s, layerId: c })
695
- ), l.dataTransfer.effectAllowed = "move"), o.classList.add("dragging");
696
- }), o.addEventListener("dragover", (n) => {
697
- const l = n;
698
- if (i !== "feature" || t === s) return;
699
- l.preventDefault(), l.stopPropagation(), l.dataTransfer && (l.dataTransfer.dropEffect = "move");
700
- const d = o.getBoundingClientRect(), p = l.clientY - d.top < d.height / 2;
701
- o.classList.toggle("drop-above", p), o.classList.toggle("drop-below", !p);
702
- }), o.addEventListener("dragleave", (n) => {
703
- const l = n.relatedTarget;
704
- l && o.contains(l) || o.classList.remove("drop-above", "drop-below");
705
- }), o.addEventListener("drop", (n) => {
706
- const l = n;
707
- if (i !== "feature" || !t || t === s) return;
708
- l.preventDefault(), l.stopPropagation();
709
- const d = o.classList.contains("drop-above");
710
- r();
711
- const p = this.host.feicoes.findIndex((h) => h.id === t);
712
- if (p === -1) return;
713
- const u = this.host.feicoes.find((h) => h.id === s);
714
- if (!u) return;
715
- const [f] = this.host.feicoes.splice(p, 1), g = f.layerId, b = u.layerId, E = g !== b;
716
- E && (f.layerId = b);
717
- const y = this.host.feicoes.findIndex((h) => h.id === s);
718
- y === -1 ? this.host.feicoes.push(f) : this.host.feicoes.splice(d ? y : y + 1, 0, f), E && this.host.dispararEvento("ui-feicao-movida", {
719
- feicaoId: f.id,
720
- camadaOrigemId: g,
721
- camadaDestinoId: b,
722
- feicao: f
792
+ JSON.stringify({ type: "feature", id: s, layerId: n })
793
+ ), c.dataTransfer.effectAllowed = "move"), r.classList.add("dragging");
794
+ }), r.addEventListener("dragover", (l) => {
795
+ const c = l;
796
+ if (o !== "feature" || t === s) return;
797
+ c.preventDefault(), c.stopPropagation(), c.dataTransfer && (c.dataTransfer.dropEffect = "move");
798
+ const f = r.getBoundingClientRect(), u = c.clientY - f.top < f.height / 2;
799
+ r.classList.toggle("drop-above", u), r.classList.toggle("drop-below", !u);
800
+ }), r.addEventListener("dragleave", (l) => {
801
+ const c = l.relatedTarget;
802
+ c && r.contains(c) || r.classList.remove("drop-above", "drop-below");
803
+ }), r.addEventListener("drop", (l) => {
804
+ const c = l;
805
+ if (o !== "feature" || !t || t === s) return;
806
+ c.preventDefault(), c.stopPropagation();
807
+ const f = r.classList.contains("drop-above");
808
+ i();
809
+ const u = this.host.feicoes.findIndex((b) => b.id === t);
810
+ if (u === -1) return;
811
+ const p = this.host.feicoes.find((b) => b.id === s);
812
+ if (!p) return;
813
+ const [d] = this.host.feicoes.splice(u, 1), m = d.layerId, h = p.layerId, k = m !== h;
814
+ k && (d.layerId = h);
815
+ const v = this.host.feicoes.findIndex((b) => b.id === s);
816
+ v === -1 ? this.host.feicoes.push(d) : this.host.feicoes.splice(f ? v : v + 1, 0, d), k && this.host.dispararEvento("ui-feicao-movida", {
817
+ feicaoId: d.id,
818
+ camadaOrigemId: m,
819
+ camadaDestinoId: h,
820
+ feicao: d
723
821
  }), this.host.dispararEvento("ui-feicoes-reordenadas", {
724
822
  feicoes: [...this.host.feicoes]
725
823
  }), this.host.solicitarRenderizacao();
726
- }), o.addEventListener("dragend", (n) => {
727
- n.stopPropagation(), i = null, t = null, e = null, r();
824
+ }), r.addEventListener("dragend", (l) => {
825
+ l.stopPropagation(), o = null, t = null, a = null, i();
728
826
  }));
729
827
  });
730
828
  }
829
+ /**
830
+ * Suporte a arraste por toque e ponteiro no handle (.ui-col-drag) para tablets e mobile
831
+ */
832
+ bindTouchDragAndDrop() {
833
+ this.shadow.querySelectorAll(".ui-layer-row .ui-col-drag").forEach((o) => {
834
+ const a = o.closest(".ui-layer-row");
835
+ if (!a) return;
836
+ const t = a.getAttribute("data-layer-id");
837
+ t && o.addEventListener("pointerdown", (i) => {
838
+ const r = i;
839
+ if (r.pointerType === "mouse" && r.button !== 0 || this.host.editingLayerId || this.host.editingFeatureId) return;
840
+ let s = null, n = !1;
841
+ const l = t, c = () => {
842
+ this.shadow.querySelectorAll(".ui-layer-row, .ui-feat-row, .ui-layer-group").forEach((p) => p.classList.remove("dragging", "drop-above", "drop-below"));
843
+ }, f = (p) => {
844
+ p.preventDefault(), a.classList.add("dragging");
845
+ const d = this.shadow.elementFromPoint(p.clientX, p.clientY), m = d ? d.closest(".ui-layer-row") : null;
846
+ if (s && s !== m && s.classList.remove("drop-above", "drop-below"), m && m !== a) {
847
+ s = m;
848
+ const h = m.getBoundingClientRect();
849
+ n = p.clientY - h.top < h.height / 2, m.classList.toggle("drop-above", n), m.classList.toggle("drop-below", !n);
850
+ } else
851
+ s = null;
852
+ }, u = () => {
853
+ var p, d;
854
+ if (window.removeEventListener("pointermove", f), window.removeEventListener("pointerup", u), window.removeEventListener("pointercancel", u), s) {
855
+ const m = s.getAttribute("data-layer-id");
856
+ if (c(), m && l && m !== l) {
857
+ const h = this.host.camadas.findIndex((k) => k.id === l);
858
+ if (h !== -1) {
859
+ const [k] = this.host.camadas.splice(h, 1), v = this.host.camadas.findIndex((b) => b.id === m);
860
+ v === -1 ? this.host.camadas.push(k) : this.host.camadas.splice(n ? v : v + 1, 0, k), (d = (p = this.host).salvarLembrancaEstado) == null || d.call(p), this.host.dispararEvento("ui-camadas-reordenadas", {
861
+ camadas: [...this.host.camadas]
862
+ }), this.host.solicitarRenderizacao();
863
+ }
864
+ }
865
+ } else
866
+ c();
867
+ };
868
+ window.addEventListener("pointermove", f, { passive: !1 }), window.addEventListener("pointerup", u), window.addEventListener("pointercancel", u);
869
+ });
870
+ });
871
+ }
731
872
  }
732
- const Fe = "ui_camadas_estado_";
733
- function Be(a, i) {
734
- const e = (a || i || "default").trim();
735
- return `${Fe}${e}`;
873
+ const Ue = "ui_camadas_estado_";
874
+ function _e(e, o) {
875
+ const a = (e || o || "default").trim();
876
+ return `${Ue}${a}`;
736
877
  }
737
- function U(a) {
878
+ function W(e) {
738
879
  if (typeof window > "u" || typeof localStorage > "u")
739
880
  return null;
740
881
  try {
741
- const i = localStorage.getItem(a);
742
- if (!i) return null;
743
- const e = JSON.parse(i);
744
- if (e && typeof e == "object")
745
- return e;
746
- } catch (i) {
747
- console.warn(`[UI-Camadas] Não foi possível carregar o estado persistido (${a}):`, i);
882
+ const o = localStorage.getItem(e);
883
+ if (!o) return null;
884
+ const a = JSON.parse(o);
885
+ if (a && typeof a == "object")
886
+ return a;
887
+ } catch (o) {
888
+ console.warn(`[UI-Camadas] Não foi possível carregar o estado persistido (${e}):`, o);
748
889
  }
749
890
  return null;
750
891
  }
751
- function qe(a, i) {
892
+ function Ke(e, o) {
752
893
  if (!(typeof window > "u" || typeof localStorage > "u"))
753
894
  try {
754
- localStorage.setItem(a, JSON.stringify(i));
755
- } catch (e) {
756
- console.warn(`[UI-Camadas] Não foi possível salvar o estado persistido (${a}):`, e);
895
+ localStorage.setItem(e, JSON.stringify(o));
896
+ } catch (a) {
897
+ console.warn(`[UI-Camadas] Não foi possível salvar o estado persistido (${e}):`, a);
757
898
  }
758
899
  }
759
- function Te(a) {
900
+ function Ye(e) {
760
901
  if (!(typeof window > "u" || typeof localStorage > "u"))
761
902
  try {
762
- localStorage.removeItem(a);
903
+ localStorage.removeItem(e);
763
904
  } catch {
764
905
  }
765
906
  }
766
- function _(a) {
907
+ function Z(e) {
767
908
  return {
768
- name: a.name,
769
- visible: a.visible !== !1,
770
- locked: !!a.locked,
771
- opacity: typeof a.opacity == "number" ? a.opacity : 1,
772
- color: a.color || "#00E08A"
909
+ name: e.name,
910
+ visible: e.visible !== !1,
911
+ locked: !!e.locked,
912
+ opacity: typeof e.opacity == "number" ? e.opacity : 1,
913
+ color: e.color || "#00E08A",
914
+ parentId: e.parentId !== void 0 ? e.parentId : null
773
915
  };
774
916
  }
775
- function De(a, i, e, t) {
776
- if (!Array.isArray(a)) return;
777
- const r = (i == null ? void 0 : i.camadasOverrides) || {}, o = new Set((i == null ? void 0 : i.expandedLayerIds) || []), s = new Set((i == null ? void 0 : i.collapsedLayerIds) || []), c = o.size > 0 || s.size > 0;
778
- for (let n = 0; n < a.length; n++) {
779
- const l = a[n], d = r[l.id];
780
- if (t == null || t.set(l.id, _(l)), d) {
781
- const p = d.origem, u = (f) => {
917
+ function Qe(e, o, a, t) {
918
+ if (!Array.isArray(e)) return;
919
+ const i = (o == null ? void 0 : o.camadasOverrides) || {}, r = new Set((o == null ? void 0 : o.expandedLayerIds) || []), s = new Set((o == null ? void 0 : o.collapsedLayerIds) || []), n = r.size > 0 || s.size > 0;
920
+ for (let u = 0; u < e.length; u++) {
921
+ const p = e[u], d = i[p.id];
922
+ if (t == null || t.set(p.id, Z(p)), d) {
923
+ const m = d.origem, h = (k) => {
782
924
  var b;
783
- const g = (b = t == null ? void 0 : t.get(l.id)) == null ? void 0 : b[f];
784
- return p !== void 0 && p[f] !== g;
925
+ const v = (b = t == null ? void 0 : t.get(p.id)) == null ? void 0 : b[k];
926
+ return m !== void 0 && m[k] !== v;
785
927
  };
786
- typeof d.name == "string" && d.name.trim() && !u("name") && (l.name = d.name), typeof d.visible == "boolean" && !u("visible") && (l.visible = d.visible), typeof d.locked == "boolean" && !u("locked") && (l.locked = d.locked), typeof d.opacity == "number" && !u("opacity") && (l.opacity = d.opacity), typeof d.color == "string" && !u("color") && (l.color = d.color);
928
+ typeof d.name == "string" && d.name.trim() && !h("name") && (p.name = d.name), typeof d.visible == "boolean" && !h("visible") && (p.visible = d.visible), typeof d.locked == "boolean" && !h("locked") && (p.locked = d.locked), typeof d.opacity == "number" && !h("opacity") && (p.opacity = d.opacity), typeof d.color == "string" && !h("color") && (p.color = d.color), d.parentId !== void 0 && !h("parentId") && (p.parentId = d.parentId);
787
929
  }
788
- c ? o.has(l.id) ? e.add(l.id) : s.has(l.id) ? e.delete(l.id) : e.add(l.id) : e.add(l.id);
789
- }
790
- if (Array.isArray(i == null ? void 0 : i.ordemCamadasIds) && i.ordemCamadasIds.length > 0) {
791
- const n = /* @__PURE__ */ new Map();
792
- i.ordemCamadasIds.forEach((l, d) => n.set(l, d)), a.sort((l, d) => {
793
- const p = n.has(l.id) ? n.get(l.id) : 9999, u = n.has(d.id) ? n.get(d.id) : 9999;
794
- return p - u;
930
+ n ? r.has(p.id) ? a.add(p.id) : s.has(p.id) ? a.delete(p.id) : a.add(p.id) : a.add(p.id);
931
+ }
932
+ const l = new Set(e.map((u) => u.id)), c = o == null ? void 0 : o.ordemOrigemIds;
933
+ if (!(Array.isArray(c) && (() => {
934
+ const u = new Set(c), p = (d) => d.filter((m) => l.has(m) && u.has(m)).join("|");
935
+ return p(c) !== p(e.map((d) => d.id));
936
+ })()) && Array.isArray(o == null ? void 0 : o.ordemCamadasIds) && o.ordemCamadasIds.length > 0) {
937
+ const u = /* @__PURE__ */ new Map();
938
+ o.ordemCamadasIds.forEach((p, d) => u.set(p, d)), e.sort((p, d) => {
939
+ const m = u.has(p.id) ? u.get(p.id) : 9999, h = u.has(d.id) ? u.get(d.id) : 9999;
940
+ return m - h;
795
941
  });
796
942
  }
797
943
  }
798
- function Oe(a) {
799
- const { estadoAnterior: i, camadas: e, expandedLayers: t } = a;
800
- let r = (i == null ? void 0 : i.expandedLayerIds) || [], o = (i == null ? void 0 : i.collapsedLayerIds) || [], s = (i == null ? void 0 : i.ordemCamadasIds) || [];
801
- const c = {
802
- ...(i == null ? void 0 : i.camadasOverrides) || {}
944
+ function Je(e) {
945
+ const { estadoAnterior: o, camadas: a, expandedLayers: t } = e;
946
+ let i = (o == null ? void 0 : o.expandedLayerIds) || [], r = (o == null ? void 0 : o.collapsedLayerIds) || [], s = (o == null ? void 0 : o.ordemCamadasIds) || [], n = o == null ? void 0 : o.ordemOrigemIds;
947
+ const l = {
948
+ ...(o == null ? void 0 : o.camadasOverrides) || {}
803
949
  };
804
- return e.length > 0 && (r = [], o = [], s = e.map((n) => n.id), e.forEach((n) => {
805
- var l, d;
806
- t.has(n.id) ? r.push(n.id) : o.push(n.id), c[n.id] = {
807
- name: n.name,
808
- visible: n.visible !== !1,
809
- locked: !!n.locked,
810
- opacity: typeof n.opacity == "number" ? n.opacity : 1,
811
- color: n.color || "#00E08A",
812
- origem: ((l = a.origensCamadas) == null ? void 0 : l.get(n.id)) ?? ((d = c[n.id]) == null ? void 0 : d.origem)
950
+ a.length > 0 && (i = [], r = [], s = a.map((c) => c.id), n = e.origensCamadas ? [...e.origensCamadas.keys()] : s, a.forEach((c) => {
951
+ var f, u;
952
+ t.has(c.id) ? i.push(c.id) : r.push(c.id), l[c.id] = {
953
+ name: c.name,
954
+ visible: c.visible !== !1,
955
+ locked: !!c.locked,
956
+ opacity: typeof c.opacity == "number" ? c.opacity : 1,
957
+ color: c.color || "#00E08A",
958
+ origem: ((f = e.origensCamadas) == null ? void 0 : f.get(c.id)) ?? ((u = l[c.id]) == null ? void 0 : u.origem)
813
959
  };
814
- })), {
960
+ }));
961
+ for (const c of e.camadasRemovidas ?? []) delete l[c];
962
+ return {
815
963
  versao: 1,
816
- expandedLayerIds: r,
817
- collapsedLayerIds: o,
818
- camadaAtivaId: a.camadaAtivaId,
819
- painelColapsado: a.painelColapsado,
964
+ expandedLayerIds: i,
965
+ collapsedLayerIds: r,
966
+ camadaAtivaId: e.camadaAtivaId,
967
+ painelColapsado: e.painelColapsado,
820
968
  ordemCamadasIds: s,
821
- mapaBaseAtivo: a.mapaBaseAtivo,
822
- densidade: a.densidade,
823
- altura: a.altura,
824
- camadasOverrides: c,
969
+ ordemOrigemIds: n,
970
+ mapaBaseAtivo: e.mapaBaseAtivo,
971
+ densidade: e.densidade,
972
+ altura: e.altura,
973
+ camadasOverrides: l,
825
974
  ultimaAtualizacao: Date.now()
826
975
  };
827
976
  }
828
- const Pe = ':host{display:flex;flex-direction:column;box-sizing:border-box;font-family:inherit;font-size:11px;color:var(--ui-cor-texto, #e1e1e6);-webkit-user-select:none;user-select:none;width:100%;height:var(--ui-camadas-altura, 100%);min-height:var(--ui-camadas-min-altura, 140px);position:relative;--camada-linha-altura: 25px;--camada-thumb-tamanho: 15px;--camada-transicao: .16s cubic-bezier(.16, 1, .3, 1)}:host([densidade="compacto"]){--camada-linha-altura: 22px;--camada-thumb-tamanho: 13px;font-size:10px}:host([flutuante]){position:absolute;top:10px;right:10px;bottom:46px;z-index:var(--ui-z-workspace-hud, 500);width:auto;height:var(--ui-camadas-altura, auto)}*,*:before,*:after{box-sizing:border-box}:host(:not([flutuante])) .ui-camadas-container{max-width:100%;min-width:0;border:none;box-shadow:none;border-radius:0;background:transparent;backdrop-filter:none;-webkit-backdrop-filter:none}.ui-camadas-container{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;width:100%;max-width:380px;min-width:270px;background:var(--ui-cor-superficie, #141417);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .12));border-radius:var(--ui-raio-borda, 8px);box-shadow:var(--ui-sombra-lg, 0 10px 30px -4px rgba(0, 0, 0, .5)),0 0 0 1px color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 5%,transparent);overflow:hidden;position:relative;transition:transform .24s cubic-bezier(.16,1,.3,1),opacity .2s ease;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}:host([colapsado]) .ui-camadas-container{transform:translate(calc(100% + 24px));opacity:0;pointer-events:none}.ui-camadas-toggle-flutuante{display:none;position:absolute;top:10px;right:10px;z-index:calc(var(--ui-z-workspace-hud, 500) - 1);background:var(--ui-cor-superficie, #141417);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .18));border-radius:var(--ui-raio-borda, 6px);color:var(--ui-cor-texto, #ffffff);width:34px;height:34px;cursor:pointer;align-items:center;justify-content:center;box-shadow:var(--ui-sombra-md, 0 8px 20px rgba(0, 0, 0, .45));transition:all var(--camada-transicao)}:host([colapsado][flutuante]) .ui-camadas-toggle-flutuante{display:flex}.ui-camadas-toggle-flutuante:hover{border-color:var(--ui-cor-primaria, #00E08A);color:var(--ui-cor-primaria, #00E08A);transform:scale(1.08);box-shadow:0 0 14px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 35%,transparent)}.ui-camadas-header{height:32px;min-height:32px;max-height:32px;display:flex;align-items:center;justify-content:space-between;padding:0 5px;border-bottom:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));background:var(--ui-cor-fundo-elevado, rgba(0, 0, 0, .28));gap:4px}.ui-camadas-tabs{display:flex;gap:3px;flex:1}.ui-camadas-tab-btn{flex:1;background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);height:24px;padding:0 6px;font-size:11px;font-weight:500;border-radius:var(--ui-raio-sm, 4px);cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;white-space:nowrap;transition:all var(--camada-transicao)}.ui-camadas-tab-btn:hover{color:var(--ui-cor-texto, #ffffff);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .07))}.ui-camadas-tab-btn.active{color:var(--ui-cor-primaria, #00E08A);background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 25%,transparent);font-weight:600}.ui-camadas-btn-colapsar{background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);width:22px;height:22px;cursor:pointer;border-radius:var(--ui-raio-sm, 4px);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all var(--camada-transicao)}.ui-camadas-btn-colapsar:hover{color:var(--ui-cor-texto, #ffffff);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .09))}.ui-camadas-corpo{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:6px 6px 4px;display:flex;flex-direction:column;gap:6px;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 16%,transparent) transparent}.ui-camadas-corpo::-webkit-scrollbar{width:4px}.ui-camadas-corpo::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 18%,transparent);border-radius:var(--ui-raio-sm, 4px)}.ui-camadas-corpo::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 32%,transparent)}.ui-tree-toolbar{display:flex;align-items:center;justify-content:space-between;padding:1px 2px 3px;border-bottom:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .06))}.ui-tree-title-group{display:flex;align-items:center;gap:5px}.ui-tree-section-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--ui-cor-texto-secundario, #888899)}.ui-tree-count-badge{font-size:9px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 7%,transparent);color:var(--ui-cor-texto-secundario, #888899);padding:1px 5px;border-radius:8px;border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 6%,transparent)}.ui-tree-actions{display:flex;align-items:center;gap:3px}.ui-tree-action-btn{background:transparent;border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .1));color:var(--ui-cor-texto-secundario, #888899);border-radius:var(--ui-raio-sm, 4px);width:22px;height:22px;padding:0;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--camada-transicao)}.ui-tree-action-btn:hover{color:var(--ui-cor-texto, #ffffff);border-color:var(--ui-cor-primaria, #00E08A);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .09))}.ui-tree-btn-new{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent);border:1px solid color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 35%,transparent);color:var(--ui-cor-primaria, #00E08A);border-radius:var(--ui-raio-sm, 4px);height:22px;padding:0 8px;font-size:10px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:4px;transition:all var(--camada-transicao)}.ui-tree-btn-new:hover{background:var(--ui-cor-primaria, #00E08A);color:var(--ui-cor-texto-sobre-primaria, #000000);box-shadow:0 0 10px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 35%,transparent)}.ui-tree-search-wrapper{position:relative;display:flex;align-items:center;margin:1px 0}.ui-tree-search-icon{position:absolute;left:8px;color:var(--ui-cor-texto-secundario, #888899);pointer-events:none;display:flex;align-items:center}.ui-tree-search-input{width:100%;height:25px;background:var(--ui-cor-fundo, #0a0a0c);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .1));border-radius:var(--ui-raio-borda, 5px);padding:0 24px 0 26px;color:var(--ui-cor-texto, #ffffff);font-size:10.5px;outline:none;transition:border-color var(--camada-transicao),box-shadow var(--camada-transicao)}.ui-tree-search-input:focus{border-color:var(--ui-cor-primaria, #00E08A);box-shadow:0 0 0 2px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 18%,transparent)}.ui-tree-search-clear{position:absolute;right:5px;background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);cursor:pointer;width:18px;height:18px;display:flex;align-items:center;justify-content:center;border-radius:3px;transition:all var(--camada-transicao)}.ui-tree-search-clear:hover{color:var(--ui-cor-texto, #ffffff);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 10%,transparent)}.ui-panel-box{background:var(--ui-cor-fundo, #0c0c0f);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));border-radius:var(--ui-raio-borda, 6px);overflow:hidden;display:flex;flex-direction:column;flex:1 1 0%;min-height:80px}.ui-layer-tree{flex:1 1 0%;min-height:40px;overflow-y:auto;overflow-x:hidden}.ui-layer-group{border-bottom:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .04));transition:background var(--camada-transicao)}.ui-layer-group.drop-into{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 9%,transparent)!important;outline:1.5px dashed var(--ui-cor-primaria, #00E08A);outline-offset:-1.5px}.ui-layer-row,.ui-feat-row{display:flex;align-items:center;height:var(--camada-linha-altura);min-height:var(--camada-linha-altura);max-height:var(--camada-linha-altura);padding:0 4px;-webkit-user-select:none;user-select:none;cursor:default;transition:background .1s ease;position:relative}.ui-layer-row{background:var(--ui-cor-fundo-elevado, #18181d);font-weight:600;cursor:pointer;border-left:3px solid transparent}.ui-layer-row:hover{background:var(--ui-cor-hover-menu, #22222a)}.ui-layer-row.active-drawing-layer{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent)!important;border-left:3px solid var(--layer-active-color, var(--ui-cor-primaria, #00E08A))!important;box-shadow:inset 0 0 12px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 7%,transparent)}.ui-layer-row.active-drawing-layer .ui-name-text{color:var(--ui-cor-texto, #e1e1e6);font-weight:700}.ui-feat-row{background:var(--ui-cor-fundo, #101014);font-weight:400;cursor:pointer}.ui-feat-row:hover{background:var(--ui-cor-hover-menu, #19191f)}.ui-feat-row.selected-row{background:color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 18%,transparent)!important;outline:1px solid color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 50%,transparent)!important;outline-offset:-1px}.ui-layer-row.hidden-layer,.ui-feat-row.hidden-row{opacity:.52}.ui-layer-row.hidden-layer .ui-col-eye,.ui-feat-row.hidden-row .ui-col-eye{color:var(--ui-cor-texto-alerta, #ffb86c);opacity:.95}.ui-layer-row.dragging,.ui-feat-row.dragging{opacity:.35;background:color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 16%,transparent)!important}.ui-layer-row.drop-above:before,.ui-feat-row.drop-above:before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background:var(--ui-cor-texto-info, #33b5ff);box-shadow:0 0 8px color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 100%,transparent);z-index:20;pointer-events:none}.ui-layer-row.drop-below:after,.ui-feat-row.drop-below:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--ui-cor-texto-info, #33b5ff);box-shadow:0 0 8px color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 100%,transparent);z-index:20;pointer-events:none}.ui-col{display:flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--camada-linha-altura)}.ui-col-drag{width:14px;cursor:grab;color:var(--ui-cor-texto-secundario, #888899);opacity:.35;transition:opacity var(--camada-transicao),color var(--camada-transicao)}.ui-layer-row:hover .ui-col-drag,.ui-feat-row:hover .ui-col-drag{opacity:.9;color:var(--ui-cor-primaria, #00E08A)}.ui-col-drag:active{cursor:grabbing}.ui-col-eye{width:20px;cursor:pointer;color:var(--ui-cor-texto-secundario, #888899);transition:color var(--camada-transicao)}.ui-col-eye:hover{color:var(--ui-cor-primaria, #00E08A)}.ui-col-lock{width:18px;cursor:pointer;color:var(--ui-cor-texto-secundario, #888899);transition:color var(--camada-transicao)}.ui-col-lock:hover{color:var(--ui-cor-texto-alerta, #ffb86c)}.ui-col-colorbar{width:3.5px;height:16px;margin:0 3px 0 2px;border-radius:1.5px;flex-shrink:0}.ui-col-chevron{width:14px;cursor:pointer;color:var(--ui-cor-texto-secundario, #888899);display:flex;align-items:center;justify-content:center}.ui-chevron-icon{display:inline-flex;align-items:center;justify-content:center;transition:transform var(--camada-transicao)}.ui-chevron-icon.open{transform:rotate(90deg)}.ui-col-branch{width:14px;display:flex;align-items:center;justify-content:center;color:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 22%,transparent);font-size:10px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace)}.ui-col-thumb{width:18px;margin-right:4px;display:flex;align-items:center;justify-content:center}.ui-thumb-box{width:var(--camada-thumb-tamanho);height:var(--camada-thumb-tamanho);border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 15%,transparent);border-radius:2.5px;background:var(--ui-cor-fundo, #0d0d10);display:flex;align-items:center;justify-content:center}.ui-col-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;color:var(--ui-cor-texto, #e1e1e6);padding-left:2px;padding-right:4px;cursor:pointer;display:flex;align-items:center;justify-content:flex-start;text-align:left;gap:4px}.ui-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-active-badge{font-size:8px;font-weight:700;color:var(--ui-cor-texto-sobre-primaria, #000000);background:var(--ui-cor-primaria, #00E08A);border:1px solid color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 45%,transparent);padding:1px 4px;border-radius:3px;display:inline-flex;align-items:center;gap:2px;white-space:nowrap;flex-shrink:0;animation:pulseBadge 2.8s infinite}@keyframes pulseBadge{0%{opacity:.85}50%{opacity:1;filter:drop-shadow(0 0 4px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 50%,transparent))}to{opacity:.85}}.ui-count-chip{font-size:9px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;color:var(--ui-cor-texto, #e1e1e6);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 6%,transparent);padding:0 4px;border-radius:8px}.ui-col-actions{display:flex;align-items:center;gap:2px;opacity:0;transition:opacity var(--camada-transicao)}.ui-layer-row:hover .ui-col-actions,.ui-feat-row:hover .ui-col-actions{opacity:1}.ui-micro-btn{background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);width:18px;height:18px;padding:0;border-radius:3px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--camada-transicao)}.ui-micro-btn:hover{color:var(--ui-cor-primaria, #00E08A);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .12))}.ui-micro-btn.active{color:var(--ui-cor-primaria, #00E08A);background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 18%,transparent)}.ui-col-target{width:22px;cursor:pointer}.ui-target-circle{width:11px;height:11px;border-radius:50%;border:1.5px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 32%,transparent);background:transparent;transition:all .12s ease}.ui-col-target:hover .ui-target-circle{border-color:var(--ui-cor-texto-info, #33b5ff);transform:scale(1.18)}.ui-target-circle.selected{border:2px solid var(--ui-cor-texto-info, #33b5ff);background:var(--ui-cor-texto-info, #33b5ff);box-shadow:inset 0 0 0 2px var(--ui-cor-superficie, #141418)}.ui-target-circle.partial{border:2px solid var(--ui-cor-texto-info, #33b5ff);background:color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 40%,transparent)}.ui-inline-rename-input{width:100%;height:20px;background:var(--ui-cor-fundo, #0d0d10);color:var(--ui-cor-texto, #e1e1e6);border:1px solid var(--ui-cor-primaria, #00E08A);border-radius:3px;font-size:10.5px;padding:0 4px;outline:none;box-shadow:0 0 8px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 40%,transparent)}.ui-layer-settings-drawer{background:linear-gradient(180deg,var(--ui-cor-fundo-elevado, #17171e) 0%,var(--ui-cor-superficie, #0f0f13) 100%);padding:10px 14px 12px;border-top:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 8%,transparent);border-bottom:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 12%,transparent);border-left:3px solid var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));display:flex;flex-direction:column;gap:10px;box-shadow:inset 0 1px color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 6%,transparent),0 6px 16px #00000073;animation:drawerSlideDown .18s cubic-bezier(.16,1,.3,1);position:relative;z-index:10}@keyframes drawerSlideDown{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.ui-drawer-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:6px;border-bottom:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 7%,transparent)}.ui-drawer-header-left{display:flex;align-items:center;gap:7px;min-width:0}.ui-drawer-icon{color:var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));display:flex;align-items:center;flex-shrink:0}.ui-drawer-title{font-size:10.5px;font-weight:700;color:var(--ui-cor-texto, #e1e1e6);text-transform:uppercase;letter-spacing:.6px;white-space:nowrap}.ui-drawer-layer-chip{font-size:9.5px;font-weight:500;color:var(--ui-cor-texto-secundario, #888899);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 7%,transparent);padding:1px 6px;border-radius:var(--ui-raio-sm, 4px);border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 8%,transparent);max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-drawer-btn-fechar{background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);width:20px;height:20px;padding:0;border-radius:var(--ui-raio-sm, 4px);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--camada-transicao)}.ui-drawer-btn-fechar:hover{color:var(--ui-cor-texto, #e1e1e6);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 12%,transparent)}.ui-drawer-body{display:flex;flex-direction:column;gap:10px}.ui-drawer-row{display:flex;flex-direction:column;gap:5px}.ui-drawer-row-label{display:flex;justify-content:space-between;align-items:center;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--ui-cor-texto-secundario, #888899)}.ui-drawer-color-group{display:flex;align-items:center;justify-content:space-between;gap:8px}.ui-drawer-color-pill{position:relative;display:inline-flex;align-items:center;gap:6px;padding:3px 8px 3px 5px;background:var(--ui-cor-fundo, #0b0b0d);border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 16%,transparent);border-radius:var(--ui-raio-sm, 4px);cursor:pointer;transition:all var(--camada-transicao);-webkit-user-select:none;user-select:none}.ui-drawer-color-pill:hover{border-color:var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 8%,transparent);box-shadow:0 0 10px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 25%,transparent)}.ui-drawer-color-sample{width:14px;height:14px;border-radius:3px;border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 35%,transparent);box-shadow:var(--ui-sombra-sm, 0 1px 3px rgba(0, 0, 0, .5));flex-shrink:0;transition:background-color .1s ease}.ui-drawer-color-hex{font-size:10px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;font-weight:700;color:var(--ui-cor-texto, #e1e1e6);letter-spacing:.5px}.ui-drawer-color-native{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.ui-drawer-badge{font-size:9.5px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;font-weight:700;color:var(--ui-cor-texto, #e1e1e6);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 10%,transparent);padding:1px 6px;border-radius:var(--ui-raio-sm, 4px);border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 12%,transparent)}.ui-drawer-slider-container{display:flex;flex-direction:column;gap:4px}.ui-drawer-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:5px;background:linear-gradient(90deg,color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 8%,transparent) 0%,var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A)) 100%);border-radius:3px;outline:none;margin:3px 0;cursor:pointer;border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 12%,transparent)}.ui-drawer-slider::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;border:3px solid var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));box-shadow:0 0 6px #0009,0 0 10px var(--drawer-cor-camada, rgba(0, 224, 138, .6));cursor:pointer;transition:transform .12s ease}.ui-drawer-slider::-webkit-slider-thumb:hover{transform:scale(1.22)}.ui-drawer-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:3px solid var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));box-shadow:0 0 6px #0009,0 0 10px var(--drawer-cor-camada, rgba(0, 224, 138, .6));cursor:pointer}.ui-drawer-footer{display:flex;align-items:center;justify-content:space-between;padding-top:8px;border-top:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 7%,transparent)}.ui-drawer-meta-info{font-size:9.5px;color:var(--ui-cor-texto-secundario, #888899);font-style:italic}.ui-drawer-actions{display:flex;align-items:center;gap:6px}.ui-drawer-btn-danger{background:color-mix(in srgb,var(--ui-cor-texto-erro, #ff5555) 10%,transparent);border:1px solid color-mix(in srgb,var(--ui-cor-texto-erro, #ff5555) 35%,transparent);color:var(--ui-cor-texto-erro, #ff5555);border-radius:var(--ui-raio-sm, 4px);height:24px;padding:0 10px;font-size:10px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:all var(--camada-transicao)}.ui-drawer-btn-danger:hover{background:var(--ui-cor-botao-destrutivo-fundo, #d32f2f);color:var(--ui-cor-botao-destrutivo-texto, #ffffff);border-color:var(--ui-cor-botao-destrutivo-fundo, #d32f2f);box-shadow:0 0 10px color-mix(in srgb,var(--ui-cor-texto-erro, #ff5555) 45%,transparent);transform:translateY(-.5px)}.ui-drawer-btn-danger.confirming{background:var(--ui-cor-botao-destrutivo-hover, #b71c1c);color:var(--ui-cor-botao-destrutivo-texto, #ffffff);border-color:var(--ui-cor-botao-destrutivo-hover, #b71c1c);animation:pulseDanger 1.2s infinite}@keyframes pulseDanger{0%{transform:scale(1)}50%{transform:scale(1.02)}to{transform:scale(1)}}.ui-geom-tag{font-size:8px;font-weight:700;letter-spacing:.4px;padding:1px 4px;border-radius:3px;margin-left:4px;text-transform:uppercase;flex-shrink:0}.ui-geom-tag.oficial{background:color-mix(in srgb,var(--ui-cor-texto-sucesso, #00E08A) 16%,transparent);color:var(--ui-cor-texto-sucesso, #00E08A);border:1px solid color-mix(in srgb,var(--ui-cor-texto-sucesso, #00E08A) 35%,transparent)}.ui-geom-tag.previa{background:color-mix(in srgb,var(--ui-cor-texto-alerta, #ffb86c) 16%,transparent);color:var(--ui-cor-texto-alerta, #ffb86c);border:1px solid color-mix(in srgb,var(--ui-cor-texto-alerta, #ffb86c) 35%,transparent)}.ui-tree-footer{height:28px;min-height:28px;background:var(--ui-cor-fundo-elevado, #111115);border-top:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));display:flex;align-items:center;justify-content:space-between;padding:0 6px;gap:4px}.ui-footer-left{display:flex;align-items:center;gap:4px;white-space:nowrap;min-width:0}.ui-footer-count{font-size:10.5px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;font-weight:700;color:var(--ui-cor-primaria, #00E08A)}.ui-footer-label{font-size:10px;font-weight:500;color:var(--ui-cor-texto-secundario, #888899)}.ui-footer-metric{font-size:9.5px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;color:var(--ui-cor-primaria, #00E08A);display:inline-flex;align-items:center;gap:3px;white-space:nowrap}.ui-footer-right{display:flex;align-items:center;gap:2px;flex-shrink:0}.ui-footer-btn{background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);width:20px;height:20px;padding:0;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:3px;transition:all var(--camada-transicao)}.ui-footer-btn:hover:not(.disabled){color:var(--ui-cor-texto, #e1e1e6);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .12))}.ui-footer-btn.disabled{opacity:.25;cursor:not-allowed}.ui-footer-color-wrapper,.ui-footer-move-wrapper{display:flex;align-items:center}.ui-footer-color{width:15px;height:15px;border:none;background:transparent;cursor:pointer;padding:0}.ui-footer-select{background:var(--ui-cor-fundo, #18181d);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .12));color:var(--ui-cor-texto, #e1e1e6);border-radius:3px;font-size:9.5px;height:20px;padding:0 2px;cursor:pointer}.ui-basemap-section{display:flex;flex-direction:column;gap:4px;flex-shrink:0}.ui-basemap-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--ui-cor-texto-secundario, #888899)}.ui-basemap-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:4px}.ui-basemap-card{display:flex;flex-direction:column;align-items:center;gap:2px;padding:3px;border-radius:var(--ui-raio-borda, 5px);background:var(--ui-cor-fundo, #101014);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));cursor:pointer;transition:all var(--camada-transicao);text-align:center;overflow:hidden}.ui-basemap-card:hover{border-color:var(--ui-cor-primaria, #00E08A);background:var(--ui-cor-fundo-elevado, #17171c)}.ui-basemap-card.active{border-color:var(--ui-cor-primaria, #00E08A);background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent);color:var(--ui-cor-primaria, #00E08A);font-weight:600;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 35%,transparent)}.ui-basemap-preview{width:100%;height:22px;border-radius:3px;object-fit:cover;opacity:.85;transition:opacity var(--camada-transicao)}.ui-basemap-preview-none{width:100%;height:22px;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 4%,transparent);border-radius:3px;color:var(--ui-cor-texto-secundario, #888899)}.ui-basemap-card:hover .ui-basemap-preview,.ui-basemap-card.active .ui-basemap-preview{opacity:1}.ui-basemap-card span{font-size:9.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.ui-search-hidden{display:none!important}.ui-empty-row{height:22px;display:flex;align-items:center;padding-left:36px;font-size:10px;color:var(--ui-cor-texto-secundario, #666677);font-style:italic;background:var(--ui-cor-fundo-recuado, rgba(0, 0, 0, .15))}.ui-camadas-resizer-altura{display:none;flex-shrink:0;width:100%;height:9px;background:var(--ui-cor-superficie, #141417);border-top:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));cursor:ns-resize;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;touch-action:none;transition:background .15s ease,border-color .15s ease;position:relative;z-index:10}:host([redimensionavel]) .ui-camadas-resizer-altura,:host([redimensionavel-altura]) .ui-camadas-resizer-altura{display:flex}.ui-camadas-resizer-altura:hover,.ui-camadas-resizer-altura.ui-camadas-resizer--ativo{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 9%,transparent);border-top-color:var(--ui-cor-primaria, #00E08A)}.ui-camadas-resizer-grip{width:32px;height:3px;border-radius:2px;background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 22%,transparent);transition:all .15s ease}.ui-camadas-resizer-altura:hover .ui-camadas-resizer-grip,.ui-camadas-resizer-altura.ui-camadas-resizer--ativo .ui-camadas-resizer-grip{background:var(--ui-cor-primaria, #00E08A);width:46px;box-shadow:0 0 8px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 45%,transparent)}:host(.ui-camadas--redimensionando){-webkit-user-select:none!important;user-select:none!important;cursor:ns-resize!important}:host(.ui-camadas--redimensionando) *{-webkit-user-select:none!important;user-select:none!important}.ui-col-lock.ui-lock-open{opacity:.28}.ui-col-lock.ui-lock-open:hover,.ui-col-lock.ui-lock-open:focus-visible{opacity:.8}.ui-col-lock[data-locked-by-layer]{cursor:not-allowed}.ui-col[role=button]:focus-visible,.ui-basemap-card:focus-visible,.ui-feat-row:focus-visible,.ui-layer-row:focus-visible{outline:2px solid var(--ui-cor-primaria, #00E08A);outline-offset:-2px}.ui-footer-btn.confirming{color:var(--ui-cor-botao-destrutivo-texto, #ffffff);background:var(--ui-cor-botao-destrutivo-hover, #b71c1c);width:auto;padding:0 6px}';
829
- function je(a, i) {
830
- i.querySelectorAll("[data-layer-row]").forEach((r) => {
831
- r.addEventListener("click", (o) => {
832
- if (o.target.closest(
977
+ const We = ':host{display:flex;flex-direction:column;box-sizing:border-box;font-family:inherit;font-size:11px;color:var(--ui-cor-texto, #e1e1e6);-webkit-user-select:none;user-select:none;width:100%;height:var(--ui-camadas-altura, 100%);min-height:var(--ui-camadas-min-altura, 140px);position:relative;--camada-linha-altura: 25px;--camada-thumb-tamanho: 15px;--camada-transicao: .16s cubic-bezier(.16, 1, .3, 1)}:host([densidade="compacto"]){--camada-linha-altura: 22px;--camada-thumb-tamanho: 13px;font-size:10px}:host([flutuante]){position:absolute;top:10px;right:10px;bottom:46px;z-index:var(--ui-z-workspace-hud, 500);width:auto;height:var(--ui-camadas-altura, auto)}*,*:before,*:after{box-sizing:border-box}:host(:not([flutuante])) .ui-camadas-container{max-width:100%;min-width:0;border:none;box-shadow:none;border-radius:0;background:transparent;backdrop-filter:none;-webkit-backdrop-filter:none}.ui-camadas-container{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;width:100%;max-width:380px;min-width:270px;background:var(--ui-cor-superficie, #141417);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .12));border-radius:var(--ui-raio-borda, 8px);box-shadow:var(--ui-sombra-lg, 0 10px 30px -4px rgba(0, 0, 0, .5)),0 0 0 1px color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 5%,transparent);overflow:hidden;position:relative;transition:transform .24s cubic-bezier(.16,1,.3,1),opacity .2s ease;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}:host([colapsado]) .ui-camadas-container{transform:translate(calc(100% + 24px));opacity:0;pointer-events:none}.ui-camadas-toggle-flutuante{display:none;position:absolute;top:10px;right:10px;z-index:calc(var(--ui-z-workspace-hud, 500) - 1);background:var(--ui-cor-superficie, #141417);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .18));border-radius:var(--ui-raio-borda, 6px);color:var(--ui-cor-texto, #ffffff);width:34px;height:34px;cursor:pointer;align-items:center;justify-content:center;box-shadow:var(--ui-sombra-md, 0 8px 20px rgba(0, 0, 0, .45));transition:all var(--camada-transicao)}:host([colapsado][flutuante]) .ui-camadas-toggle-flutuante{display:flex}.ui-camadas-toggle-flutuante:hover{border-color:var(--ui-cor-primaria, #00E08A);color:var(--ui-cor-primaria, #00E08A);transform:scale(1.08);box-shadow:0 0 14px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 35%,transparent)}.ui-camadas-header{height:32px;min-height:32px;max-height:32px;display:flex;align-items:center;justify-content:space-between;padding:0 5px;border-bottom:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));background:var(--ui-cor-fundo-elevado, rgba(0, 0, 0, .28));gap:4px}.ui-camadas-tabs{display:flex;gap:3px;flex:1}.ui-camadas-tab-btn{flex:1;background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);height:24px;padding:0 6px;font-size:11px;font-weight:500;border-radius:var(--ui-raio-sm, 4px);cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;white-space:nowrap;transition:all var(--camada-transicao)}.ui-camadas-tab-btn:hover{color:var(--ui-cor-texto, #ffffff);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .07))}.ui-camadas-tab-btn.active{color:var(--ui-cor-primaria, #00E08A);background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 25%,transparent);font-weight:600}.ui-camadas-btn-colapsar{background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);width:22px;height:22px;cursor:pointer;border-radius:var(--ui-raio-sm, 4px);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all var(--camada-transicao)}.ui-camadas-btn-colapsar:hover{color:var(--ui-cor-texto, #ffffff);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .09))}.ui-camadas-corpo{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:6px 6px 4px;display:flex;flex-direction:column;gap:6px;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 16%,transparent) transparent}.ui-camadas-corpo::-webkit-scrollbar{width:4px}.ui-camadas-corpo::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 18%,transparent);border-radius:var(--ui-raio-sm, 4px)}.ui-camadas-corpo::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 32%,transparent)}.ui-tree-toolbar{display:flex;align-items:center;justify-content:space-between;padding:1px 2px 3px;border-bottom:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .06))}.ui-tree-title-group{display:flex;align-items:center;gap:5px}.ui-tree-section-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--ui-cor-texto-secundario, #888899)}.ui-tree-count-badge{font-size:9px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 7%,transparent);color:var(--ui-cor-texto-secundario, #888899);padding:1px 5px;border-radius:8px;border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 6%,transparent)}.ui-tree-actions{display:flex;align-items:center;gap:3px}.ui-tree-action-btn{background:transparent;border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .1));color:var(--ui-cor-texto-secundario, #888899);border-radius:var(--ui-raio-sm, 4px);width:22px;height:22px;padding:0;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--camada-transicao)}.ui-tree-action-btn:hover{color:var(--ui-cor-texto, #ffffff);border-color:var(--ui-cor-primaria, #00E08A);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .09))}.ui-tree-btn-new{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent);border:1px solid color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 35%,transparent);color:var(--ui-cor-primaria, #00E08A);border-radius:var(--ui-raio-sm, 4px);height:22px;padding:0 8px;font-size:10px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:4px;transition:all var(--camada-transicao)}.ui-tree-btn-new:hover{background:var(--ui-cor-primaria, #00E08A);color:var(--ui-cor-texto-sobre-primaria, #000000);box-shadow:0 0 10px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 35%,transparent)}.ui-tree-search-wrapper{position:relative;display:flex;align-items:center;margin:1px 0}.ui-tree-search-icon{position:absolute;left:8px;color:var(--ui-cor-texto-secundario, #888899);pointer-events:none;display:flex;align-items:center}.ui-tree-search-input{width:100%;height:25px;background:var(--ui-cor-fundo, #0a0a0c);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .1));border-radius:var(--ui-raio-borda, 5px);padding:0 24px 0 26px;color:var(--ui-cor-texto, #ffffff);font-size:10.5px;outline:none;transition:border-color var(--camada-transicao),box-shadow var(--camada-transicao)}.ui-tree-search-input:focus{border-color:var(--ui-cor-primaria, #00E08A);box-shadow:0 0 0 2px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 18%,transparent)}.ui-tree-search-clear{position:absolute;right:5px;background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);cursor:pointer;width:18px;height:18px;display:flex;align-items:center;justify-content:center;border-radius:3px;transition:all var(--camada-transicao)}.ui-tree-search-clear:hover{color:var(--ui-cor-texto, #ffffff);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 10%,transparent)}.ui-panel-box{background:var(--ui-cor-fundo, #0c0c0f);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));border-radius:var(--ui-raio-borda, 6px);overflow:hidden;display:flex;flex-direction:column;flex:1 1 0%;min-height:80px}.ui-layer-tree{flex:1 1 0%;min-height:40px;overflow-y:auto;overflow-x:hidden}.ui-layer-group{border-bottom:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .04));transition:background var(--camada-transicao)}.ui-layer-group.drop-into{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 9%,transparent)!important;outline:1.5px dashed var(--ui-cor-primaria, #00E08A);outline-offset:-1.5px}.ui-layer-row,.ui-feat-row{display:flex;align-items:center;height:var(--camada-linha-altura);min-height:var(--camada-linha-altura);max-height:var(--camada-linha-altura);padding:0 4px;-webkit-user-select:none;user-select:none;cursor:default;transition:background .1s ease;position:relative}.ui-layer-row{background:var(--ui-cor-fundo-elevado, #18181d);font-weight:600;cursor:pointer;border-left:3px solid transparent}.ui-layer-row:hover{background:var(--ui-cor-hover-menu, #22222a)}.ui-layer-row.active-drawing-layer{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent)!important;border-left:3px solid var(--layer-active-color, var(--ui-cor-primaria, #00E08A))!important;box-shadow:inset 0 0 12px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 7%,transparent)}.ui-layer-row.active-drawing-layer .ui-name-text{color:var(--ui-cor-texto, #e1e1e6);font-weight:700}.ui-feat-row{background:var(--ui-cor-fundo, #101014);font-weight:400;cursor:pointer}.ui-feat-row:hover{background:var(--ui-cor-hover-menu, #19191f)}.ui-feat-row.selected-row{background:color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 18%,transparent)!important;outline:1px solid color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 50%,transparent)!important;outline-offset:-1px}.ui-layer-row.hidden-layer,.ui-feat-row.hidden-row{opacity:.52}.ui-layer-row.hidden-layer .ui-col-eye,.ui-feat-row.hidden-row .ui-col-eye{color:var(--ui-cor-texto-alerta, #ffb86c);opacity:.95}.ui-layer-row.dragging,.ui-feat-row.dragging{opacity:.35;background:color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 16%,transparent)!important}.ui-layer-row.drop-above:before,.ui-feat-row.drop-above:before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background:var(--ui-cor-texto-info, #33b5ff);box-shadow:0 0 8px color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 100%,transparent);z-index:20;pointer-events:none}.ui-layer-row.drop-below:after,.ui-feat-row.drop-below:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--ui-cor-texto-info, #33b5ff);box-shadow:0 0 8px color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 100%,transparent);z-index:20;pointer-events:none}.ui-layer-row.drop-into{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 16%,transparent)!important;outline:1.5px dashed var(--ui-cor-primaria, #00E08A)!important;outline-offset:-2px;border-radius:var(--ui-raio-sm, 4px)}.ui-layer-row.is-sublayer{padding-left:calc(6px + var(--layer-depth, 1) * 16px);background:color-mix(in srgb,var(--ui-cor-fundo-elevado, #18181d) 70%,transparent);border-left:2px solid color-mix(in srgb,var(--layer-active-color, #00E08A) 40%,transparent)}.ui-children-container.is-subchildren{position:relative;margin-left:calc(var(--layer-depth, 0) * 8px);border-left:1px dashed var(--ui-cor-borda, rgba(255, 255, 255, .1))}.ui-group-folder-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--ui-cor-texto-alerta, #ffb86c);margin-right:4px;flex-shrink:0}.ui-group-badge{font-size:8.5px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;padding:1px 4px;border-radius:3px;background:color-mix(in srgb,var(--ui-cor-texto-alerta, #ffb86c) 15%,transparent);color:var(--ui-cor-texto-alerta, #ffb86c);border:1px solid color-mix(in srgb,var(--ui-cor-texto-alerta, #ffb86c) 30%,transparent);margin-left:4px;flex-shrink:0}.ui-col{display:flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--camada-linha-altura)}.ui-col-drag{width:14px;cursor:grab;color:var(--ui-cor-texto-secundario, #888899);opacity:.35;touch-action:none;transition:opacity var(--camada-transicao),color var(--camada-transicao)}.ui-layer-row:hover .ui-col-drag,.ui-feat-row:hover .ui-col-drag{opacity:.9;color:var(--ui-cor-primaria, #00E08A)}.ui-col-drag:active{cursor:grabbing}.ui-col-eye{width:20px;cursor:pointer;color:var(--ui-cor-texto-secundario, #888899);transition:color var(--camada-transicao)}.ui-col-eye:hover{color:var(--ui-cor-primaria, #00E08A)}.ui-col-lock{width:18px;cursor:pointer;color:var(--ui-cor-texto-secundario, #888899);transition:color var(--camada-transicao)}.ui-col-lock:hover{color:var(--ui-cor-texto-alerta, #ffb86c)}.ui-col-colorbar{width:3.5px;height:16px;margin:0 3px 0 2px;border-radius:1.5px;flex-shrink:0}.ui-col-chevron{width:14px;cursor:pointer;color:var(--ui-cor-texto-secundario, #888899);display:flex;align-items:center;justify-content:center}.ui-chevron-icon{display:inline-flex;align-items:center;justify-content:center;transition:transform var(--camada-transicao)}.ui-chevron-icon.open{transform:rotate(90deg)}.ui-col-branch{width:14px;display:flex;align-items:center;justify-content:center;color:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 22%,transparent);font-size:10px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace)}.ui-col-thumb{width:18px;margin-right:4px;display:flex;align-items:center;justify-content:center}.ui-thumb-box{width:var(--camada-thumb-tamanho);height:var(--camada-thumb-tamanho);border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 15%,transparent);border-radius:2.5px;background:var(--ui-cor-fundo, #0d0d10);display:flex;align-items:center;justify-content:center}.ui-col-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;color:var(--ui-cor-texto, #e1e1e6);padding-left:2px;padding-right:4px;cursor:pointer;display:flex;align-items:center;justify-content:flex-start;text-align:left;gap:4px}.ui-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-active-badge{font-size:8px;font-weight:700;color:var(--ui-cor-texto-sobre-primaria, #000000);background:var(--ui-cor-primaria, #00E08A);border:1px solid color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 45%,transparent);padding:1px 4px;border-radius:3px;display:inline-flex;align-items:center;gap:2px;white-space:nowrap;flex-shrink:0;animation:pulseBadge 2.8s infinite}@keyframes pulseBadge{0%{opacity:.85}50%{opacity:1;filter:drop-shadow(0 0 4px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 50%,transparent))}to{opacity:.85}}.ui-count-chip{font-size:9px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;color:var(--ui-cor-texto, #e1e1e6);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 6%,transparent);padding:0 4px;border-radius:8px}.ui-col-actions{display:flex;align-items:center;gap:2px;opacity:0;transition:opacity var(--camada-transicao)}.ui-layer-row:hover .ui-col-actions,.ui-feat-row:hover .ui-col-actions{opacity:1}.ui-micro-btn{background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);width:18px;height:18px;padding:0;border-radius:3px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--camada-transicao)}.ui-micro-btn:hover{color:var(--ui-cor-primaria, #00E08A);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .12))}.ui-micro-btn.active{color:var(--ui-cor-primaria, #00E08A);background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 18%,transparent)}.ui-col-target{width:22px;cursor:pointer}.ui-target-circle{width:11px;height:11px;border-radius:50%;border:1.5px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 32%,transparent);background:transparent;transition:all .12s ease}.ui-col-target:hover .ui-target-circle{border-color:var(--ui-cor-texto-info, #33b5ff);transform:scale(1.18)}.ui-target-circle.selected{border:2px solid var(--ui-cor-texto-info, #33b5ff);background:var(--ui-cor-texto-info, #33b5ff);box-shadow:inset 0 0 0 2px var(--ui-cor-superficie, #141418)}.ui-target-circle.partial{border:2px solid var(--ui-cor-texto-info, #33b5ff);background:color-mix(in srgb,var(--ui-cor-texto-info, #33b5ff) 40%,transparent)}.ui-inline-rename-input{width:100%;height:20px;background:var(--ui-cor-fundo, #0d0d10);color:var(--ui-cor-texto, #e1e1e6);border:1px solid var(--ui-cor-primaria, #00E08A);border-radius:3px;font-size:10.5px;padding:0 4px;outline:none;box-shadow:0 0 8px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 40%,transparent)}.ui-layer-settings-drawer{background:linear-gradient(180deg,var(--ui-cor-fundo-elevado, #17171e) 0%,var(--ui-cor-superficie, #0f0f13) 100%);padding:10px 14px 12px;border-top:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 8%,transparent);border-bottom:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 12%,transparent);border-left:3px solid var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));display:flex;flex-direction:column;gap:10px;box-shadow:inset 0 1px color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 6%,transparent),0 6px 16px #00000073;animation:drawerSlideDown .18s cubic-bezier(.16,1,.3,1);position:relative;z-index:10}@keyframes drawerSlideDown{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.ui-drawer-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:6px;border-bottom:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 7%,transparent)}.ui-drawer-header-left{display:flex;align-items:center;gap:7px;min-width:0}.ui-drawer-icon{color:var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));display:flex;align-items:center;flex-shrink:0}.ui-drawer-title{font-size:10.5px;font-weight:700;color:var(--ui-cor-texto, #e1e1e6);text-transform:uppercase;letter-spacing:.6px;white-space:nowrap}.ui-drawer-layer-chip{font-size:9.5px;font-weight:500;color:var(--ui-cor-texto-secundario, #888899);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 7%,transparent);padding:1px 6px;border-radius:var(--ui-raio-sm, 4px);border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 8%,transparent);max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-drawer-btn-fechar{background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);width:20px;height:20px;padding:0;border-radius:var(--ui-raio-sm, 4px);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--camada-transicao)}.ui-drawer-btn-fechar:hover{color:var(--ui-cor-texto, #e1e1e6);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 12%,transparent)}.ui-drawer-body{display:flex;flex-direction:column;gap:10px}.ui-drawer-row{display:flex;flex-direction:column;gap:5px}.ui-drawer-row-label{display:flex;justify-content:space-between;align-items:center;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--ui-cor-texto-secundario, #888899)}.ui-drawer-color-group{display:flex;align-items:center;justify-content:space-between;gap:8px}.ui-drawer-color-pill{position:relative;display:inline-flex;align-items:center;gap:6px;padding:3px 8px 3px 5px;background:var(--ui-cor-fundo, #0b0b0d);border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 16%,transparent);border-radius:var(--ui-raio-sm, 4px);cursor:pointer;transition:all var(--camada-transicao);-webkit-user-select:none;user-select:none}.ui-drawer-color-pill:hover{border-color:var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 8%,transparent);box-shadow:0 0 10px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 25%,transparent)}.ui-drawer-color-sample{width:14px;height:14px;border-radius:3px;border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 35%,transparent);box-shadow:var(--ui-sombra-sm, 0 1px 3px rgba(0, 0, 0, .5));flex-shrink:0;transition:background-color .1s ease}.ui-drawer-color-hex{font-size:10px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;font-weight:700;color:var(--ui-cor-texto, #e1e1e6);letter-spacing:.5px}.ui-drawer-color-native{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.ui-drawer-badge{font-size:9.5px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;font-weight:700;color:var(--ui-cor-texto, #e1e1e6);background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 10%,transparent);padding:1px 6px;border-radius:var(--ui-raio-sm, 4px);border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 12%,transparent)}.ui-drawer-slider-container{display:flex;flex-direction:column;gap:4px}.ui-drawer-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:5px;background:linear-gradient(90deg,color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 8%,transparent) 0%,var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A)) 100%);border-radius:3px;outline:none;margin:3px 0;cursor:pointer;border:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 12%,transparent)}.ui-drawer-slider::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;border:3px solid var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));box-shadow:0 0 6px #0009,0 0 10px var(--drawer-cor-camada, rgba(0, 224, 138, .6));cursor:pointer;transition:transform .12s ease}.ui-drawer-slider::-webkit-slider-thumb:hover{transform:scale(1.22)}.ui-drawer-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:3px solid var(--drawer-cor-camada, var(--ui-cor-primaria, #00E08A));box-shadow:0 0 6px #0009,0 0 10px var(--drawer-cor-camada, rgba(0, 224, 138, .6));cursor:pointer}.ui-drawer-footer{display:flex;align-items:center;justify-content:space-between;padding-top:8px;border-top:1px solid color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 7%,transparent)}.ui-drawer-meta-info{font-size:9.5px;color:var(--ui-cor-texto-secundario, #888899);font-style:italic}.ui-drawer-actions{display:flex;align-items:center;gap:6px}.ui-drawer-btn-danger{background:color-mix(in srgb,var(--ui-cor-texto-erro, #ff5555) 10%,transparent);border:1px solid color-mix(in srgb,var(--ui-cor-texto-erro, #ff5555) 35%,transparent);color:var(--ui-cor-texto-erro, #ff5555);border-radius:var(--ui-raio-sm, 4px);height:24px;padding:0 10px;font-size:10px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:all var(--camada-transicao)}.ui-drawer-btn-danger:hover{background:var(--ui-cor-botao-destrutivo-fundo, #d32f2f);color:var(--ui-cor-botao-destrutivo-texto, #ffffff);border-color:var(--ui-cor-botao-destrutivo-fundo, #d32f2f);box-shadow:0 0 10px color-mix(in srgb,var(--ui-cor-texto-erro, #ff5555) 45%,transparent);transform:translateY(-.5px)}.ui-drawer-btn-danger.confirming{background:var(--ui-cor-botao-destrutivo-hover, #b71c1c);color:var(--ui-cor-botao-destrutivo-texto, #ffffff);border-color:var(--ui-cor-botao-destrutivo-hover, #b71c1c);animation:pulseDanger 1.2s infinite}@keyframes pulseDanger{0%{transform:scale(1)}50%{transform:scale(1.02)}to{transform:scale(1)}}.ui-geom-tag{font-size:8px;font-weight:700;letter-spacing:.4px;padding:1px 4px;border-radius:3px;margin-left:4px;text-transform:uppercase;flex-shrink:0}.ui-geom-tag.oficial{background:color-mix(in srgb,var(--ui-cor-texto-sucesso, #00E08A) 16%,transparent);color:var(--ui-cor-texto-sucesso, #00E08A);border:1px solid color-mix(in srgb,var(--ui-cor-texto-sucesso, #00E08A) 35%,transparent)}.ui-geom-tag.previa{background:color-mix(in srgb,var(--ui-cor-texto-alerta, #ffb86c) 16%,transparent);color:var(--ui-cor-texto-alerta, #ffb86c);border:1px solid color-mix(in srgb,var(--ui-cor-texto-alerta, #ffb86c) 35%,transparent)}.ui-tree-footer{height:32px;min-height:32px;background:var(--ui-cor-fundo-elevado, #121216);border-top:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));display:flex;align-items:center;justify-content:space-between;padding:0 8px;gap:6px;box-sizing:border-box;overflow:hidden;position:relative}.ui-footer-left{display:flex;align-items:center;gap:5px;white-space:nowrap;min-width:0;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.ui-footer-count{font-size:11px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;font-weight:700;color:var(--ui-cor-primaria, #00E08A);flex-shrink:0}.ui-footer-label{font-size:10px;font-weight:500;color:var(--ui-cor-texto-secundario, #888899);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-footer-metric{font-size:9.5px;font-family:var(--ui-fonte-codigo, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;color:var(--ui-cor-primaria, #00E08A);display:inline-flex;align-items:center;gap:3px;white-space:nowrap;background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent);padding:1px 5px;border-radius:3px;border:1px solid color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 24%,transparent);flex-shrink:0}.ui-footer-actions-gerais{display:flex;align-items:center;gap:4px;flex-shrink:0}.ui-footer-chip-btn{background:#ffffff0a;border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .1));color:var(--ui-cor-texto-secundario, #a0a0b0);font-size:10px;font-weight:600;height:22px;padding:0 7px;border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;gap:4px;transition:all var(--camada-transicao)}.ui-footer-chip-btn:hover{background:#ffffff1a;color:var(--ui-cor-texto, #ffffff);border-color:#fff3}.ui-footer-chip-btn.primario{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent);border-color:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 32%,transparent);color:var(--ui-cor-primaria, #00E08A)}.ui-footer-chip-btn.primario:hover{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 22%,transparent);border-color:var(--ui-cor-primaria, #00E08A);color:#fff}.ui-footer-right{display:flex;align-items:center;gap:3px;flex-shrink:0}.ui-footer-btn{background:transparent;border:none;color:var(--ui-cor-texto-secundario, #888899);width:22px;height:22px;padding:0;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all var(--camada-transicao);flex-shrink:0}.ui-footer-btn:hover:not(.disabled){color:var(--ui-cor-texto, #e1e1e6);background:var(--ui-cor-hover-menu, rgba(255, 255, 255, .12))}.ui-footer-btn.disabled{opacity:.25;cursor:not-allowed}.ui-footer-btn.btn-danger-footer:hover:not(.disabled){color:#f55;background:#ff555526}.ui-footer-btn.confirming{background:#f55!important;color:#fff!important}.ui-footer-btn.btn-clear-footer{color:var(--ui-cor-texto-secundario, #888899);margin-left:2px}.ui-footer-btn.btn-clear-footer:hover{color:#fff;background:#ffffff1f}.ui-footer-color-wrapper{position:relative;display:flex;align-items:center;justify-content:center;width:18px;height:18px;cursor:pointer;flex-shrink:0}.ui-footer-color-preview{width:14px;height:14px;border-radius:50%;border:1.5px solid rgba(255,255,255,.35);box-shadow:0 0 4px #0006;pointer-events:none;transition:transform .15s ease,border-color .15s ease}.ui-footer-color-wrapper:hover .ui-footer-color-preview{transform:scale(1.15);border-color:#fff}.ui-footer-color{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;padding:0;margin:0;border:none}.ui-footer-move-wrapper{position:relative;display:flex;align-items:center;max-width:95px;flex-shrink:0}.ui-footer-select{background:var(--ui-cor-fundo, #16161c);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .12));color:var(--ui-cor-texto, #e1e1e6);border-radius:4px;font-size:10px;height:22px;padding:0 4px;cursor:pointer;max-width:95px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-footer-select:hover:not(:disabled){border-color:#ffffff40}.ui-footer-select:focus{outline:none;border-color:var(--ui-cor-primaria, #00E08A)}.ui-tree-btn-group{background:#ffffff0a;border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .12));color:var(--ui-cor-texto-secundario, #a0a0b0);border-radius:var(--ui-raio-sm, 4px);height:22px;padding:0 7px;font-size:10px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:4px;transition:all var(--camada-transicao)}.ui-tree-btn-group:hover{background:#ffffff1a;color:var(--ui-cor-texto, #ffffff);border-color:#ffffff40}.ui-drawer-btn-sublayer{background:#ffffff0f;border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .12));color:var(--ui-cor-texto, #e1e1e6);font-size:10.5px;font-weight:500;padding:4px 8px;border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;gap:4px;transition:all var(--camada-transicao)}.ui-drawer-btn-sublayer:hover{background:#ffffff1f;color:var(--ui-cor-primaria, #00E08A);border-color:var(--ui-cor-primaria, #00E08A)}.ui-drawer-select-wrapper{display:flex;align-items:center}.ui-drawer-select{background:var(--ui-cor-fundo, #16161c);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .15));color:var(--ui-cor-texto, #e1e1e6);border-radius:4px;font-size:10.5px;height:24px;padding:0 6px;cursor:pointer;max-width:140px}.ui-basemap-section{display:flex;flex-direction:column;gap:4px;flex-shrink:0}.ui-basemap-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--ui-cor-texto-secundario, #888899)}.ui-basemap-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:4px}.ui-basemap-card{display:flex;flex-direction:column;align-items:center;gap:2px;padding:3px;border-radius:var(--ui-raio-borda, 5px);background:var(--ui-cor-fundo, #101014);border:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));cursor:pointer;transition:all var(--camada-transicao);text-align:center;overflow:hidden}.ui-basemap-card:hover{border-color:var(--ui-cor-primaria, #00E08A);background:var(--ui-cor-fundo-elevado, #17171c)}.ui-basemap-card.active{border-color:var(--ui-cor-primaria, #00E08A);background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 12%,transparent);color:var(--ui-cor-primaria, #00E08A);font-weight:600;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 35%,transparent)}.ui-basemap-preview{width:100%;height:22px;border-radius:3px;object-fit:cover;opacity:.85;transition:opacity var(--camada-transicao)}.ui-basemap-preview-none{width:100%;height:22px;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 4%,transparent);border-radius:3px;color:var(--ui-cor-texto-secundario, #888899)}.ui-basemap-card:hover .ui-basemap-preview,.ui-basemap-card.active .ui-basemap-preview{opacity:1}.ui-basemap-card span{font-size:9.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.ui-search-hidden{display:none!important}.ui-empty-row{height:22px;display:flex;align-items:center;padding-left:36px;font-size:10px;color:var(--ui-cor-texto-secundario, #666677);font-style:italic;background:var(--ui-cor-fundo-recuado, rgba(0, 0, 0, .15))}.ui-camadas-resizer-altura{display:none;flex-shrink:0;width:100%;height:9px;background:var(--ui-cor-superficie, #141417);border-top:1px solid var(--ui-cor-borda, rgba(255, 255, 255, .08));cursor:ns-resize;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;touch-action:none;transition:background .15s ease,border-color .15s ease;position:relative;z-index:10}:host([redimensionavel]) .ui-camadas-resizer-altura,:host([redimensionavel-altura]) .ui-camadas-resizer-altura{display:flex}.ui-camadas-resizer-altura:hover,.ui-camadas-resizer-altura.ui-camadas-resizer--ativo{background:color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 9%,transparent);border-top-color:var(--ui-cor-primaria, #00E08A)}.ui-camadas-resizer-grip{width:32px;height:3px;border-radius:2px;background:color-mix(in srgb,var(--ui-cor-texto, #e1e1e6) 22%,transparent);transition:all .15s ease}.ui-camadas-resizer-altura:hover .ui-camadas-resizer-grip,.ui-camadas-resizer-altura.ui-camadas-resizer--ativo .ui-camadas-resizer-grip{background:var(--ui-cor-primaria, #00E08A);width:46px;box-shadow:0 0 8px color-mix(in srgb,var(--ui-cor-primaria, #00E08A) 45%,transparent)}:host(.ui-camadas--redimensionando){-webkit-user-select:none!important;user-select:none!important;cursor:ns-resize!important}:host(.ui-camadas--redimensionando) *{-webkit-user-select:none!important;user-select:none!important}.ui-col-lock.ui-lock-open{opacity:.28}.ui-col-lock.ui-lock-open:hover,.ui-col-lock.ui-lock-open:focus-visible{opacity:.8}.ui-col-lock[data-locked-by-layer]{cursor:not-allowed}.ui-col[role=button]:focus-visible,.ui-basemap-card:focus-visible,.ui-feat-row:focus-visible,.ui-layer-row:focus-visible{outline:2px solid var(--ui-cor-primaria, #00E08A);outline-offset:-2px}.ui-footer-btn.confirming{color:var(--ui-cor-botao-destrutivo-texto, #ffffff);background:var(--ui-cor-botao-destrutivo-hover, #b71c1c);width:auto;padding:0 6px}';
978
+ function Xe(e, o) {
979
+ o.querySelectorAll("[data-layer-row]").forEach((i) => {
980
+ i.addEventListener("click", (r) => {
981
+ if (r.target.closest(
833
982
  "[data-layer-eye], [data-layer-lock], [data-layer-expand], [data-layer-target], [data-layer-fit], [data-layer-settings], input, button"
834
983
  ))
835
984
  return;
836
- const c = r.getAttribute("data-layer-row");
837
- c && a.definirCamadaAtiva(c, !0);
985
+ const n = i.getAttribute("data-layer-row");
986
+ n && e.definirCamadaAtiva(n, !0);
838
987
  });
839
- }), i.querySelectorAll("[data-layer-expand]").forEach((r) => {
840
- r.addEventListener("click", (o) => {
841
- o.stopPropagation();
842
- const s = r.getAttribute("data-layer-expand");
988
+ }), o.querySelectorAll("[data-layer-expand]").forEach((i) => {
989
+ i.addEventListener("click", (r) => {
990
+ r.stopPropagation();
991
+ const s = i.getAttribute("data-layer-expand");
843
992
  if (!s) return;
844
- a.expandedLayers.has(s) ? a.expandedLayers.delete(s) : a.expandedLayers.add(s);
845
- const c = r.closest(".ui-layer-group"), n = r.querySelector(".ui-chevron-icon"), l = a.expandedLayers.has(s);
846
- if (n && n.classList.toggle("open", l), c) {
847
- const d = c.querySelector(".ui-children-container");
848
- d && (d.style.display = l ? "block" : "none");
993
+ e.expandedLayers.has(s) ? e.expandedLayers.delete(s) : e.expandedLayers.add(s);
994
+ const n = i.closest(".ui-layer-group"), l = i.querySelector(".ui-chevron-icon"), c = e.expandedLayers.has(s);
995
+ if (l && l.classList.toggle("open", c), n) {
996
+ const f = n.querySelector(".ui-children-container");
997
+ f && (f.style.display = c ? "block" : "none");
849
998
  }
850
- a.salvarLembrancaEstado();
999
+ e.salvarLembrancaEstado();
851
1000
  });
852
- }), i.querySelectorAll("[data-layer-eye]").forEach((r) => {
853
- r.addEventListener("click", (o) => {
854
- o.stopPropagation();
855
- const s = r.getAttribute("data-layer-eye"), c = a.camadas.find((n) => n.id === s);
856
- if (c) {
857
- c.visible = c.visible === !1;
858
- const n = c.visible !== !1;
859
- r.innerHTML = n ? m.olhoAberto : m.olhoFechado, $(r, n ? "Ocultar Camada" : "Exibir Camada");
860
- const l = r.closest(".ui-layer-row");
861
- l && l.classList.toggle("hidden-layer", !n), Re(a, i), a.salvarLembrancaEstado(), a.dispararEvento("ui-camada-visibilidade", {
862
- camadaId: c.id,
863
- visivel: n
1001
+ }), o.querySelectorAll("[data-layer-eye]").forEach((i) => {
1002
+ i.addEventListener("click", (r) => {
1003
+ r.stopPropagation();
1004
+ const s = i.getAttribute("data-layer-eye"), n = e.camadas.find((l) => l.id === s);
1005
+ if (n) {
1006
+ n.visible = n.visible === !1;
1007
+ const l = n.visible !== !1;
1008
+ i.innerHTML = l ? g.olhoAberto : g.olhoFechado, F(i, l ? "Ocultar Camada" : "Exibir Camada");
1009
+ const c = i.closest(".ui-layer-row");
1010
+ c && c.classList.toggle("hidden-layer", !l), Ze(e, o), e.salvarLembrancaEstado(), e.dispararEvento("ui-camada-visibilidade", {
1011
+ camadaId: n.id,
1012
+ visivel: l
864
1013
  });
865
1014
  }
866
1015
  });
867
- }), i.querySelectorAll("[data-layer-lock]").forEach((r) => {
868
- r.addEventListener("click", (o) => {
869
- o.stopPropagation();
870
- const s = r.getAttribute("data-layer-lock"), c = a.camadas.find((n) => n.id === s);
871
- c && (c.locked = !c.locked, r.innerHTML = c.locked ? m.cadeadoTrancado : m.cadeadoAberto, r.classList.toggle("ui-lock-open", !c.locked), $(r, c.locked ? "Desbloquear Camada" : "Bloquear Camada"), Ne(a, i, c.id, c.locked === !0), a.salvarLembrancaEstado(), a.dispararEvento("ui-camada-bloqueio", {
872
- camadaId: c.id,
873
- bloqueado: c.locked
1016
+ }), o.querySelectorAll("[data-layer-lock]").forEach((i) => {
1017
+ i.addEventListener("click", (r) => {
1018
+ r.stopPropagation();
1019
+ const s = i.getAttribute("data-layer-lock"), n = e.camadas.find((l) => l.id === s);
1020
+ n && (n.locked = !n.locked, i.innerHTML = n.locked ? g.cadeadoTrancado : g.cadeadoAberto, i.classList.toggle("ui-lock-open", !n.locked), F(i, n.locked ? "Desbloquear Camada" : "Bloquear Camada"), ea(e, o, n.id, n.locked === !0), e.salvarLembrancaEstado(), e.dispararEvento("ui-camada-bloqueio", {
1021
+ camadaId: n.id,
1022
+ bloqueado: n.locked
874
1023
  }));
875
1024
  });
876
- }), i.querySelectorAll("[data-layer-fit]").forEach((r) => {
877
- r.addEventListener("click", (o) => {
878
- o.stopPropagation();
879
- const s = r.getAttribute("data-layer-fit");
880
- s && a.dispararEvento("ui-camada-enquadrar", { camadaId: s });
1025
+ }), o.querySelectorAll("[data-layer-fit]").forEach((i) => {
1026
+ i.addEventListener("click", (r) => {
1027
+ r.stopPropagation();
1028
+ const s = i.getAttribute("data-layer-fit");
1029
+ s && e.dispararEvento("ui-camada-enquadrar", { camadaId: s });
881
1030
  });
882
- }), i.querySelectorAll("[data-layer-settings]").forEach((r) => {
883
- r.addEventListener("click", (o) => {
884
- o.stopPropagation();
885
- const s = r.getAttribute("data-layer-settings");
886
- a.activeSettingsLayerId = a.activeSettingsLayerId === s ? null : s, a.solicitarRenderizacao();
1031
+ }), o.querySelectorAll("[data-layer-settings]").forEach((i) => {
1032
+ i.addEventListener("click", (r) => {
1033
+ r.stopPropagation();
1034
+ const s = i.getAttribute("data-layer-settings");
1035
+ e.activeSettingsLayerId = e.activeSettingsLayerId === s ? null : s, e.solicitarRenderizacao();
887
1036
  });
888
- }), i.querySelectorAll("[data-layer-settings-close]").forEach((r) => {
889
- r.addEventListener("click", (o) => {
890
- o.stopPropagation(), a.activeSettingsLayerId = null, a.solicitarRenderizacao();
1037
+ }), o.querySelectorAll("[data-layer-settings-close]").forEach((i) => {
1038
+ i.addEventListener("click", (r) => {
1039
+ r.stopPropagation(), e.activeSettingsLayerId = null, e.solicitarRenderizacao();
891
1040
  });
892
1041
  });
893
- const e = (r, o, s) => {
894
- const c = a.camadas.find((f) => f.id === r);
895
- if (!c) return;
896
- const n = D(o, c.color || "#00E08A");
897
- c.color = n;
898
- const l = i.getElementById(`sample-color-${r}`);
899
- l && (l.style.backgroundColor = n);
900
- const d = i.getElementById(`hex-color-${r}`);
901
- d && (d.textContent = n.toUpperCase());
902
- const p = i.getElementById(`settings-drawer-${r}`);
903
- p && p.style.setProperty("--drawer-cor-camada", n);
904
- const u = S(i, "data-layer-row", r);
905
- if (u) {
906
- u.style.setProperty("--layer-active-color", n);
907
- const f = u.querySelector(".ui-col-colorbar");
908
- f && (f.style.backgroundColor = n);
1042
+ const a = (i, r, s) => {
1043
+ const n = e.camadas.find((d) => d.id === i);
1044
+ if (!n) return;
1045
+ const l = G(r, n.color || "#00E08A");
1046
+ n.color = l;
1047
+ const c = o.getElementById(`sample-color-${i}`);
1048
+ c && (c.style.backgroundColor = l);
1049
+ const f = o.getElementById(`hex-color-${i}`);
1050
+ f && (f.textContent = l.toUpperCase());
1051
+ const u = o.getElementById(`settings-drawer-${i}`);
1052
+ u && u.style.setProperty("--drawer-cor-camada", l);
1053
+ const p = M(o, "data-layer-row", i);
1054
+ if (p) {
1055
+ p.style.setProperty("--layer-active-color", l);
1056
+ const d = p.querySelector(".ui-col-colorbar");
1057
+ d && (d.style.backgroundColor = l);
909
1058
  }
910
- s ? a.salvarLembrancaEstado() : a.agendarSalvarLembranca(), a.dispararEvento("ui-camada-cor", { camadaId: c.id, cor: n });
1059
+ s ? e.salvarLembrancaEstado() : e.agendarSalvarLembranca(), e.dispararEvento("ui-camada-cor", { camadaId: n.id, cor: l });
911
1060
  };
912
- i.querySelectorAll("[data-layer-color-picker]").forEach((r) => {
913
- const o = r, s = (c) => (n) => {
914
- const l = o.getAttribute("data-layer-color-picker");
915
- if (!l) return;
916
- const d = n.target.value;
917
- e(l, d, c);
1061
+ o.querySelectorAll("[data-layer-color-picker]").forEach((i) => {
1062
+ const r = i, s = (n) => (l) => {
1063
+ const c = r.getAttribute("data-layer-color-picker");
1064
+ if (!c) return;
1065
+ const f = l.target.value;
1066
+ a(c, f, n);
918
1067
  };
919
- o.addEventListener("input", s(!1)), o.addEventListener("change", s(!0));
1068
+ r.addEventListener("input", s(!1)), r.addEventListener("change", s(!0));
920
1069
  });
921
- const t = (r, o) => {
922
- const s = a.camadas.find((l) => l.id === r);
1070
+ const t = (i, r) => {
1071
+ const s = e.camadas.find((c) => c.id === i);
923
1072
  if (!s) return;
924
- s.opacity = o;
925
- const c = i.getElementById(`badge-op-${r}`);
926
- c && (c.textContent = `${Math.round(o * 100)}%`);
927
- const n = S(i, "data-layer-opacity-slider", r);
928
- n && parseFloat(n.value) !== o && (n.value = String(o)), a.agendarSalvarLembranca(), a.dispararEvento("ui-camada-opacidade", { camadaId: s.id, opacidade: o });
1073
+ s.opacity = r;
1074
+ const n = o.getElementById(`badge-op-${i}`);
1075
+ n && (n.textContent = `${Math.round(r * 100)}%`);
1076
+ const l = M(o, "data-layer-opacity-slider", i);
1077
+ l && parseFloat(l.value) !== r && (l.value = String(r)), e.agendarSalvarLembranca(), e.dispararEvento("ui-camada-opacidade", { camadaId: s.id, opacidade: r });
929
1078
  };
930
- i.querySelectorAll("[data-layer-opacity-slider]").forEach((r) => {
931
- r.addEventListener("input", (o) => {
932
- const s = r.getAttribute("data-layer-opacity-slider");
1079
+ o.querySelectorAll("[data-layer-opacity-slider]").forEach((i) => {
1080
+ i.addEventListener("input", (r) => {
1081
+ const s = i.getAttribute("data-layer-opacity-slider");
933
1082
  if (!s) return;
934
- const c = parseFloat(o.target.value);
935
- t(s, c);
1083
+ const n = parseFloat(r.target.value);
1084
+ t(s, n);
936
1085
  });
937
- }), i.querySelectorAll("[data-delete-layer]").forEach((r) => {
938
- let o = null;
939
- r.addEventListener("click", (s) => {
1086
+ }), o.querySelectorAll("[data-delete-layer]").forEach((i) => {
1087
+ let r = null;
1088
+ i.addEventListener("click", (s) => {
940
1089
  s.stopPropagation();
941
- const c = r.getAttribute("data-delete-layer");
942
- if (!c) return;
943
- if (r.classList.contains("confirming")) {
944
- o && clearTimeout(o), a.dispararEvento("ui-camada-excluida", { camadaId: c });
945
- const l = a.selectedFeatureIds.size;
946
- a.removerCamada(c), a.selectedFeatureIds.size !== l && a.notificarMudancaSelecao();
1090
+ const n = i.getAttribute("data-delete-layer");
1091
+ if (!n) return;
1092
+ if (i.classList.contains("confirming")) {
1093
+ r && clearTimeout(r), e.dispararEvento("ui-camada-excluida", { camadaId: n });
1094
+ const c = e.selectedFeatureIds.size;
1095
+ e.camadas.forEach((f) => {
1096
+ f.parentId === n && (f.parentId = null);
1097
+ }), e.removerCamada(n), e.selectedFeatureIds.size !== c && e.notificarMudancaSelecao();
947
1098
  } else {
948
- r.classList.add("confirming");
949
- const l = r.querySelector(".ui-btn-label");
950
- l && (l.textContent = "Confirmar Exclusão?"), o = setTimeout(() => {
951
- r.classList.remove("confirming"), l && (l.textContent = "Excluir Camada");
1099
+ i.classList.add("confirming");
1100
+ const c = i.querySelector(".ui-btn-label");
1101
+ c && (c.textContent = "Confirmar Exclusão?"), r = setTimeout(() => {
1102
+ i.classList.remove("confirming"), c && (c.textContent = "Excluir Camada");
952
1103
  }, 3500);
953
1104
  }
954
1105
  });
955
- }), i.querySelectorAll("[data-layer-target]").forEach((r) => {
956
- r.addEventListener("click", (o) => {
957
- o.stopPropagation();
958
- const s = o, c = r.getAttribute("data-layer-target"), n = K(
959
- a.feicoes.filter((d) => d.layerId === c),
960
- a.searchQuery
1106
+ }), o.querySelectorAll("[data-layer-parent-select]").forEach((i) => {
1107
+ i.addEventListener("change", (r) => {
1108
+ const s = r.target, n = s.getAttribute("data-layer-parent-select"), l = s.value || null, c = e.camadas.find((f) => f.id === n);
1109
+ c && (c.parentId = l, e.salvarLembrancaEstado(), e.dispararEvento("ui-camada-mover-hierarquia", {
1110
+ camadaId: c.id,
1111
+ novoParentId: l,
1112
+ camada: c
1113
+ }), e.solicitarRenderizacao());
1114
+ });
1115
+ }), o.querySelectorAll("[data-add-sublayer]").forEach((i) => {
1116
+ i.addEventListener("click", (r) => {
1117
+ r.stopPropagation();
1118
+ const s = i.getAttribute("data-add-sublayer");
1119
+ e.dispararEvento("ui-camada-adicionar", { parentId: s });
1120
+ });
1121
+ }), o.querySelectorAll("[data-layer-target]").forEach((i) => {
1122
+ i.addEventListener("click", (r) => {
1123
+ r.stopPropagation();
1124
+ const s = r, n = i.getAttribute("data-layer-target"), l = ae(
1125
+ e.feicoes.filter((f) => f.layerId === n),
1126
+ e.searchQuery
961
1127
  );
962
- if (n.length === 0) return;
963
- n.every((d) => a.selectedFeatureIds.has(d.id)) ? n.forEach((d) => a.selectedFeatureIds.delete(d.id)) : (!s.ctrlKey && !s.metaKey && a.selectedFeatureIds.clear(), n.forEach((d) => a.selectedFeatureIds.add(d.id))), a.lastClickedFeatureId = n[n.length - 1].id, a.sincronizarSelecaoDOM(), a.notificarMudancaSelecao();
1128
+ if (l.length === 0) return;
1129
+ l.every((f) => e.selectedFeatureIds.has(f.id)) ? l.forEach((f) => e.selectedFeatureIds.delete(f.id)) : (!s.ctrlKey && !s.metaKey && e.selectedFeatureIds.clear(), l.forEach((f) => e.selectedFeatureIds.add(f.id))), e.lastClickedFeatureId = l[l.length - 1].id, e.sincronizarSelecaoDOM(), e.notificarMudancaSelecao();
964
1130
  });
965
1131
  });
966
1132
  }
967
- function Re(a, i) {
968
- const e = i.getElementById("btn-toggle-all-vis");
969
- if (!e) return;
970
- const t = a.camadas.every((r) => r.visible !== !1);
971
- e.innerHTML = t ? m.olhoAberto : m.olhoFechado, $(e, t ? "Ocultar Todas as Camadas" : "Exibir Todas as Camadas");
1133
+ function Ze(e, o) {
1134
+ const a = o.getElementById("btn-toggle-all-vis");
1135
+ if (!a) return;
1136
+ const t = e.camadas.every((i) => i.visible !== !1);
1137
+ a.innerHTML = t ? g.olhoAberto : g.olhoFechado, F(a, t ? "Ocultar Todas as Camadas" : "Exibir Todas as Camadas");
972
1138
  }
973
- function Ne(a, i, e, t) {
974
- a.feicoes.filter((r) => r.layerId === e).forEach((r) => {
975
- const o = S(i, "data-feat-lock", r.id);
976
- if (!o) return;
977
- const s = r.locked === !0 || t;
978
- o.innerHTML = s ? m.cadeadoTrancado : m.cadeadoAberto, o.classList.toggle("ui-lock-open", !s), t ? o.setAttribute("data-locked-by-layer", "true") : o.removeAttribute("data-locked-by-layer"), $(
979
- o,
1139
+ function ea(e, o, a, t) {
1140
+ e.feicoes.filter((i) => i.layerId === a).forEach((i) => {
1141
+ const r = M(o, "data-feat-lock", i.id);
1142
+ if (!r) return;
1143
+ const s = i.locked === !0 || t;
1144
+ r.innerHTML = s ? g.cadeadoTrancado : g.cadeadoAberto, r.classList.toggle("ui-lock-open", !s), t ? r.setAttribute("data-locked-by-layer", "true") : r.removeAttribute("data-locked-by-layer"), F(
1145
+ r,
980
1146
  t ? "Bloqueada pela camada" : s ? "Desbloquear Feição" : "Bloquear Feição"
981
1147
  );
982
1148
  });
983
1149
  }
984
- function He(a, i) {
985
- const e = i.getElementById("btn-footer-vis");
986
- e && e.addEventListener("click", () => {
987
- const l = a.feicoes.filter((u) => a.selectedFeatureIds.has(u.id));
988
- if (l.length === 0) return;
989
- const p = !l.some((u) => u.visible !== !1);
990
- l.forEach((u) => u.visible = p), a.dispararEvento("ui-acao-massa", {
1150
+ function aa(e, o) {
1151
+ const a = o.getElementById("btn-footer-vis");
1152
+ a && a.addEventListener("click", () => {
1153
+ const u = e.feicoes.filter((m) => e.selectedFeatureIds.has(m.id));
1154
+ if (u.length === 0) return;
1155
+ const d = !u.some((m) => m.visible !== !1);
1156
+ u.forEach((m) => m.visible = d), e.dispararEvento("ui-acao-massa", {
991
1157
  acao: "visibilidade",
992
- feicoesIds: l.map((u) => u.id),
993
- feicoes: l,
994
- valor: p
995
- }), a.solicitarRenderizacao();
1158
+ feicoesIds: u.map((m) => m.id),
1159
+ feicoes: u,
1160
+ valor: d
1161
+ }), e.solicitarRenderizacao();
996
1162
  });
997
- const t = i.getElementById("btn-footer-lock");
1163
+ const t = o.getElementById("btn-footer-lock");
998
1164
  t && t.addEventListener("click", () => {
999
- const l = a.feicoes.filter((u) => a.selectedFeatureIds.has(u.id));
1000
- if (l.length === 0) return;
1001
- const p = !l.some((u) => u.locked === !0);
1002
- l.forEach((u) => u.locked = p), a.dispararEvento("ui-acao-massa", {
1165
+ const u = e.feicoes.filter((m) => e.selectedFeatureIds.has(m.id));
1166
+ if (u.length === 0) return;
1167
+ const d = !u.some((m) => m.locked === !0);
1168
+ u.forEach((m) => m.locked = d), e.dispararEvento("ui-acao-massa", {
1003
1169
  acao: "bloqueio",
1004
- feicoesIds: l.map((u) => u.id),
1005
- feicoes: l,
1006
- valor: p
1007
- }), a.solicitarRenderizacao();
1008
- });
1009
- const r = i.getElementById("input-footer-color");
1010
- r && r.addEventListener("change", (l) => {
1011
- const d = l.target.value, p = a.feicoes.filter((u) => a.selectedFeatureIds.has(u.id));
1012
- p.length !== 0 && (p.forEach((u) => {
1013
- u.color = d, u.style = { ...u.style || {}, fillColor: d, strokeColor: d };
1014
- }), a.dispararEvento("ui-acao-massa", {
1015
- acao: "cor",
1016
- feicoesIds: p.map((u) => u.id),
1017
- feicoes: p,
1170
+ feicoesIds: u.map((m) => m.id),
1171
+ feicoes: u,
1018
1172
  valor: d
1019
- }), a.solicitarRenderizacao());
1173
+ }), e.solicitarRenderizacao();
1020
1174
  });
1021
- const o = i.getElementById("select-footer-move");
1022
- o && o.addEventListener("change", (l) => {
1023
- const d = l.target.value;
1024
- if (!d) return;
1025
- const p = a.feicoes.filter((f) => a.selectedFeatureIds.has(f.id));
1026
- if (p.length === 0) return;
1027
- const u = new Map(p.map((f) => [f.id, f.layerId]));
1028
- p.forEach((f) => f.layerId = d), p.forEach((f) => {
1029
- u.get(f.id) !== d && a.dispararEvento("ui-feicao-movida", {
1030
- feicaoId: f.id,
1031
- camadaOrigemId: u.get(f.id),
1032
- camadaDestinoId: d,
1033
- feicao: f
1175
+ const i = o.getElementById("input-footer-color"), r = o.getElementById("preview-footer-color");
1176
+ i && (i.addEventListener("input", (u) => {
1177
+ const p = u.target.value;
1178
+ r && (r.style.backgroundColor = p);
1179
+ }), i.addEventListener("change", (u) => {
1180
+ const p = u.target.value;
1181
+ r && (r.style.backgroundColor = p);
1182
+ const d = e.feicoes.filter((m) => e.selectedFeatureIds.has(m.id));
1183
+ d.length !== 0 && (d.forEach((m) => {
1184
+ m.color = p, m.style = { ...m.style || {}, fillColor: p, strokeColor: p };
1185
+ }), e.dispararEvento("ui-acao-massa", {
1186
+ acao: "cor",
1187
+ feicoesIds: d.map((m) => m.id),
1188
+ feicoes: d,
1189
+ valor: p
1190
+ }), e.solicitarRenderizacao());
1191
+ }));
1192
+ const s = o.getElementById("select-footer-move");
1193
+ s && s.addEventListener("change", (u) => {
1194
+ const p = u.target.value;
1195
+ if (!p) return;
1196
+ const d = e.feicoes.filter((h) => e.selectedFeatureIds.has(h.id));
1197
+ if (d.length === 0) return;
1198
+ const m = new Map(d.map((h) => [h.id, h.layerId]));
1199
+ d.forEach((h) => h.layerId = p), d.forEach((h) => {
1200
+ m.get(h.id) !== p && e.dispararEvento("ui-feicao-movida", {
1201
+ feicaoId: h.id,
1202
+ camadaOrigemId: m.get(h.id),
1203
+ camadaDestinoId: p,
1204
+ feicao: h
1034
1205
  });
1035
- }), a.dispararEvento("ui-acao-massa", {
1206
+ }), e.dispararEvento("ui-acao-massa", {
1036
1207
  acao: "mover",
1037
- feicoesIds: p.map((f) => f.id),
1038
- feicoes: p,
1039
- valor: d
1040
- }), a.solicitarRenderizacao();
1208
+ feicoesIds: d.map((h) => h.id),
1209
+ feicoes: d,
1210
+ valor: p
1211
+ }), e.solicitarRenderizacao();
1212
+ });
1213
+ const n = o.getElementById("btn-footer-new-layer");
1214
+ n && n.addEventListener("click", () => {
1215
+ e.dispararEvento("ui-camada-adicionar", {});
1041
1216
  });
1042
- const s = i.getElementById("btn-footer-new-layer");
1043
- s && s.addEventListener("click", () => {
1044
- a.dispararEvento("ui-camada-adicionar", {});
1217
+ const l = o.getElementById("btn-footer-new-group");
1218
+ l && l.addEventListener("click", () => {
1219
+ e.dispararEvento("ui-camada-grupo-adicionar", { isGroup: !0 });
1045
1220
  });
1046
- const c = i.getElementById("btn-footer-del");
1221
+ const c = o.getElementById("btn-footer-del");
1047
1222
  if (c) {
1048
- let l = null;
1049
- const d = "Excluir selecionados";
1223
+ let u = null;
1224
+ const p = "Excluir selecionados";
1050
1225
  c.addEventListener("click", () => {
1051
- const p = Array.from(a.selectedFeatureIds);
1052
- if (p.length === 0) return;
1226
+ const d = Array.from(e.selectedFeatureIds);
1227
+ if (d.length === 0) return;
1053
1228
  if (!c.classList.contains("confirming")) {
1054
- c.classList.add("confirming"), $(c, `Clique novamente para excluir ${p.length} selecionado(s)`), l = setTimeout(() => {
1055
- c.classList.remove("confirming"), $(c, d);
1229
+ c.classList.add("confirming"), F(c, `Clique novamente para excluir ${d.length} selecionado(s)`), u = setTimeout(() => {
1230
+ c.classList.remove("confirming"), F(c, p);
1056
1231
  }, 3500);
1057
1232
  return;
1058
1233
  }
1059
- l && clearTimeout(l);
1060
- const u = a.feicoes.filter((f) => a.selectedFeatureIds.has(f.id));
1061
- a.feicoes = a.feicoes.filter((f) => !a.selectedFeatureIds.has(f.id)), a.selectedFeatureIds.clear(), a.lastClickedFeatureId = null, a.dispararEvento("ui-acao-massa", {
1234
+ u && clearTimeout(u);
1235
+ const m = e.feicoes.filter((h) => e.selectedFeatureIds.has(h.id));
1236
+ e.feicoes = e.feicoes.filter((h) => !e.selectedFeatureIds.has(h.id)), e.selectedFeatureIds.clear(), e.lastClickedFeatureId = null, e.dispararEvento("ui-acao-massa", {
1062
1237
  acao: "excluir",
1063
- feicoesIds: p,
1064
- feicoes: u
1065
- }), a.notificarMudancaSelecao(), a.solicitarRenderizacao();
1238
+ feicoesIds: d,
1239
+ feicoes: m
1240
+ }), e.notificarMudancaSelecao(), e.solicitarRenderizacao();
1066
1241
  });
1067
1242
  }
1068
- const n = i.getElementById("btn-footer-clear");
1069
- n && n.addEventListener("click", () => a.limparSelecao(!0));
1243
+ const f = o.getElementById("btn-footer-clear");
1244
+ f && f.addEventListener("click", () => e.limparSelecao(!0));
1070
1245
  }
1071
- function Ue(a, i) {
1072
- const e = i.getElementById("btn-toggle-all-vis");
1073
- e && e.addEventListener("click", () => a.alternarVisibilidadeTodas(!0));
1074
- const t = i.getElementById("btn-toggle-all-expand");
1075
- t && t.addEventListener("click", (s) => {
1076
- s.stopPropagation(), a.camadas.length > 0 && a.camadas.every((n) => a.expandedLayers.has(n.id)) ? a.colapsarTodas() : a.expandirTodas();
1246
+ function ta(e, o) {
1247
+ const a = o.getElementById("btn-toggle-all-vis");
1248
+ a && a.addEventListener("click", () => e.alternarVisibilidadeTodas(!0));
1249
+ const t = o.getElementById("btn-toggle-all-expand");
1250
+ t && t.addEventListener("click", (n) => {
1251
+ n.stopPropagation(), e.camadas.length > 0 && e.camadas.every((c) => e.expandedLayers.has(c.id)) ? e.colapsarTodas() : e.expandirTodas();
1077
1252
  });
1078
- const r = i.getElementById("btn-add-layer");
1253
+ const i = o.getElementById("btn-add-layer");
1254
+ i && i.addEventListener("click", () => {
1255
+ e.dispararEvento("ui-camada-adicionar", {});
1256
+ });
1257
+ const r = o.getElementById("btn-add-group");
1079
1258
  r && r.addEventListener("click", () => {
1080
- a.dispararEvento("ui-camada-adicionar", {});
1259
+ e.dispararEvento("ui-camada-grupo-adicionar", { isGroup: !0 });
1081
1260
  });
1082
- const o = i.getElementById("btn-colapsar");
1083
- o && o.addEventListener("click", () => a.colapsar(!0)), Ve(a, i);
1261
+ const s = o.getElementById("btn-colapsar");
1262
+ s && s.addEventListener("click", () => e.colapsar(!0)), ra(e, o);
1084
1263
  }
1085
- function Ve(a, i) {
1086
- const e = i.getElementById("input-layer-search"), t = i.getElementById("btn-clear-layer-search"), r = () => {
1087
- var o;
1088
- a.searchQuery = "", a.solicitarRenderizacao(), (o = i.getElementById("input-layer-search")) == null || o.focus();
1264
+ function ra(e, o) {
1265
+ const a = o.getElementById("input-layer-search"), t = o.getElementById("btn-clear-layer-search"), i = () => {
1266
+ var r;
1267
+ e.searchQuery = "", e.solicitarRenderizacao(), (r = o.getElementById("input-layer-search")) == null || r.focus();
1089
1268
  };
1090
- if (e) {
1091
- const o = oe(() => a.solicitarRenderizacao(), 75);
1092
- e.addEventListener("input", (s) => {
1093
- a.searchQuery = s.target.value, o();
1094
- }), e.addEventListener("keydown", (s) => {
1095
- s.key === "Escape" && a.searchQuery && (s.preventDefault(), r());
1269
+ if (a) {
1270
+ const r = fe(() => e.solicitarRenderizacao(), 75);
1271
+ a.addEventListener("input", (s) => {
1272
+ e.searchQuery = s.target.value, r();
1273
+ }), a.addEventListener("keydown", (s) => {
1274
+ s.key === "Escape" && e.searchQuery && (s.preventDefault(), i());
1096
1275
  });
1097
1276
  }
1098
- t && t.addEventListener("click", r);
1277
+ t && t.addEventListener("click", i);
1099
1278
  }
1100
- function _e(a, i) {
1101
- i.querySelectorAll("[data-feat-select]").forEach((e) => {
1102
- e.addEventListener("click", (t) => {
1103
- if (a.editingFeatureId) return;
1104
- const r = t;
1105
- if (r.target.closest(
1279
+ function ia(e, o) {
1280
+ o.querySelectorAll("[data-feat-select]").forEach((a) => {
1281
+ a.addEventListener("click", (t) => {
1282
+ if (e.editingFeatureId) return;
1283
+ const i = t;
1284
+ if (i.target.closest(
1106
1285
  "[data-feat-eye], [data-feat-lock], [data-feat-fit], [data-feat-target], input, button"
1107
1286
  ))
1108
1287
  return;
1109
- const s = e.getAttribute("data-feat-select");
1110
- s && a.selecionarFeicao(s, r.ctrlKey || r.metaKey, r.shiftKey, !0);
1288
+ const s = a.getAttribute("data-feat-select");
1289
+ s && e.selecionarFeicao(s, i.ctrlKey || i.metaKey, i.shiftKey, !0);
1111
1290
  });
1112
- }), i.querySelectorAll("[data-feat-target]").forEach((e) => {
1113
- e.addEventListener("click", (t) => {
1291
+ }), o.querySelectorAll("[data-feat-target]").forEach((a) => {
1292
+ a.addEventListener("click", (t) => {
1114
1293
  t.stopPropagation();
1115
- const r = t, o = e.getAttribute("data-feat-target");
1116
- o && a.selecionarFeicao(o, r.ctrlKey || r.metaKey, r.shiftKey, !0);
1294
+ const i = t, r = a.getAttribute("data-feat-target");
1295
+ r && e.selecionarFeicao(r, i.ctrlKey || i.metaKey, i.shiftKey, !0);
1117
1296
  });
1118
- }), i.querySelectorAll("[data-feat-eye]").forEach((e) => {
1119
- e.addEventListener("click", (t) => {
1297
+ }), o.querySelectorAll("[data-feat-eye]").forEach((a) => {
1298
+ a.addEventListener("click", (t) => {
1120
1299
  t.stopPropagation();
1121
- const r = e.getAttribute("data-feat-eye"), o = a.feicoes.find((s) => s.id === r);
1122
- if (o) {
1123
- o.visible = o.visible === !1;
1124
- const s = o.visible !== !1;
1125
- e.innerHTML = s ? m.olhoAberto : m.olhoFechado, $(e, s ? "Ocultar Feição" : "Exibir Feição");
1126
- const c = e.closest(".ui-feat-row");
1127
- c && c.classList.toggle("hidden-row", !s), a.dispararEvento("ui-feicao-visibilidade", {
1128
- feicaoId: o.id,
1300
+ const i = a.getAttribute("data-feat-eye"), r = e.feicoes.find((s) => s.id === i);
1301
+ if (r) {
1302
+ r.visible = r.visible === !1;
1303
+ const s = r.visible !== !1;
1304
+ a.innerHTML = s ? g.olhoAberto : g.olhoFechado, F(a, s ? "Ocultar Feição" : "Exibir Feição");
1305
+ const n = a.closest(".ui-feat-row");
1306
+ n && n.classList.toggle("hidden-row", !s), e.dispararEvento("ui-feicao-visibilidade", {
1307
+ feicaoId: r.id,
1129
1308
  visivel: s
1130
1309
  });
1131
1310
  }
1132
1311
  });
1133
- }), i.querySelectorAll("[data-feat-lock]").forEach((e) => {
1134
- e.addEventListener("click", (t) => {
1135
- if (t.stopPropagation(), e.hasAttribute("data-locked-by-layer")) return;
1136
- const r = e.getAttribute("data-feat-lock"), o = a.feicoes.find((s) => s.id === r);
1137
- o && (o.locked = !o.locked, e.innerHTML = o.locked ? m.cadeadoTrancado : m.cadeadoAberto, e.classList.toggle("ui-lock-open", !o.locked), $(e, o.locked ? "Desbloquear Feição" : "Bloquear Feição"), a.dispararEvento("ui-feicao-bloqueio", {
1138
- feicaoId: o.id,
1139
- bloqueado: o.locked
1312
+ }), o.querySelectorAll("[data-feat-lock]").forEach((a) => {
1313
+ a.addEventListener("click", (t) => {
1314
+ if (t.stopPropagation(), a.hasAttribute("data-locked-by-layer")) return;
1315
+ const i = a.getAttribute("data-feat-lock"), r = e.feicoes.find((s) => s.id === i);
1316
+ r && (r.locked = !r.locked, a.innerHTML = r.locked ? g.cadeadoTrancado : g.cadeadoAberto, a.classList.toggle("ui-lock-open", !r.locked), F(a, r.locked ? "Desbloquear Feição" : "Bloquear Feição"), e.dispararEvento("ui-feicao-bloqueio", {
1317
+ feicaoId: r.id,
1318
+ bloqueado: r.locked
1140
1319
  }));
1141
1320
  });
1142
- }), i.querySelectorAll("[data-feat-fit]").forEach((e) => {
1143
- e.addEventListener("click", (t) => {
1321
+ }), o.querySelectorAll("[data-feat-fit]").forEach((a) => {
1322
+ a.addEventListener("click", (t) => {
1144
1323
  t.stopPropagation();
1145
- const r = e.getAttribute("data-feat-fit");
1146
- r && a.dispararEvento("ui-feicao-enquadrar", { feicaoId: r });
1324
+ const i = a.getAttribute("data-feat-fit");
1325
+ i && e.dispararEvento("ui-feicao-enquadrar", { feicaoId: i });
1147
1326
  });
1148
1327
  });
1149
1328
  }
1150
- function Ge(a, i) {
1151
- i.querySelectorAll("[data-basemap-thumb]").forEach((e) => {
1152
- e.addEventListener(
1329
+ function oa(e, o) {
1330
+ o.querySelectorAll("[data-basemap-thumb]").forEach((a) => {
1331
+ a.addEventListener(
1153
1332
  "error",
1154
1333
  () => {
1155
1334
  const t = document.createElement("div");
1156
- t.className = "ui-basemap-preview-none", t.innerHTML = m.mapa, e.replaceWith(t);
1335
+ t.className = "ui-basemap-preview-none", t.innerHTML = g.mapa, a.replaceWith(t);
1157
1336
  },
1158
1337
  { once: !0 }
1159
1338
  );
1160
- }), i.querySelectorAll("[data-basemap-id]").forEach((e) => {
1161
- e.addEventListener("click", () => {
1162
- const t = e.getAttribute("data-basemap-id");
1163
- t && a.selecionarMapaBase(t, !0);
1339
+ }), o.querySelectorAll("[data-basemap-id]").forEach((a) => {
1340
+ a.addEventListener("click", () => {
1341
+ const t = a.getAttribute("data-basemap-id");
1342
+ t && e.selecionarMapaBase(t, !0);
1164
1343
  });
1165
1344
  });
1166
1345
  }
1167
- function Ke(a, i) {
1168
- Ue(a, i), je(a, i), _e(a, i), Ge(a, i), He(a, i);
1346
+ function sa(e, o) {
1347
+ ta(e, o), Xe(e, o), ia(e, o), oa(e, o), aa(e, o);
1169
1348
  }
1170
- const Qe = '[role="button"][tabindex]', z = "[data-layer-row], [data-feat-row]", Ye = ["color", "range", "checkbox", "radio", "button"];
1171
- function le(a) {
1172
- return a instanceof HTMLSelectElement || a instanceof HTMLTextAreaElement ? !0 : a instanceof HTMLInputElement && !Ye.includes(a.type);
1349
+ const na = '[role="button"][tabindex]', P = "[data-layer-row], [data-feat-row]", la = ["color", "range", "checkbox", "radio", "button"];
1350
+ function ge(e) {
1351
+ return e instanceof HTMLSelectElement || e instanceof HTMLTextAreaElement ? !0 : e instanceof HTMLInputElement && !la.includes(e.type);
1173
1352
  }
1174
- function Je(a) {
1175
- return Array.from(a.querySelectorAll(z)).filter((i) => {
1176
- const e = i.closest(".ui-children-container");
1177
- return !(e && e.style.display === "none") && !i.classList.contains("ui-search-hidden");
1353
+ function ca(e) {
1354
+ return Array.from(e.querySelectorAll(P)).filter((o) => {
1355
+ const a = o.closest(".ui-children-container");
1356
+ return !(a && a.style.display === "none") && !o.classList.contains("ui-search-hidden");
1178
1357
  });
1179
1358
  }
1180
- function T(a, i) {
1181
- i && (a.querySelectorAll(z).forEach((e) => e.setAttribute("tabindex", "-1")), i.setAttribute("tabindex", "0"), i.focus());
1359
+ function H(e, o) {
1360
+ o && (e.querySelectorAll(P).forEach((a) => a.setAttribute("tabindex", "-1")), o.setAttribute("tabindex", "0"), o.focus());
1182
1361
  }
1183
- function We(a, i) {
1184
- a.dispatchEvent(
1362
+ function da(e, o) {
1363
+ e.dispatchEvent(
1185
1364
  new MouseEvent("click", {
1186
1365
  bubbles: !0,
1187
- ctrlKey: i.ctrlKey || i.metaKey,
1188
- shiftKey: i.shiftKey
1366
+ ctrlKey: o.ctrlKey || o.metaKey,
1367
+ shiftKey: o.shiftKey
1189
1368
  })
1190
1369
  );
1191
1370
  }
1192
- function Xe(a, i, e) {
1371
+ function ua(e, o, a) {
1193
1372
  var t;
1194
- if (!le(e.composedPath()[0])) {
1195
- if (a.activeSettingsLayerId) {
1196
- e.preventDefault();
1197
- const r = a.activeSettingsLayerId;
1198
- a.activeSettingsLayerId = null, a.solicitarRenderizacao(), (t = S(i, "data-layer-settings", r)) == null || t.focus();
1373
+ if (!ge(a.composedPath()[0])) {
1374
+ if (e.activeSettingsLayerId) {
1375
+ a.preventDefault();
1376
+ const i = e.activeSettingsLayerId;
1377
+ e.activeSettingsLayerId = null, e.solicitarRenderizacao(), (t = M(o, "data-layer-settings", i)) == null || t.focus();
1199
1378
  return;
1200
1379
  }
1201
- a.selectedFeatureIds.size > 0 && (e.preventDefault(), a.limparSelecao(!0));
1380
+ e.selectedFeatureIds.size > 0 && (a.preventDefault(), e.limparSelecao(!0));
1202
1381
  }
1203
1382
  }
1204
- function Ze(a, i, e) {
1383
+ function pa(e, o, a) {
1205
1384
  var s;
1206
- const t = e.composedPath()[0];
1207
- if (!(t instanceof HTMLElement) || le(t)) return;
1208
- if ((e.key === "Enter" || e.key === " ") && t.matches(Qe)) {
1209
- e.preventDefault(), t.click();
1385
+ const t = a.composedPath()[0];
1386
+ if (!(t instanceof HTMLElement) || ge(t)) return;
1387
+ if ((a.key === "Enter" || a.key === " ") && t.matches(na)) {
1388
+ a.preventDefault(), t.click();
1210
1389
  return;
1211
1390
  }
1212
- if (!t.matches(z)) return;
1213
- const r = Je(a), o = r.indexOf(t);
1214
- switch (e.key) {
1391
+ if (!t.matches(P)) return;
1392
+ const i = ca(e), r = i.indexOf(t);
1393
+ switch (a.key) {
1215
1394
  case "ArrowDown":
1216
- e.preventDefault(), T(a, r[Math.min(r.length - 1, o + 1)]);
1395
+ a.preventDefault(), H(e, i[Math.min(i.length - 1, r + 1)]);
1217
1396
  break;
1218
1397
  case "ArrowUp":
1219
- e.preventDefault(), T(a, r[Math.max(0, o - 1)]);
1398
+ a.preventDefault(), H(e, i[Math.max(0, r - 1)]);
1220
1399
  break;
1221
1400
  case "Home":
1222
- e.preventDefault(), T(a, r[0]);
1401
+ a.preventDefault(), H(e, i[0]);
1223
1402
  break;
1224
1403
  case "End":
1225
- e.preventDefault(), T(a, r[r.length - 1]);
1404
+ a.preventDefault(), H(e, i[i.length - 1]);
1226
1405
  break;
1227
1406
  case "ArrowRight":
1228
1407
  case "ArrowLeft": {
1229
- const c = t.getAttribute("data-layer-row");
1230
- if (!c) return;
1231
- const n = t.closest(".ui-layer-group"), l = (n == null ? void 0 : n.getAttribute("aria-expanded")) === "true";
1232
- e.key === "ArrowRight" !== l && (e.preventDefault(), (s = S(i, "data-layer-expand", c)) == null || s.click());
1408
+ const n = t.getAttribute("data-layer-row");
1409
+ if (!n) return;
1410
+ const l = t.closest(".ui-layer-group"), c = (l == null ? void 0 : l.getAttribute("aria-expanded")) === "true";
1411
+ a.key === "ArrowRight" !== c && (a.preventDefault(), (s = M(o, "data-layer-expand", n)) == null || s.click());
1233
1412
  break;
1234
1413
  }
1235
1414
  case "Enter":
1236
1415
  case " ":
1237
- e.preventDefault(), We(t, e);
1416
+ a.preventDefault(), da(t, a);
1238
1417
  break;
1239
1418
  }
1240
1419
  }
1241
- function ea(a, i, e, t, r) {
1242
- r.add(i, "keydown", (o) => {
1243
- o.key === "Escape" && Xe(a, e, o);
1244
- }), r.add(t, "keydown", (o) => Ze(t, e, o)), r.add(t, "focusin", (o) => {
1245
- const s = o.composedPath()[0];
1246
- s instanceof HTMLElement && s.matches(z) && (t.querySelectorAll(z).forEach((c) => c.setAttribute("tabindex", "-1")), s.setAttribute("tabindex", "0"));
1420
+ function fa(e, o, a, t, i) {
1421
+ i.add(o, "keydown", (r) => {
1422
+ r.key === "Escape" && ua(e, a, r);
1423
+ }), i.add(t, "keydown", (r) => pa(t, a, r)), i.add(t, "focusin", (r) => {
1424
+ const s = r.composedPath()[0];
1425
+ s instanceof HTMLElement && s.matches(P) && (t.querySelectorAll(P).forEach((n) => n.setAttribute("tabindex", "-1")), s.setAttribute("tabindex", "0"));
1247
1426
  });
1248
1427
  }
1249
- function aa(a, i) {
1250
- i.querySelectorAll("[data-layer-row]").forEach((t) => {
1251
- const o = t.getAttribute("data-layer-row") === a.camadaAtivaId;
1252
- t.classList.toggle("active-drawing-layer", o);
1428
+ function ma(e, o) {
1429
+ o.querySelectorAll("[data-layer-row]").forEach((t) => {
1430
+ const r = t.getAttribute("data-layer-row") === e.camadaAtivaId;
1431
+ t.classList.toggle("active-drawing-layer", r);
1253
1432
  const s = t.querySelector(".ui-col-name");
1254
1433
  if (s) {
1255
- let c = s.querySelector(".ui-active-badge");
1256
- if (o && !c) {
1257
- c = document.createElement("span"), c.className = "ui-active-badge", c.textContent = "✓ Ativa";
1258
- const n = s.querySelector(".ui-count-chip");
1259
- n ? s.insertBefore(c, n) : s.appendChild(c);
1260
- } else !o && c && c.remove();
1434
+ let n = s.querySelector(".ui-active-badge");
1435
+ if (r && !n) {
1436
+ n = document.createElement("span"), n.className = "ui-active-badge", n.textContent = "✓ Ativa";
1437
+ const l = s.querySelector(".ui-count-chip");
1438
+ l ? s.insertBefore(n, l) : s.appendChild(n);
1439
+ } else !r && n && n.remove();
1261
1440
  }
1262
1441
  });
1263
1442
  }
1264
- function ta(a, i) {
1265
- i.querySelectorAll(".ui-feat-row").forEach((g) => {
1266
- const b = g.getAttribute("data-feat-row"), E = b ? a.selectedFeatureIds.has(b) : !1;
1267
- g.classList.toggle("selected-row", E), g.setAttribute("aria-selected", String(E));
1268
- const y = g.querySelector(".ui-target-circle");
1269
- y && y.classList.toggle("selected", E);
1270
- }), i.querySelectorAll(".ui-layer-group").forEach((g) => {
1271
- const b = g.getAttribute("data-layer-id"), E = a.feicoes.filter((h) => h.layerId === b), y = g.querySelector(".ui-layer-row .ui-target-circle");
1272
- if (y && E.length > 0) {
1273
- const h = E.every((w) => a.selectedFeatureIds.has(w.id)), v = !h && E.some((w) => a.selectedFeatureIds.has(w.id));
1274
- y.classList.toggle("selected", h), y.classList.toggle("partial", v);
1275
- } else y && y.classList.remove("selected", "partial");
1443
+ function ha(e, o) {
1444
+ o.querySelectorAll(".ui-feat-row").forEach((v) => {
1445
+ const b = v.getAttribute("data-feat-row"), I = b ? e.selectedFeatureIds.has(b) : !1;
1446
+ v.classList.toggle("selected-row", I), v.setAttribute("aria-selected", String(I));
1447
+ const x = v.querySelector(".ui-target-circle");
1448
+ x && x.classList.toggle("selected", I);
1449
+ }), o.querySelectorAll(".ui-layer-group").forEach((v) => {
1450
+ const b = v.getAttribute("data-layer-id"), I = e.feicoes.filter((w) => w.layerId === b), x = v.querySelector(".ui-layer-row .ui-target-circle");
1451
+ if (x && I.length > 0) {
1452
+ const w = I.every((C) => e.selectedFeatureIds.has(C.id)), $ = !w && I.some((C) => e.selectedFeatureIds.has(C.id));
1453
+ x.classList.toggle("selected", w), x.classList.toggle("partial", $);
1454
+ } else x && x.classList.remove("selected", "partial");
1276
1455
  });
1277
- const e = a.feicoes.filter((g) => a.selectedFeatureIds.has(g.id)), t = e.length > 0, r = i.getElementById("footer-count"), o = i.getElementById("footer-label");
1278
- r && (r.textContent = String(t ? e.length : a.camadas.length)), o && (o.textContent = t ? e.length > 1 ? "selecionados" : "selecionado" : a.camadas.length > 1 ? "camadas" : "camada");
1279
- const s = i.querySelector(".ui-footer-metric"), c = ie(e);
1280
- s && (c ? (s.innerHTML = `${m.reguaMetrica} ${c}`, s.style.display = "inline-flex") : s.style.display = "none"), ["btn-footer-vis", "btn-footer-lock", "btn-footer-del"].forEach((g) => {
1281
- const b = i.getElementById(g);
1456
+ const a = e.feicoes.filter((v) => e.selectedFeatureIds.has(v.id)), t = a.length > 0, i = o.getElementById("footer-count"), r = o.getElementById("footer-label");
1457
+ i && (i.textContent = String(t ? a.length : e.camadas.length)), r && (r.textContent = t ? a.length > 1 ? "selecionados" : "selecionado" : e.camadas.length > 1 ? "camadas" : "camada");
1458
+ const s = o.querySelector(".ui-footer-metric"), n = pe(a);
1459
+ s && (n ? (s.innerHTML = `${g.reguaMetrica} ${n}`, s.style.display = "inline-flex") : s.style.display = "none");
1460
+ const l = o.querySelector(".ui-tree-footer");
1461
+ l && (l.classList.toggle("tem-selecao", t), l.classList.toggle("sem-selecao", !t));
1462
+ const c = o.querySelector(".ui-footer-actions-gerais");
1463
+ c && (c.style.display = t ? "none" : "flex");
1464
+ const f = o.querySelector(".ui-footer-bulk-actions");
1465
+ f && (f.style.display = t ? "flex" : "none"), ["btn-footer-vis", "btn-footer-lock", "btn-footer-del"].forEach((v) => {
1466
+ const b = o.getElementById(v);
1282
1467
  b && (b.disabled = !t, b.classList.toggle("disabled", !t));
1283
1468
  });
1284
- const n = i.querySelector(".ui-footer-move-wrapper");
1285
- n && n.classList.toggle("disabled", !t);
1286
- const l = i.getElementById("select-footer-move");
1287
- l && (l.disabled = !t);
1288
- const d = i.querySelector(".ui-footer-color-wrapper");
1289
- d && d.classList.toggle("disabled", !t);
1290
- const p = i.getElementById("input-footer-color");
1469
+ const u = o.querySelector(".ui-footer-move-wrapper");
1470
+ u && u.classList.toggle("disabled", !t);
1471
+ const p = o.getElementById("select-footer-move");
1291
1472
  p && (p.disabled = !t);
1292
- let u = i.getElementById("btn-footer-clear");
1293
- const f = i.querySelector(".ui-footer-right");
1294
- t && !u && f ? (u = document.createElement("button"), u.id = "btn-footer-clear", u.className = "ui-footer-btn", u.title = "Limpar seleção", u.innerHTML = m.fechar, u.addEventListener("click", () => a.limparSelecao(!0)), f.appendChild(u)) : !t && u && u.remove();
1473
+ const d = o.querySelector(".ui-footer-color-wrapper");
1474
+ d && d.classList.toggle("disabled", !t);
1475
+ const m = o.getElementById("input-footer-color");
1476
+ m && (m.disabled = !t);
1477
+ let h = o.getElementById("btn-footer-clear");
1478
+ const k = o.querySelector(".ui-footer-right");
1479
+ t && !h && k ? (h = document.createElement("button"), h.id = "btn-footer-clear", h.className = "ui-footer-btn btn-clear-footer", h.title = "Limpar seleção", h.innerHTML = g.fechar, h.addEventListener("click", () => e.limparSelecao(!0)), k.appendChild(h)) : !t && h && h.remove();
1295
1480
  }
1296
- function ra(a) {
1481
+ function ga(e) {
1297
1482
  function t() {
1298
- return a.getMinAltura ? a.getMinAltura() : 140;
1483
+ return e.getMinAltura ? e.getMinAltura() : 140;
1299
1484
  }
1300
- function r() {
1301
- return a.getMaxAltura ? a.getMaxAltura() : 1600;
1485
+ function i() {
1486
+ return e.getMaxAltura ? e.getMaxAltura() : 1600;
1302
1487
  }
1303
- function o(l, d = !1) {
1304
- if (l == null || l === "") {
1305
- a.hostElement.style.removeProperty("height"), a.hostElement.style.removeProperty("--ui-camadas-altura"), d && a.hostElement.dispatchEvent(
1488
+ function r(c, f = !1) {
1489
+ if (c == null || c === "") {
1490
+ e.hostElement.style.removeProperty("height"), e.hostElement.style.removeProperty("--ui-camadas-altura"), f && e.hostElement.dispatchEvent(
1306
1491
  new CustomEvent("ui-redimensionar-altura", {
1307
1492
  bubbles: !0,
1308
1493
  composed: !0,
@@ -1311,100 +1496,103 @@ function ra(a) {
1311
1496
  );
1312
1497
  return;
1313
1498
  }
1314
- const p = typeof l == "number" ? l : parseFloat(String(l));
1315
- if (isNaN(p)) return;
1316
- const u = Math.max(t(), Math.min(r(), Math.round(p)));
1317
- a.hostElement.style.height = `${u}px`, a.hostElement.style.setProperty("--ui-camadas-altura", `${u}px`), d && a.hostElement.dispatchEvent(
1499
+ const u = typeof c == "number" ? c : parseFloat(String(c));
1500
+ if (isNaN(u)) return;
1501
+ const p = Math.max(t(), Math.min(i(), Math.round(u)));
1502
+ e.hostElement.style.height = `${p}px`, e.hostElement.style.setProperty("--ui-camadas-altura", `${p}px`), f && e.hostElement.dispatchEvent(
1318
1503
  new CustomEvent("ui-redimensionar-altura", {
1319
1504
  bubbles: !0,
1320
1505
  composed: !0,
1321
- detail: { altura: u }
1506
+ detail: { altura: p }
1322
1507
  })
1323
1508
  );
1324
1509
  }
1325
1510
  let s = null;
1326
- function c() {
1327
- if (!a.resizerElement) return;
1328
- let l = !1, d = 0, p = 0;
1329
- const u = (g) => {
1330
- if (g.button !== 0) return;
1331
- g.preventDefault(), g.stopPropagation(), l = !0, d = g.clientY, p = a.hostElement.getBoundingClientRect().height, a.resizerElement.classList.add("ui-camadas-resizer--ativo"), a.hostElement.classList.add("ui-camadas--redimensionando");
1511
+ function n() {
1512
+ if (!e.resizerElement) return;
1513
+ let c = !1, f = 0, u = 0;
1514
+ const p = (m) => {
1515
+ if (m.button !== 0) return;
1516
+ m.preventDefault(), m.stopPropagation(), c = !0, f = m.clientY, u = e.hostElement.getBoundingClientRect().height, e.resizerElement.classList.add("ui-camadas-resizer--ativo"), e.hostElement.classList.add("ui-camadas--redimensionando");
1332
1517
  try {
1333
- a.resizerElement.setPointerCapture(g.pointerId);
1518
+ e.resizerElement.setPointerCapture(m.pointerId);
1334
1519
  } catch {
1335
1520
  }
1336
- const b = (h) => {
1337
- if (!l) return;
1338
- h.preventDefault();
1339
- const v = h.clientY - d, w = Math.max(t(), Math.min(r(), Math.round(p + v)));
1340
- a.hostElement.style.height = `${w}px`, a.hostElement.style.setProperty("--ui-camadas-altura", `${w}px`), a.onRedimensionando && a.onRedimensionando(w), a.hostElement.dispatchEvent(
1521
+ const h = (b) => {
1522
+ if (!c) return;
1523
+ b.preventDefault();
1524
+ const I = b.clientY - f, x = Math.max(t(), Math.min(i(), Math.round(u + I)));
1525
+ e.hostElement.style.height = `${x}px`, e.hostElement.style.setProperty("--ui-camadas-altura", `${x}px`), e.onRedimensionando && e.onRedimensionando(x), e.hostElement.dispatchEvent(
1341
1526
  new CustomEvent("ui-redimensionando-altura", {
1342
1527
  bubbles: !0,
1343
1528
  composed: !0,
1344
- detail: { altura: w }
1529
+ detail: { altura: x }
1345
1530
  })
1346
1531
  );
1347
- }, E = () => {
1348
- var h;
1349
- l = !1, s = null, window.removeEventListener("pointermove", b), window.removeEventListener("pointerup", y), window.removeEventListener("pointercancel", y), (h = a.resizerElement) == null || h.classList.remove("ui-camadas-resizer--ativo"), a.hostElement.classList.remove("ui-camadas--redimensionando");
1350
- }, y = (h) => {
1351
- if (!l) return;
1352
- l = !1, a.resizerElement.classList.remove("ui-camadas-resizer--ativo"), a.hostElement.classList.remove("ui-camadas--redimensionando");
1532
+ }, k = () => {
1533
+ var b;
1534
+ c = !1, s = null, window.removeEventListener("pointermove", h), window.removeEventListener("pointerup", v), window.removeEventListener("pointercancel", v), (b = e.resizerElement) == null || b.classList.remove("ui-camadas-resizer--ativo"), e.hostElement.classList.remove("ui-camadas--redimensionando");
1535
+ }, v = (b) => {
1536
+ if (!c) return;
1537
+ c = !1, e.resizerElement.classList.remove("ui-camadas-resizer--ativo"), e.hostElement.classList.remove("ui-camadas--redimensionando");
1353
1538
  try {
1354
- a.resizerElement.hasPointerCapture(h.pointerId) && a.resizerElement.releasePointerCapture(h.pointerId);
1539
+ e.resizerElement.hasPointerCapture(b.pointerId) && e.resizerElement.releasePointerCapture(b.pointerId);
1355
1540
  } catch {
1356
1541
  }
1357
- window.removeEventListener("pointermove", b), window.removeEventListener("pointerup", y), window.removeEventListener("pointercancel", y);
1358
- const v = a.hostElement.getBoundingClientRect().height, w = Math.round(v);
1359
- a.onAlturaAlterada && a.onAlturaAlterada(w), a.hostElement.dispatchEvent(
1542
+ window.removeEventListener("pointermove", h), window.removeEventListener("pointerup", v), window.removeEventListener("pointercancel", v);
1543
+ const I = e.hostElement.getBoundingClientRect().height, x = Math.round(I);
1544
+ e.onAlturaAlterada && e.onAlturaAlterada(x), e.hostElement.dispatchEvent(
1360
1545
  new CustomEvent("ui-redimensionar-altura", {
1361
1546
  bubbles: !0,
1362
1547
  composed: !0,
1363
- detail: { altura: w }
1548
+ detail: { altura: x }
1364
1549
  })
1365
1550
  );
1366
1551
  };
1367
- s = E, window.addEventListener("pointermove", b), window.addEventListener("pointerup", y), window.addEventListener("pointercancel", y);
1368
- }, f = (g) => {
1369
- g.preventDefault(), g.stopPropagation(), o(null, !0), a.onAlturaAlterada && a.onAlturaAlterada(null);
1552
+ s = k, window.addEventListener("pointermove", h), window.addEventListener("pointerup", v), window.addEventListener("pointercancel", v);
1553
+ }, d = (m) => {
1554
+ m.preventDefault(), m.stopPropagation(), r(null, !0), e.onAlturaAlterada && e.onAlturaAlterada(null);
1370
1555
  };
1371
- a.listeners.add(a.resizerElement, "pointerdown", u), a.listeners.add(a.resizerElement, "dblclick", f);
1556
+ e.listeners.add(e.resizerElement, "pointerdown", p), e.listeners.add(e.resizerElement, "dblclick", d);
1372
1557
  }
1373
- function n() {
1374
- s == null || s(), a.listeners.cleanup();
1558
+ function l() {
1559
+ s == null || s(), e.listeners.cleanup();
1375
1560
  }
1376
1561
  return {
1377
- init: c,
1378
- definirAltura: o,
1379
- destruir: n
1562
+ init: n,
1563
+ definirAltura: r,
1564
+ destruir: l
1380
1565
  };
1381
1566
  }
1382
- class Q extends be {
1567
+ const q = class q extends $e {
1383
1568
  constructor() {
1384
1569
  super();
1385
- x(this, "shadow");
1386
- x(this, "listeners", new xe());
1387
- x(this, "dragDropManager");
1388
- x(this, "resizerController");
1389
- x(this, "alturaCustomizada", null);
1390
- x(this, "conectado", !1);
1391
- x(this, "origensCamadas", /* @__PURE__ */ new Map());
1392
- x(this, "salvarLembrancaDebounced", oe(() => this.salvarLembrancaEstado(), 200));
1570
+ y(this, "shadow");
1571
+ y(this, "listeners", new Se());
1572
+ y(this, "dragDropManager");
1573
+ y(this, "resizerController");
1574
+ y(this, "alturaCustomizada", null);
1575
+ y(this, "conectado", !1);
1576
+ y(this, "profundidadeLote", 0);
1577
+ y(this, "renderPendente", !1);
1578
+ y(this, "camadasRemovidas", /* @__PURE__ */ new Set());
1579
+ y(this, "origensCamadas", /* @__PURE__ */ new Map());
1580
+ y(this, "salvarLembrancaDebounced", fe(() => this.salvarLembrancaEstado(), 200));
1393
1581
  // Estado interno
1394
- x(this, "camadas", []);
1395
- x(this, "feicoes", []);
1396
- x(this, "mapasBase", [...se]);
1397
- x(this, "expandedLayers", /* @__PURE__ */ new Set());
1398
- x(this, "selectedFeatureIds", /* @__PURE__ */ new Set());
1399
- x(this, "lastClickedFeatureId", null);
1400
- x(this, "activeSettingsLayerId", null);
1401
- x(this, "editingLayerId", null);
1402
- x(this, "editingFeatureId", null);
1403
- x(this, "searchQuery", "");
1404
- x(this, "corpoElement");
1405
- x(this, "btnExpandirFlutuante");
1582
+ y(this, "camadas", []);
1583
+ y(this, "feicoes", []);
1584
+ y(this, "mapasBase", [...me]);
1585
+ y(this, "expandedLayers", /* @__PURE__ */ new Set());
1586
+ y(this, "selectedFeatureIds", /* @__PURE__ */ new Set());
1587
+ y(this, "lastClickedFeatureId", null);
1588
+ y(this, "activeSettingsLayerId", null);
1589
+ y(this, "editingLayerId", null);
1590
+ y(this, "editingFeatureId", null);
1591
+ y(this, "searchQuery", "");
1592
+ y(this, "corpoElement");
1593
+ y(this, "btnExpandirFlutuante");
1406
1594
  this.shadow = this.attachShadow({ mode: "open" }), this.shadow.innerHTML = `
1407
- <style>${Pe}</style>
1595
+ <style>${We}</style>
1408
1596
  <div class="ui-camadas-container" id="panel-container" role="region" aria-label="Painel de Camadas">
1409
1597
  <div class="ui-camadas-corpo" id="painel-corpo"></div>
1410
1598
  <div class="ui-camadas-resizer-altura" id="resizer-altura" title="Arraste para redimensionar a altura (duplo-clique para resetar)" aria-label="Redimensionar altura">
@@ -1412,13 +1600,13 @@ class Q extends be {
1412
1600
  </div>
1413
1601
  </div>
1414
1602
  <button class="ui-camadas-toggle-flutuante" id="btn-expandir-flutuante" title="Expandir Painel de Camadas" aria-label="Expandir Painel de Camadas">
1415
- ${m.camadas}
1603
+ ${g.camadas}
1416
1604
  </button>
1417
- `, this.corpoElement = this.shadow.getElementById("painel-corpo"), this.btnExpandirFlutuante = this.shadow.getElementById("btn-expandir-flutuante"), this.dragDropManager = new ze(this, this.shadow);
1418
- const e = this.shadow.getElementById("resizer-altura");
1419
- this.resizerController = ra({
1605
+ `, this.corpoElement = this.shadow.getElementById("painel-corpo"), this.btnExpandirFlutuante = this.shadow.getElementById("btn-expandir-flutuante"), this.dragDropManager = new Ve(this, this.shadow);
1606
+ const a = this.shadow.getElementById("resizer-altura");
1607
+ this.resizerController = ga({
1420
1608
  hostElement: this,
1421
- resizerElement: e,
1609
+ resizerElement: a,
1422
1610
  listeners: this.listeners,
1423
1611
  getMinAltura: () => {
1424
1612
  const t = this.getAttribute("min-altura");
@@ -1457,129 +1645,131 @@ class Q extends be {
1457
1645
  }
1458
1646
  connectedCallback() {
1459
1647
  if (this.persistir) {
1460
- const e = U(this.obterChaveStorageAtual());
1461
- e && (e.painelColapsado === !0 && !this.hasAttribute("colapsado") && (this.colapsado = !0), e.camadaAtivaId && !this.getAttribute("camada-ativa") && (this.camadaAtivaId = e.camadaAtivaId), e.mapaBaseAtivo && !this.getAttribute("mapa-base-ativo") && (this.mapaBaseAtivo = e.mapaBaseAtivo), e.densidade && !this.getAttribute("densidade") && (this.densidade = e.densidade), typeof e.altura == "number" && !this.getAttribute("altura") && !this.style.height && (this.resizerController.definirAltura(e.altura, !1), this.alturaCustomizada = e.altura));
1648
+ const a = W(this.obterChaveStorageAtual());
1649
+ a && (a.painelColapsado === !0 && !this.hasAttribute("colapsado") && (this.colapsado = !0), a.camadaAtivaId && !this.getAttribute("camada-ativa") && (this.camadaAtivaId = a.camadaAtivaId), a.mapaBaseAtivo && !this.getAttribute("mapa-base-ativo") && (this.mapaBaseAtivo = a.mapaBaseAtivo), a.densidade && !this.getAttribute("densidade") && (this.densidade = a.densidade), typeof a.altura == "number" && !this.getAttribute("altura") && !this.style.height && (this.resizerController.definirAltura(a.altura, !1), this.alturaCustomizada = a.altura));
1462
1650
  }
1463
- this.hasAttribute("altura") && this.resizerController.definirAltura(this.getAttribute("altura"), !1), this.resizerController.init(), this.render(), this.conectarEventosGerais(), ea(this, this, this.shadow, this.corpoElement, this.listeners), this.conectado = !0, this.camadas.length > 0 && this.salvarLembrancaEstado();
1651
+ this.hasAttribute("altura") && this.resizerController.definirAltura(this.getAttribute("altura"), !1), this.persistir && !this.storageKey && !this.id && (q.instanciasChavePadrao.size > 0 && console.warn(
1652
+ "[UI-Camadas] Mais de um painel sem 'id' nem 'storage-key' divide a mesma chave de persistência e um sobrescreve o estado do outro. Defina 'storage-key' (ou 'id') em cada um."
1653
+ ), q.instanciasChavePadrao.add(this)), this.resizerController.init(), this.render(), this.conectarEventosGerais(), fa(this, this, this.shadow, this.corpoElement, this.listeners), this.conectado = !0, this.camadas.length > 0 && this.salvarLembrancaEstado();
1464
1654
  }
1465
1655
  disconnectedCallback() {
1466
- var e;
1467
- this.conectado = !1, (e = this.resizerController) == null || e.destruir(), this.listeners.cleanup();
1656
+ var a;
1657
+ this.conectado = !1, q.instanciasChavePadrao.delete(this), (a = this.resizerController) == null || a.destruir(), this.listeners.cleanup();
1468
1658
  }
1469
- attributeChangedCallback(e, t, r) {
1470
- var o;
1471
- t !== r && (e === "colapsado" ? this.salvarLembrancaEstado() : e === "camada-ativa" ? (this.sincronizarCamadaAtivaDOM(), this.salvarLembrancaEstado()) : e === "mapa-base-ativo" ? r && this.marcarMapaBaseAtivoNoDOM(r) : e === "mostrar-mapas-base" || e === "mostrar-rodape" || e === "mostrar-busca" || e === "colapsavel" || e === "flutuante" ? this.solicitarRenderizacao() : e === "altura" && ((o = this.resizerController) == null || o.definirAltura(r, !1)));
1659
+ attributeChangedCallback(a, t, i) {
1660
+ var r;
1661
+ t !== i && (a === "colapsado" ? this.salvarLembrancaEstado() : a === "camada-ativa" ? (this.sincronizarCamadaAtivaDOM(), this.salvarLembrancaEstado()) : a === "mapa-base-ativo" ? i && this.marcarMapaBaseAtivoNoDOM(i) : a === "mostrar-mapas-base" || a === "mostrar-rodape" || a === "mostrar-busca" || a === "colapsavel" || a === "flutuante" ? this.solicitarRenderizacao() : a === "altura" && ((r = this.resizerController) == null || r.definirAltura(i, !1)));
1472
1662
  }
1473
1663
  // --- Getters e Setters de Propriedades Reativas ---
1474
1664
  get titulo() {
1475
1665
  return this.getAttribute("titulo") || "Camadas";
1476
1666
  }
1477
- set titulo(e) {
1478
- this.setAttribute("titulo", e);
1667
+ set titulo(a) {
1668
+ this.setAttribute("titulo", a);
1479
1669
  }
1480
1670
  get camadaAtivaId() {
1481
- var e;
1482
- return this.getAttribute("camada-ativa") || (((e = this.camadas[0]) == null ? void 0 : e.id) ?? null);
1671
+ var a;
1672
+ return this.getAttribute("camada-ativa") || (((a = this.camadas[0]) == null ? void 0 : a.id) ?? null);
1483
1673
  }
1484
- set camadaAtivaId(e) {
1485
- e ? this.setAttribute("camada-ativa", e) : this.removeAttribute("camada-ativa");
1674
+ set camadaAtivaId(a) {
1675
+ a ? this.setAttribute("camada-ativa", a) : this.removeAttribute("camada-ativa");
1486
1676
  }
1487
1677
  get mapaBaseAtivo() {
1488
1678
  return this.getAttribute("mapa-base-ativo") || "satelite";
1489
1679
  }
1490
- set mapaBaseAtivo(e) {
1491
- this.setAttribute("mapa-base-ativo", e);
1680
+ set mapaBaseAtivo(a) {
1681
+ this.setAttribute("mapa-base-ativo", a);
1492
1682
  }
1493
- selecionarMapaBase(e, t = !1) {
1494
- !e || this.mapaBaseAtivo === e || (this.mapaBaseAtivo = e, this.marcarMapaBaseAtivoNoDOM(e), this.salvarLembrancaEstado(), t && this.dispararEvento("ui-mapa-base-alterado", { mapaBaseId: e }));
1683
+ selecionarMapaBase(a, t = !1) {
1684
+ !a || this.mapaBaseAtivo === a || (this.mapaBaseAtivo = a, this.marcarMapaBaseAtivoNoDOM(a), this.salvarLembrancaEstado(), t && this.dispararEvento("ui-mapa-base-alterado", { mapaBaseId: a }));
1495
1685
  }
1496
- marcarMapaBaseAtivoNoDOM(e) {
1686
+ marcarMapaBaseAtivoNoDOM(a) {
1497
1687
  this.shadow.querySelectorAll("[data-basemap-id]").forEach((t) => {
1498
- const r = t.getAttribute("data-basemap-id") === e;
1499
- t.classList.toggle("active", r), t.setAttribute("aria-pressed", String(r));
1688
+ const i = t.getAttribute("data-basemap-id") === a;
1689
+ t.classList.toggle("active", i), t.setAttribute("aria-pressed", String(i));
1500
1690
  });
1501
1691
  }
1502
1692
  get abaAtiva() {
1503
1693
  return this.getAttribute("aba-ativa") || "camadas";
1504
1694
  }
1505
- set abaAtiva(e) {
1506
- this.setAttribute("aba-ativa", e);
1695
+ set abaAtiva(a) {
1696
+ this.setAttribute("aba-ativa", a);
1507
1697
  }
1508
1698
  get colapsado() {
1509
1699
  return this.hasAttribute("colapsado");
1510
1700
  }
1511
- set colapsado(e) {
1512
- e ? this.setAttribute("colapsado", "") : this.removeAttribute("colapsado");
1701
+ set colapsado(a) {
1702
+ a ? this.setAttribute("colapsado", "") : this.removeAttribute("colapsado");
1513
1703
  }
1514
1704
  get colapsavel() {
1515
1705
  return this.getAttribute("colapsavel") !== "false";
1516
1706
  }
1517
- set colapsavel(e) {
1518
- this.setAttribute("colapsavel", String(e));
1707
+ set colapsavel(a) {
1708
+ this.setAttribute("colapsavel", String(a));
1519
1709
  }
1520
1710
  get flutuante() {
1521
1711
  return this.hasAttribute("flutuante");
1522
1712
  }
1523
- set flutuante(e) {
1524
- e ? this.setAttribute("flutuante", "") : this.removeAttribute("flutuante");
1713
+ set flutuante(a) {
1714
+ a ? this.setAttribute("flutuante", "") : this.removeAttribute("flutuante");
1525
1715
  }
1526
1716
  get densidade() {
1527
1717
  return this.getAttribute("densidade") || "normal";
1528
1718
  }
1529
- set densidade(e) {
1530
- this.setAttribute("densidade", e);
1719
+ set densidade(a) {
1720
+ this.setAttribute("densidade", a);
1531
1721
  }
1532
1722
  get mostrarMapasBase() {
1533
1723
  return this.getAttribute("mostrar-mapas-base") !== "false";
1534
1724
  }
1535
- set mostrarMapasBase(e) {
1536
- this.setAttribute("mostrar-mapas-base", String(e));
1725
+ set mostrarMapasBase(a) {
1726
+ this.setAttribute("mostrar-mapas-base", String(a));
1537
1727
  }
1538
1728
  get mostrarRodape() {
1539
1729
  return this.getAttribute("mostrar-rodape") !== "false";
1540
1730
  }
1541
- set mostrarRodape(e) {
1542
- this.setAttribute("mostrar-rodape", String(e));
1731
+ set mostrarRodape(a) {
1732
+ this.setAttribute("mostrar-rodape", String(a));
1543
1733
  }
1544
1734
  get mostrarBusca() {
1545
1735
  return this.getAttribute("mostrar-busca") !== "false";
1546
1736
  }
1547
- set mostrarBusca(e) {
1548
- this.setAttribute("mostrar-busca", String(e));
1737
+ set mostrarBusca(a) {
1738
+ this.setAttribute("mostrar-busca", String(a));
1549
1739
  }
1550
1740
  get persistir() {
1551
1741
  return this.getAttribute("persistir") !== "false";
1552
1742
  }
1553
- set persistir(e) {
1554
- this.setAttribute("persistir", String(e));
1743
+ set persistir(a) {
1744
+ this.setAttribute("persistir", String(a));
1555
1745
  }
1556
1746
  get storageKey() {
1557
1747
  return this.getAttribute("storage-key");
1558
1748
  }
1559
- set storageKey(e) {
1560
- e ? this.setAttribute("storage-key", e) : this.removeAttribute("storage-key");
1749
+ set storageKey(a) {
1750
+ a ? this.setAttribute("storage-key", a) : this.removeAttribute("storage-key");
1561
1751
  }
1562
1752
  get redimensionavel() {
1563
1753
  return this.hasAttribute("redimensionavel") || this.hasAttribute("redimensionavel-altura");
1564
1754
  }
1565
- set redimensionavel(e) {
1566
- e ? this.setAttribute("redimensionavel", "") : (this.removeAttribute("redimensionavel"), this.removeAttribute("redimensionavel-altura"));
1755
+ set redimensionavel(a) {
1756
+ a ? this.setAttribute("redimensionavel", "") : (this.removeAttribute("redimensionavel"), this.removeAttribute("redimensionavel-altura"));
1567
1757
  }
1568
1758
  get altura() {
1569
1759
  return this.getAttribute("altura") || this.style.height || null;
1570
1760
  }
1571
- set altura(e) {
1572
- e != null ? (this.setAttribute("altura", String(e)), this.definirAltura(e)) : (this.removeAttribute("altura"), this.definirAltura(null));
1761
+ set altura(a) {
1762
+ a != null ? (this.setAttribute("altura", String(a)), this.definirAltura(a)) : (this.removeAttribute("altura"), this.definirAltura(null));
1573
1763
  }
1574
- definirAltura(e, t = !0) {
1575
- var o;
1576
- (o = this.resizerController) == null || o.definirAltura(e, !1);
1577
- const r = e !== null ? parseFloat(String(e)) : null;
1578
- this.alturaCustomizada = isNaN(r) ? null : r, t && this.salvarLembrancaEstado();
1764
+ definirAltura(a, t = !0) {
1765
+ var r;
1766
+ (r = this.resizerController) == null || r.definirAltura(a, !1);
1767
+ const i = a !== null ? parseFloat(String(a)) : null;
1768
+ this.alturaCustomizada = isNaN(i) ? null : i, t && this.salvarLembrancaEstado();
1579
1769
  }
1580
1770
  // --- Gerenciamento de Persistência / Lembrança ---
1581
1771
  obterChaveStorageAtual() {
1582
- return Be(this.storageKey, this.id);
1772
+ return _e(this.storageKey, this.id);
1583
1773
  }
1584
1774
  /** Versão com debounce, para interações contínuas (seletor de cor, slider de opacidade). */
1585
1775
  agendarSalvarLembranca() {
@@ -1587,8 +1777,8 @@ class Q extends be {
1587
1777
  }
1588
1778
  salvarLembrancaEstado() {
1589
1779
  if (!this.persistir || !this.conectado) return;
1590
- const e = this.obterChaveStorageAtual(), t = Oe({
1591
- estadoAnterior: U(e),
1780
+ const a = this.obterChaveStorageAtual(), t = Je({
1781
+ estadoAnterior: W(a),
1592
1782
  origensCamadas: this.origensCamadas,
1593
1783
  camadas: this.camadas,
1594
1784
  expandedLayers: this.expandedLayers,
@@ -1596,12 +1786,13 @@ class Q extends be {
1596
1786
  painelColapsado: this.colapsado,
1597
1787
  mapaBaseAtivo: this.mapaBaseAtivo,
1598
1788
  densidade: this.densidade,
1599
- altura: this.alturaCustomizada
1789
+ altura: this.alturaCustomizada,
1790
+ camadasRemovidas: this.camadasRemovidas
1600
1791
  });
1601
- qe(e, t);
1792
+ this.camadasRemovidas.clear(), Ke(a, t);
1602
1793
  }
1603
1794
  limparLembranca() {
1604
- Te(this.obterChaveStorageAtual());
1795
+ Ye(this.obterChaveStorageAtual());
1605
1796
  }
1606
1797
  // --- API Pública de Alta Ergonomia ---
1607
1798
  //
@@ -1614,143 +1805,170 @@ class Q extends be {
1614
1805
  get layers() {
1615
1806
  return this.camadas;
1616
1807
  }
1617
- set layers(e) {
1618
- this.definirCamadas(e);
1808
+ set layers(a) {
1809
+ this.definirCamadas(a);
1619
1810
  }
1620
1811
  /** Atalho reativo para `definirFeicoes()` — não dispara eventos. */
1621
1812
  get features() {
1622
1813
  return this.feicoes;
1623
1814
  }
1624
- set features(e) {
1625
- this.definirFeicoes(e);
1815
+ set features(a) {
1816
+ this.definirFeicoes(a);
1626
1817
  }
1627
1818
  /** Atalho reativo para `definirMapasBase()` — não dispara eventos. */
1628
1819
  get basemaps() {
1629
1820
  return this.mapasBase;
1630
1821
  }
1631
- set basemaps(e) {
1632
- this.definirMapasBase(e);
1822
+ set basemaps(a) {
1823
+ this.definirMapasBase(a);
1633
1824
  }
1634
- definirCamadas(e, t) {
1635
- if (this.camadas = Array.isArray(e) ? e.map((r) => ({ ...r })) : [], this.origensCamadas.clear(), this.persistir) {
1636
- const r = U(this.obterChaveStorageAtual());
1637
- De(this.camadas, r, this.expandedLayers, this.origensCamadas), r != null && r.camadaAtivaId && this.camadas.some((o) => o.id === r.camadaAtivaId) && (this.camadaAtivaId = r.camadaAtivaId);
1825
+ achatarCamadas(a, t = null) {
1826
+ const i = [];
1827
+ for (const r of a) {
1828
+ const s = { ...r };
1829
+ t && s.parentId === void 0 && (s.parentId = t), i.push(s), Array.isArray(r.children) && r.children.length > 0 && i.push(...this.achatarCamadas(r.children, r.id));
1830
+ }
1831
+ return i;
1832
+ }
1833
+ definirCamadas(a, t) {
1834
+ if (this.camadas = Array.isArray(a) ? this.achatarCamadas(a) : [], this.origensCamadas.clear(), this.persistir) {
1835
+ const r = W(this.obterChaveStorageAtual());
1836
+ Qe(this.camadas, r, this.expandedLayers, this.origensCamadas), r != null && r.camadaAtivaId && this.camadas.some((s) => s.id === r.camadaAtivaId) && (this.camadaAtivaId = r.camadaAtivaId);
1638
1837
  } else
1639
1838
  this.camadas.forEach((r) => {
1640
- this.origensCamadas.set(r.id, _(r)), this.expandedLayers.has(r.id) || this.expandedLayers.add(r.id);
1839
+ this.origensCamadas.set(r.id, Z(r)), this.expandedLayers.has(r.id) || this.expandedLayers.add(r.id);
1641
1840
  });
1642
1841
  if (Array.isArray(t)) {
1643
- this.feicoes = t.map((s) => ({ ...s }));
1644
- const r = new Set(this.camadas.map((s) => s.id)), o = this.feicoes.filter((s) => s.layerId && !r.has(s.layerId));
1645
- o.length > 0 && console.warn(
1646
- `[UI-Camadas] ${o.length} feição(ões) possuem 'layerId' não cadastrado nas camadas:`,
1647
- o.map((s) => ({ id: s.id, nome: s.name, layerId: s.layerId }))
1842
+ this.feicoes = t.map((n) => ({ ...n }));
1843
+ const r = new Set(this.camadas.map((n) => n.id)), s = this.feicoes.filter((n) => n.layerId && !r.has(n.layerId));
1844
+ s.length > 0 && console.warn(
1845
+ `[UI-Camadas] ${s.length} feição(ões) possuem 'layerId' não cadastrado nas camadas:`,
1846
+ s.map((n) => ({ id: n.id, nome: n.name, layerId: n.layerId }))
1648
1847
  ), this.sincronizarSelecoesComFeicoesValidas();
1649
1848
  }
1650
- !this.getAttribute("camada-ativa") && this.camadas.length > 0 && (this.camadaAtivaId = this.camadas[0].id), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1849
+ const i = this.getAttribute("camada-ativa");
1850
+ this.camadas.length > 0 && (!i || !this.camadas.some((r) => r.id === i)) && (this.camadaAtivaId = this.camadas[0].id), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1651
1851
  }
1652
- definirFeicoes(e) {
1653
- this.feicoes = Array.isArray(e) ? e.map((t) => ({ ...t })) : [], this.sincronizarSelecoesComFeicoesValidas(), this.solicitarRenderizacao();
1852
+ definirFeicoes(a) {
1853
+ this.feicoes = Array.isArray(a) ? a.map((t) => ({ ...t })) : [], this.sincronizarSelecoesComFeicoesValidas(), this.solicitarRenderizacao();
1654
1854
  }
1655
- definirMapasBase(e) {
1656
- this.mapasBase = Array.isArray(e) ? [...e] : [], this.solicitarRenderizacao();
1855
+ definirMapasBase(a) {
1856
+ this.mapasBase = Array.isArray(a) ? [...a] : [], this.solicitarRenderizacao();
1657
1857
  }
1658
- definirCamadaAtiva(e, t = !1) {
1659
- !e || this.camadaAtivaId === e || (this.camadaAtivaId = e, this.sincronizarCamadaAtivaDOM(), this.salvarLembrancaEstado(), t && this.dispararEvento("ui-camada-selecionada", {
1660
- camadaId: e,
1661
- camada: this.camadas.find((r) => r.id === e)
1858
+ definirCamadaAtiva(a, t = !1) {
1859
+ !a || this.camadaAtivaId === a || (this.camadaAtivaId = a, this.sincronizarCamadaAtivaDOM(), this.salvarLembrancaEstado(), t && this.dispararEvento("ui-camada-selecionada", {
1860
+ camadaId: a,
1861
+ camada: this.camadas.find((i) => i.id === a)
1662
1862
  }));
1663
1863
  }
1664
- obterCamada(e) {
1665
- return this.camadas.find((t) => t.id === e);
1864
+ obterCamada(a) {
1865
+ return this.camadas.find((t) => t.id === a);
1666
1866
  }
1667
1867
  obterCamadaAtiva() {
1668
- return this.camadas.find((e) => e.id === this.camadaAtivaId);
1868
+ return this.camadas.find((a) => a.id === this.camadaAtivaId);
1669
1869
  }
1670
- obterFeicao(e) {
1671
- return this.feicoes.find((t) => t.id === e);
1870
+ obterFeicao(a) {
1871
+ return this.feicoes.find((t) => t.id === a);
1672
1872
  }
1673
1873
  obterFeicoesSelecionadas() {
1674
- return this.feicoes.filter((e) => this.selectedFeatureIds.has(e.id));
1874
+ return this.feicoes.filter((a) => this.selectedFeatureIds.has(a.id));
1675
1875
  }
1676
- adicionarCamada(e) {
1677
- if (!e || !e.id) return;
1678
- if (this.camadas.some((r) => r.id === e.id)) {
1679
- console.warn(`[UI-Camadas] adicionarCamada ignorado: já existe uma camada com id '${e.id}'.`);
1876
+ adicionarCamada(a) {
1877
+ if (!a || !a.id) return;
1878
+ if (this.camadas.some((i) => i.id === a.id)) {
1879
+ console.warn(`[UI-Camadas] adicionarCamada ignorado: já existe uma camada com id '${a.id}'.`);
1680
1880
  return;
1681
1881
  }
1682
- const t = { ...e };
1683
- this.camadas.push(t), this.origensCamadas.set(t.id, _(t)), this.expandedLayers.add(t.id), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1882
+ const t = { ...a };
1883
+ this.camadas.push(t), this.origensCamadas.set(t.id, Z(t)), this.expandedLayers.add(t.id), t.parentId && this.expandedLayers.add(t.parentId), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1684
1884
  }
1685
- removerCamada(e) {
1885
+ removerCamada(a) {
1686
1886
  var t;
1687
- this.camadas = this.camadas.filter((r) => r.id !== e), this.feicoes = this.feicoes.filter((r) => r.layerId !== e), this.origensCamadas.delete(e), this.expandedLayers.delete(e), this.activeSettingsLayerId === e && (this.activeSettingsLayerId = null), this.sincronizarSelecoesComFeicoesValidas(), this.selectedFeatureIds.size === 0 && (this.lastClickedFeatureId = null), this.camadaAtivaId === e && (this.camadaAtivaId = ((t = this.camadas[0]) == null ? void 0 : t.id) ?? null), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1688
- }
1689
- adicionarFeicao(e) {
1690
- if (!(!e || !e.id)) {
1691
- if (this.feicoes.some((t) => t.id === e.id)) {
1692
- console.warn(`[UI-Camadas] adicionarFeicao ignorado: já existe uma feição com id '${e.id}'.`);
1887
+ this.camadas.forEach((i) => {
1888
+ i.parentId === a && (i.parentId = null);
1889
+ }), this.camadas = this.camadas.filter((i) => i.id !== a), this.feicoes = this.feicoes.filter((i) => i.layerId !== a), this.origensCamadas.delete(a), this.camadasRemovidas.add(a), this.expandedLayers.delete(a), this.activeSettingsLayerId === a && (this.activeSettingsLayerId = null), this.sincronizarSelecoesComFeicoesValidas(), this.selectedFeatureIds.size === 0 && (this.lastClickedFeatureId = null), this.camadaAtivaId === a && (this.camadaAtivaId = ((t = this.camadas[0]) == null ? void 0 : t.id) ?? null), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1890
+ }
1891
+ adicionarFeicao(a) {
1892
+ if (!(!a || !a.id)) {
1893
+ if (this.feicoes.some((t) => t.id === a.id)) {
1894
+ console.warn(`[UI-Camadas] adicionarFeicao ignorado: já existe uma feição com id '${a.id}'.`);
1693
1895
  return;
1694
1896
  }
1695
- this.feicoes.push({ ...e }), this.solicitarRenderizacao();
1897
+ this.feicoes.push({ ...a }), this.solicitarRenderizacao();
1696
1898
  }
1697
1899
  }
1698
- atualizarFeicao(e) {
1699
- const t = this.feicoes.findIndex((r) => r.id === e.id);
1700
- t !== -1 && (this.feicoes[t] = { ...this.feicoes[t], ...e }, this.solicitarRenderizacao());
1900
+ atualizarFeicao(a) {
1901
+ const t = this.feicoes.findIndex((i) => i.id === a.id);
1902
+ t !== -1 && (this.feicoes[t] = { ...this.feicoes[t], ...a }, this.solicitarRenderizacao());
1701
1903
  }
1702
- removerFeicao(e) {
1703
- this.feicoes = this.feicoes.filter((t) => t.id !== e), this.selectedFeatureIds.delete(e), this.solicitarRenderizacao();
1904
+ removerFeicao(a) {
1905
+ this.feicoes = this.feicoes.filter((t) => t.id !== a), this.selectedFeatureIds.delete(a), this.solicitarRenderizacao();
1704
1906
  }
1705
- selecionarFeicao(e, t = !1, r = !1, o = !1) {
1706
- const s = Ce(
1707
- Le(this.camadas, this.feicoes, this.expandedLayers, this.searchQuery),
1907
+ selecionarFeicao(a, t = !1, i = !1, r = !1) {
1908
+ const s = Pe(this.camadas, this.feicoes, this.expandedLayers, this.searchQuery), n = !i && !s.includes(a) && this.feicoes.some((c) => c.id === a), l = Oe(
1909
+ n ? [...s, a] : s,
1708
1910
  this.selectedFeatureIds,
1709
1911
  this.lastClickedFeatureId,
1710
- e,
1912
+ a,
1711
1913
  t,
1712
- r
1914
+ i
1713
1915
  );
1714
- s && (this.selectedFeatureIds = s.selecionados, this.lastClickedFeatureId = s.ultimoClicadoId, this.sincronizarSelecaoDOM(), o && this.notificarMudancaSelecao());
1916
+ l && (this.selectedFeatureIds = l.selecionados, this.lastClickedFeatureId = l.ultimoClicadoId, this.sincronizarSelecaoDOM(), r && this.notificarMudancaSelecao());
1715
1917
  }
1716
- selecionarFeicoes(e, t = !1) {
1717
- const r = e || [];
1718
- r.length === this.selectedFeatureIds.size && r.every((c) => this.selectedFeatureIds.has(c)) || (this.selectedFeatureIds.clear(), r.forEach((c) => this.selectedFeatureIds.add(c)), this.sincronizarSelecaoDOM(), t && this.notificarMudancaSelecao());
1918
+ selecionarFeicoes(a, t = !1) {
1919
+ const i = a || [];
1920
+ i.length === this.selectedFeatureIds.size && i.every((n) => this.selectedFeatureIds.has(n)) || (this.selectedFeatureIds.clear(), i.forEach((n) => this.selectedFeatureIds.add(n)), this.lastClickedFeatureId = i.length > 0 ? i[i.length - 1] : null, this.sincronizarSelecaoDOM(), t && this.notificarMudancaSelecao());
1719
1921
  }
1720
- limparSelecao(e = !1) {
1721
- this.selectedFeatureIds.size !== 0 && (this.selectedFeatureIds.clear(), this.lastClickedFeatureId = null, this.sincronizarSelecaoDOM(), e && this.notificarMudancaSelecao());
1922
+ limparSelecao(a = !1) {
1923
+ this.selectedFeatureIds.size !== 0 && (this.selectedFeatureIds.clear(), this.lastClickedFeatureId = null, this.sincronizarSelecaoDOM(), a && this.notificarMudancaSelecao());
1722
1924
  }
1723
1925
  expandirTodas() {
1724
- this.expandedLayers = new Set(this.camadas.map((e) => e.id)), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1926
+ this.expandedLayers = new Set(this.camadas.map((a) => a.id)), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1725
1927
  }
1726
1928
  colapsarTodas() {
1727
1929
  this.expandedLayers.clear(), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1728
1930
  }
1729
- alternarVisibilidadeTodas(e = !1) {
1730
- const r = !this.camadas.some((o) => o.visible !== !1);
1731
- this.camadas.forEach((o) => {
1732
- o.visible = r, e && this.dispararEvento("ui-camada-visibilidade", { camadaId: o.id, visivel: r });
1931
+ alternarVisibilidadeTodas(a = !1) {
1932
+ const i = !this.camadas.some((r) => r.visible !== !1);
1933
+ this.camadas.forEach((r) => {
1934
+ r.visible = i, a && this.dispararEvento("ui-camada-visibilidade", { camadaId: r.id, visivel: i });
1733
1935
  }), this.salvarLembrancaEstado(), this.solicitarRenderizacao();
1734
1936
  }
1735
- colapsar(e = !1) {
1736
- this.definirColapso(!0, e);
1937
+ colapsar(a = !1) {
1938
+ this.definirColapso(!0, a);
1737
1939
  }
1738
- expandir(e = !1) {
1739
- this.definirColapso(!1, e);
1940
+ expandir(a = !1) {
1941
+ this.definirColapso(!1, a);
1740
1942
  }
1741
- alternarColapso(e = !1) {
1742
- this.definirColapso(!this.colapsado, e);
1943
+ alternarColapso(a = !1) {
1944
+ this.definirColapso(!this.colapsado, a);
1743
1945
  }
1744
- definirColapso(e, t) {
1745
- this.colapsado !== e && (this.colapsado = e, t && this.dispararEvento("ui-colapso-alterado", { colapsado: e }));
1946
+ definirColapso(a, t) {
1947
+ this.colapsado !== a && (this.colapsado = a, t && this.dispararEvento("ui-colapso-alterado", { colapsado: a }));
1746
1948
  }
1747
1949
  // --- Renderização e Ciclo de Vida ---
1748
1950
  solicitarRenderizacao() {
1951
+ if (this.profundidadeLote > 0) {
1952
+ this.renderPendente = !0;
1953
+ return;
1954
+ }
1749
1955
  this.render();
1750
1956
  }
1751
- dispararEvento(e, t) {
1957
+ /**
1958
+ * Agrupa várias mutações (`adicionarFeicao` em laço, por exemplo) em uma só renderização, ao fim de `fn`.
1959
+ * Sem isto, cada chamada redesenha a árvore inteira.
1960
+ */
1961
+ emLote(a) {
1962
+ this.profundidadeLote++;
1963
+ try {
1964
+ a();
1965
+ } finally {
1966
+ this.profundidadeLote--, this.profundidadeLote === 0 && this.renderPendente && (this.renderPendente = !1, this.render());
1967
+ }
1968
+ }
1969
+ dispararEvento(a, t) {
1752
1970
  this.dispatchEvent(
1753
- new CustomEvent(e, {
1971
+ new CustomEvent(a, {
1754
1972
  detail: t,
1755
1973
  bubbles: !0,
1756
1974
  composed: !0
@@ -1758,9 +1976,9 @@ class Q extends be {
1758
1976
  );
1759
1977
  }
1760
1978
  render() {
1761
- var u;
1979
+ var d, m;
1762
1980
  if (!this.corpoElement) return;
1763
- const e = Me({
1981
+ const a = He({
1764
1982
  camadas: this.camadas,
1765
1983
  feicoes: this.feicoes,
1766
1984
  camadaAtivaId: this.camadaAtivaId,
@@ -1771,22 +1989,22 @@ class Q extends be {
1771
1989
  editingFeatureId: this.editingFeatureId,
1772
1990
  searchQuery: this.searchQuery,
1773
1991
  mostrarBotaoColapsar: this.flutuante && this.getAttribute("colapsavel") !== "false"
1774
- }), t = this.mostrarMapasBase ? ke(this.mapasBase, this.mapaBaseAtivo) : "", r = this.mostrarRodape ? Ie(this.camadas, this.feicoes, this.selectedFeatureIds) : "", o = this.shadow.getElementById("ui-layer-tree-mount"), s = this.corpoElement.scrollTop, c = o ? o.scrollTop : 0, n = this.shadow.activeElement, l = n && this.corpoElement.contains(n) ? n.id : "", d = n && "selectionStart" in n ? n.selectionStart : null;
1992
+ }), t = this.mostrarMapasBase ? qe(this.mapasBase, this.mapaBaseAtivo) : "", i = this.mostrarRodape ? Te(this.camadas, this.feicoes, this.selectedFeatureIds) : "", r = this.shadow.getElementById("ui-layer-tree-mount"), s = this.corpoElement.scrollTop, n = r ? r.scrollTop : 0, l = this.shadow.activeElement, c = l && this.corpoElement.contains(l) ? l.id : "", f = l && !c && this.corpoElement.contains(l) ? Array.from(l.attributes).find((h) => h.name.startsWith("data-") && h.value !== "") : void 0, u = l && "selectionStart" in l ? l.selectionStart : null;
1775
1993
  this.corpoElement.innerHTML = `
1776
- ${e}
1777
- ${r}
1994
+ ${a}
1995
+ ${i}
1778
1996
  ${t}
1779
1997
  `, this.corpoElement.scrollTop = s;
1780
1998
  const p = this.shadow.getElementById("ui-layer-tree-mount");
1781
- if (p && (p.scrollTop = c), l) {
1782
- const f = this.shadow.getElementById(l);
1783
- if (f && (f.focus({ preventScroll: !0 }), d !== null && typeof f.setSelectionRange == "function"))
1999
+ if (p && (p.scrollTop = n), c) {
2000
+ const h = this.shadow.getElementById(c);
2001
+ if (h && (h.focus({ preventScroll: !0 }), u !== null && typeof h.setSelectionRange == "function"))
1784
2002
  try {
1785
- f.setSelectionRange(d, d);
2003
+ h.setSelectionRange(u, u);
1786
2004
  } catch {
1787
2005
  }
1788
2006
  }
1789
- (u = this.shadow.querySelector("[data-layer-row], [data-feat-row]")) == null || u.setAttribute("tabindex", "0"), Ke(this, this.shadow), this.dragDropManager.bindAll();
2007
+ !c && f && ((d = M(this.corpoElement, f.name, f.value)) == null || d.focus({ preventScroll: !0 })), (m = this.shadow.querySelector("[data-layer-row], [data-feat-row]")) == null || m.setAttribute("tabindex", "0"), sa(this, this.shadow), this.dragDropManager.bindAll();
1790
2008
  }
1791
2009
  // --- Conexão de Eventos ---
1792
2010
  conectarEventosGerais() {
@@ -1794,64 +2012,127 @@ class Q extends be {
1794
2012
  }
1795
2013
  // --- Sincronização de DOM (delegada) ---
1796
2014
  sincronizarCamadaAtivaDOM() {
1797
- aa(this, this.shadow);
2015
+ ma(this, this.shadow);
1798
2016
  }
1799
2017
  sincronizarSelecaoDOM() {
1800
- ta(this, this.shadow);
2018
+ ha(this, this.shadow);
1801
2019
  }
1802
2020
  // --- Auxiliares Internos ---
1803
2021
  sincronizarSelecoesComFeicoesValidas() {
1804
- $e(this.selectedFeatureIds, this.feicoes);
2022
+ je(this.selectedFeatureIds, this.feicoes);
1805
2023
  }
1806
2024
  notificarMudancaSelecao() {
1807
- const e = this.feicoes.filter((t) => this.selectedFeatureIds.has(t.id));
2025
+ const a = this.feicoes.filter((t) => this.selectedFeatureIds.has(t.id));
1808
2026
  this.dispararEvento("ui-feicoes-selecionadas", {
1809
2027
  feicoesIds: Array.from(this.selectedFeatureIds),
1810
- feicoes: e
1811
- }), e.length === 1 ? this.dispararEvento("ui-feicao-selecionada", {
1812
- feicaoId: e[0].id,
1813
- feicao: e[0]
1814
- }) : e.length === 0 && this.dispararEvento("ui-feicao-selecionada", {
2028
+ feicoes: a
2029
+ }), a.length === 1 ? this.dispararEvento("ui-feicao-selecionada", {
2030
+ feicaoId: a[0].id,
2031
+ feicao: a[0]
2032
+ }) : a.length === 0 && this.dispararEvento("ui-feicao-selecionada", {
1815
2033
  feicaoId: null,
1816
2034
  feicao: null
1817
2035
  });
1818
2036
  }
2037
+ };
2038
+ /** Painéis conectados sem `id` nem `storage-key`: dividem a mesma chave de persistência. */
2039
+ y(q, "instanciasChavePadrao", /* @__PURE__ */ new Set());
2040
+ let O = q;
2041
+ class va extends O {
2042
+ }
2043
+ class ba extends O {
1819
2044
  }
1820
- class ia extends Q {
2045
+ ee("ui-camadas", O);
2046
+ ee("ui-painel-camadas", va);
2047
+ ee("ui-layer-panel", ba);
2048
+ function Aa(e) {
2049
+ var o;
2050
+ return {
2051
+ id: e.id,
2052
+ name: e.nome || e.id,
2053
+ color: ((o = e.estilo) == null ? void 0 : o.corPrimaria) || "#00E08A",
2054
+ visible: e.visivel !== !1,
2055
+ locked: e.bloqueada === !0,
2056
+ opacity: typeof e.opacidade == "number" ? e.opacidade : 1,
2057
+ order: e.zIndex,
2058
+ description: e.categoria ? `Categoria: ${e.categoria}` : void 0,
2059
+ categoria: e.categoria,
2060
+ tipo: e.tipo,
2061
+ estilo: e.estilo,
2062
+ dados: e.dados
2063
+ };
1821
2064
  }
1822
- class oa extends Q {
2065
+ function ka(e, o = "levantamento", a = "feicoes") {
2066
+ return {
2067
+ id: e.id,
2068
+ nome: e.name,
2069
+ categoria: e.categoria || o,
2070
+ tipo: e.tipo || a,
2071
+ visivel: e.visible !== !1,
2072
+ opacidade: typeof e.opacity == "number" ? e.opacity : 1,
2073
+ zIndex: typeof e.order == "number" ? e.order : 500,
2074
+ bloqueada: e.locked === !0,
2075
+ interativo: !0,
2076
+ estilo: {
2077
+ corPrimaria: e.color || "#00E08A",
2078
+ scaleMode: "screen",
2079
+ ...typeof e.estilo == "object" && e.estilo !== null ? e.estilo : {}
2080
+ },
2081
+ dados: typeof e.dados == "object" && e.dados !== null ? e.dados : void 0
2082
+ };
2083
+ }
2084
+ function Ia(e, o = "") {
2085
+ var r, s, n, l;
2086
+ const a = ((r = e.geometria) == null ? void 0 : r.tipo) || ((s = e.geometria) == null ? void 0 : s.type) || e.tipo || e.type || "Polygon", t = ((n = e.geometria) == null ? void 0 : n.coordenadas) || ((l = e.geometria) == null ? void 0 : l.coordinates) || e.coordinates, i = e.cor || e.color;
2087
+ return {
2088
+ id: String(e.id),
2089
+ name: e.nome || e.name || `Feição ${e.id}`,
2090
+ layerId: e.layerId || e.camadaId || o,
2091
+ type: a,
2092
+ geometryType: a,
2093
+ coordinates: t,
2094
+ color: i,
2095
+ visible: e.visivel !== void 0 ? e.visivel : e.visible !== !1,
2096
+ locked: e.bloqueada !== void 0 ? e.bloqueada : e.locked === !0,
2097
+ status: e.status || "oficial",
2098
+ category: e.categoria || e.category,
2099
+ properties: e.propriedades || e.properties || {}
2100
+ };
1823
2101
  }
1824
- G("ui-camadas", Q);
1825
- G("ui-painel-camadas", ia);
1826
- G("ui-layer-panel", oa);
1827
2102
  export {
1828
- ze as CamadasDragDropManager,
1829
- m as ICONES,
1830
- ne as LIMITE_FEICOES_POR_CAMADA,
1831
- se as MAPAS_BASE_PADRAO,
1832
- Q as UICamadas,
1833
- oa as UILayerPanel,
1834
- pa as UIMapaBase,
1835
- ia as UIPainelCamadas,
1836
- fa as UISeletorMapaBase,
1837
- re as calcularAreaPoligono,
1838
- te as calcularComprimentoLinha,
1839
- ye as calcularDistanciaPontos,
1840
- Ce as calcularSelecaoFeicao,
1841
- U as carregarEstadoPersistido,
1842
- k as escapeHtml,
1843
- K as filtrarFeicoesPorBusca,
1844
- ie as formatarMetricaFeicoes,
1845
- Be as gerarChaveStorage,
1846
- Te as limparEstadoPersistido,
1847
- Oe as montarEstadoPersistido,
1848
- Le as obterIdsVisiveisFeicoes,
1849
- De as reidratarCamadasComOverrides,
1850
- $e as removerSelecoesInvalidas,
1851
- Me as renderizarArvoreCamadas,
1852
- ke as renderizarGridMapasBase,
1853
- Ie as renderizarRodapeAcoes,
1854
- Se as renderizarThumbGeometria,
1855
- qe as salvarEstadoPersistido,
1856
- _ as snapshotCamada
2103
+ Ve as CamadasDragDropManager,
2104
+ g as ICONES,
2105
+ he as LIMITE_FEICOES_POR_CAMADA,
2106
+ me as MAPAS_BASE_PADRAO,
2107
+ O as UICamadas,
2108
+ ba as UILayerPanel,
2109
+ $a as UIMapaBase,
2110
+ va as UIPainelCamadas,
2111
+ Sa as UISeletorMapaBase,
2112
+ Q as calcularAreaAnelSimples,
2113
+ ue as calcularAreaPoligono,
2114
+ de as calcularComprimentoLinha,
2115
+ ze as calcularDistanciaPontos,
2116
+ Oe as calcularSelecaoFeicao,
2117
+ W as carregarEstadoPersistido,
2118
+ Ne as construirHierarquiaCamadas,
2119
+ ka as converterCamadaItemParaCanvasLayer,
2120
+ Aa as converterCanvasLayerParaCamadaItem,
2121
+ Ia as converterFeicaoParaItem,
2122
+ L as escapeHtml,
2123
+ ae as filtrarFeicoesPorBusca,
2124
+ pe as formatarMetricaFeicoes,
2125
+ De as formatarOpcoesCamadasHierarquicas,
2126
+ _e as gerarChaveStorage,
2127
+ Ye as limparEstadoPersistido,
2128
+ Je as montarEstadoPersistido,
2129
+ Pe as obterIdsVisiveisFeicoes,
2130
+ Qe as reidratarCamadasComOverrides,
2131
+ je as removerSelecoesInvalidas,
2132
+ He as renderizarArvoreCamadas,
2133
+ qe as renderizarGridMapasBase,
2134
+ Te as renderizarRodapeAcoes,
2135
+ Re as renderizarThumbGeometria,
2136
+ Ke as salvarEstadoPersistido,
2137
+ Z as snapshotCamada
1857
2138
  };