UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

1,655 lines 56.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.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