@expofp/floorplan
Version:
Interactive floor plan library for expos and events
1,551 lines (1,550 loc) • 46.1 kB
JavaScript
(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 };