zenit-sdk 0.0.2 → 0.0.3
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.
- package/dist/chunk-R73LRYVJ.mjs +3060 -0
- package/dist/chunk-R73LRYVJ.mjs.map +1 -0
- package/dist/{chat.service-Dr9qCnuT.d.mts → index-Da0hFqDL.d.mts} +187 -1
- package/dist/{chat.service-Dr9qCnuT.d.ts → index-Da0hFqDL.d.ts} +187 -1
- package/dist/index.d.mts +5 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.js +2764 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +51 -3
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +3 -183
- package/dist/react/index.d.ts +3 -183
- package/dist/react/index.js +38 -35
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +25 -2712
- package/dist/react/index.mjs.map +1 -1
- package/package.json +27 -7
- package/dist/chunk-4Y7JCMGR.mjs +0 -330
- package/dist/chunk-4Y7JCMGR.mjs.map +0 -1
package/dist/chunk-4Y7JCMGR.mjs
DELETED
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
// src/maps/helpers.ts
|
|
2
|
-
function toNumber(value) {
|
|
3
|
-
if (typeof value === "number" && Number.isFinite(value)) {
|
|
4
|
-
return value;
|
|
5
|
-
}
|
|
6
|
-
if (typeof value === "string") {
|
|
7
|
-
const parsed = parseFloat(value);
|
|
8
|
-
if (Number.isFinite(parsed)) {
|
|
9
|
-
return parsed;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
return void 0;
|
|
13
|
-
}
|
|
14
|
-
function clampOpacity(value) {
|
|
15
|
-
if (!Number.isFinite(value ?? NaN)) {
|
|
16
|
-
return 1;
|
|
17
|
-
}
|
|
18
|
-
return Math.min(1, Math.max(0, value ?? 1));
|
|
19
|
-
}
|
|
20
|
-
function resolveLayerId(mapLayer) {
|
|
21
|
-
if (mapLayer.layerId !== void 0 && mapLayer.layerId !== null) {
|
|
22
|
-
return mapLayer.layerId;
|
|
23
|
-
}
|
|
24
|
-
const embedded = mapLayer.layer;
|
|
25
|
-
return embedded?.id;
|
|
26
|
-
}
|
|
27
|
-
function extractMapDto(map) {
|
|
28
|
-
if (map && typeof map === "object" && "data" in map) {
|
|
29
|
-
const data = map.data;
|
|
30
|
-
return data ?? null;
|
|
31
|
-
}
|
|
32
|
-
if (map && typeof map === "object") {
|
|
33
|
-
return map;
|
|
34
|
-
}
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
function normalizeMapCenter(map) {
|
|
38
|
-
const center = map.settings?.center;
|
|
39
|
-
if (Array.isArray(center) && center.length >= 2) {
|
|
40
|
-
const [lon, lat] = center;
|
|
41
|
-
return {
|
|
42
|
-
...map,
|
|
43
|
-
settings: {
|
|
44
|
-
...map.settings,
|
|
45
|
-
center: { lon, lat }
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return map;
|
|
50
|
-
}
|
|
51
|
-
function normalizeMapLayers(mapOrResponse) {
|
|
52
|
-
const map = extractMapDto(mapOrResponse);
|
|
53
|
-
if (!map?.mapLayers) {
|
|
54
|
-
return [];
|
|
55
|
-
}
|
|
56
|
-
const normalized = [];
|
|
57
|
-
map.mapLayers.forEach((mapLayer, index) => {
|
|
58
|
-
const layerId = resolveLayerId(mapLayer);
|
|
59
|
-
if (layerId === void 0) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const embeddedLayer = mapLayer.layer;
|
|
63
|
-
const visible = mapLayer.isVisible !== false;
|
|
64
|
-
const opacity = clampOpacity(toNumber(mapLayer.opacity) ?? 1);
|
|
65
|
-
const layerType = embeddedLayer?.layerType ?? mapLayer.layerType;
|
|
66
|
-
const geometryType = embeddedLayer?.geometryType ?? mapLayer.geometryType;
|
|
67
|
-
const layerName = embeddedLayer?.name ?? mapLayer.name;
|
|
68
|
-
const orderCandidate = toNumber(mapLayer.displayOrder) ?? toNumber(mapLayer.order) ?? toNumber(embeddedLayer?.displayOrder) ?? index;
|
|
69
|
-
normalized.push({
|
|
70
|
-
layerId,
|
|
71
|
-
displayOrder: orderCandidate ?? index,
|
|
72
|
-
isVisible: visible,
|
|
73
|
-
opacity,
|
|
74
|
-
layer: embeddedLayer,
|
|
75
|
-
layerType,
|
|
76
|
-
geometryType,
|
|
77
|
-
layerName,
|
|
78
|
-
mapLayer
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
return normalized.sort((a, b) => a.displayOrder - b.displayOrder);
|
|
82
|
-
}
|
|
83
|
-
function computeBBoxFromFeature(feature) {
|
|
84
|
-
if (!feature || typeof feature !== "object") return null;
|
|
85
|
-
const geometry = feature.geometry;
|
|
86
|
-
if (!geometry || !("coordinates" in geometry)) return null;
|
|
87
|
-
const coords = [];
|
|
88
|
-
const collect = (candidate) => {
|
|
89
|
-
if (!Array.isArray(candidate)) return;
|
|
90
|
-
if (candidate.length === 2 && typeof candidate[0] === "number" && typeof candidate[1] === "number") {
|
|
91
|
-
coords.push([candidate[0], candidate[1]]);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
candidate.forEach((entry) => collect(entry));
|
|
95
|
-
};
|
|
96
|
-
collect(geometry.coordinates);
|
|
97
|
-
if (coords.length === 0) return null;
|
|
98
|
-
const [firstLon, firstLat] = coords[0];
|
|
99
|
-
const bbox = { minLon: firstLon, minLat: firstLat, maxLon: firstLon, maxLat: firstLat };
|
|
100
|
-
coords.forEach(([lon, lat]) => {
|
|
101
|
-
bbox.minLon = Math.min(bbox.minLon, lon);
|
|
102
|
-
bbox.minLat = Math.min(bbox.minLat, lat);
|
|
103
|
-
bbox.maxLon = Math.max(bbox.maxLon, lon);
|
|
104
|
-
bbox.maxLat = Math.max(bbox.maxLat, lat);
|
|
105
|
-
});
|
|
106
|
-
return bbox;
|
|
107
|
-
}
|
|
108
|
-
function centroidFromBBox(bbox) {
|
|
109
|
-
return [(bbox.minLat + bbox.maxLat) / 2, (bbox.minLon + bbox.maxLon) / 2];
|
|
110
|
-
}
|
|
111
|
-
function applyFilteredGeoJSONStrategy(options) {
|
|
112
|
-
const layerControls = options.normalizedLayers.map((entry) => ({
|
|
113
|
-
layerId: entry.layerId,
|
|
114
|
-
visible: entry.isVisible,
|
|
115
|
-
opacity: entry.opacity
|
|
116
|
-
}));
|
|
117
|
-
return {
|
|
118
|
-
overlay: options.filteredGeojson,
|
|
119
|
-
metadata: options.metadata,
|
|
120
|
-
layerControls
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// src/engine/LayerStateEngine.ts
|
|
125
|
-
function clampOpacity2(value) {
|
|
126
|
-
if (typeof value === "number" && Number.isFinite(value)) {
|
|
127
|
-
return Math.min(1, Math.max(0, value));
|
|
128
|
-
}
|
|
129
|
-
if (typeof value === "string") {
|
|
130
|
-
const parsed = parseFloat(value);
|
|
131
|
-
if (Number.isFinite(parsed)) {
|
|
132
|
-
return Math.min(1, Math.max(0, parsed));
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return 1;
|
|
136
|
-
}
|
|
137
|
-
var resolveBaseVisibility = (_layer) => false;
|
|
138
|
-
function resolveBaseOpacity(layer) {
|
|
139
|
-
if ("opacity" in layer) {
|
|
140
|
-
return clampOpacity2(layer.opacity);
|
|
141
|
-
}
|
|
142
|
-
return 1;
|
|
143
|
-
}
|
|
144
|
-
function toEffectiveState(base, override) {
|
|
145
|
-
const overrideVisible = override?.overrideVisible ?? void 0;
|
|
146
|
-
const overrideOpacity = override?.overrideOpacity ?? void 0;
|
|
147
|
-
const opacitySource = overrideOpacity !== void 0 && overrideOpacity !== null ? overrideOpacity : base.baseOpacity;
|
|
148
|
-
return {
|
|
149
|
-
layerId: base.layerId,
|
|
150
|
-
baseVisible: base.baseVisible,
|
|
151
|
-
baseOpacity: base.baseOpacity,
|
|
152
|
-
overrideVisible,
|
|
153
|
-
overrideOpacity,
|
|
154
|
-
visible: overrideVisible ?? base.baseVisible,
|
|
155
|
-
opacity: clampOpacity2(opacitySource)
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
function initLayerStates(mapLayers) {
|
|
159
|
-
const bases = mapLayers.filter((layer) => layer.layerId !== void 0).map((layer) => ({
|
|
160
|
-
layerId: layer.layerId,
|
|
161
|
-
baseVisible: resolveBaseVisibility(layer),
|
|
162
|
-
baseOpacity: resolveBaseOpacity(layer)
|
|
163
|
-
}));
|
|
164
|
-
return bases.map((base) => toEffectiveState(base));
|
|
165
|
-
}
|
|
166
|
-
function applyLayerOverrides(states, overrides) {
|
|
167
|
-
const overrideMap = /* @__PURE__ */ new Map();
|
|
168
|
-
overrides.forEach((entry) => overrideMap.set(entry.layerId, entry));
|
|
169
|
-
return states.map((state) => {
|
|
170
|
-
const nextOverride = overrideMap.get(state.layerId);
|
|
171
|
-
const mergedOverrideVisible = nextOverride && "overrideVisible" in nextOverride && nextOverride.overrideVisible !== void 0 ? nextOverride.overrideVisible : state.overrideVisible;
|
|
172
|
-
const mergedOverrideOpacity = nextOverride && "overrideOpacity" in nextOverride && nextOverride.overrideOpacity !== void 0 ? nextOverride.overrideOpacity : state.overrideOpacity;
|
|
173
|
-
return toEffectiveState(state, {
|
|
174
|
-
layerId: state.layerId,
|
|
175
|
-
overrideVisible: mergedOverrideVisible ?? void 0,
|
|
176
|
-
overrideOpacity: mergedOverrideOpacity ?? void 0
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
function resetOverrides(states) {
|
|
181
|
-
return states.map((state) => toEffectiveState(state));
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// src/ai/chat.service.ts
|
|
185
|
-
var DEFAULT_ERROR_MESSAGE = "No fue posible completar la solicitud al asistente.";
|
|
186
|
-
var normalizeBaseUrl = (baseUrl) => baseUrl.replace(/\/$/, "");
|
|
187
|
-
var resolveBaseUrl = (config, options) => {
|
|
188
|
-
const baseUrl = options?.baseUrl ?? config?.baseUrl;
|
|
189
|
-
if (!baseUrl) {
|
|
190
|
-
throw new Error("baseUrl es requerido para usar el chat de Zenit AI.");
|
|
191
|
-
}
|
|
192
|
-
return normalizeBaseUrl(baseUrl);
|
|
193
|
-
};
|
|
194
|
-
var resolveAccessToken = async (config, options) => {
|
|
195
|
-
if (options?.accessToken) return options.accessToken;
|
|
196
|
-
if (config?.accessToken) return config.accessToken;
|
|
197
|
-
if (options?.getAccessToken) return await options.getAccessToken();
|
|
198
|
-
if (config?.getAccessToken) return await config.getAccessToken();
|
|
199
|
-
return void 0;
|
|
200
|
-
};
|
|
201
|
-
var buildAuthHeaders = (token) => {
|
|
202
|
-
if (!token) return {};
|
|
203
|
-
return { Authorization: `Bearer ${token}` };
|
|
204
|
-
};
|
|
205
|
-
var parseError = async (response) => {
|
|
206
|
-
try {
|
|
207
|
-
const contentType = response.headers.get("content-type") ?? "";
|
|
208
|
-
if (contentType.includes("application/json")) {
|
|
209
|
-
const payload = await response.json();
|
|
210
|
-
const message = payload?.message ?? DEFAULT_ERROR_MESSAGE;
|
|
211
|
-
return new Error(message);
|
|
212
|
-
}
|
|
213
|
-
const text = await response.text();
|
|
214
|
-
return new Error(text || DEFAULT_ERROR_MESSAGE);
|
|
215
|
-
} catch (error) {
|
|
216
|
-
return error instanceof Error ? error : new Error(DEFAULT_ERROR_MESSAGE);
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
var sendMessage = async (mapId, request, options, config) => {
|
|
220
|
-
const baseUrl = resolveBaseUrl(config, options);
|
|
221
|
-
const token = await resolveAccessToken(config, options);
|
|
222
|
-
const response = await fetch(`${baseUrl}/ai/maps/chat/${mapId}`, {
|
|
223
|
-
method: "POST",
|
|
224
|
-
headers: {
|
|
225
|
-
"Content-Type": "application/json",
|
|
226
|
-
...buildAuthHeaders(token)
|
|
227
|
-
},
|
|
228
|
-
body: JSON.stringify(request),
|
|
229
|
-
signal: options?.signal
|
|
230
|
-
});
|
|
231
|
-
if (!response.ok) {
|
|
232
|
-
throw await parseError(response);
|
|
233
|
-
}
|
|
234
|
-
return await response.json();
|
|
235
|
-
};
|
|
236
|
-
var mergeResponse = (previous, chunk, aggregatedAnswer) => ({
|
|
237
|
-
...previous ?? chunk,
|
|
238
|
-
...chunk,
|
|
239
|
-
answer: aggregatedAnswer
|
|
240
|
-
});
|
|
241
|
-
var resolveAggregatedAnswer = (current, incoming) => {
|
|
242
|
-
if (!incoming) return current;
|
|
243
|
-
if (incoming.startsWith(current)) return incoming;
|
|
244
|
-
return current + incoming;
|
|
245
|
-
};
|
|
246
|
-
var sendMessageStream = async (mapId, request, callbacks = {}, options, config) => {
|
|
247
|
-
const baseUrl = resolveBaseUrl(config, options);
|
|
248
|
-
const token = await resolveAccessToken(config, options);
|
|
249
|
-
const response = await fetch(`${baseUrl}/ai/maps/chat/${mapId}/stream`, {
|
|
250
|
-
method: "POST",
|
|
251
|
-
headers: {
|
|
252
|
-
Accept: "text/event-stream",
|
|
253
|
-
"Content-Type": "application/json",
|
|
254
|
-
...buildAuthHeaders(token)
|
|
255
|
-
},
|
|
256
|
-
body: JSON.stringify(request),
|
|
257
|
-
signal: options?.signal
|
|
258
|
-
});
|
|
259
|
-
if (!response.ok) {
|
|
260
|
-
const error = await parseError(response);
|
|
261
|
-
callbacks.onError?.(error);
|
|
262
|
-
throw error;
|
|
263
|
-
}
|
|
264
|
-
const reader = response.body?.getReader();
|
|
265
|
-
if (!reader) {
|
|
266
|
-
const error = new Error("No se pudo iniciar el streaming de Zenit AI.");
|
|
267
|
-
callbacks.onError?.(error);
|
|
268
|
-
throw error;
|
|
269
|
-
}
|
|
270
|
-
const decoder = new TextDecoder("utf-8");
|
|
271
|
-
let buffer = "";
|
|
272
|
-
let aggregated = "";
|
|
273
|
-
let latestResponse = null;
|
|
274
|
-
try {
|
|
275
|
-
while (true) {
|
|
276
|
-
const { value, done } = await reader.read();
|
|
277
|
-
if (done) break;
|
|
278
|
-
buffer += decoder.decode(value, { stream: true });
|
|
279
|
-
const lines = buffer.split(/\r?\n/);
|
|
280
|
-
buffer = lines.pop() ?? "";
|
|
281
|
-
for (const line of lines) {
|
|
282
|
-
const trimmed = line.trim();
|
|
283
|
-
if (!trimmed || trimmed.startsWith("event:")) continue;
|
|
284
|
-
if (!trimmed.startsWith("data:")) continue;
|
|
285
|
-
const payload = trimmed.replace(/^data:\s*/, "");
|
|
286
|
-
if (!payload || payload === "[DONE]") continue;
|
|
287
|
-
try {
|
|
288
|
-
const parsed = JSON.parse(payload);
|
|
289
|
-
aggregated = resolveAggregatedAnswer(aggregated, parsed.answer ?? "");
|
|
290
|
-
latestResponse = mergeResponse(latestResponse, parsed, aggregated);
|
|
291
|
-
if (latestResponse) {
|
|
292
|
-
callbacks.onChunk?.(latestResponse, aggregated);
|
|
293
|
-
}
|
|
294
|
-
} catch (error) {
|
|
295
|
-
callbacks.onError?.(error);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
} catch (error) {
|
|
300
|
-
callbacks.onError?.(error);
|
|
301
|
-
throw error;
|
|
302
|
-
}
|
|
303
|
-
if (!latestResponse) {
|
|
304
|
-
const error = new Error(DEFAULT_ERROR_MESSAGE);
|
|
305
|
-
callbacks.onError?.(error);
|
|
306
|
-
throw error;
|
|
307
|
-
}
|
|
308
|
-
callbacks.onComplete?.(latestResponse);
|
|
309
|
-
return latestResponse;
|
|
310
|
-
};
|
|
311
|
-
var createChatService = (config) => ({
|
|
312
|
-
sendMessage: (mapId, request, options) => sendMessage(mapId, request, options, config),
|
|
313
|
-
sendMessageStream: (mapId, request, callbacks, options) => sendMessageStream(mapId, request, callbacks, options, config)
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
export {
|
|
317
|
-
extractMapDto,
|
|
318
|
-
normalizeMapCenter,
|
|
319
|
-
normalizeMapLayers,
|
|
320
|
-
computeBBoxFromFeature,
|
|
321
|
-
centroidFromBBox,
|
|
322
|
-
applyFilteredGeoJSONStrategy,
|
|
323
|
-
initLayerStates,
|
|
324
|
-
applyLayerOverrides,
|
|
325
|
-
resetOverrides,
|
|
326
|
-
sendMessage,
|
|
327
|
-
sendMessageStream,
|
|
328
|
-
createChatService
|
|
329
|
-
};
|
|
330
|
-
//# sourceMappingURL=chunk-4Y7JCMGR.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/maps/helpers.ts","../src/engine/LayerStateEngine.ts","../src/ai/chat.service.ts"],"sourcesContent":["import type {\r\n Bbox,\r\n FilterMultipleMetadata,\r\n GeoJsonFeature,\r\n GeoJsonFeatureCollection,\r\n LayerDto,\r\n} from '../layers/types';\r\nimport type { MapDto, MapLayerConfig, NormalizedMapLayer } from './types';\r\n\r\nfunction toNumber(value: unknown): number | undefined {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n if (typeof value === 'string') {\r\n const parsed = parseFloat(value);\r\n if (Number.isFinite(parsed)) {\r\n return parsed;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction clampOpacity(value: number | undefined): number {\r\n if (!Number.isFinite(value ?? NaN)) {\r\n return 1;\r\n }\r\n return Math.min(1, Math.max(0, value ?? 1));\r\n}\r\n\r\nfunction resolveLayerId(mapLayer: MapLayerConfig): number | string | undefined {\r\n if (mapLayer.layerId !== undefined && mapLayer.layerId !== null) {\r\n return mapLayer.layerId;\r\n }\r\n const embedded = (mapLayer as MapLayerConfig & { layer?: LayerDto }).layer;\r\n return embedded?.id;\r\n}\r\n\r\nexport function extractMapDto(map: unknown): MapDto | null {\r\n if (map && typeof map === 'object' && 'data' in map) {\r\n const data = (map as { data?: MapDto | null }).data;\r\n return data ?? null;\r\n }\r\n if (map && typeof map === 'object') {\r\n return map as MapDto;\r\n }\r\n return null;\r\n}\r\n\r\nexport function normalizeMapCenter(map: MapDto): MapDto {\r\n const center = map.settings?.center as unknown;\r\n\r\n if (Array.isArray(center) && center.length >= 2) {\r\n const [lon, lat] = center;\r\n return {\r\n ...map,\r\n settings: {\r\n ...map.settings,\r\n center: { lon, lat },\r\n },\r\n };\r\n }\r\n\r\n return map;\r\n}\r\n\r\nexport function normalizeMapLayers(mapOrResponse: unknown): NormalizedMapLayer[] {\r\n const map = extractMapDto(mapOrResponse);\r\n if (!map?.mapLayers) {\r\n return [];\r\n }\r\n\r\n const normalized: NormalizedMapLayer[] = [];\r\n\r\n map.mapLayers.forEach((mapLayer, index) => {\r\n const layerId = resolveLayerId(mapLayer);\r\n if (layerId === undefined) {\r\n return;\r\n }\r\n\r\n const embeddedLayer = (mapLayer as MapLayerConfig & { layer?: LayerDto }).layer;\r\n const visible = mapLayer.isVisible !== false;\r\n const opacity = clampOpacity(toNumber(mapLayer.opacity) ?? 1);\r\n const layerType = embeddedLayer?.layerType ?? (mapLayer as { layerType?: string }).layerType;\r\n const geometryType =\r\n (embeddedLayer as { geometryType?: string } | undefined)?.geometryType ??\r\n (mapLayer as { geometryType?: string }).geometryType;\r\n const layerName = embeddedLayer?.name ?? (mapLayer as { name?: string }).name;\r\n const orderCandidate =\r\n toNumber((mapLayer as { displayOrder?: number | string }).displayOrder) ??\r\n toNumber(mapLayer.order) ??\r\n toNumber((embeddedLayer as { displayOrder?: number | string } | undefined)?.displayOrder) ??\r\n index;\r\n\r\n normalized.push({\r\n layerId,\r\n displayOrder: orderCandidate ?? index,\r\n isVisible: visible,\r\n opacity,\r\n layer: embeddedLayer,\r\n layerType,\r\n geometryType,\r\n layerName,\r\n mapLayer,\r\n });\r\n });\r\n\r\n return normalized.sort((a, b) => a.displayOrder - b.displayOrder);\r\n}\r\n\r\nexport function computeBBoxFromFeature(feature?: GeoJsonFeature | null): Bbox | null {\r\n if (!feature || typeof feature !== 'object') return null;\r\n\r\n const geometry = (feature as { geometry?: { coordinates?: unknown } }).geometry;\r\n if (!geometry || !('coordinates' in geometry)) return null;\r\n\r\n const coords: Array<[number, number]> = [];\r\n\r\n const collect = (candidate: unknown) => {\r\n if (!Array.isArray(candidate)) return;\r\n if (\r\n candidate.length === 2 &&\r\n typeof candidate[0] === 'number' &&\r\n typeof candidate[1] === 'number'\r\n ) {\r\n coords.push([candidate[0], candidate[1]]);\r\n return;\r\n }\r\n\r\n candidate.forEach((entry) => collect(entry));\r\n };\r\n\r\n collect(geometry.coordinates);\r\n\r\n if (coords.length === 0) return null;\r\n\r\n const [firstLon, firstLat] = coords[0];\r\n const bbox: Bbox = { minLon: firstLon, minLat: firstLat, maxLon: firstLon, maxLat: firstLat };\r\n\r\n coords.forEach(([lon, lat]) => {\r\n bbox.minLon = Math.min(bbox.minLon, lon);\r\n bbox.minLat = Math.min(bbox.minLat, lat);\r\n bbox.maxLon = Math.max(bbox.maxLon, lon);\r\n bbox.maxLat = Math.max(bbox.maxLat, lat);\r\n });\r\n\r\n return bbox;\r\n}\r\n\r\nexport function centroidFromBBox(bbox: Bbox): [number, number] {\r\n return [(bbox.minLat + bbox.maxLat) / 2, (bbox.minLon + bbox.maxLon) / 2];\r\n}\r\n\r\nexport interface FilteredGeoJSONApplication {\r\n overlay: GeoJsonFeatureCollection | null;\r\n metadata?: FilterMultipleMetadata;\r\n layerControls: Array<{\r\n layerId: number | string;\r\n visible: boolean;\r\n opacity: number;\r\n }>;\r\n}\r\n\r\nexport function applyFilteredGeoJSONStrategy(options: {\r\n normalizedLayers: NormalizedMapLayer[];\r\n filteredGeojson: GeoJsonFeatureCollection | null;\r\n metadata?: FilterMultipleMetadata;\r\n}): FilteredGeoJSONApplication {\r\n const layerControls = options.normalizedLayers.map((entry) => ({\r\n layerId: entry.layerId,\r\n visible: entry.isVisible,\r\n opacity: entry.opacity,\r\n }));\r\n\r\n return {\r\n overlay: options.filteredGeojson,\r\n metadata: options.metadata,\r\n layerControls,\r\n };\r\n}\r\n","import type { MapLayerConfig, NormalizedMapLayer } from '../maps/types';\r\n\r\ntype LayerLike = Pick<MapLayerConfig | NormalizedMapLayer, 'layerId' | 'isVisible' | 'opacity'>;\r\n\r\nexport interface LayerBaseState {\r\n layerId: number | string;\r\n baseVisible: boolean;\r\n baseOpacity: number;\r\n}\r\n\r\nexport interface LayerOverrideState {\r\n layerId: number | string;\r\n overrideVisible?: boolean | null;\r\n overrideOpacity?: number | string | null;\r\n}\r\n\r\nexport interface EffectiveLayerState extends LayerBaseState, LayerOverrideState {\r\n visible: boolean;\r\n opacity: number;\r\n}\r\n\r\nfunction clampOpacity(value: number | string | null | undefined): number {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return Math.min(1, Math.max(0, value));\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const parsed = parseFloat(value);\r\n if (Number.isFinite(parsed)) {\r\n return Math.min(1, Math.max(0, parsed));\r\n }\r\n }\r\n\r\n return 1;\r\n}\r\n\r\n// The SDK mirrors the frontend default: layers start hidden until toggled externally.\r\nconst resolveBaseVisibility = (_layer?: LayerLike): boolean => false;\r\n\r\nfunction resolveBaseOpacity(layer: LayerLike): number {\r\n if ('opacity' in layer) {\r\n return clampOpacity(layer.opacity as number | string | null | undefined);\r\n }\r\n\r\n return 1;\r\n}\r\n\r\nfunction toEffectiveState(base: LayerBaseState, override?: LayerOverrideState | null): EffectiveLayerState {\r\n const overrideVisible = override?.overrideVisible ?? undefined;\r\n const overrideOpacity = override?.overrideOpacity ?? undefined;\r\n\r\n const opacitySource =\r\n overrideOpacity !== undefined && overrideOpacity !== null ? overrideOpacity : base.baseOpacity;\r\n\r\n return {\r\n layerId: base.layerId,\r\n baseVisible: base.baseVisible,\r\n baseOpacity: base.baseOpacity,\r\n overrideVisible,\r\n overrideOpacity,\r\n visible: overrideVisible ?? base.baseVisible,\r\n opacity: clampOpacity(opacitySource),\r\n };\r\n}\r\n\r\nexport function initLayerStates(mapLayers: LayerLike[]): EffectiveLayerState[] {\r\n const bases: LayerBaseState[] = mapLayers\r\n .filter((layer): layer is LayerLike & { layerId: number | string } => layer.layerId !== undefined)\r\n .map((layer) => ({\r\n layerId: layer.layerId as number | string,\r\n baseVisible: resolveBaseVisibility(layer),\r\n baseOpacity: resolveBaseOpacity(layer),\r\n }));\r\n\r\n return bases.map((base) => toEffectiveState(base));\r\n}\r\n\r\nexport function applyLayerOverrides(\r\n states: EffectiveLayerState[],\r\n overrides: LayerOverrideState[],\r\n): EffectiveLayerState[] {\r\n const overrideMap = new Map<number | string, LayerOverrideState>();\r\n overrides.forEach((entry) => overrideMap.set(entry.layerId, entry));\r\n\r\n return states.map((state) => {\r\n const nextOverride = overrideMap.get(state.layerId);\r\n const mergedOverrideVisible =\r\n nextOverride && 'overrideVisible' in nextOverride && nextOverride.overrideVisible !== undefined\r\n ? nextOverride.overrideVisible\r\n : state.overrideVisible;\r\n\r\n const mergedOverrideOpacity =\r\n nextOverride && 'overrideOpacity' in nextOverride && nextOverride.overrideOpacity !== undefined\r\n ? nextOverride.overrideOpacity\r\n : state.overrideOpacity;\r\n\r\n return toEffectiveState(state, {\r\n layerId: state.layerId,\r\n overrideVisible: mergedOverrideVisible ?? undefined,\r\n overrideOpacity: mergedOverrideOpacity ?? undefined,\r\n });\r\n });\r\n}\r\n\r\nexport function resetOverrides(states: EffectiveLayerState[]): EffectiveLayerState[] {\r\n return states.map((state) => toEffectiveState(state));\r\n}\r\n","import type { ChatRequestDto, ChatResponseDto } from './types';\r\n\r\nexport interface ChatServiceConfig {\r\n baseUrl: string;\r\n accessToken?: string;\r\n getAccessToken?: () => string | Promise<string>;\r\n}\r\n\r\nexport interface ChatRequestOptions {\r\n baseUrl?: string;\r\n accessToken?: string;\r\n getAccessToken?: () => string | Promise<string>;\r\n signal?: AbortSignal;\r\n}\r\n\r\nexport interface ChatStreamCallbacks {\r\n onChunk?: (chunk: ChatResponseDto, aggregatedText: string) => void;\r\n onComplete?: (response: ChatResponseDto) => void;\r\n onError?: (error: unknown) => void;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = 'No fue posible completar la solicitud al asistente.';\r\n\r\nconst normalizeBaseUrl = (baseUrl: string) => baseUrl.replace(/\\/$/, '');\r\n\r\nconst resolveBaseUrl = (config?: ChatServiceConfig, options?: ChatRequestOptions): string => {\r\n const baseUrl = options?.baseUrl ?? config?.baseUrl;\r\n if (!baseUrl) {\r\n throw new Error('baseUrl es requerido para usar el chat de Zenit AI.');\r\n }\r\n return normalizeBaseUrl(baseUrl);\r\n};\r\n\r\nconst resolveAccessToken = async (\r\n config?: ChatServiceConfig,\r\n options?: ChatRequestOptions\r\n): Promise<string | undefined> => {\r\n if (options?.accessToken) return options.accessToken;\r\n if (config?.accessToken) return config.accessToken;\r\n\r\n if (options?.getAccessToken) return await options.getAccessToken();\r\n if (config?.getAccessToken) return await config.getAccessToken();\r\n\r\n return undefined;\r\n};\r\n\r\nconst buildAuthHeaders = (token?: string): Record<string, string> => {\r\n if (!token) return {};\r\n return { Authorization: `Bearer ${token}` };\r\n};\r\n\r\nconst parseError = async (response: Response): Promise<Error> => {\r\n try {\r\n const contentType = response.headers.get('content-type') ?? '';\r\n if (contentType.includes('application/json')) {\r\n const payload = await response.json();\r\n const message = payload?.message ?? DEFAULT_ERROR_MESSAGE;\r\n return new Error(message);\r\n }\r\n\r\n const text = await response.text();\r\n return new Error(text || DEFAULT_ERROR_MESSAGE);\r\n } catch (error) {\r\n return error instanceof Error ? error : new Error(DEFAULT_ERROR_MESSAGE);\r\n }\r\n};\r\n\r\nexport const sendMessage = async (\r\n mapId: number,\r\n request: ChatRequestDto,\r\n options?: ChatRequestOptions,\r\n config?: ChatServiceConfig\r\n): Promise<ChatResponseDto> => {\r\n const baseUrl = resolveBaseUrl(config, options);\r\n const token = await resolveAccessToken(config, options);\r\n const response = await fetch(`${baseUrl}/ai/maps/chat/${mapId}`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...buildAuthHeaders(token),\r\n },\r\n body: JSON.stringify(request),\r\n signal: options?.signal,\r\n });\r\n\r\n if (!response.ok) {\r\n throw await parseError(response);\r\n }\r\n\r\n return (await response.json()) as ChatResponseDto;\r\n};\r\n\r\nconst mergeResponse = (\r\n previous: ChatResponseDto | null,\r\n chunk: ChatResponseDto,\r\n aggregatedAnswer: string\r\n): ChatResponseDto => ({\r\n ...(previous ?? chunk),\r\n ...chunk,\r\n answer: aggregatedAnswer,\r\n});\r\n\r\nconst resolveAggregatedAnswer = (current: string, incoming: string): string => {\r\n if (!incoming) return current;\r\n if (incoming.startsWith(current)) return incoming;\r\n return current + incoming;\r\n};\r\n\r\nexport const sendMessageStream = async (\r\n mapId: number,\r\n request: ChatRequestDto,\r\n callbacks: ChatStreamCallbacks = {},\r\n options?: ChatRequestOptions,\r\n config?: ChatServiceConfig\r\n): Promise<ChatResponseDto> => {\r\n const baseUrl = resolveBaseUrl(config, options);\r\n const token = await resolveAccessToken(config, options);\r\n\r\n const response = await fetch(`${baseUrl}/ai/maps/chat/${mapId}/stream`, {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n ...buildAuthHeaders(token),\r\n },\r\n body: JSON.stringify(request),\r\n signal: options?.signal,\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await parseError(response);\r\n callbacks.onError?.(error);\r\n throw error;\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) {\r\n const error = new Error('No se pudo iniciar el streaming de Zenit AI.');\r\n callbacks.onError?.(error);\r\n throw error;\r\n }\r\n\r\n const decoder = new TextDecoder('utf-8');\r\n let buffer = '';\r\n let aggregated = '';\r\n let latestResponse: ChatResponseDto | null = null;\r\n\r\n try {\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split(/\\r?\\n/);\r\n buffer = lines.pop() ?? '';\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith('event:')) continue;\r\n if (!trimmed.startsWith('data:')) continue;\r\n\r\n const payload = trimmed.replace(/^data:\\s*/, '');\r\n if (!payload || payload === '[DONE]') continue;\r\n\r\n try {\r\n const parsed = JSON.parse(payload) as ChatResponseDto;\r\n aggregated = resolveAggregatedAnswer(aggregated, parsed.answer ?? '');\r\n latestResponse = mergeResponse(latestResponse, parsed, aggregated);\r\n if (latestResponse) {\r\n callbacks.onChunk?.(latestResponse, aggregated);\r\n }\r\n } catch (error) {\r\n callbacks.onError?.(error);\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n callbacks.onError?.(error);\r\n throw error;\r\n }\r\n\r\n if (!latestResponse) {\r\n const error = new Error(DEFAULT_ERROR_MESSAGE);\r\n callbacks.onError?.(error);\r\n throw error;\r\n }\r\n\r\n callbacks.onComplete?.(latestResponse);\r\n return latestResponse;\r\n};\r\n\r\nexport const createChatService = (config: ChatServiceConfig) => ({\r\n sendMessage: (mapId: number, request: ChatRequestDto, options?: ChatRequestOptions) =>\r\n sendMessage(mapId, request, options, config),\r\n sendMessageStream: (\r\n mapId: number,\r\n request: ChatRequestDto,\r\n callbacks?: ChatStreamCallbacks,\r\n options?: ChatRequestOptions\r\n ) => sendMessageStream(mapId, request, callbacks, options, config),\r\n});\r\n"],"mappings":";AASA,SAAS,SAAS,OAAoC;AACpD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAS,WAAW,KAAK;AAC/B,QAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAmC;AACvD,MAAI,CAAC,OAAO,SAAS,SAAS,GAAG,GAAG;AAClC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC;AAC5C;AAEA,SAAS,eAAe,UAAuD;AAC7E,MAAI,SAAS,YAAY,UAAa,SAAS,YAAY,MAAM;AAC/D,WAAO,SAAS;AAAA,EAClB;AACA,QAAM,WAAY,SAAmD;AACrE,SAAO,UAAU;AACnB;AAEO,SAAS,cAAc,KAA6B;AACzD,MAAI,OAAO,OAAO,QAAQ,YAAY,UAAU,KAAK;AACnD,UAAM,OAAQ,IAAiC;AAC/C,WAAO,QAAQ;AAAA,EACjB;AACA,MAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,KAAqB;AACtD,QAAM,SAAS,IAAI,UAAU;AAE7B,MAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,UAAU,GAAG;AAC/C,UAAM,CAAC,KAAK,GAAG,IAAI;AACnB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,QACR,GAAG,IAAI;AAAA,QACP,QAAQ,EAAE,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,eAA8C;AAC/E,QAAM,MAAM,cAAc,aAAa;AACvC,MAAI,CAAC,KAAK,WAAW;AACnB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAmC,CAAC;AAE1C,MAAI,UAAU,QAAQ,CAAC,UAAU,UAAU;AACzC,UAAM,UAAU,eAAe,QAAQ;AACvC,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AAEA,UAAM,gBAAiB,SAAmD;AAC1E,UAAM,UAAU,SAAS,cAAc;AACvC,UAAM,UAAU,aAAa,SAAS,SAAS,OAAO,KAAK,CAAC;AAC5D,UAAM,YAAY,eAAe,aAAc,SAAoC;AACnF,UAAM,eACH,eAAyD,gBACzD,SAAuC;AAC1C,UAAM,YAAY,eAAe,QAAS,SAA+B;AACzE,UAAM,iBACJ,SAAU,SAAgD,YAAY,KACtE,SAAS,SAAS,KAAK,KACvB,SAAU,eAAkE,YAAY,KACxF;AAEF,eAAW,KAAK;AAAA,MACd;AAAA,MACA,cAAc,kBAAkB;AAAA,MAChC,WAAW;AAAA,MACX;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,eAAe,EAAE,YAAY;AAClE;AAEO,SAAS,uBAAuB,SAA8C;AACnF,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AAEpD,QAAM,WAAY,QAAqD;AACvE,MAAI,CAAC,YAAY,EAAE,iBAAiB,UAAW,QAAO;AAEtD,QAAM,SAAkC,CAAC;AAEzC,QAAM,UAAU,CAAC,cAAuB;AACtC,QAAI,CAAC,MAAM,QAAQ,SAAS,EAAG;AAC/B,QACE,UAAU,WAAW,KACrB,OAAO,UAAU,CAAC,MAAM,YACxB,OAAO,UAAU,CAAC,MAAM,UACxB;AACA,aAAO,KAAK,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AACxC;AAAA,IACF;AAEA,cAAU,QAAQ,CAAC,UAAU,QAAQ,KAAK,CAAC;AAAA,EAC7C;AAEA,UAAQ,SAAS,WAAW;AAE5B,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QAAM,CAAC,UAAU,QAAQ,IAAI,OAAO,CAAC;AACrC,QAAM,OAAa,EAAE,QAAQ,UAAU,QAAQ,UAAU,QAAQ,UAAU,QAAQ,SAAS;AAE5F,SAAO,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAC7B,SAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,GAAG;AACvC,SAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,GAAG;AACvC,SAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,GAAG;AACvC,SAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,GAAG;AAAA,EACzC,CAAC;AAED,SAAO;AACT;AAEO,SAAS,iBAAiB,MAA8B;AAC7D,SAAO,EAAE,KAAK,SAAS,KAAK,UAAU,IAAI,KAAK,SAAS,KAAK,UAAU,CAAC;AAC1E;AAYO,SAAS,6BAA6B,SAId;AAC7B,QAAM,gBAAgB,QAAQ,iBAAiB,IAAI,CAAC,WAAW;AAAA,IAC7D,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,EACjB,EAAE;AAEF,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,IACjB,UAAU,QAAQ;AAAA,IAClB;AAAA,EACF;AACF;;;AC7JA,SAASA,cAAa,OAAmD;AACvE,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACvC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAS,WAAW,KAAK;AAC/B,QAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,aAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;AAGA,IAAM,wBAAwB,CAAC,WAAgC;AAE/D,SAAS,mBAAmB,OAA0B;AACpD,MAAI,aAAa,OAAO;AACtB,WAAOA,cAAa,MAAM,OAA6C;AAAA,EACzE;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAsB,UAA2D;AACzG,QAAM,kBAAkB,UAAU,mBAAmB;AACrD,QAAM,kBAAkB,UAAU,mBAAmB;AAErD,QAAM,gBACJ,oBAAoB,UAAa,oBAAoB,OAAO,kBAAkB,KAAK;AAErF,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,aAAa,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,IACA,SAAS,mBAAmB,KAAK;AAAA,IACjC,SAASA,cAAa,aAAa;AAAA,EACrC;AACF;AAEO,SAAS,gBAAgB,WAA+C;AAC7E,QAAM,QAA0B,UAC7B,OAAO,CAAC,UAA6D,MAAM,YAAY,MAAS,EAChG,IAAI,CAAC,WAAW;AAAA,IACf,SAAS,MAAM;AAAA,IACf,aAAa,sBAAsB,KAAK;AAAA,IACxC,aAAa,mBAAmB,KAAK;AAAA,EACvC,EAAE;AAEJ,SAAO,MAAM,IAAI,CAAC,SAAS,iBAAiB,IAAI,CAAC;AACnD;AAEO,SAAS,oBACd,QACA,WACuB;AACvB,QAAM,cAAc,oBAAI,IAAyC;AACjE,YAAU,QAAQ,CAAC,UAAU,YAAY,IAAI,MAAM,SAAS,KAAK,CAAC;AAElE,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,UAAM,eAAe,YAAY,IAAI,MAAM,OAAO;AAClD,UAAM,wBACJ,gBAAgB,qBAAqB,gBAAgB,aAAa,oBAAoB,SAClF,aAAa,kBACb,MAAM;AAEZ,UAAM,wBACJ,gBAAgB,qBAAqB,gBAAgB,aAAa,oBAAoB,SAClF,aAAa,kBACb,MAAM;AAEZ,WAAO,iBAAiB,OAAO;AAAA,MAC7B,SAAS,MAAM;AAAA,MACf,iBAAiB,yBAAyB;AAAA,MAC1C,iBAAiB,yBAAyB;AAAA,IAC5C,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,eAAe,QAAsD;AACnF,SAAO,OAAO,IAAI,CAAC,UAAU,iBAAiB,KAAK,CAAC;AACtD;;;ACrFA,IAAM,wBAAwB;AAE9B,IAAM,mBAAmB,CAAC,YAAoB,QAAQ,QAAQ,OAAO,EAAE;AAEvE,IAAM,iBAAiB,CAAC,QAA4B,YAAyC;AAC3F,QAAM,UAAU,SAAS,WAAW,QAAQ;AAC5C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO,iBAAiB,OAAO;AACjC;AAEA,IAAM,qBAAqB,OACzB,QACA,YACgC;AAChC,MAAI,SAAS,YAAa,QAAO,QAAQ;AACzC,MAAI,QAAQ,YAAa,QAAO,OAAO;AAEvC,MAAI,SAAS,eAAgB,QAAO,MAAM,QAAQ,eAAe;AACjE,MAAI,QAAQ,eAAgB,QAAO,MAAM,OAAO,eAAe;AAE/D,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,UAA2C;AACnE,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,SAAO,EAAE,eAAe,UAAU,KAAK,GAAG;AAC5C;AAEA,IAAM,aAAa,OAAO,aAAuC;AAC/D,MAAI;AACF,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,QAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,YAAM,UAAU,MAAM,SAAS,KAAK;AACpC,YAAM,UAAU,SAAS,WAAW;AACpC,aAAO,IAAI,MAAM,OAAO;AAAA,IAC1B;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,IAAI,MAAM,QAAQ,qBAAqB;AAAA,EAChD,SAAS,OAAO;AACd,WAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,qBAAqB;AAAA,EACzE;AACF;AAEO,IAAM,cAAc,OACzB,OACA,SACA,SACA,WAC6B;AAC7B,QAAM,UAAU,eAAe,QAAQ,OAAO;AAC9C,QAAM,QAAQ,MAAM,mBAAmB,QAAQ,OAAO;AACtD,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB,KAAK,IAAI;AAAA,IAC/D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAG,iBAAiB,KAAK;AAAA,IAC3B;AAAA,IACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC5B,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,WAAW,QAAQ;AAAA,EACjC;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;AAEA,IAAM,gBAAgB,CACpB,UACA,OACA,sBACqB;AAAA,EACrB,GAAI,YAAY;AAAA,EAChB,GAAG;AAAA,EACH,QAAQ;AACV;AAEA,IAAM,0BAA0B,CAAC,SAAiB,aAA6B;AAC7E,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,SAAS,WAAW,OAAO,EAAG,QAAO;AACzC,SAAO,UAAU;AACnB;AAEO,IAAM,oBAAoB,OAC/B,OACA,SACA,YAAiC,CAAC,GAClC,SACA,WAC6B;AAC7B,QAAM,UAAU,eAAe,QAAQ,OAAO;AAC9C,QAAM,QAAQ,MAAM,mBAAmB,QAAQ,OAAO;AAEtD,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB,KAAK,WAAW;AAAA,IACtE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,GAAG,iBAAiB,KAAK;AAAA,IAC3B;AAAA,IACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC5B,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,WAAW,QAAQ;AACvC,cAAU,UAAU,KAAK;AACzB,UAAM;AAAA,EACR;AAEA,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,MAAI,CAAC,QAAQ;AACX,UAAM,QAAQ,IAAI,MAAM,8CAA8C;AACtE,cAAU,UAAU,KAAK;AACzB,UAAM;AAAA,EACR;AAEA,QAAM,UAAU,IAAI,YAAY,OAAO;AACvC,MAAI,SAAS;AACb,MAAI,aAAa;AACjB,MAAI,iBAAyC;AAE7C,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,OAAO,KAAK,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,OAAO;AAClC,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAU,KAAK,KAAK;AAC1B,YAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,EAAG;AAC9C,YAAI,CAAC,QAAQ,WAAW,OAAO,EAAG;AAElC,cAAM,UAAU,QAAQ,QAAQ,aAAa,EAAE;AAC/C,YAAI,CAAC,WAAW,YAAY,SAAU;AAEtC,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,OAAO;AACjC,uBAAa,wBAAwB,YAAY,OAAO,UAAU,EAAE;AACpE,2BAAiB,cAAc,gBAAgB,QAAQ,UAAU;AACjE,cAAI,gBAAgB;AAClB,sBAAU,UAAU,gBAAgB,UAAU;AAAA,UAChD;AAAA,QACF,SAAS,OAAO;AACd,oBAAU,UAAU,KAAK;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,cAAU,UAAU,KAAK;AACzB,UAAM;AAAA,EACR;AAEA,MAAI,CAAC,gBAAgB;AACnB,UAAM,QAAQ,IAAI,MAAM,qBAAqB;AAC7C,cAAU,UAAU,KAAK;AACzB,UAAM;AAAA,EACR;AAEA,YAAU,aAAa,cAAc;AACrC,SAAO;AACT;AAEO,IAAM,oBAAoB,CAAC,YAA+B;AAAA,EAC/D,aAAa,CAAC,OAAe,SAAyB,YACpD,YAAY,OAAO,SAAS,SAAS,MAAM;AAAA,EAC7C,mBAAmB,CACjB,OACA,SACA,WACA,YACG,kBAAkB,OAAO,SAAS,WAAW,SAAS,MAAM;AACnE;","names":["clampOpacity"]}
|