UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

1,551 lines (1,550 loc) • 46.1 kB
(function() { try { var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {}; e.SENTRY_RELEASE = { id: "3.47.0" }; var t = new e.Error().stack; t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "0e590129-0e5c-49de-9328-0bcb925f415c", e._sentryDebugIdIdentifier = "sentry-dbid-0e590129-0e5c-49de-9328-0bcb925f415c"); } catch {} })(); import { r as e } from "./rolldown-runtime-5rOLGCTp.js"; import { h as t } from "./i18n-DlquqKCP.js"; import { t as n } from "./react-XuvSZP7j.js"; import { i as r, l as i } from "./mobx.module-BTnTbXnp.js"; import { t as a } from "./loadImage-iqS2KHgN.js"; import { r as o } from "./debug-context-CLE9u3W1.js"; import { a as s, l as c, t as l, u } from "./store-DTvNQcN7.js"; import { $ as d, $t as f, Bt as p, C as m, Ct as h, Dt as g, Ft as _, It as v, Jt as y, K as b, Lt as x, Mt as S, Nt as C, Ot as w, Pt as T, Q as E, Rt as D, S as O, Tt as k, Wt as A, X as ee, Xt as j, Y as te, Z as M, an as ne, at as re, bt as ie, ct as ae, f as oe, ht as N, i as se, k as ce, m as le, nn as P, nt as ue, ot as de, p as fe, q as pe, rn as me, sn as F, st as he, t as ge, tn as _e, wt as ve, xt as ye, zt as be } from "./LayerStore-DCg-juRT.js"; import { l as xe, y as Se } from "./wayfinding-BUQns13Y.js"; import { i as Ce, n as we } from "./viewport-DBuFXrrj.js"; import { i as Te, r as Ee } from "./scene-CeKqMicD.js"; //#region src/components/Map/traffic/trafficLayers.ts var De = "traffic_route", Oe = "traffic_route_stop", I = "traffic_vehicles", ke = "build_route_lines", Ae = "build_route_dots", je = 5; function Me() { let e = []; for (let t = 0; t < je; t++) e.push({ name: Ne(t), children: [] }), e.push({ name: Pe(t), children: [] }); return e.push({ name: I, children: [] }), e.push({ name: ke, children: [] }), e.push({ name: Ae, children: [] }), e; } function Ne(e) { return `${De}_${e + 1}`; } function Pe(e) { return `${Oe}_${e + 1}`; } function Fe() { return RegExp(`^${De}_\\d+$`); } function Ie() { return RegExp(`^${Oe}_\\d+$`); } //#endregion //#region src/components/Map/drawing/config/booth-badge-anchor.ts var Le = /* @__PURE__ */ e(ie(), 1), Re = .5, ze = .3, Be = 10, Ve = .01, L = 8, He = 2, Ue = .01, We = 8, Ge = 4, Ke = 50; function qe(e) { var t, n; let [r, ...i] = (t = e.paths) == null ? [] : t, a = ((n = e.layer) == null ? void 0 : n.name) || "", o = Xe(r ? A(r.index, a) : []); if (!i.length) return { geometry: o, outlineInset: 0 }; let { polygon: s, edges: c } = o, l = 0; for (let e of i) { let t = 0, n = !1; for (let r of A(e.index, a)) for (let [e, i] of r) { let r = { x: e, y: i }; if (s.containsPoint(r, { areaTolerance: 0 })) { let e = Qe(r, c); t = Math.max(t, e), e <= Ve && (n = !0); } else n = !0; } n && (l = Math.max(l, t)); } return { geometry: o, outlineInset: l }; } var R = class e { constructor(e, t, n, r) { this.booth = e, this.border = n, this.source = r, this.fits = [], this.prefetchRotation = 0, this.triangles = void 0, this.polygon = void 0, this.edges = void 0, this.bbox = void 0, this.vertices = null, {triangles: this.triangles, polygon: this.polygon, edges: this.edges, bbox: this.bbox} = t; } fit(e, t) { let n = this.fits[e]; return n || (this.fits[e] = n = this.compute(e, t), this.fits.filter(Boolean).length === 4 && (this.vertices = null)), n; } prefetch(t) { e.idle.has(this) || (this.prefetchRotation = t, e.idle.add(this), e.scheduleIdle()); } cancelPrefetch() { e.idle.delete(this); } static scheduleIdle() { e.idleScheduled || !e.idle.size || (e.idleScheduled = !0, typeof requestIdleCallback == "function" ? requestIdleCallback(e.runIdle) : typeof requestAnimationFrame == "function" ? requestAnimationFrame(() => setTimeout(e.runSlice, 0)) : setTimeout(e.runSlice, Ke)); } static runSlice() { let t = performance.now() + Ge; e.runIdle({ timeRemaining: () => t - performance.now() }); } static runIdle(t) { e.idleScheduled = !1; let n = performance.now() + We; try { for (let r of e.idle) { if (t.timeRemaining() <= 0 || performance.now() >= n) break; let i = !1; try { i = r.prefetchNext(); } finally { i || e.idle.delete(r); } } } finally { e.scheduleIdle(); } } prefetchNext() { for (let e = 1; e < 4; e++) if (!this.fits[e]) return this.fit(e, this.prefetchRotation + e * Math.PI / 2), e < 3; return !1; } compute(e, t) { var n; let r = e === 0 || e === 3 ? 1 : -1, i = e === 0 || e === 1 ? 1 : -1, a = this.findAnchor(r, i), o = this.clampScale(a.x, a.y, this.rectMaxScale(e % 2 == 1), t), s = ((n = this.booth.rotate) == null ? 0 : n) + e * Math.PI / 2; for (let e = 0; e < He; e++) { let e = this.nudge(a, o, s); if (!e) break; a = e, this.fitsAt(a.x, a.y, o, t) || (o = this.clampScale(a.x, a.y, o, t)); } return { x: a.x, y: a.y, maxScale: o }; } nudge(e, t, n) { if (!this.triangles.length || !t) return null; let r = Math.cos(n), i = Math.sin(n), a = this.source.x * t, o = this.source.y * t, s = (t, n) => { let r = 0; for (let i = 0; i <= L; i++) { let a = { x: e.x + t * i / L, y: e.y + n * i / L }, o = Qe(a, this.edges), s = this.polygon.containsPoint(a); r = Math.max(r, s ? this.border - o : this.border + o); } return r; }, c = s(-i * o, r * o), l = s(r * a, i * a), u = this.border * Ue; if (c <= u && l <= u) return null; let d = { x: e.x + Math.max(c, 0) * r - Math.max(l, 0) * i, y: e.y + Math.max(c, 0) * i + Math.max(l, 0) * r }; return this.polygon.containsPoint(d) ? d : null; } rectMaxScale(e) { let t = this.booth.rect.size.width, n = this.booth.rect.size.height, r = e ? n : t, i = e ? t : n; return Math.min(r > 0 ? r * Re / this.source.x : Infinity, i > 0 ? i * ze / this.source.y : Infinity); } findAnchor(e, t) { var n; let { booth: r, border: i, bbox: a } = this; if (a) { let n = e > 0 ? a.min.x : a.max.x, r = t > 0 ? a.min.y : a.max.y, o = []; for (let [a, s] of this.distinctVertices()) { let c = a + i * e, l = s + i * t, u = Math.abs(c - n) + Math.abs(l - r); u < Infinity && o.push({ x: c, y: l, score: u, order: o.length }); } o.sort((e, t) => e.score - t.score || e.order - t.order); for (let e of o) { let t = { x: e.x, y: e.y }; if (this.polygon.containsPoint(t)) return t; } } let o = e > 0 ? r.rect.min.x + i : r.rect.max.x - i, s = t > 0 ? r.rect.min.y + i : r.rect.max.y - i, c = (n = r.rotate) == null ? 0 : n; return c ? F({ x: o, y: s }, c, r.rect.center) : { x: o, y: s }; } clampScale(e, t, n, r) { let { polygon: i } = this; if (!this.triangles.length) return n; let a = { x: e, y: t }; if (!i.containsPoint(a)) return n; let o = 0, s = n; for (let n = 0; n < Be; n++) { let n = (o + s) / 2; this.fitsAt(e, t, n, r) ? o = n : s = n; } return o; } fitsAt(e, t, n, r) { let { polygon: i, source: a } = this, o = { x: e, y: t }, s = a.x * n, c = a.y * n; return i.containsPoint(F({ x: e + s, y: t }, r, o)) && i.containsPoint(F({ x: e, y: t + c }, r, o)) && i.containsPoint(F({ x: e + s, y: t + c }, r, o)); } distinctVertices() { if (this.vertices) return this.vertices; let e = /* @__PURE__ */ new Set(), t = []; for (let n of this.triangles) for (let r of n) { let n = `${r[0]},${r[1]}`; e.has(n) || (e.add(n), t.push([r[0], r[1]])); } return this.vertices = t; } }; R.idle = /* @__PURE__ */ new Set(), R.idleScheduled = !1; function Je(e) { if (!e.length) return null; let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity; for (let a of e) for (let [e, o] of a) e < t && (t = e), o < n && (n = o), e > r && (r = e), o > i && (i = o); return f.fromMinMax({ x: t, y: n }, { x: r, y: i }); } function Ye(e) { let t = [], n = []; for (let r of e) { let e = t.length; t.push({ x: r[0][0], y: r[0][1] }), t.push({ x: r[1][0], y: r[1][1] }), t.push({ x: r[2][0], y: r[2][1] }), n.push([ e, e + 1, e + 2 ]); } return new me(t, n); } function Xe(e) { return { triangles: e, polygon: Ye(e), edges: Ze(e), bbox: Je(e) }; } function Ze(e) { let t = /* @__PURE__ */ new Map(); for (let n of e) for (let e = 0; e < 3; e++) { let r = n[e], i = n[(e + 1) % 3], a = `${r[0]},${r[1]}`, o = `${i[0]},${i[1]}`, s = a < o ? `${a}|${o}` : `${o}|${a}`, c = t.get(s); c ? c.count++ : t.set(s, { edge: [r, i], count: 1 }); } let n = []; for (let { edge: e, count: r } of t.values()) r === 1 && n.push(e); return n; } function Qe(e, t) { let n = Infinity; for (let [[r, i], [a, o]] of t) { let t = a - r, s = o - i, c = t * t + s * s, l = c ? Math.max(0, Math.min(1, ((e.x - r) * t + (e.y - i) * s) / c)) : 0; n = Math.min(n, Math.hypot(e.x - r - l * t, e.y - i - l * s)); } return n; } //#endregion //#region src/components/Map/drawing/config/config-booth-badge-eligibility.ts function $e(e) { return e.hideExhibitorBoothNumber || e.hideBoothBadges || !e.hasExhibitors ? !1 : e.noLabels || !e.hideLogoInBooth && e.hasLogoInBooth; } //#endregion //#region src/components/Map/drawing/config/config-booth-badge-scale.ts function et({ pixelSize: e, fontSize: t, plateFontSize: n, maxScale: r }) { let i = e * t / n; return Math.min(i, r); } //#endregion //#region src/components/Map/drawing/config/config-booth-badge.ts var tt = 15, nt = Ee ? 16 : 18, rt = 30, it = 6, z = .8, at = rt * z, ot = document.createElement("canvas").getContext("2d"); function st(e) { return e.length <= tt ? e : e.slice(0, tt - 1) + "…"; } function ct(e) { var t; let n = st(e.title || e.name), r = le(e), a = Te((0, Le.default)(r).hex()), o = oe(); ot.font = C(rt, o); let s = ot.measureText(n).width, c = Math.ceil(s + it * 2), { geometry: f, outlineInset: p } = qe(e), m = Math.max((e.borderWidth || l.borderWidth) / 2, p), h = c * z, g = 38 * z, _ = new R(e, f, m, { x: h, y: g }), v = (t = e.rotate) == null ? 0 : t, y = 0, b = 0, x = 0, S = 0, w = () => { let e = _.fit(y, v); b = e.x, x = e.y, S = e.maxScale; }; w(); let T = (t, n) => { let r = t / 2, i = n / 2; return new P(F({ x: b + r, y: x + i }, v, { x: b, y: x }), { x: t, y: n }, v, e.elevation); }, E = fe(o, d()), D = te(T(1, 1), r); D.hidden = !0, D.dim = e.skipDim ? 0 : void 0; let O = ee(M([[n], []], a, 0, [E, E]), T(1, 1), [0, 0], { horizontal: "center", vertical: "center" }); O.hidden = !0, O.dim = e.skipDim ? 0 : void 0; let k = { booth: e, anchor: { x: b, y: x }, source: { x: h, y: g }, rotation: v, maxScale: S, bg: D, text: O }, A = new lt(k); D.onScale = ({ pixelSize: e }) => A.layOutBg(e), O.onScale = ({ pixelSize: e }) => A.layOutText(e); let j = []; return j.push(i(() => e.skipDim, (e) => { D.dim = e ? 0 : void 0, O.dim = e ? 0 : void 0, N(D, O); })), j.push(i(() => { var t, n; return (t = (n = e.layer) == null ? void 0 : n.visible) == null || t; }, (e) => { D.hidden = !e, O.hidden = !e, N(D, O); })), j.push(i(() => u.mapSettings, ({ roll: t }) => { var n; he(t == null ? 0 : t) && (_.prefetch((n = e.rotate) == null ? 0 : n), D.onRoll = ({ roll: e, pixelSize: t }) => { let n = de(e, v); if (n !== 0) return v += n * Math.PI / 2, y = ((y + n) % 4 + 4) % 4, w(), k.anchor.x = b, k.anchor.y = x, k.rotation = v, k.maxScale = S, A.invalidate(), [...A.layOutBg(t), ...A.layOutText(t)]; }); }, { fireImmediately: !0 }), () => _.cancelPrefetch()), { bg: D, text: O, dispose: () => { j.forEach((e) => e()), j.length = 0; } }; } var lt = class { constructor(e) { this.placement = e, this.bgScale = NaN, this.textScale = NaN; } invalidate() { this.bgScale = NaN, this.textScale = NaN; } layOutBg(e) { let { bg: t } = this.placement, n = this.scaleFor(e); return n === this.bgScale ? [] : (this.bgScale = n, t.shape = this.rectAt(n), t.hidden = this.isHidden(), t.hidden ? [] : [t]); } layOutText(e) { let { text: t } = this.placement, n = this.scaleFor(e); return n === this.textScale ? [] : (this.textScale = n, t.lines[0].fontSize = at * n, t.bounds = this.rectAt(n), t.hidden = this.isHidden(), t.hidden ? [] : [t]); } scaleFor(e) { return et({ pixelSize: e, fontSize: nt, plateFontSize: at, maxScale: this.placement.maxScale }); } rectAt(e) { let { anchor: t, booth: n, source: r, rotation: i } = this.placement, a = r.x * e, o = r.y * e; return new P(F({ x: t.x + a / 2, y: t.y + o / 2 }, i, t), { x: a, y: o }, i, n.elevation); } isHidden() { let { booth: e } = this.placement; return !!(e.layer && !e.layer.visible); } }; function ut(e, t) { let n = [], r = [], i = []; for (let e of t) if (e instanceof ue && $e({ hideExhibitorBoothNumber: y.hideExhibitorBoothNumber, hideBoothBadges: y.hideBoothBadges, hideLogoInBooth: u.hideLogoInBooth, noLabels: e.noLabels, hasExhibitors: e.exhibitors.length > 0, hasLogoInBooth: e.exhibitors.some((e) => e.logoInBooth && e.logo) })) { let { bg: t, text: a, dispose: o } = ct(e); n.push(t), r.push(a), i.push(o); } let a = () => { i.forEach((e) => e()), i.length = 0; }; return n.length ? { layer: { name: `${e}:badges`, children: [{ name: `${e}:badgeBgs`, children: n }, { name: `${e}:badgeTexts`, children: r }] }, cleanup: a } : { layer: null, cleanup: a }; } //#endregion //#region src/components/Map/drawing/config/config-markers.ts var dt = "_selected", ft = "markers"; function pt(e, t, n) { let { center: r, rotation: i, elevation: a } = e.bounds, { width: o, height: s } = t; return e.bounds = S(r.x, r.y, o, s, n, i, a), [e]; } function mt(e) { B = e; } function ht(e) { let { scene: t } = e, n = [], r = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = [], l = t.rootLayer.children.find((e) => e.name === ft); l.onScale = ({ pixelSize: e }) => mt(e), O(gt), N(l); async function d(e) { let t = []; e.forEach((e) => { let { name: n, content: i, width: a, height: o, scale: s } = e; if (r.has(n)) return; let c = new Image(), l = new Promise((e, t) => { c.onload = () => { r.set(n, { img: c, width: a, height: o, scale: s }), e(); }, c.onerror = (e) => { t(e); }; }); t.push(l), c.src = i, c.crossOrigin = "anonymous"; }), await Promise.all(t); } let f = (e, t) => { e.onScale = ({ pixelSize: n }) => pt(e, t, n); }, p = (e) => { e.screenSpace || re(e); }; function m(e, t) { let n = a.get(e); if (n) return n; let r = g(t.img, t.width, t.height, window.devicePixelRatio, t.scale || 1); return a.set(e, r), r; } function h() { let e = c.routeStore.markersData.markers; if (!e.length) return; o = []; let t = u.is3DView; e.forEach((e) => { var n, i; let a = r.get(e.icon); if (!a) return; let c = r.get(e.selectedIcon); if (!c) return; let l = a.scale || 1, u = m(e.icon, a), d = m(e.selectedIcon, c), p = (n = (i = s.findLayer(e.z)) == null ? void 0 : i.visible) == null || n, h = T(a.img, a.width, a.height, l), g = T(c.img, c.width, c.height, l), _ = S(e.x, e.y, h.width, h.height, 1, 0), v = S(e.x, e.y, g.width, g.height, 1, 0), y; switch (e.position) { case "lefttop": y = [0, 0]; break; case "centertop": y = [.5, 0]; break; case "centerbottom": y = [.5, 1]; break; default: y = [.5, .5]; } let x = { ...b(u, _, { hidden: !p, origin: y }), id: e.id, scale: l, screenSpace: t }, C = { ...b(d, v, { hidden: !(p && e.active), origin: y }), id: `${e.id}${dt}`, scale: l, screenSpace: t }; f(x, h), f(C, g), o.push(x, C); }), l.children = o, o.forEach(p); } function _() { l.children = [], o = []; } function v() { let e = c.routeStore.markersData.markers; e.length && e.forEach((e) => { var t, n; let r = o.find((t) => t.id === e.id), i = o.find((t) => t.id === `${e.id}${dt}`); if (!r || !i) return; let a = (t = (n = s.findLayer(e.z)) == null ? void 0 : n.visible) == null || t; e.active ? (r.hidden = !0, i.hidden = !(a && e.active)) : (r.hidden = !a, i.hidden = !0); }); } return n.push(i(() => [c.routeStore.selectedMarkers, c.layerStore.visible], () => { if (!c.routeStore.markersData.markers.length) { _(), N(l); return; } v(), N(...o); })), n.push(i(() => c.routeStore.markersData.markers, () => { d(c.routeStore.markersData.icons).then(() => { h(), N(l); }); }, { fireImmediately: !0 })), function() { n.forEach((e) => e()), n.length = 0, l.onScale = void 0, O(), B = 1, N(l); }; } function gt(e, t) { return _t(e, t, B); } function _t(e, t, n) { for (let r of c.routeStore.markersData.markers) { let i = c.routeStore.markersData.icons.find((e) => e.name === r.icon); if (!i) continue; let a = i.width * (i.scale || 1) * n, o = i.height * (i.scale || 1) * n; if (vt(e, t, r.x, r.y, a, o)) { let e = c.layerStore.findLayer(r.z); if (!e || e && e.visible) return r; } } return null; } function vt(e, t, n, r, i, a) { return f.fromCenter({ x: n, y: r }, { x: 2 * i, y: 2 * a }).containsPoint({ x: e, y: t }); } var B = 1, yt = .5, bt = "cubic"; function xt(e, t) { return !e || e.rootLayer.dim === t ? !1 : (e.rootLayer.dim = t, !0); } function St(e, t = 300, n = bt) { let r = null, i = 0, a = 0, o = 0, s = 0, c = Math.max(t, 0); function l() { r === null || typeof cancelAnimationFrame != "function" || (cancelAnimationFrame(r), r = null); } function u(t) { l(), i = t, e(i); } function d(t) { let l = t - s, u = Math.min(Math.max(l / c, 0), 1), f = Ct(u, n); if (i = a + (o - a) * f, e(i), u < 1) { r = requestAnimationFrame(d); return; } r = null, i = o, e(i); } return { getValue() { return i; }, setTarget(e, t = {}) { let n = +!!e; if (!(!t.immediate && n === o && r === null)) { if (o = n, t.immediate || c === 0 || typeof requestAnimationFrame != "function") { u(o); return; } l(), a = i, s = typeof performance > "u" ? Date.now() : performance.now(), r = requestAnimationFrame(d); } }, stop() { l(); } }; } function Ct(e, t) { return t === "linear" ? e : wt(e); } function wt(e) { return e < .5 ? 4 * e * e * e : 1 - (-2 * e + 2) ** 3 / 2; } //#endregion //#region src/components/Map/drawing/config/config-pins.ts function Tt(e, t, n) { let a = [], o = [], s = [], c = []; function d() { let e = u.selectedPoiTypeFilters; if (!e.length) return []; let t = new Set(e.map((e) => e.id)); return l.booths.filter((e) => e.visible && t.has(e.poiTypeId) && e.rect); } let f = (e) => { o.push(e); }; function p() { o.forEach((e) => e.stop()), o = []; } function m() { e.children = s.map((e) => At(e, f)); } function h() { c = Array.from({ length: Math.floor(s.length / 2) }, () => Mt(f)), t.children = c.map((e) => e.image), n.children = c.map((e) => e.count); } function g(e, t) { let n = /* @__PURE__ */ new Set(), r = (e) => e == null ? void 0 : e.forEach((e) => n.add(e)), i = Pt(c, e, Bt * t.pixelSize); i.forEach((t, n) => { It(t, e[n]) && r([t.image, t.count]), r(t.fader.place(!0)); }); let a = new Set(i); for (let e of c) a.has(e) || r(e.fader.place(!1)); return n.size ? [...n] : void 0; } return e.clustering = { onCluster: (e, t) => g(e, t), marker: { width: U, height: W, origin: H } }, a.push(i(() => d(), (r) => { s = r, p(), m(), h(), N(e, t, n); }, { equals: r.shallow, fireImmediately: !0 })), function() { a.forEach((e) => e()), a.length = 0, p(), c = [], e.clustering = void 0, e.children = [], t.children = [], n.children = [], N(e, t, n); }; } function Et(e, t, n, r, i) { let a, o = i, s = !1, c = !1, l = (r) => { let i = 1 - Math.min(Math.max(r, 0), 1), a = !1; if (n() !== i && (t(i), a = !0), !o && r >= 1 && e.some((e) => !e.hidden)) { for (let t of e) t.hidden = !0; a = !0; } a && (s ? c = !0 : N(...e)); }, u = () => { if (!a && (a = St(l, 300), r(a), !i)) { let e = s; s = !0, a.setTarget(!0, { immediate: !0 }), s = e; } return a; }; return { place(t) { if (t === o) return; o = t; let n = !1; if (t && e.some((e) => e.hidden)) { for (let t of e) t.hidden = !1; n = !0; } return s = !0, c = !1, u().setTarget(!t), s = !1, n || c ? e : void 0; } }; } function Dt(e, t, n, r) { let { bounds: i } = e, a = t * r, o = t * n * r; if (!(i.size.x === a && i.size.y === o)) return i.set(i.center.x, i.center.y, a, o, i.rotation, i.elevation), [e]; } function Ot() { return G || (G = w(V, window.devicePixelRatio)), G; } function kt() { return Ut || (Ut = k(U, window.devicePixelRatio)), Ut; } function At(e, t) { let n = new P(e.rect.center, { x: V, y: V * v }, 0, e.elevation * 2), r = { ...b(Ot(), n, { hidden: !1, origin: H }), screenSpace: !0, opacity: 1 }; r.onScale = ({ pixelSize: e }) => Dt(r, V, v, e); let i = Et([r], (e) => { r.opacity = e; }, () => { var e; return (e = r.opacity) == null ? 1 : e; }, t, !0); return r.placement = { onPlace: (e) => i.place(e) }, r; } function jt(e) { return `${Vt}${Math.round(Math.min(Math.max(e, 0), 1) * 255).toString(16).padStart(2, "0")}`; } function Mt(e) { let t = new P({ x: 0, y: 0 }, { x: U, y: W }, 0, 0), n = { ...b(kt(), t, { hidden: !0, origin: H }), screenSpace: !0, opacity: 0 }; n.onScale = ({ pixelSize: e }) => Dt(n, U, v, e); let r = Nt(n); return { image: n, count: r, fader: Et([n, r], (e) => { n.opacity = e, r.lines[0].color = jt(e); }, () => { var e; return (e = n.opacity) == null ? 1 : e; }, e, !1) }; } function Nt(e) { let t = { lines: [{ text: D(2), color: jt(0), fontUrl: E, fontSize: 0 }], bounds: new P({ x: e.bounds.center.x, y: e.bounds.center.y }, { x: 0, y: 0 }, 0, e.bounds.elevation), padding: [0, 0], alignment: { horizontal: "center", vertical: "top", text: "center" }, screenSpace: !0, hidden: !0 }; return t.onScale = ({ pixelSize: n }) => { let r = x(Ht.r) * n, i = U * n, a = 2 * ((W - Ht.cy) * n + _ * r), { bounds: o } = t, [s] = t.lines; if (!(s.fontSize === r && o.size.x === i && o.size.y === a)) return s.fontSize = r, o.set(e.bounds.center.x, e.bounds.center.y, i, a, o.rotation, e.bounds.elevation), [t]; }, t; } function Pt(e, t, n) { let r = Math.min(t.length, e.length), i = [], a = /* @__PURE__ */ new Set(), o = []; e.forEach(({ image: e }, i) => { if (!e.hidden) for (let a = 0; a < r; a++) { let { x: r, y: s } = t[a], c = Math.hypot(r - e.bounds.center.x, s - e.bounds.center.y); c <= n && o.push({ distance: c, cluster: a, unit: i }); } }), o.sort((e, t) => e.distance - t.distance || e.cluster - t.cluster || e.unit - t.unit); for (let { cluster: t, unit: n } of o) i[t] || a.has(e[n]) || (i[t] = e[n], a.add(e[n])); let s = e.map((e, t) => ({ unit: e, index: t })).filter(({ unit: e }) => !a.has(e)).sort((e, t) => Ft(e.unit) - Ft(t.unit) || e.index - t.index), c = 0; for (let e = 0; e < r; e++) i[e] || (i[e] = s[c++].unit); return i; } function Ft({ image: e }) { var t; return e.hidden ? 0 : (t = e.opacity) == null ? 1 : t; } function It({ image: e, count: t }, n) { let { x: r, y: i, elevation: a, unitCount: o } = n, s = D(o), [c] = t.lines, l = e.bounds; if (l.center.x === r && l.center.y === i && l.elevation === a && c.text === s) return !1; l.set(r, i, l.size.x, l.size.y, l.rotation, a); let { bounds: u } = t; return u.set(r, i, u.size.x, u.size.y, u.rotation, a), c.text = s, !0; } var Lt = "poiFilterPins", Rt = "poiFilterPinClusters", zt = "poiFilterPinCounts", V = 32, H = [.5, 1], U = 44, Bt = U, Vt = "#000000", Ht = be(U), W = U * v, G, Ut; //#endregion //#region src/components/Map/drawing/config/config-all.ts function Wt() { let { defaultLayer: e } = c.layerStore, { layers: t } = c.layerStore; if (e) { let n = [...t], r = t.indexOf(e); n.splice(r, 1), t = [e, ...n]; } let n = t.filter((e) => !e.rootParent).map((e) => se(e)); return Promise.all(n).then((e) => { var t; let n = pe(ft, []); n.overlay = u.is3DView; let r = u.is3DView ? Gt() : void 0, i = xe({ overlay: u.is3DView }), a = [], o = []; for (let t of e.flat()) ce(t.name) ? (t.dim = 0, o.push(t)) : a.push(t); let { layer: s, cleanup: c } = ut("root", l.booths); return { layers: [ ...a, ...s ? [s] : [], ...o, ...Me(), n, ...(t = r == null ? void 0 : r.layers) == null ? [] : t, i ], cleanup: () => { c(), r == null || r.cleanup(); } }; }); } function Gt() { let e = [ Lt, Rt, zt ].map((e) => { let t = pe(e, []); return t.overlay = !0, t.dim = 0, t; }), [t, n, r] = e; return { layers: e, cleanup: Tt(t, n, r) }; } //#endregion //#region src/components/Map/MapCursorCoords.tsx var K = /* @__PURE__ */ e(n(), 1), Kt = 2; function qt(e) { let { canvas: t } = e, n = ae(), r = o(), i = (0, K.useCallback)(() => r("cursor", void 0), [r]), a = (0, K.useEffectEvent)((e) => { if (!e.isPrimary) return; let t = n.canvasToPlan({ x: e.offsetX, y: e.offsetY }); r("cursor", t ? Yt(t, Jt()) : void 0); }); return (0, K.useEffect)(() => { let e = t.current; if (!e) return; let n = (e) => a(e), r = () => i(); return e.addEventListener("pointermove", n), e.addEventListener("pointerleave", r), () => { e.removeEventListener("pointermove", n), e.removeEventListener("pointerleave", r); }; }, [t, i]), null; } function Jt() { let e = c.layerStore.layers.find((e) => e.visible && (e.mode === ge.TurnedOn || e.mode === ge.TurnedOff)); return (e == null ? void 0 : e.name) || null; } function Yt(e, t) { let n = `[${e.x.toFixed(Kt)}, ${e.y.toFixed(Kt)}]`; return t ? `${n} · layer ${t}` : n; } //#endregion //#region src/components/Map/MapViewport.tsx function Xt() { let e = ae(), t = (0, K.useRef)({ api: e }), [n] = (0, K.useState)(() => we(t)); return (0, K.useLayoutEffect)(() => { t.current = { api: e }; }), (0, K.useEffect)(() => (Ce(n), () => Ce(void 0)), [n]), null; } //#endregion //#region src/components/Map/traffic/UpdateQueue.ts var Zt = class { constructor() { this.queue = [], this.isProcessing = !1, this.rafId = null, this.CHUNK_SIZE = 100, this.TIME_BUDGET = 4; } add(e) { this.queue.push(e), this.scheduleProcessing(); } scheduleProcessing() { this.isProcessing || this.queue.length === 0 || (this.isProcessing = !0, this.queue.length <= this.CHUNK_SIZE * 2 ? Promise.resolve().then(() => this.processMicrotaskQueue()) : this.rafId = requestAnimationFrame((e) => { this.processQueue(e); })); } processMicrotaskQueue() { let e = performance.now(), t = 0; for (; this.queue.length > 0 && t < this.CHUNK_SIZE;) { let n = this.queue.shift(); try { n(); } catch (e) { console.warn("UpdateQueue task error:", e); } if (t++, performance.now() - e > this.TIME_BUDGET) break; } this.queue.length > 0 ? Promise.resolve().then(() => this.processMicrotaskQueue()) : this.isProcessing = !1; } processQueue(e) { this.rafId = null; let t = 0; for (; this.queue.length > 0 && t < this.CHUNK_SIZE;) { let n = this.queue.shift(); try { n(); } catch (e) { console.warn("UpdateQueue task error:", e); } if (t++, performance.now() - e > this.TIME_BUDGET) break; } this.queue.length > 0 ? this.rafId = requestAnimationFrame((e) => this.processQueue(e)) : this.isProcessing = !1; } destroy() { this.rafId !== null && (cancelAnimationFrame(this.rafId), this.rafId = null), this.queue = [], this.isProcessing = !1; } }, Qt = 49, $t = `hsl(257, 76%, ${Qt}%)`, en = `hsl(339.903, 82%, ${Qt}%)`, tn = `hsl(257, 76%, ${Math.round(Qt * 1.82)}%)`, q = 4, J = ye(q), nn = q, rn = "U", an = "R", on = "S", sn = "P", cn = class { constructor() { this._state = [[]], this.index = 0, this.pointHashSet = /* @__PURE__ */ new Set(), this.locked = !1, this.storageKey = "expofp_build_route_state", this._selected = 0; } get points() { return this._state[this.index]; } set points(e) { this._state.push(e), this.setIndex(), this.save(); } setIndex() { this.index = Math.max(this._state.length - 1, 0); } genPointHash(e) { return `${e.x},${e.y}`; } add(e) { let t = this.genPointHash(e); this.pointHashSet.has(t) || (this.pointHashSet.add(t), this.points = [...this.points, e]); } undo() { this.index && (this._state.pop(), this.setIndex(), this.save(), this.select(this.points.length - 1)); } execute(e) { try { if (this.locked) return; this.locked = !0, e(); } finally { requestAnimationFrame(() => { this.locked = !1; }); } } log(e, t = 12) { console.log(`%c${e}`, `color: black; font-size: ${t}px; background: LemonChiffon;`); } instruct() { this.log(`How to Build a Route: Add Point: Click on the map. Apply Smoothing: Press ${an}. Apply Simplification: Press ${on}. Undo: Press ${rn}. Enable/Disable Preview: Press ${sn}. `, 16); } applyChaikinSmoothing(e, t, n) { let r; if (n >= 1 && e.length >= 2) { r = [e[0]]; for (let t = 1; t < e.length; t++) { let i = e[t - 1], a = e[t]; for (let e = 1; e <= n; e++) { let t = e / (n + 1); r.push({ x: i.x + (a.x - i.x) * t, y: i.y + (a.y - i.y) * t }); } r.push(a); } } else r = e.slice(); for (let e = 0; e < t && !(r.length < 2); e++) { let e = [{ ...r[0] }]; for (let t = 1; t < r.length; t++) { let n = r[t - 1], i = r[t]; e.push({ x: .75 * n.x + .25 * i.x, y: .75 * n.y + .25 * i.y }), e.push({ x: .25 * n.x + .75 * i.x, y: .25 * n.y + .75 * i.y }); } e.push({ ...r[r.length - 1] }), r = e; } return r; } applySmoothing() { this.points.length < 3 || (this.points = this.applyChaikinSmoothing(this.points, 1, 0), this.select(this.points.length - 1)); } save() { try { this.points.length ? sessionStorage.setItem(this.storageKey, JSON.stringify(this.points)) : sessionStorage.removeItem(this.storageKey); } catch (e) { console.warn(e); } } restore() { try { let e = sessionStorage.getItem(this.storageKey); if (!e) return; let t = JSON.parse(e); if (!Array.isArray(t)) return; t.forEach((e) => this.add(e)), this.select(this.points.length - 1); } catch (e) { console.warn(e); } } topologyPreservingSimplify(e, t) { if (e.length <= 2) return e.map((e) => ({ ...e })); let n = (e, t, n) => { let r = e.x, i = e.y, a = t.x, o = t.y, s = n.x, c = n.y; return Math.abs((c - o) * r - (s - a) * i + s * o - c * a) / (Math.sqrt((c - o) ** 2 + (s - a) ** 2) || 1e-10); }, r = (e, t, n, r) => { let i = _e({ p0: e, p1: t }, { p0: n, p1: r }); return i !== null && i.onLine1 && i.onLine2; }, i = Array(e.length).fill(!1); i[0] = i[i.length - 1] = !0; let a = [], o = (s, c) => { if (c <= s + 1) return; let l = e[s], u = e[c], d = 0, f = 0; for (let t = s + 1; t < c; t++) { let r = n(e[t], l, u); r > d && (d = r, f = t); } if (d > t) { let t = e[f], n = !0; for (let e = 0; e < a.length - 1; e++) if (r(a[e], a[e + 1], l, t) || r(a[e], a[e + 1], t, u)) { n = !1; break; } n && (i[f] = !0, o(s, f), o(f, c)); } }; return o(0, e.length - 1), e.filter((e, t) => i[t]); } applySimplification() { this.points = this.topologyPreservingSimplify(this.points, .5), this.select(this.points.length - 1); } get selected() { return this._selected; } select(e) { this._selected = Math.max(0, Math.min(e, this.points.length - 1)); } }; function ln({ enabled: e, scene: t }) { let n = (0, K.useRef)(!1), r = (0, K.useRef)(1), i = (0, K.useMemo)(() => ve(q, $t), []), a = (0, K.useMemo)(() => ve(q, en), []), o = (0, K.useMemo)(() => new cn(), []), s = (0, K.useRef)(new Zt()), c = (0, K.useMemo)(() => { if (!t) return {}; let e = t.rootLayer.children; return { linesLayer: e.find((e) => e.name === ke), pointsLayer: e.find((e) => e.name === Ae) }; }, [t]), l = (0, K.useCallback)(() => { if (!c || !i || !a) return; let { linesLayer: e, pointsLayer: t } = c; if (!e || !t) return; let l = o.points, u = n.current; u ? t.children.length = 0 : t.children = l.map(({ x: e, y: t }, n) => ({ source: n == o.selected ? a : i, bounds: S(e, t, J, J, r.current) })); let d = []; for (let e = 1; e < l.length; e++) { let t = l[e - 1], n = l[e]; d.push({ points: { p0: t, p1: n }, color: u ? $t : tn, width: nn }); } d.length ? e.children = d : e.children.length = 0, s.current.add(() => N(t, e)), o.instruct(), o.log(JSON.stringify(o.points)); }, [ o, c, i, a ]), u = (0, K.useCallback)((e) => { let t = e.key.toUpperCase(); o.execute(() => { switch (t) { case rn: e.preventDefault(), o.undo(), n.current = !1, l(); break; case an: e.preventDefault(), o.applySmoothing(), n.current = !1, l(); break; case on: e.preventDefault(), o.applySimplification(), n.current = !1, l(); break; case sn: e.preventDefault(), n.current = !n.current, l(); break; } }); }, [o, l]), d = (0, K.useCallback)((e) => { r.current = e; let { pointsLayer: t } = c; if (!t) return []; let n = []; return o.execute(() => { let e = t.children; for (let t of e) t.bounds = S(t.bounds.center.x, t.bounds.center.y, J, J, r.current), n.push(t); }), n; }, [c, o]), f = (0, K.useCallback)((e) => { o.execute(() => { o.add({ x: e.x, y: e.y }), o.select(o.points.length - 1), l(); }); }, [o, l]); (0, K.useEffect)(() => { var t, n; if (!e || !(c != null && c.pointsLayer)) return; let { pointsLayer: i } = c; r.current = (t = (n = j()) == null ? void 0 : n.state().pixelSize) == null ? 1 : t, o.execute(() => { o.restore(), l(); }), i.onScale = ({ pixelSize: e }) => d(e); let a = s.current; return a.add(() => N(i)), m(f), window.addEventListener("keyup", u), () => { window.removeEventListener("keyup", u), m(), i.onScale = void 0, a.destroy(); }; }, [ e, c, o, l, f, d, u ]); } //#endregion //#region src/components/Map/traffic/useManageTraffic.ts var un = 2, dn = un * 3.5, Y = un * 12, X = Y * .7, fn = 8, pn = 2, mn = .6, hn = 8, gn = "transport_locations", _n = 150, vn = "#a4aab6", yn = 1e3, bn = 2e4, xn = 500; function Sn({ permission: e, scene: n, dataJsonUrl: r, websocketUrl: i }) { let o = (0, K.useRef)(1), s = (0, K.useRef)(/* @__PURE__ */ new Map()), c = (0, K.useRef)(/* @__PURE__ */ new Map()), l = (0, K.useRef)(null), u = (0, K.useRef)(null), d = (0, K.useRef)(0), f = (0, K.useRef)(1), p = (0, K.useRef)(new Zt()), m = (0, K.useRef)(/* @__PURE__ */ new Map()), h = (0, K.useRef)(yn), _ = (0, K.useRef)(/* @__PURE__ */ new Map()), v = (0, K.useRef)(void 0); (0, K.useEffect)(() => { if (!e || !n) return; let y = !1, b, x = n.rootLayer.children, C = c.current, w = s.current, E = p.current; async function D() { try { var e, n; let i; try { let e = await fetch(r, { method: "GET", headers: { "Content-Type": "application/json" } }); if (!e.ok || e.status === 204) return; i = await e.json(); } catch (e) { console.warn("useManageTraffic failed to get JSON", e); } if (y || !i || i.disabled || i.error) return; o.current = Tn((e = (n = j()) == null ? void 0 : n.state().pixelSize) == null ? 1 : e); let c = new Map(i.routes.map(({ id: e, color: t }) => [e, t])), l = /* @__PURE__ */ new Map(); c.forEach((e) => { l.set(e, Dn({ radius: dn, color: e, scale: window.devicePixelRatio })); }); let p = Fe(), h = x.filter((e) => p.test(e.name)), v = Ie(), b = x.filter((e) => v.test(e.name)); i.routes.slice(0, h.length).forEach(({ id: e, color: t, path: n, stops: r, hiddenPoints: i }, a) => { m.current.set(e, n); let s = h[a]; if (s) { var c; let e = new Map((c = i == null ? void 0 : i.map((e) => [In(e), e])) == null ? [] : c); for (let r = 1; r < n.length; r++) { let i = n[r - 1], a = n[r]; e.has(In(i)) || e.has(In(a)) || s.children.push({ points: { p0: i, p1: a }, color: t, width: un }); } s.children.length && E.add(() => N(s)); } let u = b[a], d = l.get(t); u && d && r != null && r.length && (r.forEach((e) => { u.children.push({ source: d, bounds: S(e.x, e.y, ...Z(d), o.current) }); }), u.children.length && E.add(() => N(u))); }); let D = x.find((e) => e.name === I); if (!D) { console.warn(`useManageTraffic: the scene has no "${I}" layer`); return; } let ee = /* @__PURE__ */ new Map(); D.onScale = ({ pixelSize: e }) => { o.current = Tn(e); let t = []; for (let e of b) { let n = e.children; for (let e of n) { let n = e.source; e.bounds = S(e.bounds.center.x, e.bounds.center.y, ...Z(n), o.current, e.bounds.rotation), t.push(e); } } for (let e of s.current.values()) { let n = e.source; e.bounds = S(e.bounds.center.x, e.bounds.center.y, ...Z(n), o.current, e.bounds.rotation), t.push(e); } return t; }, E.add(() => N(D)), c.forEach((e, t) => { ee.set(t, On({ id: t, width: Y, height: Y, color: e, scale: window.devicePixelRatio })); }); let te = On({ id: "orphan", width: Y, height: Y, color: vn, scale: window.devicePixelRatio }), M = null; try { let e = await a(`${t}icons/bus-white.svg`); if (y) return; M = g(e, X, X, window.devicePixelRatio); let { width: n, height: r } = T(e, X, X); $.set(M, [n, r]); } catch (e) { console.error(e); } u.current = (e) => { try { var t; let n = JSON.parse(e.data); if (n.type !== gn) return; let r = e.timeStamp || performance.now(); f.current = Math.round(r - d.current), d.current = r; let i = Math.max((t = f.current) == null ? xn : t, xn), a = D.children, s = !1; n.data.forEach(({ id: e, x: t, y: n, route_id: r, hidden: c }) => { var l; if (C.has(e)) { var u; (u = C.get(e)) == null || u(), C.delete(e); } let d = w.get(e), f = (l = w.get(An(e))) == null ? null : l; if (c && d && f) { d.hidden = !0, f.hidden = !0, E.add(() => N(d, f)); return; } if (_.current.set(e, performance.now()), !d) { var p; let i = (p = ee.get(r)) == null ? te : p, c = { source: i, bounds: S(t, n, ...Z(i), o.current, 0) }; if (w.set(e, c), M) { let r = An(e), i = { source: M, bounds: S(t, n, ...Z(M), o.current, 0) }; re(i), M.setAttribute("id", r), w.set(r, i), a.push(c, i); } else a.push(c); s = !0; return; } let h = d.bounds.center, g = Pn(h, { x: t, y: n }, m.current.get(r)); if (g.reduce((e, t, n) => n === 0 ? e : e + kn(g[n - 1], t), 0) >= _n || document.hidden) jn({ updateQueue: E, vehicle: d, vehicleFinery: f, x: t, y: n, scale: o.current, angle: En(d.bounds.center, { x: t, y: n }) }); else { let t = Fn(g, i, (e) => { jn({ updateQueue: E, vehicle: d, vehicleFinery: f, x: e.x, y: e.y, scale: o.current, angle: e.angle }); }); C.set(e, t); } }), s && E.add(() => N(D)); } catch (e) { console.error("handleSocketMessage", e); } }, d.current = performance.now(), O(), window.addEventListener("online", k), A(i.config ? (Number(i.config.vehicle_inactive_interval) || 20) * 1e3 : bn); } catch (e) { console.warn(e); } } D(); function O() { var e, t; y || ((e = l.current) == null ? void 0 : e.readyState) === WebSocket.OPEN || ((t = l.current) == null ? void 0 : t.readyState) === WebSocket.CONNECTING || (l.current = new WebSocket(i), l.current.onmessage = u.current, l.current.onopen = () => { h.current = yn; }, l.current.onclose = () => { y || !navigator.onLine || (b = window.setTimeout(O, h.current), h.current = Math.min(h.current * 2, 3e4)); }); } function k() { O(); } function A(e) { clearInterval(v.current), !y && (v.current = window.setInterval(() => { let t = performance.now(), n = [], r = []; _.current.forEach((i, a) => { if (t - i < e) return; let o = w.get(a); o && (o.hidden = !0, r.push(o), n.push(a)); let s = An(a), c = w.get(s); c && (c.hidden = !0, r.push(c), n.push(s)); }), r.length && E.add(() => N(...r)), n.forEach((e) => _.current.delete(e)); }, e)); } return () => { y = !0, clearTimeout(b); let e = l.current; e && (e.onopen = null, e.onmessage = null, e.onclose = null, e.close(), l.current = null), u.current = null; let t = x.find((e) => e.name === I); t && (t.onScale = void 0), C.forEach((e) => e == null ? void 0 : e()), C.clear(), w.clear(), E.destroy(), window.removeEventListener("online", k), clearInterval(v.current); }; }, [ e, n, r, i ]); } function Z(e) { let t = $.get(e); if (!t) throw Error("useManageTraffic: an icon was drawn without a recorded CSS size"); return t; } function Cn(e) { return e * 2; } function wn(e, t) { let n = t * mn, r = hn * 2; return [t + pn + n / 2 + r, e + n + pn + r]; } function Tn(e) { return Math.min(e || 1, fn); } function En(e, t) { return Se(e, t); } function Dn({ radius: e, scale: t, color: n }) { let r = Math.ceil(e * 2 * t), i = h(r, r, t); $.set(i, [Cn(e), Cn(e)]); let a = i.getContext("2d"); a.imageSmoothingEnabled = !1; let o = r / 2, s = e * .78, c = e * .33; return a.translate(o, o), a.scale(t, t), a.beginPath(), a.arc(0, 0, e, 0, 2 * Math.PI), a.fillStyle = "#FFFFFF", a.fill(), a.beginPath(), a.arc(0, 0, s, 0, 2 * Math.PI), a.fillStyle = n, a.fill(), a.beginPath(), a.arc(0, 0, c, 0, 2 * Math.PI), a.fillStyle = "#FFFFFF", a.fill(), i; } function On({ id: e, width: t, height: n, color: r, scale: i }) { let a = pn * i, o = t / 2 * i, s = n * i, c = mn, l = .01, u = s * c, d = s, f = hn * i, p = d + a + u / 2 + f * 2, m = o * 2 + u + a + f * 2, g = h(p, m, i); $.set(g, wn(t, n)), g.setAttribute("id", e); let _ = g.getContext("2d"), v = p / 2, y = m / 2; _.save(), _.translate(v, y), _.rotate(-Math.PI / 2), _.translate(-v, -y); let b = v, x = y - d / 2 + o, S = x + u; return _.shadowColor = "rgba(16, 24, 40, 0.2)", _.shadowBlur = f / 2, _.beginPath(), _.arc(b, x, o, Math.PI, 0, !1), _.bezierCurveTo(b + o, x + s * .3, b + l * o, S, b, S), _.bezierCurveTo(b - l * o, S, b - o, x + s * .3, b - o, x), _.closePath(), _.fillStyle = r, _.fill(), _.strokeStyle = "#FFFFFF", _.lineWidth = a, _.stroke(), _.restore(), g; } function kn(e, t) { return ne(e, t); } function An(e) { return `${e}_finery`; } function jn({ updateQueue: e, vehicle: t, vehicleFinery: n, x: r, y: i, scale: a, angle: o }) { let s = t.source; if (t.bounds = S(r, i, ...Z(s), a, o), t.hidden = !1, n) { let { size: a, rotation: o, elevation: s } = n.bounds; n.bounds = new P({ x: r, y: i }, a, o, s), n.hidden = !1, e.add(() => N(n, t)); } else e.add(() => N(t)); } function Q(e, t, n) { return { x: e.x + (t.x - e.x) * n, y: e.y + (t.y - e.y) * n }; } function Mn(e, t) { let n = Infinity, r = { index: 0, t: 0 }; for (let i = 0; i < t.length - 1; i++) { let a = t[i], o = t[i + 1], s = o.x - a.x, c = o.y - a.y, l = s * s + c * c, u = l ? ((e.x - a.x) * s + (e.y - a.y) * c) / l : 0, d = Math.max(0, Math.min(1, u)), f = kn(e, Q(a, o, d)); f < n && (n = f, r = { index: i, t: d }); } return r; } function Nn(e, t, n) { let r = kn(e, t), i = Math.max(2, Math.ceil(r / n) + 1), a = []; for (let n = 0; n < i; n++) { let r = Q(e, t, n / (i - 1)); a.push(r); } return a; } function Pn(e, t, n) { if (!n || !n.length) return Nn(e, t, 10); let r = Mn(e, n), i = Mn(t, n), a = [], o = (e) => a.push(e); r.index + 1 < n.length ? o(Q(n[r.index], n[r.index + 1], r.t)) : o(n[r.index]); for (let e = r.index + 1; e <= i.index && e < n.length; e++) o(n[e]); return i.index + 1 < n.length ? o(Q(n[i.index], n[i.index + 1], i.t)) : o(n[i.index]), a; } function Fn(e, t, n, r) { if (e.length < 2) return () => {}; let i = null, a, o = [], s = 0; for (let t = 0; t < e.length - 1; t++) { let n = ne(e[t], e[t + 1]); o.push(n), s += n; } let c = (l) => { i || (i = l); let u = l - i, d = Math.min(u / t, 1), f = d * s, p = 0, m = 0; for (; m < o.length && p + o[m] < f;) p += o[m], m++; m >= o.length && (m = o.length - 1); let h = e[m], g = e[Math.min(m + 1, e.length - 1)], _ = o[m] || 0, v = _ === 0 ? 0 : (f - p) / _; n({ x: h.x + (g.x - h.x) * v, y: h.y + (g.y - h.y) * v, angle: Se(h, g) }), d < 1 ? a = requestAnimationFrame(c) : r && r(); }; return a = requestAnimationFrame(c), () => { a && cancelAnimationFrame(a); }; } function In(e) { return `${e.x},${e.y}`; } var $ = /* @__PURE__ */ new WeakMap(); //#endregion //#region src/components/Map/with-kiosk.ts function Ln(e) { var t; let n = u.kioskData; return !n || !(!p() || n.z === ((t = c.routeStore.currentRouteLayer) == null ? void 0 : t.name)) ? e : f.fromUnion(e, new f(n.x, n.y, 1, 1)); } //#endregion //#region src/components/Map/framing-rect.ts function Rn() { let e = u.canvasVisibleRectPx; return u.shouldShiftMapRect ? u.rtl ? f.fromMinMax(e.min, { x: e.max.x - u.overlayWidthPx, y: e.max.y }) : f.fromMinMax({ x: e.min.x + u.overlayWidthPx, y: e.min.y }, e.max) : e; } //#endregion export { Xt as a, yt as c, ht as d, ln as i, xt as l, Ln as n, qt as o, Sn as r, Wt as s, Rn as t, St as u };