@expofp/floorplan
Version:
Interactive floor plan library for expos and events
1,655 lines • 56.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.7.8" };
var t = new e.Error().stack;
t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "a55418ef-3277-40e3-abb0-d29255507a00", e._sentryDebugIdIdentifier = "sentry-dbid-a55418ef-3277-40e3-abb0-d29255507a00");
} catch {}
})();
import { r as e } from "./rolldown-runtime-YBAZwyzS.js";
import { t } from "./react-Di3Pmpio.js";
import { t as n } from "./loadImage-CAq2UZsg.js";
import { _ as r, ct as i, f as a, j as o } from "./i18n-BEer1tI4.js";
import { $ as s, A as c, At as l, B as u, Bt as d, Ct as f, Et as p, F as m, Ft as h, G as g, Gt as _, Ht as v, I as y, It as b, J as x, Jt as S, Kt as C, L as w, M as T, Nt as E, P as D, Pt as O, Q as k, Qt as ee, R as A, Rt as j, Tt as te, U as M, V as ne, Vt as re, W as ie, Wt as ae, X as oe, Y as se, Z as ce, Zt as le, cn as ue, et as de, fn as fe, i as N, j as pe, ln as P, o as F, on as me, p as he, q as ge, rn as _e, s as I, st as L, t as R, un as ve, xt as ye, z as be, zt as xe } from "./store-DTwRqruF.js";
//#region src/wayfinding/layers.ts
var Se = "wf-points", Ce = "wf-trail-points", we = "wf-lines", Te = "wf-lines-animated", Ee = "wf-current-position", De = "traffic_route", Oe = "traffic_route_stop", ke = "traffic_vehicles", Ae = "build_route_lines", je = "build_route_dots", Me = 5;
function Ne() {
let e = [];
for (let t = 0; t < Me; t++) e.push({
name: Pe(t),
children: []
}), e.push({
name: Fe(t),
children: [],
interactive: !0
});
return e.push({
name: ke,
children: [],
interactive: !0
}), e.push({
name: Ae,
children: []
}), e.push({
name: je,
children: [],
interactive: !0
}), e;
}
function Pe(e) {
return `${De}_${e + 1}`;
}
function Fe(e) {
return `${Oe}_${e + 1}`;
}
function Ie() {
return RegExp(`^${De}_\\d+$`);
}
function Le() {
return RegExp(`^${Oe}_\\d+$`);
}
//#endregion
//#region src/utils/geometry.ts
var Re = /* @__PURE__ */ e(ve(), 1);
function ze(e, t, n) {
let [r, i] = n[0], [a, o] = n[1], [s, c] = n[2], l = (o - c) * (r - s) + (s - a) * (i - c);
if (l === 0) return !1;
let u = ((o - c) * (e - s) + (s - a) * (t - c)) / l, d = ((c - i) * (e - s) + (r - s) * (t - c)) / l, f = 1 - u - d;
return u >= 0 && u <= 1 && d >= 0 && d <= 1 && f >= 0 && f <= 1;
}
//#endregion
//#region src/components/Map/drawing/config/config-booth-badge.ts
var Be = .5, Ve = .3, He = 15, Ue = 24, We = 30, Ge = 12, Ke = .8, qe = document.createElement("canvas").getContext("2d");
function Je(e) {
return e.length <= He ? e : e.slice(0, He - 1) + "…";
}
function Ye(e) {
var t, n;
if (!((t = e.paths) != null && t.length)) return [];
let r = ((n = e.layer) == null ? void 0 : n.name) || "", i = [];
for (let t of e.paths) for (let e of me(t.index, r)) i.push(e);
return i;
}
function Xe(e) {
let t = Ye(e);
if (!t.length) return null;
let n = Infinity, r = Infinity, i = -Infinity, a = -Infinity;
for (let e of t) for (let t of e) t[0] < n && (n = t[0]), t[1] < r && (r = t[1]), t[0] > i && (i = t[0]), t[1] > a && (a = t[1]);
return isFinite(n) ? {
x1: n,
y1: r,
w: i - n,
h: a - r
} : null;
}
function z(e, t, n) {
for (let r of n) if (ze(e, t, r)) return !0;
return !1;
}
function Ze(e, t, n, r, i, a) {
if (!e.length || !z(t, n, e)) return a;
let o = 0, s = a;
for (let a = 0; a < 10; a++) {
let a = (o + s) / 2, c = r * a, l = i * a;
z(t + c, n, e) && z(t, n + l, e) && z(t + c, n + l, e) ? o = a : s = a;
}
return o;
}
function Qe(e) {
var t;
return (t = Xe(e)) == null ? e.rect : t;
}
function $e(e, t, n, r) {
let i = Qe(e);
if (t.length) {
let e = /* @__PURE__ */ new Set(), r = null, a = Infinity;
for (let o of t) for (let s of o) {
let o = `${s[0]},${s[1]}`;
if (e.has(o)) continue;
e.add(o);
let c = s[0] + n, l = s[1] + n;
if (z(c, l, t)) {
let e = c - i.x1 + (l - i.y1);
e < a && (a = e, r = {
x: c,
y: l
});
}
}
if (r) return r;
}
let a = e.rect.x1 + n, o = e.rect.y1 + n;
if (!r) return {
x: a,
y: o
};
let s = Math.cos(r), c = Math.sin(r), l = a - e.rect.cx, u = o - e.rect.cy;
return {
x: e.rect.cx + l * s - u * c,
y: e.rect.cy + l * c + u * s
};
}
function B(e) {
return e && e !== "none" ? e : void 0;
}
function et(e) {
var t;
let n = B(e.borderColor) || B(fe.boothBorderColor) || fe.colors.booths.default;
return ((t = e.paths) == null ? void 0 : t.length) > 1 && B(e.paths[e.paths.length - 1].color) || n;
}
function tt(e, t) {
let n = Je(t.title || t.name), i = et(t), a = he((0, Re.default)(i).hex()), o = window.devicePixelRatio || 1, s = te();
qe.font = ee(We, s);
let c = qe.measureText(n).width, l = Math.ceil(c + Ge * 2), u = (t.borderWidth || R.borderWidth) / 2, f = l * Ke, m = 54 * Ke, h = t.rotate ? -t.rotate : 0, g = t.rect.w, _ = t.rect.h, v = Math.min(g > 0 ? g * Be / f : Infinity, _ > 0 ? _ * Ve / m : Infinity), y = Ye(t), { x: b, y: x } = $e(t, y, u, h), S = Ze(y, b, x, f, m, v), w = Math.cos(h), T = Math.sin(h), E = (e, t) => {
let n = e / 2, r = t / 2, i = b + n * w - r * T, a = x + n * T + r * w;
return new C({
x: i - n,
y: a - r
}, {
x: i + n,
y: a + r
}, h);
}, D = (e) => {
let t = Math.min(e, S);
return E(f * t, m * t);
}, O = p(s, e.fontUrls), k = j(E(1, 1), i);
k.hidden = !0, k.dim = t.skipDim ? !1 : void 0;
let A = xe(d([[n], []], a, 0, [O, O]), E(1, 1), [0, 0], {
horizontal: "center",
vertical: "center"
});
A.hidden = !0, A.dim = t.skipDim ? !1 : void 0;
let M = () => !!(t.layer && !t.layer.visible);
return r(() => t.skipDim, (t) => {
k.dim = t ? !1 : void 0, A.dim = t ? !1 : void 0, e.update(k, A);
}), r(() => {
var e, n;
return (e = (n = t.layer) == null ? void 0 : n.visible) == null ? !0 : e;
}, (t) => {
k.hidden = !t, A.hidden = !t, e.update(k, A);
}), e.onPtScale(`badge-bg-${t.id}`, (e) => (k.shape = D(e), k.hidden = M(), k)), e.onPtScale(`badge-text-${t.id}`, (e) => {
let t = Math.min(e, S);
return A.lines[0].fontSize = Ue / o * t, A.bounds = D(e), A.hidden = M(), A;
}), {
bg: k,
text: A
};
}
function nt(e, t, n) {
if (ue.hideExhibitorBoothNumber) return null;
let r = [], i = [];
for (let t of n) if (t instanceof _e && t.noLabels && !I.hideLogoInBooth && t.exhibitors.some((e) => e.logoInBooth && e.logo)) {
let { bg: n, text: a } = tt(e, t);
r.push(n), i.push(a);
}
return r.length ? {
name: `${t}:badges`,
children: [{
name: `${t}:badgeBgs`,
children: r
}, {
name: `${t}:badgeTexts`,
children: i
}]
} : null;
}
//#endregion
//#region src/components/Map/drawing/config/config-markers.ts
var rt = "_selected", it = "markers";
function at(e) {
let t = [], n = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = [], o = e.scene.rootLayer.children.find((e) => e.name === it);
async function s(e) {
let t = [];
e.forEach((e) => {
let { name: r, content: i, width: a, height: o, scale: s } = e;
if (n.has(r)) return;
let c = new Image(), l = new Promise((e, t) => {
c.onload = () => {
n.set(r, {
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 c = (e) => `marker-ptScaleHandlers-${e.id}`, u = (e) => `marker-rollHandlers-${e.id}`, d = (t, n) => {
e.onPtScale(n, (e) => {
let { center: n, rotation: r } = t.bounds, { width: i, height: a } = t.source;
return t.bounds = _(n.x, n.y, i, a, e, r), t;
});
}, f = (t, n) => {
e.onRoll(n, (e) => (t.bounds.rotation = e, t));
};
function p() {
let t = F.routeStore.markersData.markers;
if (!t.length) return;
a = [];
let r = e.scale, s = l(e.angle);
t.forEach((e) => {
var t, o;
let c = n.get(e.icon);
if (!c) return;
let l = c.scale || window.devicePixelRatio, u = e.icon;
if (!i.has(u)) {
let e = le(c.img, c.width, c.height, l);
i.set(u, e);
}
let d = i.get(u), f = n.get(e.selectedIcon), p = e.selectedIcon;
if (!i.has(p)) {
let e = le(f.img, f.width, f.height, l);
i.set(p, e);
}
let m = i.get(p), h = (t = (o = N.findLayer(e.z)) == null ? void 0 : o.visible) == null ? !0 : t, g = _(e.x, e.y, d.width, d.height, r, s), v = _(e.x, e.y, m.width, m.height, r, s), 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 b = {
...O(d, g, {
hidden: !h,
origin: y
}),
id: e.id,
scale: l
}, x = {
...O(m, v, {
hidden: !(h && e.active),
origin: y
}),
id: `${e.id}${rt}`,
scale: l
};
a.push(b, x);
}), o.children = a, a.forEach((e) => {
d(e, c(e)), f(e, u(e));
});
}
function m() {
a.forEach((t) => {
e.ptScaleRegistry.unregisterByName(c(t)), e.rollRegistry.unregisterByName(u(t));
}), o.children = [], a = [];
}
function h() {
let e = F.routeStore.markersData.markers;
e.length && e.forEach((e) => {
var t, n;
let r = a.find((t) => t.id === e.id), i = a.find((t) => t.id === `${e.id}${rt}`);
if (!r) return;
let o = (t = (n = N.findLayer(e.z)) == null ? void 0 : n.visible) == null ? !0 : t;
e.active ? (r.hidden = !0, i.hidden = !(o && e.active)) : (r.hidden = !o, i.hidden = !0);
});
}
return t.push(r(() => [F.routeStore.selectedMarkers, F.layerStore.visible], () => {
if (!F.routeStore.markersData.markers.length) {
m(), e.update(o);
return;
}
h(), e.update(...a);
})), t.push(r(() => F.routeStore.markersData.markers, () => {
s(F.routeStore.markersData.icons).then(() => {
p(), e.update(o);
});
}, { fireImmediately: !0 })), function() {
t.forEach((e) => e()), t.length = 0;
};
}
function ot(e, t, n) {
for (let r of F.routeStore.markersData.markers) {
let i = F.routeStore.markersData.icons.find((e) => e.name === r.icon);
if (!i) continue;
let a = i.width * n * devicePixelRatio, o = i.height * n * devicePixelRatio;
if (st(e, t, r.x, r.y, a, o)) {
let e = F.layerStore.findLayer(r.z);
if (!e || e && e.visible) return r;
}
}
return null;
}
function st(e, t, n, r, i, a) {
let o = e >= n - i && e <= n + i, s = t >= r - a && t <= r + a;
return o && s;
}
//#endregion
//#region src/components/Map/drawing/config/config-all.ts
function ct(e) {
let { layers: t, defaultLayer: n } = F.layerStore;
if (n) {
let e = [].concat(t), r = t.find((e) => e === n), i = t.indexOf(r);
e.splice(i, 1), t = [r].concat(e);
}
let r = t.filter((e) => !e.rootParent).map((t) => f(t, e));
return Promise.all(r).then((t) => {
let n = h(Se, [], {
dim: !1,
interactive: !0
}), r = h(we, [], { dim: !1 }), i = h(it, []), a = h(Ce, [], { dim: !1 }), o = h(Te, [], { dim: !1 }), s = h(Ee, [], { dim: !1 }), c = [], l = [];
for (let e of t.flat()) S(e.name) ? (e.dim = !1, l.push(e)) : c.push(e);
let u = nt(e, "root", F.boothStore.booths);
return [
...c,
...u ? [u] : [],
...l,
...Ne(),
i,
a,
r,
o,
n,
s
];
});
}
//#endregion
//#region src/components/Map/traffic/UpdateQueue.ts
var V = /* @__PURE__ */ e(t(), 1), lt = 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;
}
}, H = 49, ut = `hsl(257, 76%, ${H}%)`, dt = `hsl(339.903, 82%, ${H}%)`, ft = `hsl(257, 76%, ${Math.round(H * 1.82)}%)`, U = 4, pt = U, mt = "U", ht = "R", gt = "S", _t = "P", vt = 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 ${ht}.
Apply Simplification: Press ${gt}.
Undo: Press ${mt}.
Enable/Disable Preview: Press ${_t}.
`, 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, t, n) => (n.y - e.y) * (t.x - e.x) - (t.y - e.y) * (n.x - e.x);
return i(e, n, r) * i(t, n, r) < 0 && i(n, e, t) * i(r, e, t) < 0;
}, 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 yt({ enabled: e, rendererService: t }) {
let n = (0, V.useRef)(!1), r = (0, V.useRef)(), i = (0, V.useMemo)(() => ae(U, ut), []), a = (0, V.useMemo)(() => ae(U, dt), []), o = (0, V.useMemo)(() => new vt(), []), s = (0, V.useRef)(new lt()), c = (0, V.useMemo)(() => {
if (!t.scene) return {};
let e = t.scene.rootLayer.children;
return {
linesLayer: e.find((e) => e.name === Ae),
pointsLayer: e.find((e) => e.name === je)
};
}, [t.scene]), l = (0, V.useCallback)(() => {
if (!(t != null && t.renderer) || !c || !i || !a) return;
let { linesLayer: e, pointsLayer: l } = c;
if (!e || !l) return;
let u = o.points, d = n.current;
d ? l.children.length = 0 : l.children = u.map(({ x: e, y: t }, n) => {
let s = n == o.selected ? a : i;
return {
source: s,
bounds: _(e, t, s.width, s.height, r.current)
};
});
let f = [];
for (let e = 1; e < u.length; e++) {
let t = u[e - 1], n = u[e];
f.push({
points: [t, n],
color: d ? ut : ft,
width: pt
});
}
f.length ? e.children = f : e.children.length = 0, s.current.add(() => t.update(l, e)), o.instruct(), o.log(JSON.stringify(o.points));
}, [
t,
o,
c,
i,
a
]), u = (0, V.useCallback)((e) => {
let t = e.key.toUpperCase();
o.execute(() => {
switch (t) {
case mt:
e.preventDefault(), o.undo(), n.current = !1, l();
break;
case ht:
e.preventDefault(), o.applySmoothing(), n.current = !1, l();
break;
case gt:
e.preventDefault(), o.applySimplification(), n.current = !1, l();
break;
case _t:
e.preventDefault(), n.current = !n.current, l();
break;
}
});
}, [o, l]), d = (0, V.useCallback)(({ ptScale: e, sceneId: n }) => {
if (!re(n) || !(t != null && t.renderer) || !c) return;
let { pointsLayer: i } = c;
i && (r.current = e, o.execute(() => {
let e = i.children, n = [];
for (let t = 0; t < e.length; t++) {
let i = e[t];
i.bounds = _(i.bounds.center.x, i.bounds.center.y, i.source.width, i.source.height, r.current), n.push(i);
}
s.current.add(() => t.update(...n));
}));
}, [
t,
c,
o
]), f = (0, V.useCallback)(({ data: e }) => {
o.execute(() => {
let { point: t } = v(e);
o.add({
x: t.x,
y: t.y
}), o.select(o.points.length - 1), l();
});
}, [o, l]);
(0, V.useEffect)(() => {
let n = t.renderer;
if (!(!e || !n)) return r.current = t.scale, o.execute(() => {
o.restore(), l();
}), n.events.addEventListener("pointer:click", f), n.events.addEventListener("viewport:ptscale", d), window.addEventListener("keyup", u), () => {
window.removeEventListener("keyup", u), n.events.removeEventListener("pointer:click", f), n.events.removeEventListener("viewport:ptscale", d), s.current.destroy();
};
}, [
e,
t,
o,
l,
f,
d,
u
]);
}
//#endregion
//#region src/components/Map/traffic/useManageTraffic.ts
var W = 2, bt = W * 3.5, G = W * 12, xt = G * .7, St = 8, Ct = "transport_locations", wt = 150, K = "#a4aab6", Tt = 1e3, Et = 2e4, Dt = 500;
function Ot({ permission: e, rendererService: t, dataJsonUrl: r, websocketUrl: i }) {
let a = (0, V.useRef)(window.devicePixelRatio), s = (0, V.useRef)(/* @__PURE__ */ new Map()), c = (0, V.useRef)(/* @__PURE__ */ new Map()), l = (0, V.useRef)(), u = (0, V.useRef)(), d = (0, V.useRef)(performance.now()), f = (0, V.useRef)(1), p = (0, V.useRef)(new lt()), m = (0, V.useRef)(/* @__PURE__ */ new Map()), h = (0, V.useRef)(), g = (0, V.useRef)(Tt), v = (0, V.useRef)(/* @__PURE__ */ new Map()), y = (0, V.useRef)();
(0, V.useEffect)(() => {
let b;
async function x() {
if (!(!e || !t.scene)) try {
let e;
try {
let t = await fetch(r, {
method: "GET",
headers: { "Content-Type": "application/json" }
});
if (!t.ok || t.status === 204) return;
e = await t.json();
} catch (e) {
console.warn("useManageTraffic failed to get JSON", e);
}
if (!e || e != null && e.disabled || e != null && e.error) return;
a.current = kt(t.scale);
let i = new Map(e.routes.map(({ id: e, color: t }) => [e, t])), l = t.scene.rootLayer.children, g = /* @__PURE__ */ new Map();
i.forEach((e) => {
g.set(e, Mt({
radius: bt,
color: e,
scale: window.devicePixelRatio
}));
});
let y = Ie(), x = l.filter((e) => y.test(e.name)), C = Le(), T = l.filter((e) => C.test(e.name));
e.routes.slice(0, x.length).forEach(({ id: e, color: n, path: r, stops: i, hiddenPoints: o }, s) => {
m.current.set(e, r);
let c = x[s];
if (c) {
var l;
let e = new Map((l = o == null ? void 0 : o.map((e) => [zt(e), e])) == null ? [] : l);
for (let t = 1; t < r.length; t++) {
let i = r[t - 1], a = r[t];
e.has(zt(i)) || e.has(zt(a)) || c.children.push({
points: [i, a],
color: n,
width: W
});
}
c.children.length && p.current.add(() => t.update(c));
}
let u = T[s];
if (u && i != null && i.length) {
let e = g.get(n);
i.forEach((t) => {
u.children.push({
source: e,
bounds: _(t.x, t.y, e.width, e.height, a.current)
});
}), u.children.length && p.current.add(() => t.update(u));
}
});
let E = l.find((e) => e.name === ke), D = /* @__PURE__ */ new Map();
h.current = (e) => {
try {
let { ptScale: n, sceneId: r } = At(e);
if (!re(r)) return;
a.current = kt(n);
let i = [];
for (let e = 0; e < T.length; e++) {
let t = T[e].children;
for (let e = 0; e < t.length; e++) {
let n = t[e];
n.bounds = _(n.bounds.center.x, n.bounds.center.y, n.source.width, n.source.height, a.current, n.bounds.rotation), i.push(n);
}
}
let o = [...s.current.values()];
for (let e = 0; e < o.length; e++) {
let t = o[e];
t.bounds = _(t.bounds.center.x, t.bounds.center.y, t.source.width, t.source.height, a.current, t.bounds.rotation);
}
p.current.add(() => t.update(...i, ...o));
} catch (e) {
console.error("ptscale", e);
}
}, t.renderer.events.addEventListener("viewport:ptscale", h.current), b = requestAnimationFrame(() => {
var e;
(e = h.current) == null || e.call(h, t.scale);
}), i.forEach((e, t) => {
D.set(t, Nt({
id: t,
width: G,
height: G,
color: e,
scale: window.devicePixelRatio
}));
}), D.set(K, Nt({
id: "orphan",
width: G,
height: G,
color: K,
scale: window.devicePixelRatio
}));
let O = null;
try {
O = le(await n(`${o}icons/bus-white.svg`), xt, xt, window.devicePixelRatio);
} catch (e) {
console.error(e);
}
u.current = (e) => {
try {
var n;
let r = JSON.parse(e.data);
if (r.type !== Ct) return;
let i = e.timeStamp || performance.now();
f.current = Math.round(i - d.current), d.current = i;
let o = Math.max((n = f.current) == null ? Dt : n, Dt), l = c.current, u = s.current, h = E.children, g = p.current, y = !1;
r.data.forEach(({ id: e, x: n, y: r, route_id: i, hidden: s }) => {
if (l.has(e)) {
var c;
(c = l.get(e)) == null || c(), l.delete(e);
}
if (s && u.has(e) && u.has(J(e))) {
let n = u.get(e);
n.hidden = !0;
let r = u.get(J(e));
r.hidden = !0, g.add(() => t.update(n, r));
return;
}
if (v.current.set(e, performance.now()), !u.has(e)) {
let t = D.get(i) || D.get(K), o = {
id: e,
source: t,
bounds: _(n, r, t.width, t.height, a.current, 0)
};
if (u.set(e, o), O) {
let t = J(e), i = {
id: t,
source: O,
bounds: _(n, r, O.width, O.height, a.current, 0)
};
O.setAttribute("id", t), u.set(t, i), h.push(o, i);
} else h.push(o);
y = !0;
return;
}
let d = u.get(e), f = u.get(J(e)), p = d.bounds.center, b = Lt(p, {
x: n,
y: r
}, m.current.get(i));
if (b.reduce((e, t, n) => n === 0 ? e : e + q(b[n - 1], t), 0) >= wt || document.hidden) Pt({
rendererService: t,
updateQueue: g,
vehicle: d,
vehicleFinery: f,
x: n,
y: r,
scale: a.current,
angle: jt(d.bounds.center, {
x: n,
y: r
})
});
else {
let n = Rt(b, o, (e) => {
Pt({
rendererService: t,
updateQueue: g,
vehicle: d,
vehicleFinery: f,
x: e.x,
y: e.y,
scale: a.current,
angle: e.angle
});
});
l.set(e, n);
}
}), y && g.add(() => t.update(E));
} catch (e) {
console.error("handleSocketMessage", e);
}
}, S(), w(e.config ? (Number(e.config.vehicle_inactive_interval) || 20) * 1e3 : Et);
} catch (e) {
console.warn(e);
}
}
x();
function S() {
var e, t;
((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 = () => {
g.current = Tt;
}, l.current.onclose = () => {
navigator.onLine && (setTimeout(S, g.current), g.current = Math.min(g.current * 2, 3e4));
});
}
function C() {
S();
}
window.addEventListener("online", C);
function w(e) {
clearInterval(y.current), y.current = window.setInterval(() => {
let n = performance.now(), r = [], i = [];
v.current.forEach((t, a) => {
if (n - t < e) return;
let o = s.current.get(a);
o && (o.hidden = !0, i.push(o), r.push(a));
let c = J(a), l = s.current.get(c);
l && (l.hidden = !0, i.push(l), r.push(c));
}), i.length && p.current.add(() => t.update(...i)), r.forEach((e) => v.current.delete(e));
}, e);
}
return () => {
h.current && t.renderer && t.renderer.events.removeEventListener("viewport:ptscale", h.current), b !== void 0 && cancelAnimationFrame(b), c.current.forEach((e) => e == null ? void 0 : e()), c.current.clear(), s.current.clear(), p.current.destroy(), window.removeEventListener("online", C), clearInterval(y.current);
};
}, [
e,
t,
r,
i
]);
}
function kt(e) {
return Math.min(e || window.devicePixelRatio, St);
}
function At(e) {
return typeof e == "number" ? { ptScale: e } : e;
}
function jt(e, t) {
return Math.atan2(t.y - e.y, t.x - e.x);
}
function Mt({ radius: e, scale: t, color: n }) {
let r = document.createElement("canvas"), i = r.getContext("2d");
i.imageSmoothingEnabled = !1;
let a = Math.ceil(e * 2 * t), o = a / 2, s = e * .78, c = e * .33;
return r.width = a, r.height = a, i.translate(o, o), i.scale(t, t), i.beginPath(), i.arc(0, 0, e, 0, 2 * Math.PI), i.fillStyle = "#FFFFFF", i.fill(), i.beginPath(), i.arc(0, 0, s, 0, 2 * Math.PI), i.fillStyle = n, i.fill(), i.beginPath(), i.arc(0, 0, c, 0, 2 * Math.PI), i.fillStyle = "#FFFFFF", i.fill(), r;
}
function Nt({ id: e, width: t, height: n, color: r, scale: i }) {
let a = 2 * i, o = t / 2 * i, s = n * i, c = .01, l = s * .6, u = s, d = 8 * i, f = u + a + l / 2 + d * 2, p = o * 2 + l + a + d * 2, m = document.createElement("canvas");
m.setAttribute("id", e), m.width = f, m.height = p;
let h = m.getContext("2d"), g = f / 2, _ = p / 2;
h.save(), h.translate(g, _), h.rotate(-Math.PI / 2), h.translate(-g, -_);
let v = g, y = _ - u / 2 + o, b = y + l;
return h.shadowColor = "rgba(16, 24, 40, 0.2)", h.shadowBlur = d / 2, h.beginPath(), h.arc(v, y, o, Math.PI, 0, !1), h.bezierCurveTo(v + o, y + s * .3, v + c * o, b, v, b), h.bezierCurveTo(v - c * o, b, v - o, y + s * .3, v - o, y), h.closePath(), h.fillStyle = r, h.fill(), h.strokeStyle = "#FFFFFF", h.lineWidth = a, h.stroke(), h.restore(), m;
}
function q(e, t) {
return Math.hypot(e.x - t.x, e.y - t.y);
}
function J(e) {
return `${e}_finery`;
}
function Pt({ rendererService: e, updateQueue: t, vehicle: n, vehicleFinery: r, x: i, y: a, scale: o, angle: s }) {
n.bounds = _(i, a, n.source.width, n.source.height, o, s), n.hidden = !1, r ? (r.bounds = _(i, a, r.source.width, r.source.height, o, l(e.angle)), r.hidden = !1, t.add(() => e.update(r, n))) : t.add(() => e.update(n));
}
function Y(e, t, n) {
return {
x: e.x + (t.x - e.x) * n,
y: e.y + (t.y - e.y) * n
};
}
function Ft(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 = q(e, Y(a, o, d));
f < n && (n = f, r = {
index: i,
t: d
});
}
return r;
}
function It(e, t, n) {
let r = q(e, t), i = Math.max(2, Math.ceil(r / n) + 1), a = [];
for (let n = 0; n < i; n++) {
let r = Y(e, t, n / (i - 1));
a.push({
x: r.x,
y: r.y
});
}
return a;
}
function Lt(e, t, n) {
if (!n || !n.length) return It(e, t, 10);
let r = Ft(e, n), i = Ft(t, n), a = [], o = (e) => a.push({
x: e.x,
y: e.y
});
r.index + 1 < n.length ? o(Y(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(Y(n[i.index], n[i.index + 1], i.t)) : o(n[i.index]), a;
}
function Rt(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 = Math.hypot(e[t + 1].x - e[t].x, e[t + 1].y - e[t].y);
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) / _, y = h.x + (g.x - h.x) * v, b = h.y + (g.y - h.y) * v, x = g.x - h.x, S = g.y - h.y;
n({
x: y,
y: b,
angle: x === 0 && S === 0 ? 0 : Math.atan2(S, x)
}), d < 1 ? a = requestAnimationFrame(c) : r && r();
};
return a = requestAnimationFrame(c), () => {
a && cancelAnimationFrame(a);
};
}
function zt(e) {
return `${e.x},${e.y}`;
}
//#endregion
//#region src/utils/dimming.ts
var Bt = .5, Vt = "cubic";
function Ht(e, t) {
let n = e.scene;
if (!n) return;
let r = n.rootLayer;
r.dim !== t && (r.dim = t, e.update(n.rootLayer));
}
function Ut(e, t = 300, n = Vt) {
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(l / c, 1), f = Wt(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 Wt(e, t) {
return t === "linear" ? e : Gt(e);
}
function Gt(e) {
return e < .5 ? 4 * e * e * e : 1 - (-2 * e + 2) ** 3 / 2;
}
//#endregion
//#region src/components/Map/booth-by-xy.ts
var Kt = /* @__PURE__ */ new Map(), qt = [], Jt = [], Yt = [], X = /* @__PURE__ */ new Map(), Z;
function Xt() {
let e = R.booths.filter((e) => e.visible && e.rect && e.rect.w > 0 && e.rect.h > 0);
if (Kt = /* @__PURE__ */ new Map(), qt = [], Yt = [], Z = null, X = /* @__PURE__ */ new Map(), !e.length) return;
Jt = e.filter((e) => e.paths);
let t = P.fromMultiple(e.map((e) => e.rect));
for (let t of e) {
let e = t.rect;
Math.abs(t.rotate) === 90 * Math.PI / 180 && (e = e.getRotated90()), qt.push(e), Kt.set(e, t);
}
let n = Math.ceil(t.w / 2), r = Math.ceil(t.h / 2);
for (let e = 0; e < 2; e++) for (let i = 0; i < 2; i++) {
let a = t.x1 + e * n, o = t.y1 + i * r, s = P.fromXywh(a, o, n, r);
Yt.push(s);
let c = qt.filter((e) => s.intersects(e));
X.set(s, c);
}
i.log("hover segmentToRects", X);
}
r(() => [
R.booths,
N.loaded,
N.visible
], () => Xt());
function Zt(e, t) {
let n;
n = Z && Z.containsPoint(e, t) ? Z : Yt.find((n) => n.containsPoint(e, t)), n && (Z = n);
let r = X.get(n);
if (r) {
let n = r.filter((n) => n.containsPoint(e, t));
if (n.length) {
let e;
e = n.length > 1 ? n.sort((e, t) => e.w - t.w)[0] : n[0];
let t = Kt.get(e);
return t.visible ? t : null;
}
}
for (let n of Jt) for (let r of n.paths) for (let i of me(r.index, N.mode === ye.Default ? "" : n.layer.name)) if (ze(e, t, i)) return n.visible ? n : null;
return null;
}
function Qt(e, t) {
return Zt(e, t);
}
//#endregion
//#region src/wayfinding/bindMobxReactions.ts
var $t = (e) => "rect" in e ? de(e) : e;
function en({ runtime: e, kioskHandler: t, yahHandler: n, stores: { routeStore: i, uiState: o, layerStore: s }, rerouteThresholdSvg: c }) {
let l = [], u = T(c);
function d() {
var t;
let n = o.selectedRoute, r = n != null && n.from ? $t(n.from) : null, a = n != null && n.to ? $t(n.to) : null;
if (!r || !a) {
e.clearRoute();
return;
}
e.setRoute({
from: r,
to: a,
waypoints: n == null || (t = n.waypoints) == null ? void 0 : t.map(de),
accessible: i.onlyAccessible
}) === !1 && console.error(/* @__PURE__ */ Error(`Route not found: (${r.x},${r.y}) → (${a.x},${a.y})`));
}
function f() {
let t = i.currentPosition, r = i.iconType !== 0, a = o.selectedRoute, s = !!(a != null && a.from && a != null && a.to), c = r && !s;
if (!t) {
e.onPositionChanged(null), n(null);
return;
}
let l = ie(t);
c ? (e.onPositionChanged(null), n({
x: l.x,
y: l.y,
layer: l.layer
})) : (n(null), e.onPositionChanged(l));
}
function p() {
var e;
let t = i.currentPosition, n = o.selectedRoute;
if (!t || !(n != null && n.to)) return;
let r = !n.from, a = ((e = n.from) == null ? void 0 : e.id) === "current-position" && u.shouldReroute(ie(t), i.routeLines);
!r && !a || i.rebuildRouteFromPosition(ge(t, g, x));
}
function m() {
var e, n;
let r = (e = s.floors.find((e) => e.active)) == null ? void 0 : e.name;
t((n = o.kioskData) == null ? null : n, r, s.mode);
}
function h() {
var e;
let t = o.selectedRoute, n = i.currentPosition;
if (!(t != null && t.to) || !n || ((e = t.from) == null ? void 0 : e.id) !== "current-position" || i.routeLines.length > 0) return;
let r = n.z == null ? "" : String(n.z);
t.from.x === n.x && t.from.y === n.y && t.from.layer === r || i.rebuildRouteFromPosition(ge(n, g, x));
}
l.push(r(() => s.layersLoaded, () => {
d(), f();
}), r(() => [o.selectedRoute, i.onlyAccessible], () => {
d(), f();
}), r(() => i.currentPosition, () => {
f();
}), r(() => {
let e = i.currentPosition;
return e ? {
x: e.x,
y: e.y,
z: e.z
} : null;
}, () => {
p(), h();
}, { equals: a.structural }), r(() => [o.kioskData, s.floors.find((e) => e.active)], () => m()));
let _ = null, v = r(() => [i.currentRouteLayer, o.getRouteNextFloor], () => {
s.layersLoaded && (_ !== null && clearTimeout(_), _ = setTimeout(() => {
e.onFloorChanged(), f(), _ = null;
}, 0));
});
return l.push(() => {
_ !== null && clearTimeout(_), v();
}), d(), f(), m(), () => {
for (let e of l) e();
l.length = 0;
};
}
//#endregion
//#region src/wayfinding/handlers/kioskHandler.ts
var tn = "kiosk", nn = 0;
function rn({ renderer: e, kioskIconMap: t, layer: n }) {
return (r, i, a) => {
var o;
if (!r) {
e.setIcon(tn, null), e.flush();
return;
}
if (a !== nn && r.z && i && r.z !== i) {
e.setIcon(tn, null), e.flush();
return;
}
e.setIcon(tn, {
canvas: oe(t, r.iconSizePercent),
layer: n,
x: r.x,
y: r.y,
rotation: ((o = r.heading) == null ? 0 : o) * Math.PI / 180
}), e.flush();
};
}
//#endregion
//#region src/wayfinding/handlers/yahHandler.ts
var an = "yah";
function on({ renderer: e, iconProvider: t, floorContext: n, layer: r }) {
return (i) => {
if (!i) {
e.setIcon(an, null), e.flush();
return;
}
let a = n.isLayerVisible(i.layer);
e.setIcon(an, {
canvas: t.getIcon("yah").canvas,
layer: r,
x: i.x,
y: i.y,
hidden: !a,
dimmed: !a,
origin: [.5, 1]
}), e.flush();
};
}
//#endregion
//#region src/wayfinding/runtime/getRouteLines.ts
function sn({ engine: e, from: t, to: n, waypoints: r, accessible: i }) {
return r != null && r.length ? e.buildWaypointsRoute([
t,
...r,
n
], { accessible: i }).lines : e.buildRoute(t, n, { accessible: i }).lines;
}
//#endregion
//#region src/wayfinding/runtime/endpointView.ts
function cn(e, t) {
return !t || !e.bounds && e.id !== "current-position";
}
function ln({ renderer: e, iconProvider: t, floorContext: n, layer: r }) {
return {
place(i, a, o, s) {
if (!o.length) return;
let c = n.isLayerVisible(i.layer), l = n.isLayerVisible(a.layer), u = o[o.length - 1], d = o[0], f = i.id === "current-position" && s;
e.setIcon("source", {
canvas: t.getIcon(f ? "source_inactive" : "source").canvas,
layer: r,
x: u.x,
y: u.y,
hidden: cn(i, c),
dimmed: !c,
cardinalSnap: !0
}), e.setIcon("destination", {
canvas: t.getIcon("destination").canvas,
layer: r,
x: d.x,
y: d.y,
hidden: !l || !a.bounds,
dimmed: !l,
cardinalSnap: !0
});
},
hide() {
e.setIcon("source", null), e.setIcon("destination", null);
}
};
}
//#endregion
//#region src/wayfinding/runtime/positionTrailView.ts
var Q = "trail";
function un({ renderer: e, iconProvider: t, floorContext: n, trails: r, iconLayer: i, snapThreshold: a }) {
let o = se({
renderer: e,
iconProvider: t,
layer: i
});
return {
placeIcon(e) {
let t = !n.isLayerVisible(e.layer);
o.place(e, t);
},
hideIcon() {
o.hide();
},
applyToRoute(e, t, r) {
let i = pe(e, [...r], {
snapThreshold: a,
from: t.from,
to: t.to
}), s = !n.isLayerVisible(e.layer);
return i.snapped ? o.place({
...e,
x: i.snappedPoint.x,
y: i.snappedPoint.y
}, s) : o.place(e, s), i;
},
setTrail(e, t) {
e && t ? r.place(Q, e, t) : r.clear(Q);
},
clearTrail() {
r.clear(Q);
}
};
}
//#endregion
//#region src/wayfinding/runtime/routeLinesView.ts
function dn({ renderer: e, linesLayer: t, animatedLinesLayer: n }) {
return {
draw({ passed: r, remaining: i }, a = !1) {
e.setRouteLines(r, i, {
linesLayer: t,
animatedLinesLayer: n,
resetAnimation: !a
});
},
clear() {
e.setRouteLines([], [], {
linesLayer: t,
animatedLinesLayer: n,
resetAnimation: !0
});
}
};
}
//#endregion
//#region src/wayfinding/runtime/routeRenderData.ts
function fn({ routeLines: e, currentRouteLayer: t, from: n, to: r, snap: i }) {
let a = w(e.filter((e) => !e.virtual), n, r), o = t === null ? a : a.filter((e) => e.p0.layer === t);
if (!(i != null && i.snapped)) return {
passed: [],
remaining: o,
distance: M(a)
};
let { passed: s, remaining: l } = c(o, i.snappedPoint);
return {
passed: s,
remaining: l !== o && l.length > 0 ? [{
...l[0],
p0: i.snappedPoint
}, ...l.slice(1)] : l,
distance: i.distance
};
}
//#endregion
//#region src/wayfinding/runtime/routeUpdate.ts
function pn(e, t) {
let n = e.filter((e) => !e.virtual), r = A(t.flatMap((e) => [e.p0, e.p1]));
return !r || r.x1 === r.x2 && r.y1 === r.y2 ? {
lines: n,
bounds: null
} : {
lines: n,
bounds: r
};
}
//#endregion
//#region src/wayfinding/runtime/trailView.ts
function mn({ renderer: e, iconProvider: t, floorContext: n, layer: r }) {
let i = /* @__PURE__ */ new Set();
function a(e, t) {
if (n.showAllFloors()) return !0;
let r = n.getActiveFloor();
return r ? e === r && t === r : !1;
}
function o(t) {
e.setTrail(t, null, null), i.delete(t);
}
return {
place(n, s, c) {
if (!a(s.layer, c.layer)) {
o(n);
return;
}
e.setTrail(n, s, c, {
canvas: t.getIcon("trail").canvas,
layer: r
}), i.add(n);
},
clear(e) {
o(e);
},
clearAll() {
for (let t of i) e.setTrail(t, null, null);
i.clear();
}
};
}
//#endregion
//#region src/wayfinding/runtime/transitionView.ts
var $ = "transition";
function hn({ renderer: e, iconProvider: t, floorContext: n, onTransitionClick: r, layer: i }) {
return {
place(a) {
e.clearIcons($);
let o;
if (n.showAllFloors()) o = null;
else {
let e = n.getActiveFloor();
if (!e) return;
o = e;
}
let s = u({
routeLines: a,
currentLayerName: o,
floorOrder: n.getFloorOrder()
});
for (let [n, a] of s.entries()) e.setIcon($, {
canvas: t.getIcon(gn(a.role, a.direction)).canvas,
layer: i,
x: a.x,
y: a.y,
cardinalSnap: !0,
onClick: a.role === "exit" ? () => r(a) : void 0
}, n);
},
clear() {
e.clearIcons($);
}
};
}
function gn(e, t) {
return e === "entry" ? "transition_entry" : t === "up" ? "transition_up" : t === "down" ? "transition_down" : "transition";
}
//#endregion
//#region src/wayfinding/runtime/createWayfindingRuntime.ts
var _n = (e) => e.flatMap((e) => [e.p0, e.p1]);
function vn({ engine: e, renderer: t, iconProvider: n, floorContext: r, layers: i, snapThreshold: a, onTransitionClick: o, onRouteUpdate: s, onRouteDistance: c }) {
let l = ln({
renderer: t,
iconProvider: n,
floorContext: r,
layer: i.points
}), u = hn({
renderer: t,
iconProvider: n,
floorContext: r,
onTransitionClick: o,
layer: i.points
}), d = un({
renderer: t,
iconProvider: n,
floorContext: r,
trails: mn({
renderer: t,
iconProvider: n,
floorContext: r,
layer: i.trail
}),
iconLayer: i.currentPosition,
snapThreshold: a
}), f = dn({
renderer: t,
linesLayer: i.lines,
animatedLinesLayer: i.linesAnimated
}), p = [], m = null, h = null, g = null, _ = 0, v = !1, y = !1;
function b() {
return r.showAllFloors() ? null : r.getActiveFloor();
}
function x() {
let e = b();
return e === null ? p.filter((e) => !e.virtual) : p.filter((t) => t.p0.layer === e && !t.virtual);
}
function S() {
if (!m || !h) return null;
let e = x();
return e.length ? {
from: m,
to: h,
routePoints: _n(e),
visibleLines: e
} : null;
}
function C(e = null, t = !1) {
if (!m || !h) return;
let n = fn({
routeLines: p,
currentRouteLayer: b(),
from: m,
to: h,
snap: e
});
f.draw(n, t), _ = n.distance;
}
function w(e) {
let t = S();
if (!t) {
d.setTrail(null, null);
return;
}
let n = g && e && !e.snapped ? g : null, r = (e) => {
var t;
return (t = e.bounds) != null && t.length ? null : e.id === "current-position" ? n : e;
}, i = v ? null : r(t.from);
if (i) {
d.setTrail(t.routePoints[t.routePoints.length - 1], i);
return;
}
let a = r(t.to);
d.setTrail(a ? t.routePoints[0] : null, a);
}
function T() {
if (!m || !h) return;
let e = S();
if (!e) {
l.hide(), u.clear(), d.clearTrail(), C();
return;
}
l.place(m, h, e.routePoints, y), u.place(p), C(), w(null);
}
function E() {
if (!m || !h) return;
let e = S();
e && l.place(m, h, e.routePoints, y);
}
function D() {
if (y = !1, !g || !m || !h) return null;
let e = p.filter((e) => !e.virtual);
if (!e.length) return null;
let t = S(), n = t ? d.applyToRoute(g, t, e) : pe(g, e, {
snapThreshold: a,
from: m,
to: h
});
return n.snapped && (v = !0), y = n.snapped, n;
}
function O() {
let e = pn(p, x());
return s(e.lines, e.bounds), e;
}
function k({ from: n, to: r, waypoints: i, accessible: a }) {
let o = sn({
engine: e,
from: n,
to: r,
waypoints: i,
accessible: a
});
if (!o.length) return j(), !1;
v = !1, m = n, h = r, p = o, T();
let { lines: s } = O(), l = D();
return E(), w(l), l && C(l, !0), c(l ? _ : M(s)), t.flush(), !0;
}
function ee(e) {
let n = g !== null;
if (g = e, !e) {
y = !1, d.hideIcon(), w(null), n && E(), C(), c(_), t.flush();
return;
}
d.placeIcon(e);
let r = D();
E(), w(r), r && C(r, !0), c(_), t.flush();
}
function A() {
T();
let e = D();
E(), w(e), e && C(e, !0), p.length && O(), c(_), t.flush();
}
function j() {
v = !1, p = [], m = null, h = null, _ = 0, l.hide(), u.clear(), d.clearTrail(), f.clear(), s([], null), c(0), t.flush();
}
function te() {
j(), g = null, t.destroy();
}
return {
setRoute: k,
onPositionChanged: ee,
onFloorChanged: A,
clearRoute: j,
destroy: te
};
}
//#endregion
//#region src/wayfinding/renderer/layerManager.ts
function yn(e) {
let t = e.scene;
if (!t) throw Error("renderer: rendererService.scene is null — start RendererService before constructing renderer");
let n = t.rootLayer.children, r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map();
return {
touchedLayers: i,
resolveLayer(e) {
let t = r.get(e);
if (t) return t;
let i = n.find((t) => t.name === e);
if (!i) throw Error(`renderer: layer "${e}" not found in scene`);
return r.set(e, i), i;
},
touchLayer(e) {
let t = this.resolveLayer(e);
return i.set(e, t), t;
},
flush() {
if (i.size !== 0) {
for (let e of i.values()) e.children = [...e.children];
e.update(...i.values()), i.clear();
}
},
destroy() {
i.clear(), r.clear();
}
};
}
//#endregion
//#region src/wayfinding/renderer/iconManager.ts
function bn(e, t) {
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map();
function a(e, t) {
return t === void 0 ? e : `${e}#${t}`;
}
function o(e, t) {
let n = r.get(e);
n || (n = /* @__PURE__ */ new Set(), r.set(e, n)), n.add(t), i.set(t, e);
}
function s(e) {
let t = i.get(e);
if (!t) return;
let n = r.get(t);
n && n.delete(e), i.delete(e);
}
function c(r, i, a) {
var s, c, l;
let u = e.touchLayer(a.layer), d = O(a.canvas, _(a.x, a.y, a.canvas.width, a.canvas.height, t.scale, a.rotation), {
hidden: (s = a.hidden) == null ? !1 : s,
dim: (c = a.dimmed) == null ? !1 : c,
origin: a.origin
});
u.children.push(d), t.onPtScale(r, (e) => {
let t = n.get(r);
if (!(!t || t.imageDef.hidden)) return t.imageDef.bounds = _(t.imageDef.bounds.center.x, t.imageDef.bounds.center.y, t.imageDef.source.width, t.imageDef.source.height, e, t.imageDef.bounds.rotation), t.imageDef;
}), a.cardinalSnap && t.onRoll(r, (e) => {
let t = n.get(r);
if (!t) return;
let i = E(e, t.imageDef.bounds.rotation);
if (i !== void 0) return t.imageDef.bounds.rotation += i, t.imageDef;
});
let f = {
imageDef: d,
layerName: a.layer,
callback: (l = a.onClick) == null ? null : l
};
return n.set(r, f), o(i, r), f;
}
function l(r, i, a, o) {
let l = e.resolveLayer(a.layerName), u = l.children, d = u.indexOf(a.imageDef);
d >= 0 && u.splice(d, 1), e.touchedLayers.set(a.layerName, l), t.ptScaleRegistry.unregisterByName(r), t.rollRegistry.unregisterByName(r), n.delete(r), s(r), c(r, i, o);
}
function u(n, r, i, a) {
var o, s, c;
if (i.layerName !== a.layer) throw Error(`renderer: icon "${n}" cannot move between layers (was "${i.layerName}", got "${a.layer}")`);
if (i.imageDef.source !== a.canvas) {
l(n, r, i, a);
return;
}
i.imageDef.bounds = _(a.x, a.y, a.canvas.width, a.canvas.height, t.scale, a.rotation), i.imageDef.hidden = (o = a.hidden) == null ? !1 : o, i.imageDef.dim = (s = a.dimmed) == null ? !1 : s, i.callback = (c = a.onClick) == null ? null : c, e.touchLayer(a.layer);
}
return {
setIcon(t, r, i) {
let o = a(t, i);
if (r === null) {
let t = n.get(o);
t && (t.imageDef.hidden = !0, t.callback = null, e.touchLayer(t.layerName));
return;
}
let s = n.get(o);
s ? u(o, t, s, r) : c(o, t, r);
},
clearIcons(t) {
let i = typeof t == "string" ? [t] : t;
for (let t of i) {
let i = r.get(t);
if (i) for (let t of i) {
let r = n.get(t);
r && (r.imageDef.hidden = !0, r.callback = null, e.touchLayer(r.layerName));
}
}
},
hideAll() {
for (let t of n.values()) t.imageDef.hidden = !0, t.callback = null, e.touchedLayers.set(t.layerName, e.resolveLayer(t.layerName));
},
destroy() {
for (let e of n.keys()) t.ptScaleRegistry.unregisterByName(e), t.rollRegistry.unregisterByName(e);
n.clear(), r.clear(), i.clear();
},
handleClick({ data: e }) {
let { defs: t } = v(e);
for (let e of n.values()) if (e.callback && !e.imageDef.hidden && t.includes(e.imageDef)) {
e.callback();
return;
}
},
handleHover({ data: e }) {
let r = t.renderer;
if (!r) return;
let { defs: i } = v(e), a = !1;
for (let e of n.values()) if (e.callback && !e.imageDef.hidden && i.includes(e.imageDef)) {
a = !0;
break;
}
r.canvas.style.cursor = a ? "pointer" : "";
}
};
}
//#endregion
//#region src/wayfinding/renderer/trailManager.ts
var xn = 40;
function Sn(e, t) {
let n = /* @__PURE__ */ new Map();
function r(e) {
return `trail#${e}`;
}
function i(t) {
if (!t.dotDefs.length) return;
let n = e.touchLayer(t.layerName), r = new Set(t.dotDefs);
n.children = n.children.filter((e) => !r.has(e)), t.dotDefs = [];
}
func