@opengis/gis 0.2.166 → 0.2.168

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.
@@ -0,0 +1,1586 @@
1
+ import { openBlock as x, createElementBlock as R, createElementVNode as u, defineComponent as O, computed as B, createTextVNode as Ve, createVNode as M, mergeModels as pt, defineAsyncComponent as Le, useModel as yt, ref as b, withCtx as j, toDisplayString as Z, unref as U, watch as q, onUnmounted as gt, createCommentVNode as A, onBeforeUnmount as oe, normalizeClass as se, withModifiers as Ee, renderSlot as Ye, onMounted as ae, createBlock as P, normalizeStyle as ye, Transition as ht, Fragment as ge, renderList as Xe, withDirectives as De, vModelText as bt, vModelCheckbox as xt, resolveDynamicComponent as _t } from "vue";
2
+ import { useRouter as wt, useRoute as kt } from "vue-router";
3
+ import { notify as D } from "@opengis/core";
4
+ import { ZoomIn as Ct, ZoomOut as $t, Compass as Mt, Minimize2 as St, Maximize2 as Lt, Link2 as Et, Ruler as Vt, Eye as zt, EyeOff as Bt } from "lucide-vue-next";
5
+ import { _ as He, f as K, o as Rt, p as Pt, q as Tt, M as Nt, i as Ot, j as Ue, r as jt, t as Ft, m as At } from "./index-C3bl1qBS.js";
6
+ import { S as Zt, C as Dt } from "./CardIcon-DzERD2T8.js";
7
+ import { _ as Ut, a as qt, b as Qt, c as Yt } from "./HeaderActions.vue_vue_type_script_setup_true_lang-D1iwSeRN.js";
8
+ import { _ as Je } from "./MonacoEditor.vue_vue_type_script_setup_true_lang-D3ZPeXMw.js";
9
+ import { V as Xt } from "./vs-datatable-Cd2Gp4jo.js";
10
+ import { _ as qe } from "./ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-B-6axJUY.js";
11
+ const Ht = {}, Jt = {
12
+ xmlns: "http://www.w3.org/2000/svg",
13
+ width: "24",
14
+ height: "24",
15
+ viewBox: "0 0 24 24",
16
+ fill: "none",
17
+ stroke: "currentColor",
18
+ "stroke-width": "2",
19
+ "stroke-linecap": "round",
20
+ "stroke-linejoin": "round",
21
+ class: "lucide lucide-table"
22
+ };
23
+ function Kt(k, r) {
24
+ return x(), R("svg", Jt, [...r[0] || (r[0] = [
25
+ u("path", { d: "M12 3v18" }, null, -1),
26
+ u("rect", {
27
+ width: "18",
28
+ height: "18",
29
+ x: "3",
30
+ y: "3",
31
+ rx: "2"
32
+ }, null, -1),
33
+ u("path", { d: "M3 9h18" }, null, -1),
34
+ u("path", { d: "M3 15h18" }, null, -1)
35
+ ])]);
36
+ }
37
+ const Gt = /* @__PURE__ */ He(Ht, [["render", Kt]]), Wt = { class: "flex flex-col h-full" }, It = { class: "flex justify-end mb-3 gap-2" }, eo = /* @__PURE__ */ O({
38
+ __name: "cartocss-css-tab",
39
+ props: {
40
+ modelValue: {}
41
+ },
42
+ emits: ["update:modelValue", "save"],
43
+ setup(k, { emit: r }) {
44
+ const l = k, _ = r, h = B({
45
+ get: () => l.modelValue,
46
+ set: (i) => _("update:modelValue", i)
47
+ });
48
+ return (i, g) => (x(), R("div", Wt, [
49
+ u("div", It, [
50
+ u("button", {
51
+ type: "button",
52
+ class: "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",
53
+ onClick: g[0] || (g[0] = (d) => i.$emit("save"))
54
+ }, [...g[2] || (g[2] = [
55
+ u("svg", {
56
+ xmlns: "http://www.w3.org/2000/svg",
57
+ width: "24",
58
+ height: "24",
59
+ viewBox: "0 0 24 24",
60
+ fill: "none",
61
+ stroke: "currentColor",
62
+ "stroke-width": "2",
63
+ "stroke-linecap": "round",
64
+ "stroke-linejoin": "round",
65
+ class: "h-3.5 w-3.5"
66
+ }, [
67
+ u("path", { d: "M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a 2 2 0 0 1-2-2V5a 2 2 0 0 1 2-2z" }),
68
+ u("path", { d: "M17 21v-7a1 1 0 0 0-1-1H8a 1 1 0 0 0-1 1v7" }),
69
+ u("path", { d: "M7 3v4a1 1 0 0 0 1 1h7" })
70
+ ], -1),
71
+ Ve(" Зберегти ", -1)
72
+ ])])
73
+ ]),
74
+ M(Je, {
75
+ modelValue: h.value,
76
+ "onUpdate:modelValue": g[1] || (g[1] = (d) => h.value = d),
77
+ language: "cartocss",
78
+ class: "flex-1 rounded-lg overflow-hidden"
79
+ }, null, 8, ["modelValue"])
80
+ ]));
81
+ }
82
+ }), to = { class: "flex flex-col flex-1 min-h-0" }, oo = { class: "flex justify-between mb-3 gap-2" }, ao = { class: "text-left" }, lo = { class: "font-medium text-gray-900" }, no = { class: "text-xs text-gray-500" }, so = { class: "flex justify-center gap-2" }, ro = ["checked", "onChange"], uo = { class: "text-sm font-medium text-gray-900" }, io = /* @__PURE__ */ O({
83
+ __name: "cartocss-data-tab",
84
+ props: {
85
+ modelValue: { default: [] },
86
+ modelModifiers: {}
87
+ },
88
+ emits: /* @__PURE__ */ pt(["save"], ["update:modelValue"]),
89
+ setup(k, { emit: r }) {
90
+ const l = [
91
+ { key: "table", label: "Таблиця", slot: "datasetCell" },
92
+ {
93
+ key: "active",
94
+ label: "Активний",
95
+ slot: "activeCell",
96
+ width: "140px"
97
+ },
98
+ {
99
+ key: "zoom",
100
+ label: "Min Зум",
101
+ slot: "zoomCell",
102
+ width: "140px"
103
+ }
104
+ ], _ = Le(
105
+ () => import("@opengis/core").then((C) => C.VsModal)
106
+ ), h = Le(() => import("@opengis/form")), i = yt(k, "modelValue"), g = r, d = b(!1), w = b({
107
+ table: "",
108
+ query: "",
109
+ srid: "",
110
+ key: "",
111
+ columns: "",
112
+ gcol: "",
113
+ minzoom: "",
114
+ maxzoom: "",
115
+ proj4text: "",
116
+ active: !0
117
+ }), a = {
118
+ table: { type: "text", label: "Таблиця", validators: ["required"] },
119
+ key: { type: "text", label: "Ключ", validators: ["required"] },
120
+ query: { type: "text", label: "Query" },
121
+ columns: { type: "text", label: "Колонки" },
122
+ gcol: { type: "text", label: "Колонка geometry" },
123
+ srid: { type: "number", label: "SRID" },
124
+ proj4text: { type: "text", label: "PROJ4" },
125
+ active: { type: "switcher", label: "Активна" },
126
+ minzoom: { type: "number", label: "Min Зум", col: 6 },
127
+ maxzoom: { type: "number", label: "Max Зум", col: 6 }
128
+ };
129
+ function n() {
130
+ w.value = {
131
+ table: "",
132
+ query: "",
133
+ srid: "",
134
+ key: "",
135
+ columns: "",
136
+ gcol: "",
137
+ minzoom: "",
138
+ maxzoom: "",
139
+ proj4text: "",
140
+ active: !0
141
+ }, d.value = !0;
142
+ }
143
+ function c() {
144
+ d.value = !1;
145
+ }
146
+ function L() {
147
+ var f, s;
148
+ const C = (f = w.value.table) == null ? void 0 : f.trim(), $ = (s = w.value.key) == null ? void 0 : s.trim();
149
+ if (!C || !$) {
150
+ D({
151
+ type: "warning",
152
+ title: "Перевірка",
153
+ message: "Вкажіть таблицю та підпис"
154
+ });
155
+ return;
156
+ }
157
+ i.value = [
158
+ ...Array.isArray(i.value) ? i.value : [],
159
+ { ...w.value, table: C, key: $ }
160
+ ], d.value = !1;
161
+ }
162
+ function y(C, $) {
163
+ var s;
164
+ const f = ((s = $ == null ? void 0 : $.target) == null ? void 0 : s.checked) ?? !1;
165
+ C.active = f, i.value = Array.isArray(i.value) ? [...i.value] : [];
166
+ }
167
+ return (C, $) => (x(), R("div", to, [
168
+ u("div", oo, [
169
+ u("button", {
170
+ type: "button",
171
+ class: "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium bg-gradient-to-r from-gray-500 to-gray-400 text-white h-9 px-4 py-2 hover:from-gray-600 hover:to-gray-500",
172
+ onClick: n
173
+ }, " Додати таблицю "),
174
+ u("button", {
175
+ type: "button",
176
+ class: "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",
177
+ onClick: $[0] || ($[0] = (f) => g("save"))
178
+ }, " Зберегти ")
179
+ ]),
180
+ M(Xt, {
181
+ modelValue: i.value,
182
+ "onUpdate:modelValue": $[1] || ($[1] = (f) => i.value = f),
183
+ "columns-scheme": l,
184
+ "form-scheme": a,
185
+ "add-button": !1,
186
+ "main-col-width": "260px"
187
+ }, {
188
+ datasetCell: j(({ row: f }) => [
189
+ u("div", ao, [
190
+ u("div", lo, Z(f.table), 1),
191
+ u("div", no, Z(f.key), 1)
192
+ ])
193
+ ]),
194
+ activeCell: j(({ row: f }) => [
195
+ u("label", so, [
196
+ u("input", {
197
+ type: "checkbox",
198
+ class: "h-4 w-4 text-sky-500 border-gray-300 rounded focus:ring-sky-300",
199
+ checked: f.active,
200
+ onChange: (s) => y(f, s)
201
+ }, null, 40, ro)
202
+ ])
203
+ ]),
204
+ zoomCell: j(({ row: f }) => [
205
+ u("div", uo, Z(f.zoom), 1)
206
+ ]),
207
+ _: 1
208
+ }, 8, ["modelValue"]),
209
+ M(U(_), {
210
+ teleport: "#modal",
211
+ visible: d.value,
212
+ "onUpdate:visible": $[3] || ($[3] = (f) => d.value = f),
213
+ title: "Нова таблиця CartoCSS"
214
+ }, {
215
+ footer: j(() => [
216
+ u("div", { class: "flex justify-end gap-2 p-4 border-т" }, [
217
+ u("button", {
218
+ type: "button",
219
+ class: "px-4 py-2 rounded bg-gray-100 text-gray-700",
220
+ onClick: c
221
+ }, " Скасувати "),
222
+ u("button", {
223
+ type: "button",
224
+ class: "px-4 py-2 rounded bg-blue-600 text-white",
225
+ onClick: L
226
+ }, " Додати ")
227
+ ])
228
+ ]),
229
+ default: j(() => [
230
+ M(U(h), {
231
+ values: w.value,
232
+ "onUpdate:values": $[2] || ($[2] = (f) => w.value = f),
233
+ schema: a
234
+ }, null, 8, ["values"])
235
+ ]),
236
+ _: 1
237
+ }, 8, ["visible"])
238
+ ]));
239
+ }
240
+ }), co = { class: "flex flex-col flex-1 min-h-0 gap-4" }, fo = { class: "h-[calc(100vh-230px)] rounded-md border border-gray-200 bg-white" }, mo = /* @__PURE__ */ O({
241
+ __name: "cartocss-card-tab",
242
+ props: {
243
+ card: {},
244
+ table: {}
245
+ },
246
+ emits: ["save"],
247
+ setup(k, { emit: r }) {
248
+ const l = k, _ = r, h = b(l.table), i = b(l.card), g = Le(() => import("@opengis/form").then((w) => w.VsInputText));
249
+ function d() {
250
+ _("save", {
251
+ card_html: i.value,
252
+ card_table: h.value
253
+ });
254
+ }
255
+ return (w, a) => (x(), R("div", co, [
256
+ u("div", { class: "flex items-center justify-end gap-3" }, [
257
+ u("button", {
258
+ type: "button",
259
+ class: "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",
260
+ onClick: d
261
+ }, [...a[2] || (a[2] = [
262
+ u("svg", {
263
+ xmlns: "http://www.w3.org/2000/svg",
264
+ width: "24",
265
+ height: "24",
266
+ viewBox: "0 0 24 24",
267
+ fill: "none",
268
+ stroke: "currentColor",
269
+ "stroke-width": "2",
270
+ "stroke-linecap": "round",
271
+ "stroke-linejoin": "round",
272
+ class: "h-3.5 w-3.5"
273
+ }, [
274
+ u("path", { d: "M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a 2 2 0 0 1-2-2V5a 2 2 0 0 1 2-2z" }),
275
+ u("path", { d: "M17 21v-7a1 1 0 0 0-1-1H8a 1 1 0 0 0-1 1v7" }),
276
+ u("path", { d: "M7 3v4a1 1 0 0 0 1 1h7" })
277
+ ], -1),
278
+ Ve(" Зберегти картку ", -1)
279
+ ])])
280
+ ]),
281
+ u("div", null, [
282
+ M(U(g), {
283
+ modelValue: h.value,
284
+ "onUpdate:modelValue": a[0] || (a[0] = (n) => h.value = n)
285
+ }, null, 8, ["modelValue"])
286
+ ]),
287
+ u("div", fo, [
288
+ M(Je, {
289
+ modelValue: i.value,
290
+ "onUpdate:modelValue": a[1] || (a[1] = (n) => i.value = n),
291
+ language: "html",
292
+ theme: "vs-light",
293
+ class: "h-full w-full rounded-md"
294
+ }, null, 8, ["modelValue"])
295
+ ])
296
+ ]));
297
+ }
298
+ }), vo = /* @__PURE__ */ O({
299
+ __name: "CartocssLayerLoader",
300
+ props: {
301
+ layerId: { type: String, required: !0 },
302
+ tileUrl: { type: String, default: "" },
303
+ title: { type: String, default: "" },
304
+ active: { type: Boolean, default: !1 },
305
+ owner: { type: String, default: "" },
306
+ opacity: { type: Number, default: 1 }
307
+ },
308
+ setup(k) {
309
+ const r = k, l = K(), {
310
+ activateTemporaryLayer: _,
311
+ deactivateTemporaryLayer: h,
312
+ setTemporaryLayerOpacity: i
313
+ } = Rt(l.map), g = B(() => {
314
+ var c;
315
+ const n = `${(c = r == null ? void 0 : r.tileUrl) == null ? void 0 : c.trim()}`;
316
+ return n ? typeof window > "u" || typeof location > "u" || /^https?:\/\//i.test(n) ? n : n.startsWith("//") ? `${window.location.protocol}${n}` : n.startsWith("/") ? `${location.origin}${n}` : `${location.origin}/${n}` : "";
317
+ });
318
+ let d = "", w = "";
319
+ function a() {
320
+ const n = r.active && !!g.value;
321
+ d && (!n || d !== r.layerId) && (h(d, w || void 0), d = "", w = ""), n && (_(
322
+ {
323
+ id: r.layerId,
324
+ title: r.title || r.layerId,
325
+ url: g.value,
326
+ opacity: r.opacity
327
+ },
328
+ {},
329
+ r.owner
330
+ ), d = r.layerId, w = r.owner || "");
331
+ }
332
+ return q(
333
+ () => [r.layerId, g.value, r.active, r.owner],
334
+ a,
335
+ { immediate: !0 }
336
+ ), q(
337
+ () => r.opacity,
338
+ (n) => {
339
+ !d || !r.active || i(d, n, w || void 0);
340
+ },
341
+ { immediate: !0 }
342
+ ), gt(() => {
343
+ d && (h(d, w || void 0), d = "", w = "");
344
+ }), (n, c) => A("", !0);
345
+ }
346
+ }), po = /* @__PURE__ */ O({
347
+ __name: "CartocssMapClickListener",
348
+ props: {
349
+ cartocssId: {},
350
+ infoEnabled: { type: [Boolean, null] },
351
+ active: { type: [Boolean, null] }
352
+ },
353
+ setup(k) {
354
+ const r = k, l = B(() => r.cartocssId ?? null), _ = B(
355
+ () => !!r.infoEnabled && r.active !== !1
356
+ ), { map: h, ready: i } = K(), g = (y) => {
357
+ !y || typeof window > "u" || window.dispatchEvent(
358
+ new CustomEvent(Tt, { detail: y })
359
+ );
360
+ }, d = async (y) => {
361
+ const C = await fetch(`/api/map-format?${y.toString()}`);
362
+ if (!C.ok)
363
+ throw new Error(`API returned ${C.status}`);
364
+ return C.json();
365
+ };
366
+ let w = null, a = null;
367
+ const n = (y) => {
368
+ if (!y) return null;
369
+ if (typeof y == "string")
370
+ try {
371
+ return JSON.parse(y);
372
+ } catch {
373
+ return null;
374
+ }
375
+ return y;
376
+ }, c = async (y, C) => {
377
+ var s;
378
+ const $ = l.value ? `external:${l.value},${String(y)}` : null, f = new URLSearchParams({
379
+ layer: l.value ?? "",
380
+ id: String(y)
381
+ });
382
+ try {
383
+ const m = await d(f), T = typeof m.html == "string" ? m.html : null, z = n(
384
+ ((s = m == null ? void 0 : m.data) == null ? void 0 : s.geom) ?? (m == null ? void 0 : m.geom) ?? null
385
+ );
386
+ (T || z) && g({
387
+ html: T,
388
+ geometry: z ?? C,
389
+ infoToken: $
390
+ });
391
+ } catch (m) {
392
+ console.warn("CartoCSS map-format (id) error", m);
393
+ }
394
+ }, L = async (y) => {
395
+ var s, m, T, z;
396
+ if (!l.value || r.active === !1) return;
397
+ if (!_.value) {
398
+ D({
399
+ type: "error",
400
+ title: "CartoCSS",
401
+ message: "Картка не налаштована"
402
+ });
403
+ return;
404
+ }
405
+ const C = (s = y == null ? void 0 : y.lngLat) == null ? void 0 : s.lng, $ = (m = y == null ? void 0 : y.lngLat) == null ? void 0 : m.lat;
406
+ if (typeof C != "number" || typeof $ != "number") return;
407
+ const f = new URLSearchParams({
408
+ layer: l.value,
409
+ lat: $.toFixed(6),
410
+ lng: C.toFixed(6)
411
+ });
412
+ try {
413
+ const S = await d(f), G = n(
414
+ ((T = S == null ? void 0 : S.data) == null ? void 0 : T.geom) ?? (S == null ? void 0 : S.geom) ?? null
415
+ ), Y = ((z = S == null ? void 0 : S.data) == null ? void 0 : z.id) ?? (S == null ? void 0 : S.id);
416
+ if (Y != null) {
417
+ await c(Y, G);
418
+ return;
419
+ }
420
+ Pt({ html: S == null ? void 0 : S.html }) && g({
421
+ html: S == null ? void 0 : S.html,
422
+ geometry: G,
423
+ infoToken: null
424
+ });
425
+ } catch (S) {
426
+ console.warn("CartoCSS map-format error", S);
427
+ }
428
+ };
429
+ return i().then(() => {
430
+ a = h.value, a && (a.on("click", L), w = () => a == null ? void 0 : a.off("click", L));
431
+ }), oe(() => {
432
+ w == null || w(), w = null, a = null;
433
+ }), () => {
434
+ };
435
+ }
436
+ }), yo = ["title", "aria-label", "disabled"], go = {
437
+ key: 0,
438
+ class: "absolute right-full mr-3 px-1.5 py-0.5 bg-gray-700 text-white text-[0.75rem] font-medium rounded-md opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100 pointer-events-none transition-opacity duration-200 whitespace-nowrap",
439
+ "aria-hidden": "true"
440
+ }, ee = /* @__PURE__ */ O({
441
+ __name: "MapIconButton",
442
+ props: {
443
+ title: {},
444
+ ariaLabel: { default: "" },
445
+ tooltip: { default: "" },
446
+ active: { type: Boolean, default: !1 },
447
+ disabled: { type: Boolean, default: !1 }
448
+ },
449
+ emits: ["click"],
450
+ setup(k) {
451
+ const r = k, l = B(() => [
452
+ "group relative flex items-center justify-center w-9 h-9 rounded-xl shadow-lg transition-transform transition-shadow duration-200 hover:scale-105 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400/60 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100",
453
+ r.active ? "bg-blue-50 text-blue-700 ring-1 ring-blue-300" : "bg-white text-gray-700 hover:bg-gray-50"
454
+ ].join(" "));
455
+ return (_, h) => (x(), R("button", {
456
+ type: "button",
457
+ class: se(l.value),
458
+ title: k.title,
459
+ "aria-label": k.ariaLabel || k.title,
460
+ disabled: k.disabled,
461
+ onClick: h[0] || (h[0] = Ee((i) => _.$emit("click", i), ["stop"]))
462
+ }, [
463
+ k.tooltip ? (x(), R("span", go, Z(k.tooltip), 1)) : A("", !0),
464
+ Ye(_.$slots, "default")
465
+ ], 10, yo));
466
+ }
467
+ }), ho = /* @__PURE__ */ O({
468
+ __name: "MapZoomInButton",
469
+ setup(k) {
470
+ const { map: r, ready: l } = K(), _ = b(!1);
471
+ ae(async () => {
472
+ await (l == null ? void 0 : l()), _.value = !!r.value;
473
+ });
474
+ function h() {
475
+ const i = r.value;
476
+ i != null && i.zoomIn && i.zoomIn();
477
+ }
478
+ return (i, g) => (x(), P(ee, {
479
+ title: "Збільшити",
480
+ tooltip: "Плюс зум",
481
+ disabled: !_.value,
482
+ onClick: h
483
+ }, {
484
+ default: j(() => [
485
+ M(U(Ct), { class: "w-4 h-4" })
486
+ ]),
487
+ _: 1
488
+ }, 8, ["disabled"]));
489
+ }
490
+ }), bo = /* @__PURE__ */ O({
491
+ __name: "MapZoomOutButton",
492
+ setup(k) {
493
+ const { map: r, ready: l } = K(), _ = b(!1);
494
+ ae(async () => {
495
+ await (l == null ? void 0 : l()), _.value = !!r.value;
496
+ });
497
+ function h() {
498
+ const i = r.value;
499
+ i != null && i.zoomOut && i.zoomOut();
500
+ }
501
+ return (i, g) => (x(), P(ee, {
502
+ title: "Зменшити",
503
+ tooltip: "Мінус зум",
504
+ disabled: !_.value,
505
+ onClick: h
506
+ }, {
507
+ default: j(() => [
508
+ M(U($t), { class: "w-4 h-4" })
509
+ ]),
510
+ _: 1
511
+ }, 8, ["disabled"]));
512
+ }
513
+ }), xo = /* @__PURE__ */ O({
514
+ __name: "MapCompassButton",
515
+ setup(k) {
516
+ const { map: r, ready: l } = K(), _ = b(!1), h = b(0), i = b(0), g = B(() => ({
517
+ transform: `scale(${(1 + i.value / 70).toFixed(5)}) rotateZ(0deg) rotateX(${i.value}deg) rotateZ(${h.value}deg)`
518
+ }));
519
+ function d() {
520
+ var n, c;
521
+ const a = r.value;
522
+ a && (h.value = Number(((n = a.getBearing) == null ? void 0 : n.call(a)) ?? 0), i.value = Number(((c = a.getPitch) == null ? void 0 : c.call(a)) ?? 0));
523
+ }
524
+ ae(async () => {
525
+ var n, c, L;
526
+ await (l == null ? void 0 : l());
527
+ const a = r.value;
528
+ _.value = !!a, d(), (n = a == null ? void 0 : a.on) == null || n.call(a, "rotate", d), (c = a == null ? void 0 : a.on) == null || c.call(a, "pitch", d), (L = a == null ? void 0 : a.on) == null || L.call(a, "load", d);
529
+ }), oe(() => {
530
+ var n, c, L;
531
+ const a = r.value;
532
+ (n = a == null ? void 0 : a.off) == null || n.call(a, "rotate", d), (c = a == null ? void 0 : a.off) == null || c.call(a, "pitch", d), (L = a == null ? void 0 : a.off) == null || L.call(a, "load", d);
533
+ });
534
+ function w() {
535
+ const a = r.value;
536
+ a != null && a.easeTo && a.easeTo({ bearing: 0, pitch: 0 });
537
+ }
538
+ return (a, n) => (x(), P(ee, {
539
+ title: "Повернути орієнтацію",
540
+ tooltip: "Компас",
541
+ disabled: !_.value,
542
+ onClick: w
543
+ }, {
544
+ default: j(() => [
545
+ M(U(Mt), {
546
+ class: "w-4 h-4",
547
+ "aria-hidden": "true",
548
+ style: ye(g.value)
549
+ }, null, 8, ["style"])
550
+ ]),
551
+ _: 1
552
+ }, 8, ["disabled"]));
553
+ }
554
+ }), _o = 100, wo = /* @__PURE__ */ O({
555
+ __name: "MapFullscreenButton",
556
+ props: {
557
+ target: {}
558
+ },
559
+ setup(k) {
560
+ const r = k, { map: l, ready: _ } = K(), h = b(!1), i = b(!1);
561
+ function g() {
562
+ var c, L;
563
+ if (r.target) return r.target;
564
+ const n = (L = (c = l.value) == null ? void 0 : c.getContainer) == null ? void 0 : L.call(c);
565
+ return n ? n.closest(".map-view-root") ?? n : null;
566
+ }
567
+ function d() {
568
+ const n = g();
569
+ i.value = !!(n && document.fullscreenElement === n);
570
+ }
571
+ function w() {
572
+ window.setTimeout(() => {
573
+ var n, c;
574
+ (c = (n = l.value) == null ? void 0 : n.resize) == null || c.call(n);
575
+ }, _o);
576
+ }
577
+ async function a() {
578
+ const n = g();
579
+ if (n)
580
+ try {
581
+ document.fullscreenElement === n ? await document.exitFullscreen() : document.fullscreenElement ? (await document.exitFullscreen(), await n.requestFullscreen()) : await n.requestFullscreen();
582
+ } catch (c) {
583
+ console.error("Fullscreen error:", c);
584
+ } finally {
585
+ d(), w();
586
+ }
587
+ }
588
+ return ae(async () => {
589
+ await (_ == null ? void 0 : _()), h.value = !!l.value, d(), document.addEventListener("fullscreenchange", d), document.addEventListener("fullscreenchange", w);
590
+ }), oe(() => {
591
+ document.removeEventListener("fullscreenchange", d), document.removeEventListener("fullscreenchange", w);
592
+ }), (n, c) => (x(), P(ee, {
593
+ title: i.value ? "Вийти з повного екрана" : "Повний екран",
594
+ tooltip: i.value ? "Вийти з повного екрана" : "Повний екран",
595
+ active: i.value,
596
+ disabled: !h.value,
597
+ onClick: a
598
+ }, {
599
+ default: j(() => [
600
+ i.value ? (x(), P(U(St), {
601
+ key: 0,
602
+ class: "w-4 h-4"
603
+ })) : (x(), P(U(Lt), {
604
+ key: 1,
605
+ class: "w-4 h-4"
606
+ }))
607
+ ]),
608
+ _: 1
609
+ }, 8, ["title", "tooltip", "active", "disabled"]));
610
+ }
611
+ }), ko = /* @__PURE__ */ O({
612
+ __name: "MapCopyLinkButton",
613
+ props: {
614
+ url: { default: "" }
615
+ },
616
+ setup(k) {
617
+ const r = k;
618
+ async function l() {
619
+ const _ = r.url || (typeof window < "u" ? window.location.href : "");
620
+ if (!_) {
621
+ D({
622
+ type: "warning",
623
+ title: "Посилання",
624
+ message: "Немає URL для копіювання"
625
+ });
626
+ return;
627
+ }
628
+ try {
629
+ await navigator.clipboard.writeText(_), D({
630
+ type: "success",
631
+ title: "Посилання",
632
+ message: "Посилання скопійовано"
633
+ });
634
+ } catch (h) {
635
+ console.error("Copy link error:", h), D({
636
+ type: "error",
637
+ title: "Посилання",
638
+ message: "Не вдалося скопіювати посилання"
639
+ });
640
+ }
641
+ }
642
+ return (_, h) => (x(), P(ee, {
643
+ title: "Копіювати посилання",
644
+ tooltip: "Копіювати посилання",
645
+ onClick: l
646
+ }, {
647
+ default: j(() => [
648
+ M(U(Et), { class: "w-4 h-4" })
649
+ ]),
650
+ _: 1
651
+ }));
652
+ }
653
+ }), Co = {
654
+ key: 0,
655
+ class: "absolute right-full top-0 mr-2 z-[450] flex",
656
+ role: "group",
657
+ "aria-label": "Вибір рівня зуму"
658
+ }, $o = { class: "flex flex-col items-center rounded-lg border border-gray-200 bg-white/95 py-2.5 pl-1 pr-2 shadow-lg backdrop-blur-sm" }, Mo = ["title", "onClick"], So = {
659
+ key: 0,
660
+ class: "absolute right-5 text-[9px] tabular-nums text-gray-400"
661
+ }, Lo = /* @__PURE__ */ O({
662
+ __name: "MapZoomSlider",
663
+ props: {
664
+ visible: { type: Boolean },
665
+ modelValue: {},
666
+ min: { default: 5 },
667
+ max: { default: 20 }
668
+ },
669
+ emits: ["update:modelValue"],
670
+ setup(k, { emit: r }) {
671
+ const l = k, _ = r, h = b(), i = b(l.modelValue), g = b(!1);
672
+ q(
673
+ () => l.modelValue,
674
+ (f) => {
675
+ g.value || (i.value = f);
676
+ }
677
+ );
678
+ const d = B(() => {
679
+ const f = [];
680
+ for (let s = l.min; s <= l.max; s += 1) f.push(s);
681
+ return f;
682
+ }), w = B(() => {
683
+ const f = /* @__PURE__ */ new Set();
684
+ for (let s = l.min; s <= l.max; s += 5)
685
+ f.add(s);
686
+ return f.add(l.max), f;
687
+ }), a = (f) => w.value.has(f), n = (f) => {
688
+ const s = l.max - l.min;
689
+ return s <= 0 ? 0 : (l.max - f) / s * 100;
690
+ }, c = (f) => {
691
+ _("update:modelValue", f);
692
+ }, L = (f) => {
693
+ if (!h.value) return;
694
+ const s = h.value.getBoundingClientRect(), m = (f - s.top) / s.height;
695
+ i.value = Math.max(
696
+ l.min,
697
+ Math.min(l.max, Math.round(l.max - m * (l.max - l.min)))
698
+ );
699
+ }, y = (f) => {
700
+ L(f.clientY);
701
+ }, C = () => {
702
+ window.removeEventListener("mousemove", y), window.removeEventListener("mouseup", C), g.value = !1, i.value !== l.modelValue && _("update:modelValue", i.value);
703
+ }, $ = (f) => {
704
+ g.value = !0, L(f.clientY), window.addEventListener("mousemove", y), window.addEventListener("mouseup", C);
705
+ };
706
+ return (f, s) => (x(), P(ht, { name: "zoom-panel" }, {
707
+ default: j(() => [
708
+ k.visible ? (x(), R("div", Co, [
709
+ u("div", $o, [
710
+ s[1] || (s[1] = u("span", { class: "mb-1 text-[9px] font-semibold uppercase tracking-wider text-gray-400" }, " Zoom ", -1)),
711
+ u("div", {
712
+ ref_key: "sliderRef",
713
+ ref: h,
714
+ class: "relative h-44 w-8 cursor-pointer select-none",
715
+ onMousedown: Ee($, ["prevent"])
716
+ }, [
717
+ s[0] || (s[0] = u("div", { class: "absolute right-0 top-0 bottom-0 w-px bg-gray-200" }, null, -1)),
718
+ (x(!0), R(ge, null, Xe(d.value, (m) => (x(), R("button", {
719
+ key: m,
720
+ type: "button",
721
+ class: "absolute right-0 -translate-y-1/2 flex items-center justify-end group",
722
+ style: ye({ top: `${n(m)}%` }),
723
+ title: `Zoom ${m}`,
724
+ onClick: Ee((T) => c(m), ["stop"])
725
+ }, [
726
+ u("span", {
727
+ class: se([
728
+ "block rounded-full",
729
+ a(m) ? "h-px w-2.5 bg-gray-300 group-hover:bg-gray-400" : "h-px w-1.5 bg-gray-200 group-hover:bg-gray-300"
730
+ ])
731
+ }, null, 2),
732
+ a(m) ? (x(), R("span", So, Z(m), 1)) : A("", !0)
733
+ ], 12, Mo))), 128)),
734
+ u("div", {
735
+ class: "absolute right-0 -translate-y-1/2 flex items-center",
736
+ style: ye({ top: `${n(i.value)}%` })
737
+ }, [
738
+ u("div", {
739
+ class: se(["h-[4px] w-4 rounded-full bg-blue-600/80 shadow-sm transition-all", g.value ? "bg-blue-300 transform duration-200" : ""])
740
+ }, null, 2)
741
+ ], 4)
742
+ ], 544)
743
+ ])
744
+ ])) : A("", !0)
745
+ ]),
746
+ _: 1
747
+ }));
748
+ }
749
+ }), Eo = /* @__PURE__ */ He(Lo, [["__scopeId", "data-v-ca77aba8"]]), Vo = { class: "text-[0.7rem] font-bold tabular-nums leading-none text-gray-600" }, Me = 5, Se = 20, zo = 13, Bo = 0.01, Ro = 200, Po = /* @__PURE__ */ O({
750
+ __name: "MapZoomLevelButton",
751
+ setup(k) {
752
+ const { map: r, ready: l } = K(), _ = b(!1), h = b(!1), i = b(zo), g = b(!1), d = b(Me), w = b(Se), a = B(() => String(i.value));
753
+ function n(s) {
754
+ return Math.round(Math.min(w.value, Math.max(d.value, s)));
755
+ }
756
+ function c() {
757
+ var z, S;
758
+ const s = r.value;
759
+ if (!s) return;
760
+ const m = (z = s.getMinZoom) == null ? void 0 : z.call(s), T = (S = s.getMaxZoom) == null ? void 0 : S.call(s);
761
+ Number.isFinite(m) && (d.value = Math.max(Me, Math.floor(Number(m)))), Number.isFinite(T) && (w.value = Math.min(Se, Math.ceil(Number(T)))), d.value > w.value && (d.value = Me, w.value = Se);
762
+ }
763
+ function L() {
764
+ var z;
765
+ const s = r.value;
766
+ if (!s || g.value) return;
767
+ const m = (z = s.getZoom) == null ? void 0 : z.call(s);
768
+ if (m == null) return;
769
+ const T = n(m);
770
+ i.value !== T && (i.value = T);
771
+ }
772
+ function y(s) {
773
+ var G, Y;
774
+ const m = r.value;
775
+ if (!(m != null && m.easeTo)) return;
776
+ const T = (G = m.getCenter) == null ? void 0 : G.call(m);
777
+ if (!T) return;
778
+ const z = n(s), S = (Y = m.getZoom) == null ? void 0 : Y.call(m);
779
+ S != null && Math.abs(S - z) < Bo || (g.value = !0, m.easeTo({
780
+ center: [T.lng, T.lat],
781
+ zoom: z,
782
+ duration: Ro,
783
+ essential: !0
784
+ }));
785
+ }
786
+ function C() {
787
+ g.value = !1, L();
788
+ }
789
+ function $() {
790
+ h.value = !h.value, h.value && (c(), L());
791
+ }
792
+ function f(s) {
793
+ i.value = s, y(s);
794
+ }
795
+ return ae(async () => {
796
+ var m;
797
+ await (l == null ? void 0 : l());
798
+ const s = r.value;
799
+ _.value = !!s, c(), L(), (m = s == null ? void 0 : s.on) == null || m.call(s, "zoomend", C);
800
+ }), oe(() => {
801
+ var s, m;
802
+ (m = (s = r.value) == null ? void 0 : s.off) == null || m.call(s, "zoomend", C);
803
+ }), (s, m) => (x(), R(ge, null, [
804
+ M(ee, {
805
+ title: h.value ? "Закрити вибір зуму" : "Вибрати рівень зуму",
806
+ tooltip: "Рівень зуму",
807
+ active: h.value,
808
+ disabled: !_.value,
809
+ "aria-label": "Рівень зуму",
810
+ onClick: $
811
+ }, {
812
+ default: j(() => [
813
+ u("div", Vo, Z(a.value), 1)
814
+ ]),
815
+ _: 1
816
+ }, 8, ["title", "active", "disabled"]),
817
+ M(Eo, {
818
+ visible: h.value,
819
+ "model-value": i.value,
820
+ min: d.value,
821
+ max: w.value,
822
+ "onUpdate:modelValue": f
823
+ }, null, 8, ["visible", "model-value", "min", "max"])
824
+ ], 64));
825
+ }
826
+ }), To = /* @__PURE__ */ O({
827
+ __name: "MapRulerButton",
828
+ props: {
829
+ active: { type: Boolean }
830
+ },
831
+ emits: ["click"],
832
+ setup(k) {
833
+ return (r, l) => (x(), P(ee, {
834
+ title: k.active ? "Вимкнути лінійку" : "Увімкнути лінійку",
835
+ tooltip: "Вимірювання",
836
+ active: k.active,
837
+ "aria-label": "Вимірювання",
838
+ onClick: l[0] || (l[0] = (_) => r.$emit("click", _))
839
+ }, {
840
+ default: j(() => [
841
+ M(U(Vt), { class: "w-4 h-4" })
842
+ ]),
843
+ _: 1
844
+ }, 8, ["title", "active"]));
845
+ }
846
+ }), No = { class: "absolute right-3 top-3 z-[450] flex flex-col gap-1 pointer-events-auto" }, Oo = /* @__PURE__ */ O({
847
+ name: "MapToolbarRight",
848
+ __name: "MapToolbarRight",
849
+ setup(k) {
850
+ return (r, l) => (x(), R("div", No, [
851
+ Ye(r.$slots, "default")
852
+ ]));
853
+ }
854
+ }), jo = /* @__PURE__ */ O({
855
+ __name: "RulerMapClickBridge",
856
+ props: {
857
+ active: { type: Boolean }
858
+ },
859
+ emits: ["map-click"],
860
+ setup(k, { emit: r }) {
861
+ const l = k, _ = r, { map: h, ready: i } = K();
862
+ let g = null;
863
+ function d(a) {
864
+ if (!l.active) return;
865
+ const n = a == null ? void 0 : a.lngLat;
866
+ typeof (n == null ? void 0 : n.lat) != "number" || typeof (n == null ? void 0 : n.lng) != "number" || _("map-click", { lat: n.lat, lng: n.lng });
867
+ }
868
+ async function w() {
869
+ if (g == null || g(), g = null, !l.active) return;
870
+ await (i == null ? void 0 : i());
871
+ const a = h.value;
872
+ a != null && a.on && (a.on("click", d), g = () => {
873
+ var n;
874
+ return (n = a.off) == null ? void 0 : n.call(a, "click", d);
875
+ });
876
+ }
877
+ return q(
878
+ () => l.active,
879
+ () => {
880
+ w();
881
+ },
882
+ { immediate: !0 }
883
+ ), oe(() => {
884
+ g == null || g(), g = null;
885
+ }), (a, n) => null;
886
+ }
887
+ }), Fo = { class: "flex h-full bg-gradient-to-br from-slate-50 to-white" }, Ao = { class: "flex-1 relative overflow-hidden" }, Zo = { class: "absolute top-0 left-0 w-full z-20" }, Do = { class: "px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm" }, Uo = { class: "flex items-start justify-between gap-4" }, qo = { class: "flex-1 min-w-0" }, Qo = { class: "flex items-center text-sm text-gray-500 mb-3" }, Yo = { class: "text-gray-900 font-medium truncate max-w-xs" }, Xo = { class: "flex items-center justify-between gap-4" }, Ho = { class: "flex-1 min-w-0" }, Jo = { class: "flex items-center gap-3 mb-1" }, Ko = { class: "text-base font-semibold text-gray-900 truncate" }, Go = {
888
+ key: 0,
889
+ class: "px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"
890
+ }, Wo = { class: "text-xs font-medium text-green-700" }, Io = ["title"], ea = { class: "w-full h-full bg-gradient-to-br from-sky-50 via-white to-blue-50 flex items-center justify-center relative pt-[115px]" }, ta = { class: "relative w-full h-full" }, oa = { class: "absolute top-3 left-3 z-20" }, aa = { class: "px-3 py-2 flex items-center gap-2 border-b border-gray-100" }, la = { class: "text-xs text-gray-700 w-9 text-right" }, na = { class: "px-3 py-2 flex items-center gap-2" }, sa = {
891
+ for: "show-layer",
892
+ class: "text-xs text-gray-700 flex items-center gap-1 cursor-pointer"
893
+ }, ra = {
894
+ key: 2,
895
+ class: "absolute bottom-4 left-1/2 z-30 -translate-x-1/2 rounded-2xl border border-sky-200 bg-white/95 px-4 py-2 text-xs font-medium text-slate-700 shadow-lg backdrop-blur"
896
+ }, ua = { class: "flex-1 flex flex-col h-full" }, ia = {
897
+ key: 0,
898
+ class: "px-3 pt-3 pb-2 border-b border-gray-100"
899
+ }, ca = ["aria-selected", "onClick"], da = { class: "leading-none" }, fa = { class: "flex flex-col flex-1 overflow-y-hidden p-3" }, ma = {
900
+ key: 0,
901
+ class: "flex-1 flex items-center justify-center text-sm text-gray-500"
902
+ }, va = "cartocss-demo-001", pa = "OpenGIS", Qe = 2, pe = 5, ya = 5, La = /* @__PURE__ */ O({
903
+ __name: "cartocss",
904
+ setup(k) {
905
+ const r = wt(), l = kt(), _ = b(null), h = B(() => {
906
+ var t;
907
+ const e = (t = l.matched[l.matched.length - 1]) == null ? void 0 : t.path;
908
+ return (typeof e == "string" && e ? e : l.path).replace(/\/:id\??$/, "") || "/";
909
+ }), i = B(() => {
910
+ var o;
911
+ const e = (o = l.meta) == null ? void 0 : o.title;
912
+ return typeof e == "string" && e.trim() ? e : "CartoCSS";
913
+ });
914
+ function g() {
915
+ r.push(h.value);
916
+ }
917
+ const d = [
918
+ { key: "css", label: "CSS", icon: Zt },
919
+ { key: "data", label: "Дані", icon: Gt },
920
+ { key: "metadata", label: "Метадані", icon: Yt },
921
+ { key: "card", label: "Картка", icon: Dt }
922
+ ], w = d.map((e) => e.key), a = b(
923
+ w.includes(l.query.tab) ? l.query.tab : "css"
924
+ ), n = b(!0), c = b(null), L = B(
925
+ () => {
926
+ var e;
927
+ return (e = c.value) != null && e.source_path ? d.filter((o) => o.key === "card" || o.key === "metadata") : d;
928
+ }
929
+ ), y = B(
930
+ () => l.params.id || va
931
+ ), C = b({
932
+ id: y.value,
933
+ name: "",
934
+ description: ""
935
+ });
936
+ let $ = null;
937
+ const f = b(!1);
938
+ function s(e) {
939
+ if (Array.isArray(e)) return s(e[0]);
940
+ if (typeof e != "string" && typeof e != "number") return null;
941
+ const o = typeof e == "number" ? e : Number(e.trim());
942
+ return Number.isFinite(o) ? o : null;
943
+ }
944
+ function m(e, o) {
945
+ return e.toFixed(o);
946
+ }
947
+ function T(e, o, t) {
948
+ const v = 0.5 * 10 ** -t;
949
+ return Math.abs(e - o) > v;
950
+ }
951
+ function z() {
952
+ var e;
953
+ return (e = _.value) == null ? void 0 : e.ctx;
954
+ }
955
+ function S() {
956
+ var E, N, J, Q;
957
+ const e = (N = (E = z()) == null ? void 0 : E.map) == null ? void 0 : N.value;
958
+ if (!e) return;
959
+ const o = s(l.query.z), t = s(l.query.x), v = s(l.query.y);
960
+ if (o == null || t == null || v == null) return;
961
+ const p = (J = e.getCenter) == null ? void 0 : J.call(e), V = (Q = e.getZoom) == null ? void 0 : Q.call(e);
962
+ (!p || T(p.lng, t, pe) || T(p.lat, v, pe) || T(V ?? 0, o, Qe)) && (f.value = !0, e.jumpTo({ center: [t, v], zoom: o }), f.value = !1);
963
+ }
964
+ function G() {
965
+ var p, V, F, E;
966
+ if (f.value) return;
967
+ const e = (V = (p = z()) == null ? void 0 : p.map) == null ? void 0 : V.value;
968
+ if (!e) return;
969
+ const o = (F = e.getCenter) == null ? void 0 : F.call(e), t = (E = e.getZoom) == null ? void 0 : E.call(e);
970
+ if (!o || t == null) return;
971
+ const v = {
972
+ ...l.query,
973
+ z: m(t, Qe),
974
+ x: m(o.lng, pe),
975
+ y: m(o.lat, pe)
976
+ };
977
+ l.query.z === v.z && l.query.x === v.x && l.query.y === v.y || r.replace({ query: v });
978
+ }
979
+ function Y(e) {
980
+ typeof document > "u" || (document.title = e ? `${e} — CartoCSS` : pa);
981
+ }
982
+ const re = b(""), ue = b([]), he = b(!1), ie = b(!1), be = b(""), xe = b(0), W = b(!0), ce = b(1), X = b(!1), le = b(null), H = b(!1), _e = b(null), de = b(
983
+ []
984
+ ), we = b(!1), ze = b("general");
985
+ function Ke(e) {
986
+ de.value = e;
987
+ }
988
+ function Ge(e) {
989
+ var o;
990
+ (o = _e.value) == null || o.addPoint(e);
991
+ }
992
+ function Be() {
993
+ var e;
994
+ de.value = [], we.value = !1, (e = _e.value) == null || e.clearPoints(), H.value = !1;
995
+ }
996
+ function We() {
997
+ if (H.value) {
998
+ Be();
999
+ return;
1000
+ }
1001
+ H.value = !0;
1002
+ }
1003
+ const Ie = B(() => `cartocss-layer-${y.value}`), et = B(
1004
+ () => `${Math.round(ce.value * 100)}%`
1005
+ ), tt = B(
1006
+ () => `cartocss-extent-${y.value}`
1007
+ ), ot = B(
1008
+ () => `cartocss-extent-draft-${y.value}`
1009
+ ), Re = B(() => {
1010
+ var p;
1011
+ const e = (p = be.value) == null ? void 0 : p.trim();
1012
+ if (!e) return "";
1013
+ const o = e.includes("?") ? "&" : "?", t = `${e}${o}nottl=1`, v = xe.value;
1014
+ return v ? `${e}${o}ts=${v}&nocache=1` : t;
1015
+ }), Pe = b(""), Te = b(""), Ne = B(() => {
1016
+ var V;
1017
+ const e = (V = c.value) == null ? void 0 : V.bounds;
1018
+ if (!Array.isArray(e) || e.length < 4) return null;
1019
+ const [o, t, v, p] = e;
1020
+ return [o, t, v, p].some(
1021
+ (F) => typeof F != "number" || Number.isNaN(F)
1022
+ ) ? null : [(o + v) / 2, (t + p) / 2];
1023
+ }), at = B(() => {
1024
+ var V;
1025
+ const e = (V = c.value) == null ? void 0 : V.bounds;
1026
+ if (!Array.isArray(e) || e.length < 4) return null;
1027
+ const [o, t, v, p] = e;
1028
+ return [o, t, v, p].some(
1029
+ (F) => typeof F != "number" || Number.isNaN(F)
1030
+ ) ? null : [o, t, v, p];
1031
+ }), ke = B(() => {
1032
+ const e = c.value;
1033
+ return e ? [
1034
+ e.description,
1035
+ e.group_id ? `Група: ${e.group_id}` : null,
1036
+ e.source_path ? `Шлях: ${e.source_path}` : null,
1037
+ e.is_public === !0 ? "Публічний" : "Не публічний",
1038
+ e.enabled === !0 ? "Активний" : "Неактивний"
1039
+ ].filter(Boolean).join(", ") : "";
1040
+ }), Oe = B(() => {
1041
+ var o;
1042
+ const e = (o = c.value) == null ? void 0 : o.group_id;
1043
+ return e ? String(e).toUpperCase() : "";
1044
+ });
1045
+ let I = null, ne = !1, te = null;
1046
+ function fe(e) {
1047
+ return Number(e.toFixed(ya));
1048
+ }
1049
+ function je(e, o) {
1050
+ const [t, v] = e, [p, V] = o;
1051
+ return [
1052
+ fe(Math.min(t, p)),
1053
+ fe(Math.min(v, V)),
1054
+ fe(Math.max(t, p)),
1055
+ fe(Math.max(v, V))
1056
+ ];
1057
+ }
1058
+ function lt(e) {
1059
+ const [o, t, v, p] = e;
1060
+ return {
1061
+ type: "Polygon",
1062
+ coordinates: [
1063
+ [
1064
+ [o, t],
1065
+ [v, t],
1066
+ [v, p],
1067
+ [o, p],
1068
+ [o, t]
1069
+ ]
1070
+ ]
1071
+ };
1072
+ }
1073
+ function Ce(e) {
1074
+ var v, p, V;
1075
+ const o = (p = (v = z()) == null ? void 0 : v.map) == null ? void 0 : p.value, t = (V = o == null ? void 0 : o.getCanvas) == null ? void 0 : V.call(o);
1076
+ t != null && t.style && (t.style.cursor = e);
1077
+ }
1078
+ async function nt(e, o) {
1079
+ if (!(!y.value || !c.value)) {
1080
+ ie.value = !0;
1081
+ try {
1082
+ const t = lt(e), v = await fetch(`/api/gis-css/${y.value}`, {
1083
+ method: "POST",
1084
+ headers: { "Content-Type": "application/json" },
1085
+ body: JSON.stringify({ geom: t })
1086
+ });
1087
+ if (!v.ok)
1088
+ throw new Error(`Failed to save cartocss bounds: ${v.status}`);
1089
+ D({
1090
+ type: "success",
1091
+ title: "Bounds збережено",
1092
+ message: "Нові межі успішно збережено."
1093
+ }), await me(y.value, { bustCache: !0 });
1094
+ } catch (t) {
1095
+ console.error("Failed to save CartoCSS bounds", t), c.value && (c.value = {
1096
+ ...c.value,
1097
+ bounds: o ? [...o] : null
1098
+ }), D({
1099
+ type: "error",
1100
+ title: "Помилка",
1101
+ message: "Не вдалося зберегти Bounds"
1102
+ });
1103
+ } finally {
1104
+ ie.value = !1;
1105
+ }
1106
+ }
1107
+ }
1108
+ function Fe(e) {
1109
+ var t, v, p;
1110
+ const o = (v = (t = z()) == null ? void 0 : t.map) == null ? void 0 : v.value;
1111
+ if ((p = o == null ? void 0 : o.dragPan) != null && p.enable && o.dragPan.enable(), (e == null ? void 0 : e.length) === 4 && c.value) {
1112
+ const V = Array.isArray(c.value.bounds) ? [...c.value.bounds] : null;
1113
+ c.value = {
1114
+ ...c.value,
1115
+ bounds: [...e]
1116
+ }, nt(e, V);
1117
+ }
1118
+ I = null, ne = !1, le.value = null, X.value = !1, Ce("");
1119
+ }
1120
+ function $e() {
1121
+ Fe(null);
1122
+ }
1123
+ function st() {
1124
+ var V, F;
1125
+ const e = (F = (V = z()) == null ? void 0 : V.map) == null ? void 0 : F.value;
1126
+ if (!e) return;
1127
+ const o = (E) => {
1128
+ var J, Q, ve;
1129
+ if (!X.value || ((J = E == null ? void 0 : E.originalEvent) == null ? void 0 : J.button) != null && E.originalEvent.button !== 0)
1130
+ return;
1131
+ const N = E == null ? void 0 : E.lngLat;
1132
+ N && (I = [N.lng, N.lat], ne = !0, le.value = [N.lng, N.lat, N.lng, N.lat], (ve = (Q = e.dragPan) == null ? void 0 : Q.disable) == null || ve.call(Q));
1133
+ }, t = (E) => {
1134
+ if (!X.value || !ne || !I)
1135
+ return;
1136
+ const N = E == null ? void 0 : E.lngLat;
1137
+ N && (le.value = je(I, [
1138
+ N.lng,
1139
+ N.lat
1140
+ ]));
1141
+ }, v = (E) => {
1142
+ if (!X.value || !ne || !I)
1143
+ return;
1144
+ const N = E == null ? void 0 : E.lngLat;
1145
+ if (!N) {
1146
+ $e();
1147
+ return;
1148
+ }
1149
+ const J = je(I, [
1150
+ N.lng,
1151
+ N.lat
1152
+ ]), [Q, ve, mt, vt] = J;
1153
+ if (!(Math.abs(mt - Q) > 0 && Math.abs(vt - ve) > 0)) {
1154
+ D({
1155
+ type: "warning",
1156
+ title: "Bounds не змінено",
1157
+ message: "Потрібно протягнути прямокутник з ненульовою площею."
1158
+ }), $e();
1159
+ return;
1160
+ }
1161
+ Fe(J);
1162
+ }, p = (E) => {
1163
+ X.value && E.key === "Escape" && (E.preventDefault(), $e());
1164
+ };
1165
+ e.on("mousedown", o), e.on("mousemove", t), e.on("mouseup", v), window.addEventListener("keydown", p), te = () => {
1166
+ e.off("mousedown", o), e.off("mousemove", t), e.off("mouseup", v), window.removeEventListener("keydown", p);
1167
+ };
1168
+ }
1169
+ async function rt() {
1170
+ var t;
1171
+ const e = z();
1172
+ !(e != null && e.ready) || (await e.ready(), !((t = e.map) == null ? void 0 : t.value)) || (te || st(), X.value = !0, ne = !1, I = null, le.value = null, Ce("crosshair"), D({
1173
+ type: "info",
1174
+ title: "Редагування Bounds",
1175
+ message: "Протягніть прямокутник на карті, щоб задати нові межі."
1176
+ }));
1177
+ }
1178
+ q(
1179
+ y,
1180
+ (e) => {
1181
+ e && me(e);
1182
+ },
1183
+ { immediate: !0 }
1184
+ ), q(
1185
+ () => {
1186
+ var e;
1187
+ return (e = C.value) == null ? void 0 : e.name;
1188
+ },
1189
+ (e) => Y(e),
1190
+ { immediate: !0 }
1191
+ );
1192
+ async function ut() {
1193
+ var v;
1194
+ const e = z();
1195
+ if (!(e != null && e.ready)) return;
1196
+ await e.ready(), S();
1197
+ const o = (v = e.map) == null ? void 0 : v.value;
1198
+ if (!o) return;
1199
+ const t = () => G();
1200
+ o.on("moveend", t), o.on("zoomend", t), $ = () => {
1201
+ o.off("moveend", t), o.off("zoomend", t);
1202
+ };
1203
+ }
1204
+ q(
1205
+ () => [l.query.z, l.query.x, l.query.y],
1206
+ () => {
1207
+ S();
1208
+ }
1209
+ ), ae(() => {
1210
+ ut();
1211
+ }), oe(() => {
1212
+ $ == null || $(), $ = null, te == null || te(), te = null, Ce("");
1213
+ }), q(
1214
+ () => l.query.tab,
1215
+ (e) => {
1216
+ e && L.value.some((o) => o.key === e) && a.value !== e && (a.value = e);
1217
+ }
1218
+ ), q(
1219
+ L,
1220
+ (e) => {
1221
+ e.length && !e.some((o) => o.key === a.value) && (a.value = e[0].key);
1222
+ },
1223
+ { immediate: !0 }
1224
+ ), q(a, (e) => {
1225
+ l.query.tab !== e && L.value.some((o) => o.key === e) && r.replace({ query: { ...l.query, tab: e } });
1226
+ }), q(
1227
+ () => c.value,
1228
+ (e) => {
1229
+ const o = e == null ? void 0 : e.card_html;
1230
+ Pe.value = o, Te.value = e == null ? void 0 : e.card_table;
1231
+ },
1232
+ { immediate: !0 }
1233
+ );
1234
+ function Ae() {
1235
+ y.value && me(y.value, { bustCache: !0 });
1236
+ }
1237
+ async function it(e, o) {
1238
+ if (y.value) {
1239
+ ie.value = !0;
1240
+ try {
1241
+ const t = await fetch(`/api/gis-css/${y.value}`, {
1242
+ method: "POST",
1243
+ headers: { "Content-Type": "application/json" },
1244
+ body: JSON.stringify(e)
1245
+ });
1246
+ if (!t.ok) throw new Error(`Failed to save cartocss: ${t.status}`);
1247
+ D({ type: "success", title: "Збережено", message: o }), await me(y.value, { bustCache: !0 });
1248
+ } catch (t) {
1249
+ console.error("Failed to save CartoCSS", t), D({
1250
+ type: "error",
1251
+ title: "Помилка",
1252
+ message: "Не вдалося зберегти CartoCSS"
1253
+ });
1254
+ } finally {
1255
+ ie.value = !1;
1256
+ }
1257
+ }
1258
+ }
1259
+ function ct(e) {
1260
+ if (!e) return null;
1261
+ if (typeof e == "string")
1262
+ try {
1263
+ return JSON.parse(e);
1264
+ } catch (o) {
1265
+ return console.warn("Failed to parse CartoCSS config", o), null;
1266
+ }
1267
+ return typeof e == "object" ? e : null;
1268
+ }
1269
+ function dt(e) {
1270
+ const o = Array.isArray(e) ? e : e == null ? void 0 : e.datasets;
1271
+ return Array.isArray(o) ? o.map((t, v) => ({
1272
+ table: (t == null ? void 0 : t.table) || (t == null ? void 0 : t.id) || `dataset_${v + 1}`,
1273
+ query: (t == null ? void 0 : t.query) || "",
1274
+ srid: (t == null ? void 0 : t.srid) || "",
1275
+ gcol: (t == null ? void 0 : t.gcol) || "",
1276
+ key: (t == null ? void 0 : t.key) || (t == null ? void 0 : t.label) || "Без підпису",
1277
+ active: typeof (t == null ? void 0 : t.active) == "boolean" ? t.active : !0,
1278
+ minzoom: typeof (t == null ? void 0 : t.zoom) > "u" ? "" : String(t.zoom),
1279
+ maxzoom: typeof (t == null ? void 0 : t.maxzoom) > "u" ? "" : String(t.maxzoom),
1280
+ columns: (t == null ? void 0 : t.columns) || "",
1281
+ proj4text: (t == null ? void 0 : t.proj4text) || ""
1282
+ })) : [];
1283
+ }
1284
+ async function me(e, o) {
1285
+ he.value = !0;
1286
+ try {
1287
+ const t = await fetch(`/api/gis-css/${e}`);
1288
+ if (!t.ok) throw new Error(`Failed to load cartocss: ${t.status}`);
1289
+ const v = await t.json(), p = (v == null ? void 0 : v.message) || v || {};
1290
+ c.value = p, C.value = {
1291
+ id: p.cartocss_key || e,
1292
+ name: p.name || C.value.name,
1293
+ description: p.description || C.value.description
1294
+ }, re.value = typeof p.style == "string" ? p.style : "";
1295
+ const V = ct(p.config ?? []);
1296
+ ue.value = dt(V);
1297
+ const F = typeof p.url == "string" ? p.url : "";
1298
+ be.value = F, W.value = !!(F && p.enabled !== !1), xe.value = o != null && o.bustCache ? Date.now() : 0;
1299
+ } catch (t) {
1300
+ console.error("Failed to fetch CartoCSS", t), W.value = !1, be.value = "", xe.value = 0, c.value = null;
1301
+ } finally {
1302
+ he.value = !1;
1303
+ }
1304
+ }
1305
+ async function Ze() {
1306
+ await it(
1307
+ {
1308
+ style: re.value || "",
1309
+ config: ue.value
1310
+ },
1311
+ "CartoCSS оновлено"
1312
+ );
1313
+ }
1314
+ async function ft(e) {
1315
+ const o = await fetch(`/api/gis-css/${y.value}`, {
1316
+ method: "POST",
1317
+ headers: { "Content-Type": "application/json" },
1318
+ body: JSON.stringify(e)
1319
+ });
1320
+ if (!o.ok) throw new Error(`Failed to save cartocss: ${o.status}`);
1321
+ D({
1322
+ type: "success",
1323
+ title: "Збережено",
1324
+ message: "Картка CartoCSS оновлена"
1325
+ });
1326
+ }
1327
+ return (e, o) => (x(), R("div", Fo, [
1328
+ u("div", Ao, [
1329
+ u("div", Zo, [
1330
+ u("div", Do, [
1331
+ u("div", Uo, [
1332
+ u("div", qo, [
1333
+ u("div", Qo, [
1334
+ u("button", {
1335
+ type: "button",
1336
+ class: "hover:text-gray-700 cursor-pointer transition-colors",
1337
+ onClick: g
1338
+ }, Z(i.value), 1),
1339
+ o[7] || (o[7] = u("svg", {
1340
+ xmlns: "http://www.w3.org/2000/svg",
1341
+ width: "24",
1342
+ height: "24",
1343
+ viewBox: "0 0 24 24",
1344
+ fill: "none",
1345
+ stroke: "currentColor",
1346
+ "stroke-width": "2",
1347
+ "stroke-linecap": "round",
1348
+ "stroke-linejoin": "round",
1349
+ class: "lucide lucide-chevron-right w-4 h-4 mx-1"
1350
+ }, [
1351
+ u("path", { d: "m9 18 6-6-6-6" })
1352
+ ], -1)),
1353
+ u("span", Yo, Z(C.value.name || "CartoCSS"), 1)
1354
+ ]),
1355
+ u("div", Xo, [
1356
+ u("div", Ho, [
1357
+ u("div", Jo, [
1358
+ u("h1", Ko, Z(C.value.name || "CartoCSS"), 1),
1359
+ Oe.value ? (x(), R("div", Go, [
1360
+ u("span", Wo, Z(Oe.value), 1)
1361
+ ])) : A("", !0)
1362
+ ]),
1363
+ ke.value ? (x(), R("p", {
1364
+ key: 0,
1365
+ class: "text-xs text-gray-500 truncate",
1366
+ title: ke.value
1367
+ }, Z(ke.value), 9, Io)) : A("", !0)
1368
+ ])
1369
+ ])
1370
+ ]),
1371
+ M(Ut, {
1372
+ class: "flex-shrink-0",
1373
+ "entity-id": y.value,
1374
+ "entity-info": C.value,
1375
+ "form-endpoint": (t) => `/api/form/gis.cartocss.table/${t}`,
1376
+ "save-endpoint": (t) => `/api/gis-css/${t}`,
1377
+ "entity-label": "CartoCSS",
1378
+ "save-method": "post",
1379
+ onSaved: Ae
1380
+ }, null, 8, ["entity-id", "entity-info", "form-endpoint", "save-endpoint"])
1381
+ ])
1382
+ ])
1383
+ ]),
1384
+ u("div", ea, [
1385
+ u("div", ta, [
1386
+ M(Nt, {
1387
+ ref_key: "mapViewRef",
1388
+ ref: _
1389
+ }, {
1390
+ default: j(() => {
1391
+ var t, v;
1392
+ return [
1393
+ u("div", oa, [
1394
+ M(Ot, null, {
1395
+ default: j(() => [
1396
+ u("div", aa, [
1397
+ o[8] || (o[8] = u("span", { class: "text-xs text-gray-600 whitespace-nowrap" }, "Прозорість:", -1)),
1398
+ De(u("input", {
1399
+ type: "range",
1400
+ min: "0",
1401
+ max: "1",
1402
+ step: "0.01",
1403
+ "onUpdate:modelValue": o[0] || (o[0] = (p) => ce.value = p),
1404
+ class: "flex-1 h-1 accent-blue-600",
1405
+ style: { "accent-color": "rgb(30, 78, 216)" }
1406
+ }, null, 512), [
1407
+ [
1408
+ bt,
1409
+ ce.value,
1410
+ void 0,
1411
+ { number: !0 }
1412
+ ]
1413
+ ]),
1414
+ u("span", la, Z(et.value), 1)
1415
+ ]),
1416
+ u("div", na, [
1417
+ De(u("input", {
1418
+ id: "show-layer",
1419
+ type: "checkbox",
1420
+ class: "rounded",
1421
+ "onUpdate:modelValue": o[1] || (o[1] = (p) => W.value = p),
1422
+ style: { "accent-color": "rgb(30, 78, 216)" }
1423
+ }, null, 512), [
1424
+ [xt, W.value]
1425
+ ]),
1426
+ u("label", sa, [
1427
+ W.value ? (x(), P(U(zt), {
1428
+ key: 0,
1429
+ class: "w-3.5 h-3.5"
1430
+ })) : (x(), P(U(Bt), {
1431
+ key: 1,
1432
+ class: "w-3.5 h-3.5"
1433
+ })),
1434
+ o[9] || (o[9] = Ve(" Показати шар ", -1))
1435
+ ])
1436
+ ])
1437
+ ]),
1438
+ _: 1
1439
+ })
1440
+ ]),
1441
+ M(Oo, null, {
1442
+ default: j(() => [
1443
+ M(ho),
1444
+ M(bo),
1445
+ M(xo),
1446
+ M(Ue),
1447
+ Ne.value ? (x(), P(Ue, {
1448
+ key: 0,
1449
+ targetCenter: Ne.value,
1450
+ targetLabel: "Центр даних",
1451
+ targetAriaLabel: "Перейти до центру даних"
1452
+ }, null, 8, ["targetCenter"])) : A("", !0),
1453
+ M(wo),
1454
+ M(ko),
1455
+ M(To, {
1456
+ active: H.value,
1457
+ onClick: We
1458
+ }, null, 8, ["active"]),
1459
+ M(Po)
1460
+ ]),
1461
+ _: 1
1462
+ }),
1463
+ H.value ? (x(), P(jt, {
1464
+ key: 0,
1465
+ ref_key: "rulerPanelRef",
1466
+ ref: _e,
1467
+ onClose: Be,
1468
+ onTabChange: o[2] || (o[2] = (p) => ze.value = p),
1469
+ onPointsChange: Ke,
1470
+ onShapeClosedChange: o[3] || (o[3] = (p) => we.value = p)
1471
+ }, null, 512)) : A("", !0),
1472
+ H.value && de.value.length > 0 ? (x(), P(Ft, {
1473
+ key: 1,
1474
+ points: de.value,
1475
+ "is-shape-closed": we.value,
1476
+ "label-mode": ze.value
1477
+ }, null, 8, ["points", "is-shape-closed", "label-mode"])) : A("", !0),
1478
+ M(jo, {
1479
+ active: H.value,
1480
+ onMapClick: Ge
1481
+ }, null, 8, ["active"]),
1482
+ X.value ? (x(), R("div", ra, " Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")) : A("", !0),
1483
+ Re.value ? (x(), P(vo, {
1484
+ key: 3,
1485
+ "layer-id": Ie.value,
1486
+ "tile-url": Re.value,
1487
+ active: W.value,
1488
+ opacity: ce.value,
1489
+ title: C.value.name,
1490
+ owner: y.value
1491
+ }, null, 8, ["layer-id", "tile-url", "active", "opacity", "title", "owner"])) : A("", !0),
1492
+ M(qe, {
1493
+ extent: at.value,
1494
+ "layer-id": tt.value
1495
+ }, null, 8, ["extent", "layer-id"]),
1496
+ M(qe, {
1497
+ extent: le.value,
1498
+ "layer-id": ot.value,
1499
+ "line-color": "#0ea5e9",
1500
+ "line-width": 3
1501
+ }, null, 8, ["extent", "layer-id"]),
1502
+ M(po, {
1503
+ "cartocss-id": y.value,
1504
+ bounds: ((t = c.value) == null ? void 0 : t.bounds) ?? null,
1505
+ active: W.value && !X.value && !H.value,
1506
+ "info-enabled": (v = c.value) == null ? void 0 : v.info
1507
+ }, null, 8, ["cartocss-id", "bounds", "active", "info-enabled"]),
1508
+ M(At, { "map-id": y.value }, null, 8, ["map-id"])
1509
+ ];
1510
+ }),
1511
+ _: 1
1512
+ }, 512)
1513
+ ])
1514
+ ]),
1515
+ c.value ? (x(), P(qt, {
1516
+ key: 0,
1517
+ open: n.value,
1518
+ onToggle: o[4] || (o[4] = (t) => n.value = !n.value)
1519
+ }, null, 8, ["open"])) : A("", !0)
1520
+ ]),
1521
+ c.value ? (x(), R("div", {
1522
+ key: 0,
1523
+ class: se(["bg-white border-l border-gray-100 flex flex-col overflow-hidden shadow-lg flex-shrink-0 transition-[width] duration-100 ease-in-out", n.value ? "w-[650px]" : "w-0"])
1524
+ }, [
1525
+ u("div", ua, [
1526
+ L.value.length > 1 ? (x(), R("div", ia, [
1527
+ u("div", {
1528
+ class: "items-center justify-center text-muted-foreground grid w-full h-12 p-1 bg-gray-50 rounded-xl shadow-sm",
1529
+ style: ye({
1530
+ gridTemplateColumns: `repeat(${L.value.length}, minmax(0, 1fr))`
1531
+ })
1532
+ }, [
1533
+ (x(!0), R(ge, null, Xe(L.value, (t) => (x(), R("button", {
1534
+ key: t.key,
1535
+ type: "button",
1536
+ role: "tab",
1537
+ "aria-selected": a.value === t.key,
1538
+ class: se([
1539
+ "whitespace-nowrap flex flex-col items-center justify-center gap-0.5 py-1 px-1 text-[9px] font-medium transition-all duration-300 hover:bg-white/70 rounded-lg group",
1540
+ a.value === t.key ? "bg-white shadow-sm text-gray-700" : ""
1541
+ ]),
1542
+ onClick: (v) => a.value = t.key
1543
+ }, [
1544
+ (x(), P(_t(t.icon), { class: "h-3.5 w-3.5 mb-0.5" })),
1545
+ u("span", da, Z(t.label), 1)
1546
+ ], 10, ca))), 128))
1547
+ ], 4)
1548
+ ])) : A("", !0),
1549
+ u("div", fa, [
1550
+ he.value ? (x(), R("div", ma, " Завантаження стилю… ")) : (x(), R(ge, { key: 1 }, [
1551
+ a.value === "css" ? (x(), P(eo, {
1552
+ key: 0,
1553
+ modelValue: re.value,
1554
+ "onUpdate:modelValue": o[5] || (o[5] = (t) => re.value = t),
1555
+ class: "flex-1 min-h-0",
1556
+ onSave: Ze
1557
+ }, null, 8, ["modelValue"])) : a.value === "data" ? (x(), P(io, {
1558
+ key: 1,
1559
+ modelValue: ue.value,
1560
+ "onUpdate:modelValue": o[6] || (o[6] = (t) => ue.value = t),
1561
+ class: "flex-1 min-h-0 flex flex-col",
1562
+ onSave: Ze
1563
+ }, null, 8, ["modelValue"])) : a.value === "card" ? (x(), P(mo, {
1564
+ key: 2,
1565
+ card: Pe.value,
1566
+ table: Te.value,
1567
+ class: "flex-1 min-h-0",
1568
+ onSave: ft
1569
+ }, null, 8, ["card", "table"])) : a.value === "metadata" ? (x(), P(Qt, {
1570
+ key: 3,
1571
+ data: c.value,
1572
+ "entity-id": y.value,
1573
+ "entity-type": "css",
1574
+ onSaved: Ae,
1575
+ onEditCssBounds: rt
1576
+ }, null, 8, ["data", "entity-id"])) : A("", !0)
1577
+ ], 64))
1578
+ ])
1579
+ ])
1580
+ ], 2)) : A("", !0)
1581
+ ]));
1582
+ }
1583
+ });
1584
+ export {
1585
+ La as default
1586
+ };