@expofp/floorplan 3.38.0 → 3.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/browser/{Button-ClbFcvfV.js → Button-bdODDPNw.js} +5 -5
  2. package/dist/browser/{CookieConsent-BtYMAMD8.js → CookieConsent-DNrAwMNi.js} +7 -7
  3. package/dist/browser/{Debug-6rBej4wJ.js → Debug-BIX5rNWa.js} +7 -7
  4. package/dist/browser/{DebugTools-CweHk4eX.js → DebugTools-DWIya7Bp.js} +6 -6
  5. package/dist/browser/{Demo-DkbMkg4o.js → Demo-BjyJN4Lb.js} +9 -9
  6. package/dist/browser/{Free-Da8_iIA3.js → Free-GA2gE4iv.js} +9 -9
  7. package/dist/browser/{GalleryContainer-cYgizXxX.js → GalleryContainer-BEiygMFs.js} +10 -10
  8. package/dist/browser/{GpsLoader-dY9414p_.js → GpsLoader-DamQfmE8.js} +10 -10
  9. package/dist/browser/{KioskStore-dTaEpV2u.js → KioskStore-unhS5B1M.js} +9 -7
  10. package/dist/browser/{MaplibreAdapter-Bin47a4P.js → MaplibreAdapter-BuFz6p4l.js} +12 -12
  11. package/dist/browser/{ModalContainer-cqTsVJWK.js → ModalContainer-BSOaylBJ.js} +10 -10
  12. package/dist/browser/{PermissionNotice-Czo_ZPGg.js → PermissionNotice-QoBvgTxq.js} +6 -6
  13. package/dist/browser/{SetKioskMode-BHyRe8uR.js → SetKioskMode-CY8Px_y2.js} +9 -9
  14. package/dist/browser/{ShowKiosk-Btvjwee0.js → ShowKiosk-BdIb4cjA.js} +10 -10
  15. package/dist/browser/{ViewerMenuPanel-ChhGSeZi.js → ViewerMenuPanel-CfEoeUSF.js} +9 -9
  16. package/dist/browser/{add-debug-secret-listener-Uy98ISZg.js → add-debug-secret-listener-DcRkKb16.js} +1 -1
  17. package/dist/browser/{adopt-global-settings-CSk5bLXy.js → adopt-global-settings-BQr2uaJi.js} +9 -9
  18. package/dist/browser/{boolean-editor-BX0E97NA.js → boolean-editor-CO1l1mG2.js} +9 -9
  19. package/dist/browser/{bootIntercom-CgTbDJ3h.js → bootIntercom-BF8W6edz.js} +2 -2
  20. package/dist/browser/bundle.json +71 -71
  21. package/dist/browser/{camera-events-Djsde0Ux.js → camera-events-BM2DRKiu.js} +1 -1
  22. package/dist/browser/{classnames-B52rwbt4.js → classnames-zBYgq48f.js} +2 -2
  23. package/dist/browser/{client-CTsWysuI.js → client-kHcAahev.js} +5 -5
  24. package/dist/browser/{components-CYoiaY2t.js → components-DAabWR_p.js} +37 -37
  25. package/dist/browser/{debug-context-BnO2NQR9.js → debug-context-DoIsRKLN.js} +7 -7
  26. package/dist/browser/{debug-overlay-bJmbHnXN.js → debug-overlay-Cldouqb1.js} +10 -10
  27. package/dist/browser/{debug-ui-DvXUU9-P.js → debug-ui-BMvP-d9w.js} +6 -6
  28. package/dist/browser/{dimming-BrGbMBxb.js → dimming-Big09HME.js} +175 -170
  29. package/dist/browser/{dist-DZ2Exk9m.js → dist-BqsLBiXn.js} +6 -6
  30. package/dist/browser/{dist-CnbCTNO3.js → dist-DUkTj21m.js} +3 -3
  31. package/dist/browser/{dist-ShElP6T0.js → dist-Da-W2paU.js} +5 -5
  32. package/dist/browser/{efp-debug-init-BR__9zmi.js → efp-debug-init-Br53YSLH.js} +3 -3
  33. package/dist/browser/{enum-editor-D1frUcEv.js → enum-editor-BF0tTe81.js} +4 -4
  34. package/dist/browser/{es5-COBqz2Zh.js → es5-DLwEWAqt.js} +2 -2
  35. package/dist/browser/{event-head-BUJJHBIq.js → event-head-D7Uj7byv.js} +1 -1
  36. package/dist/browser/{event-not-found-K1N4NbnT.js → event-not-found-CANnIJrZ.js} +3 -3
  37. package/dist/browser/{exports-DN6wF8DS.js → exports-KRrUY3Z1.js} +1 -1
  38. package/dist/browser/{favicon-D6QoTQSP.js → favicon-Bze7lfTk.js} +1 -1
  39. package/dist/browser/{fetch-retry.umd-HVXbN6qF.js → fetch-retry.umd-D6rdaNIF.js} +2 -2
  40. package/dist/browser/{flex-BP_sJeus.js → flex-_QSLGHt0.js} +5 -5
  41. package/dist/browser/{floorplan.loader-Dzvb4FTD.js → floorplan.loader-CvNH6Qc4.js} +10 -10
  42. package/dist/browser/{floorplan.ready-DLq2zteX.js → floorplan.ready-HPblmUxV.js} +15 -15
  43. package/dist/browser/{fuse-B-w8rUFE.js → fuse-9EzVEd12.js} +2 -2
  44. package/dist/browser/{i18n-C6fFyMGD.js → i18n-DsPOygSI.js} +5 -5
  45. package/dist/browser/index.js +16 -16
  46. package/dist/browser/{index.module-m51AK8p4.js → index.module-BnkEmOmv.js} +4 -4
  47. package/dist/browser/{integrateKiosk-6cmnHeoj.js → integrateKiosk-DlUC2piv.js} +4 -4
  48. package/dist/browser/{is-own-domain-wvyQvGlL.js → is-own-domain-Db2dg_LE.js} +1 -1
  49. package/dist/browser/{is-webview-oqXVE6bv.js → is-webview-CKWDUFMW.js} +1 -1
  50. package/dist/browser/{jsx-runtime-CtJ_t8Mi.js → jsx-runtime-BxX9Q763.js} +2 -2
  51. package/dist/browser/{kiosk-record-Di9isPMQ.js → kiosk-record-BDPzvIrP.js} +1 -1
  52. package/dist/browser/{lib-DmKWthvt.js → lib-BuATiAoM.js} +3 -3
  53. package/dist/browser/{loadImage-DUelfWA7.js → loadImage-BvSruq1k.js} +4 -4
  54. package/dist/browser/{logDeviceInfo-BuhtLa4A.js → logDeviceInfo-Cu3Vy9La.js} +9 -9
  55. package/dist/browser/{mobx-UGMGcjzY.js → mobx-C6ZnBiyR.js} +4 -4
  56. package/dist/browser/{optional-boolean-editor-C1Ndbp_u.js → optional-boolean-editor-D4LT9fSN.js} +3 -3
  57. package/dist/browser/{optional-enum-editor-DYAfwsr2.js → optional-enum-editor-Cxn6rM4t.js} +4 -4
  58. package/dist/browser/{optional-string-editor-ClMoGgGt.js → optional-string-editor-CTUOwnCm.js} +4 -4
  59. package/dist/browser/{particles.min-BffTQ57s.js → particles.min-dLuHpqHJ.js} +2 -2
  60. package/dist/browser/{react-C-Qd2U47.js → react-8e9Lx7_L.js} +2 -2
  61. package/dist/browser/{react-dom-CnXY0ene.js → react-dom-DVm8zF94.js} +3 -3
  62. package/dist/browser/{rolldown-runtime-CjjOYn6R.js → rolldown-runtime-CgLujcqt.js} +1 -1
  63. package/dist/browser/{scheduler-Qu0FRRuK.js → scheduler-BviKXQIp.js} +2 -2
  64. package/dist/browser/{select-DBf5drek.js → select-DqlFRrKq.js} +10 -10
  65. package/dist/browser/{settings-CK9N4RDZ.js → settings-DYHQnr2h.js} +2 -2
  66. package/dist/browser/{settings-item-C1kuqAX7.js → settings-item-C7c9AnkF.js} +6 -6
  67. package/dist/browser/{store-DcCWvP6P.js → store-CrXKrvfj.js} +5407 -5205
  68. package/dist/browser/{string-editor-CZm4w5-_.js → string-editor-DziXqaWJ.js} +4 -4
  69. package/dist/browser/{text-field-BjwNyut3.js → text-field-Dh7Ux2mR.js} +5 -5
  70. package/dist/browser/{theme-Cq3CRc3v.js → theme-me78t_PC.js} +8 -8
  71. package/dist/browser/{ui-COIkgfZE.js → ui-yPy4UNxE.js} +8 -8
  72. package/dist/browser/{useRenderTarget-Dr7hirkU.js → useRenderTarget-Cm9xuQ0_.js} +4 -4
  73. package/dist/browser/{viewport-3wsqmW9Q.js → viewport-rjH0BXVJ.js} +2 -2
  74. package/dist/esm/components/Kiosk/KioskStore.js +1 -1
  75. package/dist/esm/components/Map/drawing/config/config-all.js +1 -1
  76. package/dist/esm/components/Map/drawing/config/config-markers.d.ts +2 -2
  77. package/dist/esm/components/Map/drawing/config/config-markers.js +1 -1
  78. package/dist/esm/engine/canvases.d.ts +1 -1
  79. package/dist/esm/engine/canvases.js +1 -1
  80. package/dist/esm/engine/defs.d.ts +7 -3
  81. package/dist/esm/engine/update-def.js +1 -1
  82. package/dist/esm/types.d.ts +1 -1
  83. package/dist/esm/wayfinding/createWayfinding.js +1 -1
  84. package/dist/esm/wayfinding/handlers/kioskHandler.js +1 -1
  85. package/package.json +10 -10
@@ -1,14 +1,14 @@
1
1
  (function() {
2
2
  try {
3
3
  var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {};
4
- e.SENTRY_RELEASE = { id: "3.38.0" };
4
+ e.SENTRY_RELEASE = { id: "3.39.0" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "8f241b7f-d106-4e96-a6a2-b96a0f9abf69", e._sentryDebugIdIdentifier = "sentry-dbid-8f241b7f-d106-4e96-a6a2-b96a0f9abf69");
7
7
  } catch {}
8
8
  })();
9
- import { t as e } from "./jsx-runtime-CtJ_t8Mi.js";
10
- import { t } from "./settings-item-C1kuqAX7.js";
11
- import { t as n } from "./text-field-BjwNyut3.js";
9
+ import { t as e } from "./jsx-runtime-BxX9Q763.js";
10
+ import { t } from "./settings-item-C7c9AnkF.js";
11
+ import { t as n } from "./text-field-Dh7Ux2mR.js";
12
12
  //#region ../debug/src/lib/ui/string-editor.tsx
13
13
  var r = e(), i = (e) => {
14
14
  var i;
@@ -1,15 +1,15 @@
1
1
  (function() {
2
2
  try {
3
3
  var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {};
4
- e.SENTRY_RELEASE = { id: "3.38.0" };
4
+ e.SENTRY_RELEASE = { id: "3.39.0" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "e13f8c4e-8995-47cd-802d-392fd9bdf13a", e._sentryDebugIdIdentifier = "sentry-dbid-e13f8c4e-8995-47cd-802d-392fd9bdf13a");
7
7
  } catch {}
8
8
  })();
9
- import { r as e } from "./rolldown-runtime-CjjOYn6R.js";
10
- import { t } from "./react-C-Qd2U47.js";
11
- import { D as n, i as r, l as i, n as a, s as o, u as s, y as c } from "./flex-BP_sJeus.js";
12
- import { t as l } from "./classnames-B52rwbt4.js";
9
+ import { r as e } from "./rolldown-runtime-CgLujcqt.js";
10
+ import { t } from "./react-8e9Lx7_L.js";
11
+ import { D as n, i as r, l as i, n as a, s as o, u as s, y as c } from "./flex-_QSLGHt0.js";
12
+ import { t as l } from "./classnames-zBYgq48f.js";
13
13
  //#region ../../node_modules/.pnpm/@radix-ui+themes@3.3.0_@types+react-dom@19.2.3_@types+react@19.2.17__@types+react@19.2._5ea800d4e947acedb1fa1275f1697b17/node_modules/@radix-ui/themes/dist/esm/components/text-field.props.js
14
14
  var u = /* @__PURE__ */ e(t()), d = /* @__PURE__ */ e(l()), f = {
15
15
  size: {
@@ -1,18 +1,18 @@
1
1
  (function() {
2
2
  try {
3
3
  var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {};
4
- e.SENTRY_RELEASE = { id: "3.38.0" };
4
+ e.SENTRY_RELEASE = { id: "3.39.0" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "5b26ff7f-61de-4d09-8508-a74b71b94f98", e._sentryDebugIdIdentifier = "sentry-dbid-5b26ff7f-61de-4d09-8508-a74b71b94f98");
7
7
  } catch {}
8
8
  })();
9
- import { r as e } from "./rolldown-runtime-CjjOYn6R.js";
10
- import { t } from "./react-C-Qd2U47.js";
11
- import { t as n } from "./jsx-runtime-CtJ_t8Mi.js";
12
- import { t as r } from "./react-dom-CnXY0ene.js";
13
- import { C as i, E as a, O as o, T as s, _ as c, o as l, v as u, w as d } from "./flex-BP_sJeus.js";
14
- import { c as f, i as p, n as m, o as h, r as g, s as _, t as v } from "./dist-DZ2Exk9m.js";
15
- import { t as y } from "./classnames-B52rwbt4.js";
9
+ import { r as e } from "./rolldown-runtime-CgLujcqt.js";
10
+ import { t } from "./react-8e9Lx7_L.js";
11
+ import { t as n } from "./jsx-runtime-BxX9Q763.js";
12
+ import { t as r } from "./react-dom-DVm8zF94.js";
13
+ import { C as i, E as a, O as o, T as s, _ as c, o as l, v as u, w as d } from "./flex-_QSLGHt0.js";
14
+ import { c as f, i as p, n as m, o as h, r as g, s as _, t as v } from "./dist-BqsLBiXn.js";
15
+ import { t as y } from "./classnames-zBYgq48f.js";
16
16
  //#region ../../node_modules/.pnpm/@radix-ui+react-visually-hidden@1.2.3_@types+react-dom@19.2.3_@types+react@19.2.17__@ty_cffccd7838985066e8e1d993b5cb6017/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs
17
17
  var b = /* @__PURE__ */ e(r(), 1), x = /* @__PURE__ */ e(t(), 1), S = n(), C = Object.freeze({
18
18
  position: "absolute",
@@ -1,17 +1,17 @@
1
1
  (function() {
2
2
  try {
3
3
  var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {};
4
- e.SENTRY_RELEASE = { id: "3.38.0" };
4
+ e.SENTRY_RELEASE = { id: "3.39.0" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "80a4f49f-d869-4a38-b1c0-c3cfd645ceec", e._sentryDebugIdIdentifier = "sentry-dbid-80a4f49f-d869-4a38-b1c0-c3cfd645ceec");
7
7
  } catch {}
8
8
  })();
9
- import { r as e } from "./rolldown-runtime-CjjOYn6R.js";
10
- import { a as t, i as n, s as r } from "./efp-debug-init-BR__9zmi.js";
11
- import { a as i, i as a } from "./adopt-global-settings-CSk5bLXy.js";
12
- import { t as o } from "./jsx-runtime-CtJ_t8Mi.js";
13
- import "./settings-CK9N4RDZ.js";
14
- import { t as s } from "./add-debug-secret-listener-Uy98ISZg.js";
9
+ import { r as e } from "./rolldown-runtime-CgLujcqt.js";
10
+ import { a as t, i as n, s as r } from "./efp-debug-init-Br53YSLH.js";
11
+ import { a as i, i as a } from "./adopt-global-settings-BQr2uaJi.js";
12
+ import { t as o } from "./jsx-runtime-BxX9Q763.js";
13
+ import "./settings-DYHQnr2h.js";
14
+ import { t as s } from "./add-debug-secret-listener-DcRkKb16.js";
15
15
  //#region ../debug/src/lib/ui/render-debug-ui.tsx
16
16
  var c = /* @__PURE__ */ e(r(), 1), l = o(), u = !1;
17
17
  function d() {
@@ -26,7 +26,7 @@ function d() {
26
26
  }
27
27
  });
28
28
  let o = async (t) => {
29
- let { DebugUi: n } = await import("./debug-ui-DvXUU9-P.js"), { createRoot: i } = await import("./client-CTsWysuI.js").then((t) => /* @__PURE__ */ e(t.t(), 1)), a = document.createElement("div");
29
+ let { DebugUi: n } = await import("./debug-ui-BMvP-d9w.js"), { createRoot: i } = await import("./client-kHcAahev.js").then((t) => /* @__PURE__ */ e(t.t(), 1)), a = document.createElement("div");
30
30
  document.body.appendChild(a), i(a).render(/* @__PURE__ */ (0, l.jsx)(n, {
31
31
  useDebugButtonState: r.useState,
32
32
  open: t
@@ -1,14 +1,14 @@
1
1
  (function() {
2
2
  try {
3
3
  var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {};
4
- e.SENTRY_RELEASE = { id: "3.38.0" };
4
+ e.SENTRY_RELEASE = { id: "3.39.0" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "44feeb02-c84e-4fb1-b2f8-984c7d50f58d", e._sentryDebugIdIdentifier = "sentry-dbid-44feeb02-c84e-4fb1-b2f8-984c7d50f58d");
7
7
  } catch {}
8
8
  })();
9
- import { r as e } from "./rolldown-runtime-CjjOYn6R.js";
10
- import { t } from "./react-C-Qd2U47.js";
11
- import { l as n } from "./store-DcCWvP6P.js";
9
+ import { r as e } from "./rolldown-runtime-CgLujcqt.js";
10
+ import { t } from "./react-8e9Lx7_L.js";
11
+ import { l as n } from "./store-CrXKrvfj.js";
12
12
  //#region ../ui/src/shared/activeElement.ts
13
13
  var r = (e) => !!e && "activeElement" in e;
14
14
  function i(e) {
@@ -1,12 +1,12 @@
1
1
  (function() {
2
2
  try {
3
3
  var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {};
4
- e.SENTRY_RELEASE = { id: "3.38.0" };
4
+ e.SENTRY_RELEASE = { id: "3.39.0" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "233b3b22-a917-48c8-8f7e-f558b0dbd9d8", e._sentryDebugIdIdentifier = "sentry-dbid-233b3b22-a917-48c8-8f7e-f558b0dbd9d8");
7
7
  } catch {}
8
8
  })();
9
- import { c as e, vt as t } from "./store-DcCWvP6P.js";
9
+ import { c as e, vt as t } from "./store-CrXKrvfj.js";
10
10
  //#region src/components/Map/viewport.ts
11
11
  function n(e) {
12
12
  return {
@@ -1 +1 @@
1
- import{__decorate as i}from"tslib";import{getConfig as f}from"@expofp/config";import{action as n,computed as k,observable as g,toJS as m,when as C}from"mobx";import{KIOSK_ENABLE_KEY as p}from"../../constants";import a from"../../store";import{areLayersEnabled as y}from"../../utils/areLayersEnabled";import{t as h}from"../../utils/i18n";import{isLocalStorageAvailable as S}from"../../utils/localStorage";import{mapCamera as d}from"../Map/camera";import{mapViewport as K}from"../Map/viewport";import{screenFitsKiosk as M,storedKioskMode as v}from"./kiosk-mode";import{getPtScaleZoomRatio as P,toFiniteNumber as u}from"./kiosk-record";import{updateKiosk as b}from"./kioskApi";import{getSavedKiosk as w,removeKiosk as F,saveKiosk as R}from"./SetKiosk";import{KIOSK_STORAGE_KEY as D}from"./SetKiosk/constants";const I=2e4;class s{constructor(){this.savedKiosk=null,this.statusMessages=[],this.statusMessageTimer=0,this.isResettingCamera=!1,this.isRestoringFraming=!1}get kiosk(){return a.uiState.kioskData}setKiosk(e){a.uiState.setKioskData(e)}getCameraState(){if(a.maplibreStore.showMaplibre){const t=a.maplibreStore.cameraPort?.getCameraState();return t?{mapCenterLng:t.lng,mapCenterLat:t.lat,mapZoom:t.zoom,mapBearingDegrees:t.bearing,mapPitchDegrees:t.pitch}:{}}const e=d()?.state();return e?{mapInitialPtScale:this.initialPtScale,mapPtScale:e.pixelSize,mapCenterX:e.center.x,mapCenterY:e.center.y,mapRollDegrees:e.roll,mapPitch:e.pitch}:{}}get hasUnsavedChanges(){const e=this.savedKiosk,t=m(this.kiosk);if(!t||!e)return!!t!=!!e;const o=Object.keys(e),r=Object.keys(t);if(o.length!==r.length)return!0;for(const l of o)if(!(l in t)||e[l]!==t[l])return!0;return!1}addStatusMessage(e){this.statusMessages=[{...e,id:Date.now()}],this.startCleanupMessages()}clearStatusMessages(){this.statusMessages=[]}startCleanupMessages(){clearTimeout(this.statusMessageTimer),this.statusMessageTimer=window.setTimeout(()=>this.clearStatusMessages(),1e3)}async resetCamera(){if(!this.isResettingCamera){this.isResettingCamera=!0;try{if(a.maplibreStore.showMaplibre&&await this.resetMaplibreCamera()){this.isRestoringFraming=!0;return}this.isRestoringFraming=await this.resetPlanCamera()}finally{this.isResettingCamera=!1}}}async resetMaplibreCamera(){const e=await this.waitForMaplibreCameraPort();if(!e)return!1;const t=this.kiosk;t?.z!=null&&a.fp.activateFloor({name:String(t.z)});const o=u(t?.mapCenterLng),r=u(t?.mapCenterLat),l=u(t?.mapZoom);return o===void 0||r===void 0||l===void 0?(e.resetPitch(),a.uiState.fitBounds(),!0):(e.applyCameraState({lng:o,lat:r,zoom:l,bearing:u(t?.mapBearingDegrees),pitch:u(t?.mapPitchDegrees)}),!0)}async waitForMaplibreCameraPort(){const{maplibreStore:e}=a;if(e.cameraPort)return e.cameraPort;try{await C(()=>!!e.cameraPort||!e.showMaplibre,{timeout:I})}catch{return null}return e.cameraPort}async resetPlanCamera(){const e=d();if(!e)return!1;const t=this.kiosk;await e.api.reset({pan:!0,zoom:!0,roll:!0,pitch:!0},{immediate:!0}),t?.z!=null&&a.fp.activateFloor({name:String(t.z)});const o=P(t);o!==void 0&&await e.api.zoomBy(o,{immediate:!0});const r=u(t?.mapCenterX),l=u(t?.mapCenterY);r!==void 0&&l!==void 0&&await e.api.panTo({x:r,y:l},{immediate:!0});const c=u(t?.mapRollDegrees);return c!==void 0&&await e.api.rollTo(c,{immediate:!0}),!0}restoreData(){const e=w();this.savedKiosk=e??null,e&&(this.setKiosk(e),a.uiState.kiosk=!0)}handleSetupReady(){this.restoreData(),a.uiState.kiosk=!0,a.uiState.hideFreeOrDemo=!0,a.uiState.setForceDim(!0),a.searchStore.setSearchText(""),a.searchStore.setFocused(!1),this.resetCamera()}handleClose(){M(a.uiState)&&v(f())||(a.uiState.kiosk=!1),a.uiState.restoreUIScale(),this.setKiosk(null),a.uiState.setForceDim(!1),a.uiState.enableSetKioskMode(!1),a.searchStore.closeSearch()}handleDelete(){S&&localStorage.getItem(D)!==null&&localStorage.getItem(p)==="1"&&localStorage.removeItem(p),F(),this.savedKiosk=null,this.setKiosk(null),a.uiState.resetMapSettings(),a.uiState.resetUIScale(),this.addStatusMessage({variant:"success",title:h("Deleted")})}handleSave(){const e=K();if(!e)return;const t=m(this.kiosk);if(!t)return;const o=this.getCameraState(),r={...t,...o};if(!e.isVisible({x:r.x,y:r.y})){this.addStatusMessage({variant:"error",title:h("Kiosk not visible")});return}this.setKiosk(r),R(r),S&&localStorage.setItem(p,"1"),b(r,"https://app.expofp.com/"),a.uiState.setUIScale(r.uiScale,!0),this.addStatusMessage({variant:"success",title:h("Saved")}),this.savedKiosk=r}delayChange(e){requestAnimationFrame(()=>e?.())}handleChange(e){const t=m(this.kiosk);t&&(Number.isFinite(e.angle)&&this.setKiosk({...t,heading:e.angle}),Number.isFinite(e.scale)&&(this.setKiosk({...t,uiScale:e.scale}),this.delayChange(()=>a.uiState.setUIScale(e.scale,!1))),Number.isFinite(e.percent)&&this.setKiosk({...t,iconSizePercent:e.percent}))}setInitialPtScale(e){if(this.initialPtScale)return;this.initialPtScale=e;const t=m(this.kiosk);t&&this.setKiosk({...t,mapInitialPtScale:e})}handleClick(e){const t=m(this.kiosk),o=a.fp.getFloors(),r=y()?o.find(c=>c.active)?.name??null:null,l=a.uiState.uiScale;this.setKiosk({...t,x:e.x,y:e.y,z:r,uiScale:t?.uiScale||l,heading:t?.heading||0,iconSizePercent:t?.iconSizePercent||100,...this.getCameraState()})}handleNavigationChange(){const e=this.isRestoringFraming;this.isRestoringFraming=!1;const t=m(this.kiosk);if(!t)return;const o=this.getCameraState();this.setKiosk({...t,...o}),e&&this.savedKiosk&&(this.savedKiosk={...this.savedKiosk,...o})}}i([k({keepAlive:!0})],s.prototype,"kiosk",null),i([n],s.prototype,"setKiosk",null),i([g],s.prototype,"savedKiosk",void 0),i([k({keepAlive:!0})],s.prototype,"hasUnsavedChanges",null),i([g],s.prototype,"statusMessages",void 0),i([n],s.prototype,"addStatusMessage",null),i([n],s.prototype,"clearStatusMessages",null),i([n],s.prototype,"startCleanupMessages",null),i([n],s.prototype,"resetCamera",null),i([n],s.prototype,"restoreData",null),i([n],s.prototype,"handleSetupReady",null),i([n],s.prototype,"handleClose",null),i([n],s.prototype,"handleDelete",null),i([n],s.prototype,"handleSave",null),i([n],s.prototype,"handleChange",null),i([n],s.prototype,"setInitialPtScale",null),i([n],s.prototype,"handleClick",null),i([n],s.prototype,"handleNavigationChange",null);export default new s;
1
+ import{__decorate as i}from"tslib";import{getConfig as C}from"@expofp/config";import{action as n,computed as g,observable as S,toJS as m,when as y}from"mobx";import{KIOSK_ENABLE_KEY as p}from"../../constants";import a from"../../store";import{areLayersEnabled as K}from"../../utils/areLayersEnabled";import{t as h}from"../../utils/i18n";import{isLocalStorageAvailable as d}from"../../utils/localStorage";import{mapCamera as f}from"../Map/camera";import{mapViewport as M}from"../Map/viewport";import{screenFitsKiosk as v,storedKioskMode as P}from"./kiosk-mode";import{getPtScaleZoomRatio as b,toFiniteNumber as u}from"./kiosk-record";import{updateKiosk as w}from"./kioskApi";import{getSavedKiosk as F,removeKiosk as R,saveKiosk as D}from"./SetKiosk";import{KIOSK_STORAGE_KEY as I}from"./SetKiosk/constants";const z=2e4;class s{constructor(){this.savedKiosk=null,this.statusMessages=[],this.statusMessageTimer=0,this.isResettingCamera=!1,this.isRestoringFraming=!1}get kiosk(){return a.uiState.kioskData}setKiosk(e){a.uiState.setKioskData(e)}getCameraState(){if(a.maplibreStore.showMaplibre){const t=a.maplibreStore.cameraPort?.getCameraState();return t?{mapCenterLng:t.lng,mapCenterLat:t.lat,mapZoom:t.zoom,mapBearingDegrees:t.bearing,mapPitchDegrees:t.pitch}:{}}const e=f()?.state();return e?{mapInitialPtScale:this.initialPtScale,mapPtScale:e.pixelSize,mapCenterX:e.center.x,mapCenterY:e.center.y,mapRollDegrees:e.roll,mapPitch:e.pitch}:{}}get hasUnsavedChanges(){const e=this.savedKiosk,t=m(this.kiosk);if(!t||!e)return!!t!=!!e;const o=Object.keys(e),r=Object.keys(t);if(o.length!==r.length)return!0;for(const l of o)if(!(l in t)||e[l]!==t[l])return!0;return!1}addStatusMessage(e){this.statusMessages=[{...e,id:Date.now()}],this.startCleanupMessages()}clearStatusMessages(){this.statusMessages=[]}startCleanupMessages(){clearTimeout(this.statusMessageTimer),this.statusMessageTimer=window.setTimeout(()=>this.clearStatusMessages(),1e3)}async resetCamera(){if(!this.isResettingCamera){this.isResettingCamera=!0;try{if(a.maplibreStore.showMaplibre&&await this.resetMaplibreCamera()){this.isRestoringFraming=!0;return}this.isRestoringFraming=await this.resetPlanCamera()}finally{this.isResettingCamera=!1}}}async resetMaplibreCamera(){const e=await this.waitForMaplibreCameraPort();if(!e)return!1;const t=this.kiosk;t?.z!=null&&a.fp.activateFloor({name:String(t.z)});const o=u(t?.mapCenterLng),r=u(t?.mapCenterLat),l=u(t?.mapZoom);return o===void 0||r===void 0||l===void 0?(e.resetPitch(),a.uiState.fitBounds(),!0):(e.applyCameraState({lng:o,lat:r,zoom:l,bearing:u(t?.mapBearingDegrees),pitch:u(t?.mapPitchDegrees)}),!0)}async waitForMaplibreCameraPort(){const{maplibreStore:e}=a;if(e.cameraPort)return e.cameraPort;try{await y(()=>!!e.cameraPort||!e.showMaplibre,{timeout:z})}catch{return null}return e.cameraPort}async resetPlanCamera(){const e=f();if(!e)return!1;const t=this.kiosk;await e.api.reset({pan:!0,zoom:!0,roll:!0,pitch:!0},{immediate:!0}),t?.z!=null&&a.fp.activateFloor({name:String(t.z)});const o=b(t);o!==void 0&&await e.api.zoomBy(o,{immediate:!0});const r=u(t?.mapCenterX),l=u(t?.mapCenterY);r!==void 0&&l!==void 0&&await e.api.panTo({x:r,y:l},{immediate:!0});const c=u(t?.mapRollDegrees);c!==void 0&&await e.api.rollTo(c,{immediate:!0});const k=u(t?.mapPitch);return k!==void 0&&await e.api.pitchTo(k,{immediate:!0}),!0}restoreData(){const e=F();this.savedKiosk=e??null,e&&(this.setKiosk(e),a.uiState.kiosk=!0)}handleSetupReady(){this.restoreData(),a.uiState.kiosk=!0,a.uiState.hideFreeOrDemo=!0,a.uiState.setForceDim(!0),a.searchStore.setSearchText(""),a.searchStore.setFocused(!1),this.resetCamera()}handleClose(){v(a.uiState)&&P(C())||(a.uiState.kiosk=!1),a.uiState.restoreUIScale(),this.setKiosk(null),a.uiState.setForceDim(!1),a.uiState.enableSetKioskMode(!1),a.searchStore.closeSearch()}handleDelete(){d&&localStorage.getItem(I)!==null&&localStorage.getItem(p)==="1"&&localStorage.removeItem(p),R(),this.savedKiosk=null,this.setKiosk(null),a.uiState.resetMapSettings(),a.uiState.resetUIScale(),this.addStatusMessage({variant:"success",title:h("Deleted")})}handleSave(){const e=M();if(!e)return;const t=m(this.kiosk);if(!t)return;const o=this.getCameraState(),r={...t,...o};if(!e.isVisible({x:r.x,y:r.y})){this.addStatusMessage({variant:"error",title:h("Kiosk not visible")});return}this.setKiosk(r),D(r),d&&localStorage.setItem(p,"1"),w(r,"https://app.expofp.com/"),a.uiState.setUIScale(r.uiScale,!0),this.addStatusMessage({variant:"success",title:h("Saved")}),this.savedKiosk=r}delayChange(e){requestAnimationFrame(()=>e?.())}handleChange(e){const t=m(this.kiosk);t&&(Number.isFinite(e.angle)&&this.setKiosk({...t,heading:e.angle}),Number.isFinite(e.scale)&&(this.setKiosk({...t,uiScale:e.scale}),this.delayChange(()=>a.uiState.setUIScale(e.scale,!1))),Number.isFinite(e.percent)&&this.setKiosk({...t,iconSizePercent:e.percent}))}setInitialPtScale(e){if(this.initialPtScale)return;this.initialPtScale=e;const t=m(this.kiosk);t&&this.setKiosk({...t,mapInitialPtScale:e})}handleClick(e){const t=m(this.kiosk),o=a.fp.getFloors(),r=K()?o.find(c=>c.active)?.name??null:null,l=a.uiState.uiScale;this.setKiosk({...t,x:e.x,y:e.y,z:r,uiScale:t?.uiScale||l,heading:t?.heading||0,iconSizePercent:t?.iconSizePercent||100,...this.getCameraState()})}handleNavigationChange(){const e=this.isRestoringFraming;this.isRestoringFraming=!1;const t=m(this.kiosk);if(!t)return;const o=this.getCameraState();this.setKiosk({...t,...o}),e&&this.savedKiosk&&(this.savedKiosk={...this.savedKiosk,...o})}}i([g({keepAlive:!0})],s.prototype,"kiosk",null),i([n],s.prototype,"setKiosk",null),i([S],s.prototype,"savedKiosk",void 0),i([g({keepAlive:!0})],s.prototype,"hasUnsavedChanges",null),i([S],s.prototype,"statusMessages",void 0),i([n],s.prototype,"addStatusMessage",null),i([n],s.prototype,"clearStatusMessages",null),i([n],s.prototype,"startCleanupMessages",null),i([n],s.prototype,"resetCamera",null),i([n],s.prototype,"restoreData",null),i([n],s.prototype,"handleSetupReady",null),i([n],s.prototype,"handleClose",null),i([n],s.prototype,"handleDelete",null),i([n],s.prototype,"handleSave",null),i([n],s.prototype,"handleChange",null),i([n],s.prototype,"setInitialPtScale",null),i([n],s.prototype,"handleClick",null),i([n],s.prototype,"handleNavigationChange",null);export default new s;
@@ -1 +1 @@
1
- import{initWayfindingLayers as c}from"@expofp/wayfinding";import{createLayerDef as p}from"../../../../engine/defs";import s from"../../../../store";import{isPathwayLayer as L}from"../../../../utils/is-pathway-layer";import{createTrafficLayers as d}from"../../traffic/trafficLayers";import{configBoothsBadges as u}from"./config-booth-badge";import h from"./config-load-layer";import{MARKER_LAYER_NAME as g}from"./config-markers";export default function b(){const{defaultLayer:t}=s.layerStore;let{layers:e}=s.layerStore;if(t){const r=[...e],a=e.indexOf(t);r.splice(a,1),e=[t,...r]}const l=e.filter(r=>!r.rootParent).map(r=>h(r));return Promise.all(l).then(r=>{const a=p(g,[]),m=c(),n=[],i=[];for(const o of r.flat())L(o.name)?(o.dim=0,i.push(o)):n.push(o);const{layer:f,cleanup:y}=u("root",s.boothStore.booths);return{layers:[...n,...f?[f]:[],...i,...d(),a,m],cleanup:y}})}
1
+ import{initWayfindingLayers as p}from"@expofp/wayfinding";import{createLayerDef as L}from"../../../../engine/defs";import f,{boothStore as d,uiState as l}from"../../../../store";import{isPathwayLayer as u}from"../../../../utils/is-pathway-layer";import{createTrafficLayers as h}from"../../traffic/trafficLayers";import{configBoothsBadges as g}from"./config-booth-badge";import w from"./config-load-layer";import{MARKER_LAYER_NAME as b}from"./config-markers";export default function A(){const{defaultLayer:a}=f.layerStore;let{layers:e}=f.layerStore;if(a){const r=[...e],o=e.indexOf(a);r.splice(o,1),e=[a,...r]}const m=e.filter(r=>!r.rootParent).map(r=>w(r));return Promise.all(m).then(r=>{const o=L(b,[]);o.overlay=l.is3DView;const y=p({overlay:l.is3DView}),i=[],s=[];for(const t of r.flat())u(t.name)?(t.dim=0,s.push(t)):i.push(t);const{layer:n,cleanup:c}=g("root",d.booths);return{layers:[...i,...n?[n]:[],...s,...h(),o,y],cleanup:c}})}
@@ -1,5 +1,5 @@
1
- import { SceneDef } from '@expofp/renderer';
2
- import { FloorPlanMarkerEvent } from '../../../../types';
1
+ import { type SceneDef } from '@expofp/renderer';
2
+ import { type FloorPlanMarkerEvent } from '../../../../types';
3
3
  export declare const MARKER_LAYER_NAME = "markers";
4
4
  /** What {@link configMarkers} needs: the scene whose root layers hold the marker layer. */
5
5
  export interface MarkerOptions {
@@ -1 +1 @@
1
- import{Box as O}from"@expofp/geometry";import{update as v}from"@expofp/renderer";import{reaction as I}from"mobx";import{getBounds as w}from"../../../../engine/canvases";import{createImageDef as E}from"../../../../engine/defs";import u,{layersStore as C}from"../../../../store";import{setMarkerResolver as R}from"../../pointer";import{createImageCanvas as P}from"./canvases";const L="_selected";export const MARKER_LAYER_NAME="markers";function T(o,f){const{center:c,rotation:r}=o.bounds,{width:i,height:s}=o.source;return o.bounds=w(c.x,c.y,i,s,f,r),[o]}function W(o){B=o}export function configMarkers(o){const{scene:f}=o,c=[],r=new Map,i=new Map;let s=[];const a=f.rootLayer.children.find(e=>e.name===MARKER_LAYER_NAME);a.onScale=({pixelSize:e})=>W(e),R(markerAt),v(a);async function g(e){const n=[];e.forEach(m=>{const{name:t,content:d,width:l,height:k,scale:y}=m;if(r.has(t))return;const h=new Image,M=new Promise((S,D)=>{h.onload=()=>{r.set(t,{img:h,width:l,height:k,scale:y}),S()},h.onerror=b=>{D(b)}});n.push(M),h.src=d,h.crossOrigin="anonymous"}),await Promise.all(n)}const z=e=>{e.onScale=({pixelSize:n})=>T(e,n)},A=e=>{e.onRoll=({roll:n})=>{if(n!==e.bounds.rotation)return e.bounds.rotate(n-e.bounds.rotation,e.bounds),[e]}};function _(){const e=u.routeStore.markersData.markers;if(!e.length)return;s=[];const n=1,m=0;e.forEach(t=>{const d=r.get(t.icon);if(!d)return;const l=d.scale||window.devicePixelRatio,k=t.icon;if(!i.has(k)){const x=P(d.img,d.width,d.height,l);i.set(k,x)}const y=i.get(k),h=r.get(t.selectedIcon),M=t.selectedIcon;if(!i.has(M)){const x=P(h.img,h.width,h.height,l);i.set(M,x)}const S=i.get(M),D=C.findLayer(t.z)?.visible??!0,b=w(t.x,t.y,y.width,y.height,n,m),F=w(t.x,t.y,S.width,S.height,n,m);let p;switch(t.position){case"lefttop":p=[0,0];break;case"centertop":p=[.5,0];break;case"centerbottom":p=[.5,1];break;default:p=[.5,.5]}const H={...E(y,b,{hidden:!D,origin:p}),id:t.id,scale:l},N={...E(S,F,{hidden:!(D&&t.active),origin:p}),id:`${t.id}${L}`,scale:l};s.push(H,N)}),a.children=s,s.forEach(t=>{z(t),A(t)})}function $(){a.children=[],s=[]}function K(){const e=u.routeStore.markersData.markers;e.length&&e.forEach(n=>{const m=s.find(l=>l.id===n.id),t=s.find(l=>l.id===`${n.id}${L}`);if(!m)return;const d=C.findLayer(n.z)?.visible??!0;n.active?(m.hidden=!0,t.hidden=!(d&&n.active)):(m.hidden=!d,t.hidden=!0)})}return c.push(I(()=>[u.routeStore.selectedMarkers,u.layerStore.visible],()=>{if(!u.routeStore.markersData.markers.length){$(),v(a);return}K(),v(...s)})),c.push(I(()=>u.routeStore.markersData.markers,()=>{g(u.routeStore.markersData.icons).then(()=>{_(),v(a)})},{fireImmediately:!0})),function(){c.forEach(n=>n()),c.length=0,a.onScale=void 0,R(),v(a)}}export function markerAt(o,f){return getMarkerFromClick(o,f,B)}export function getMarkerFromClick(o,f,c){for(const r of u.routeStore.markersData.markers){const i=u.routeStore.markersData.icons.find(g=>g.name===r.icon);if(!i)continue;const s=i.width*c*devicePixelRatio,a=i.height*c*devicePixelRatio;if(Y(o,f,r.x,r.y,s,a)){const g=u.layerStore.findLayer(r.z);if(!g||g&&g.visible)return r}}return null}function Y(o,f,c,r,i,s){return O.fromCenter({x:c,y:r},{x:2*i,y:2*s}).containsPoint({x:o,y:f})}let B=1;
1
+ import{Box as K}from"@expofp/geometry";import{update as v}from"@expofp/renderer";import{reaction as I}from"mobx";import{getBounds as y}from"../../../../engine/canvases";import{createImageDef as E}from"../../../../engine/defs";import l,{layersStore as R,uiState as N}from"../../../../store";import{setMarkerResolver as P}from"../../pointer";import{createImageCanvas as O}from"./canvases";const C="_selected";export const MARKER_LAYER_NAME="markers";function T(r,f){const{center:c,rotation:o,elevation:d}=r.bounds,{width:i,height:s}=r.source;return r.bounds=y(c.x,c.y,i,s,f,o,d),[r]}function V(r){L=r}export function configMarkers(r){const{scene:f}=r,c=[],o=new Map,d=new Map;let i=[];const s=f.rootLayer.children.find(e=>e.name===MARKER_LAYER_NAME);s.onScale=({pixelSize:e})=>V(e),P(markerAt),v(s);async function p(e){const n=[];e.forEach(u=>{const{name:a,content:t,width:h,height:D,scale:g}=u;if(o.has(a))return;const m=new Image,S=new Promise((M,b)=>{m.onload=()=>{o.set(a,{img:m,width:h,height:D,scale:g}),M()},m.onerror=x=>{b(x)}});n.push(S),m.src=t,m.crossOrigin="anonymous"}),await Promise.all(n)}const B=e=>{e.onScale=({pixelSize:n})=>T(e,n)},z=e=>{e.screenSpace||(e.onRoll=({roll:n})=>{if(n!==e.bounds.rotation)return e.bounds.rotate(n-e.bounds.rotation,e.bounds),[e]})};function w(e,n,u){const a=d.get(e);if(a)return a;const t=O(n.img,n.width,n.height,u);return d.set(e,t),t}function A(){const e=l.routeStore.markersData.markers;if(!e.length)return;i=[];const n=1,u=0,a=N.is3DView;e.forEach(t=>{const h=o.get(t.icon);if(!h)return;const D=o.get(t.selectedIcon);if(!D)return;const g=h.scale||window.devicePixelRatio,m=w(t.icon,h,g),S=w(t.selectedIcon,D,g),M=R.findLayer(t.z)?.visible??!0,b=y(t.x,t.y,m.width,m.height,n,u),x=y(t.x,t.y,S.width,S.height,n,u);let k;switch(t.position){case"lefttop":k=[0,0];break;case"centertop":k=[.5,0];break;case"centerbottom":k=[.5,1];break;default:k=[.5,.5]}const F={...E(m,b,{hidden:!M,origin:k}),id:t.id,scale:g,screenSpace:a},H={...E(S,x,{hidden:!(M&&t.active),origin:k}),id:`${t.id}${C}`,scale:g,screenSpace:a};i.push(F,H)}),s.children=i,i.forEach(t=>{B(t),z(t)})}function _(){s.children=[],i=[]}function $(){const e=l.routeStore.markersData.markers;e.length&&e.forEach(n=>{const u=i.find(h=>h.id===n.id),a=i.find(h=>h.id===`${n.id}${C}`);if(!u||!a)return;const t=R.findLayer(n.z)?.visible??!0;n.active?(u.hidden=!0,a.hidden=!(t&&n.active)):(u.hidden=!t,a.hidden=!0)})}return c.push(I(()=>[l.routeStore.selectedMarkers,l.layerStore.visible],()=>{if(!l.routeStore.markersData.markers.length){_(),v(s);return}$(),v(...i)})),c.push(I(()=>l.routeStore.markersData.markers,()=>{p(l.routeStore.markersData.icons).then(()=>{A(),v(s)})},{fireImmediately:!0})),function(){c.forEach(n=>n()),c.length=0,s.onScale=void 0,P(),v(s)}}export function markerAt(r,f){return getMarkerFromClick(r,f,L)}export function getMarkerFromClick(r,f,c){for(const o of l.routeStore.markersData.markers){const d=l.routeStore.markersData.icons.find(p=>p.name===o.icon);if(!d)continue;const i=d.width*c*devicePixelRatio,s=d.height*c*devicePixelRatio;if(W(r,f,o.x,o.y,i,s)){const p=l.layerStore.findLayer(o.z);if(!p||p&&p.visible)return o}}return null}function W(r,f,c,o,d,i){return K.fromCenter({x:c,y:o},{x:2*d,y:2*i}).containsPoint({x:r,y:f})}let L=1;
@@ -1,5 +1,5 @@
1
1
  import { Rect } from '@expofp/geometry';
2
2
  export declare function createCircleCanvas(radius: number, color: string): HTMLCanvasElement;
3
3
  export declare function createBookmarkCanvas(maxSizePx: number, pixelRatio: number): HTMLCanvasElement;
4
- export declare function getBounds(x: number, y: number, width: number, height: number, scale?: number, rotate?: number): Rect;
4
+ export declare function getBounds(x: number, y: number, width: number, height: number, scale?: number, rotate?: number, elevation?: number): Rect;
5
5
  //# sourceMappingURL=canvases.d.ts.map
@@ -1 +1 @@
1
- import{Rect as d}from"@expofp/geometry";const r=new Map;export function createCircleCanvas(i,n){const c=n.toUpperCase();if(!r.has(c)){const t=document.createElement("canvas"),a=i*2*devicePixelRatio+1*2;t.width=a,t.height=a;const s=t.getContext("2d");s.fillStyle=n,s.beginPath(),s.arc(a/2,a/2,i*devicePixelRatio,0,2*Math.PI),s.fill(),r.set(c,t)}return r.get(c)}const h=new Map;export function createBookmarkCanvas(i,n){const c=i;if(h.has(c))return h.get(c);const t=i,o=t*1.4,a=Math.ceil(t*n),s=Math.ceil(o*n),l=document.createElement("canvas");l.width=a,l.height=s;const e=l.getContext("2d");return e.scale(n,n),e.fillStyle="#fdbf2b",e.strokeStyle="#fff",e.lineWidth=4/n,e.beginPath(),e.moveTo(0,0),e.lineTo(0,o),e.lineTo(t/2,o-t/2),e.lineTo(t,o),e.lineTo(t,0),e.lineTo(0,0),e.fill(),e.stroke(),h.set(c,l),l}export function getBounds(i,n,c,t,o=1,a){const s=c*o,l=t*o;return new d({x:i,y:n},{x:s,y:l},a)}
1
+ import{Rect as d}from"@expofp/geometry";const r=new Map;export function createCircleCanvas(i,n){const c=n.toUpperCase();if(!r.has(c)){const e=document.createElement("canvas"),a=i*2*devicePixelRatio+1*2;e.width=a,e.height=a;const s=e.getContext("2d");s.fillStyle=n,s.beginPath(),s.arc(a/2,a/2,i*devicePixelRatio,0,2*Math.PI),s.fill(),r.set(c,e)}return r.get(c)}const h=new Map;export function createBookmarkCanvas(i,n){const c=i;if(h.has(c))return h.get(c);const e=i,o=e*1.4,a=Math.ceil(e*n),s=Math.ceil(o*n),l=document.createElement("canvas");l.width=a,l.height=s;const t=l.getContext("2d");return t.scale(n,n),t.fillStyle="#fdbf2b",t.strokeStyle="#fff",t.lineWidth=4/n,t.beginPath(),t.moveTo(0,0),t.lineTo(0,o),t.lineTo(e/2,o-e/2),t.lineTo(e,o),t.lineTo(e,0),t.lineTo(0,0),t.fill(),t.stroke(),h.set(c,l),l}export function getBounds(i,n,c,e,o=1,a,s){const l=c*o,t=e*o;return new d({x:i,y:n},{x:l,y:t},a,s)}
@@ -18,12 +18,16 @@ export interface FontSizeFactor {
18
18
  export declare function rectToShapeDef(rect: SVGRectElement, color?: string): ShapeDef;
19
19
  export declare function meshToShapeDef(mesh: MeshType, color: string): ShapeDef;
20
20
  export declare function createShapeDef(shape: Box | Rect | Polygon | Mesh, color?: string): ShapeDef;
21
- export declare function createImageDef(source: ImageSource, bounds: Rect, options?: SharedDef & {
21
+ export declare function createImageDef<Source extends ImageSource>(source: Source, bounds: Rect, options?: SharedDef & {
22
22
  origin?: [number, number];
23
- }): ImageDef;
23
+ }): ImageDef & {
24
+ source: Source;
25
+ };
24
26
  export declare function createTextDef(textLines: TextLineDef[], bounds: Rect, padding: [number, number], alignment: TextAlignment, options?: SharedDef): TextDef;
25
27
  export declare function createTextDefLines(textLines: TextLines, color: string, fontSize: number, fontUrl?: [string | undefined, string | undefined]): TextLineDef[];
26
28
  export declare function createLayerDef(name: string, children: RenderableDefCollection, options?: SharedDef): LayerDef;
27
29
  export declare function createSceneDef(layers: LayerDef[], viewboxRect: Box | SVGRectElement, background?: string): SceneDef;
28
- export declare function createShapeDot(rect: Rect, color?: string, radius?: number): ImageDef;
30
+ export declare function createShapeDot(rect: Rect, color?: string, radius?: number): ImageDef & {
31
+ source: HTMLCanvasElement;
32
+ };
29
33
  //# sourceMappingURL=defs.d.ts.map
@@ -1 +1 @@
1
- import{angleDiff as l,Rect as k}from"@expofp/geometry";import{getBounds as w}from"./canvases";export function updateLinesScale(t,o,n){let e=!1;return t.forEach((r,i)=>{let s=0;n[i].forEach(({value:a,scaleFactor:c})=>{o<c&&(s=a)}),r.fontSize!==s*o&&(e=!0),r.fontSize=s*o}),e}export function rotateTextDefByQuarters(t,o){const{center:n,size:e,rotation:r,elevation:i}=t.bounds,s=o%2!==0;return t.bounds.set(n.x,n.y,s?e.y:e.x,s?e.x:e.y,r+o*Math.PI/2,i),t}export function rotateRectByQuarters(t,o){const{size:n,center:e,rotation:r,elevation:i}=t,s=o%2!==0?{x:n.y,y:n.x}:n;return new k(e,s,r+o*Math.PI/2,i)}export function getQuarterTurns(t,o){if(!Number.isFinite(t)||!Number.isFinite(o))return 0;const n=l(t,o);return Math.abs(n)<=Math.PI/4?0:Math.round(n/(Math.PI/2))}export function shouldFlip(t,o){const n=l(t,o),e=Math.PI/2;return Math.abs(n)>e+.1}export function flipAngle(t){return(t+Math.PI+Math.PI)%(2*Math.PI)-Math.PI}export function getClampedBoundsCanvas(t,o,n,e){const r=o.width,i=o.height,s=t.size,a=t.center,c=t.rotation,d=s.x/r,M=s.x-n*2,b=(s.y-n*2)*.8,y=0,g=M/r,I=b/i,S=Math.min(g,I,d);e=Math.min(Math.max(e,y),S);const P=r*e,z=i*e,h=Math.sin(c),f=Math.cos(c),u=s.x/2-n,x=-s.y/2+n,B=a.x+u*f-x*h,R=a.y+u*h+x*f,m=P/2,p=-z/2,W=m*f-p*h,H=m*h+p*f,X=B-W,Y=R-H;return w(X,Y,r,i,e,c)}export function getRollValue(t){if(!t)return!1;if(!Number.isInteger(+t)||+t!=1&&+t!=0)throw new Error("Map roll: setting value is incorrect");return!!+t}
1
+ import{angleDiff as p,Rect as k}from"@expofp/geometry";import{getBounds as w}from"./canvases";export function updateLinesScale(t,o,n){let e=!1;return t.forEach((r,i)=>{let s=0;n[i].forEach(({value:a,scaleFactor:c})=>{o<c&&(s=a)}),r.fontSize!==s*o&&(e=!0),r.fontSize=s*o}),e}export function rotateTextDefByQuarters(t,o){const{center:n,size:e,rotation:r,elevation:i}=t.bounds,s=o%2!==0;return t.bounds.set(n.x,n.y,s?e.y:e.x,s?e.x:e.y,r+o*Math.PI/2,i),t}export function rotateRectByQuarters(t,o){const{size:n,center:e,rotation:r,elevation:i}=t,s=o%2!==0?{x:n.y,y:n.x}:n;return new k(e,s,r+o*Math.PI/2,i)}export function getQuarterTurns(t,o){if(!Number.isFinite(t)||!Number.isFinite(o))return 0;const n=p(t,o);return Math.abs(n)<=Math.PI/4?0:Math.round(n/(Math.PI/2))}export function shouldFlip(t,o){const n=p(t,o),e=Math.PI/2;return Math.abs(n)>e+.1}export function flipAngle(t){return(t+Math.PI+Math.PI)%(2*Math.PI)-Math.PI}export function getClampedBoundsCanvas(t,o,n,e){const r=o.width,i=o.height,s=t.size,a=t.center,c=t.rotation,d=s.x/r,M=s.x-n*2,b=(s.y-n*2)*.8,y=0,g=M/r,I=b/i,S=Math.min(g,I,d);e=Math.min(Math.max(e,y),S);const P=r*e,z=i*e,h=Math.sin(c),f=Math.cos(c),u=s.x/2-n,x=-s.y/2+n,B=a.x+u*f-x*h,R=a.y+u*h+x*f,l=P/2,m=-z/2,W=l*f-m*h,H=l*h+m*f,X=B-W,Y=R-H;return w(X,Y,r,i,e,c,t.elevation)}export function getRollValue(t){if(!t)return!1;if(!Number.isInteger(+t)||+t!=1&&+t!=0)throw new Error("Map roll: setting value is incorrect");return!!+t}
@@ -372,7 +372,7 @@ export interface Marker extends CurrentPosition {
372
372
  id: string;
373
373
  icon: string;
374
374
  selectedIcon: string;
375
- position: 'centertop' | 'lefttop';
375
+ position: 'centertop' | 'lefttop' | 'centerbottom';
376
376
  active?: boolean;
377
377
  }
378
378
  export interface MarkerIcon {
@@ -1 +1 @@
1
- import{update as d}from"@expofp/renderer";import{createWayfinding as g,resolveWayfindingLayers as S}from"@expofp/wayfinding";import{fpGeo as R}from"../data/fpGeo";import{attachCardinalSnap as v}from"../engine/utils/rotation";import{createCanvasIconProvider as h,createFloorContext as x,createGraphDataSource as k}from"./adapters";import{bindMobxReactions as C}from"./bindMobxReactions";import{createKioskHandler as P}from"./handlers/kioskHandler";import{createYahHandler as W}from"./handlers/yahHandler";let u=null;export function isWayfindingReady(){return u!==null}function b(){if(!u)throw new Error("Wayfinding is not initialized \u2014 call createWayfinding() first.");return u}export function buildRoute(e,n,r){return b().wayfinding.buildRoute(e,n,r)}export function createWayfinding(e){const{scene:n,store:r,canvas:o}=e,c=S(n.rootLayer),{wayfinding:s,dispose:i}=w(r,c,{attachCardinalSnap:v,update:d}),t=c.icons;return t.onClick=f=>M(s,f),t.onPointerMove=f=>y(s,o,f),t.onPointerOut=()=>y(s,o),d(t),()=>{t.onClick=void 0,t.onPointerMove=void 0,t.onPointerOut=void 0,o.current&&(o.current.style.cursor=""),d(t),i()}}function w(e,n,r){const o=k(),c=h({iconMap:e.fp.icons,pixelRatio:devicePixelRatio}),s=x(e.layerStore,e.routeStore),i=g({dataSource:o,renderer:r,iconProvider:c,floorContext:s,layers:n,gpsConfig:R?.properties?.config,onTransitionClick:a=>{a.role==="exit"&&e.layerStore.updateVisibility(a.targetLayer,!0)},onRouteUpdate:(a,p)=>{e.routeStore.updateRoute([...a]),p.isEmpty()||(e.uiState.moveToRect=p)},onRouteDistance:a=>e.routeStore.updateRouteDistance(a)}),t=P({wayfinding:i,kioskIconMap:e.fp.icons}),f=W({wayfinding:i,iconMap:e.fp.icons,pixelRatio:devicePixelRatio,floorContext:s}),m=C({wayfinding:i,kioskHandler:t,yahHandler:f,stores:{routeStore:e.routeStore,uiState:e.uiState,layerStore:e.layerStore}});e.routeStore.showAccessible=o.getLines().some(a=>a.unaccessible);const l={wayfinding:i};return u=l,i.flush(),{wayfinding:i,dispose(){H(l)&&(u=null,e.routeStore.showAccessible=!1),m(),i.destroy()}}}function H(e){return u===e}function M(e,n){e.handleClick([n.def])&&n.stopPropagation()}function y(e,n,r){const o=n.current;if(!o)return;const c=r?e.handleHover([r.def]):!1;o.style.cursor=c?"pointer":""}
1
+ import{update as d}from"@expofp/renderer";import{createWayfinding as S,resolveWayfindingLayers as g}from"@expofp/wayfinding";import{fpGeo as R}from"../data/fpGeo";import{attachCardinalSnap as v}from"../engine/utils/rotation";import{createCanvasIconProvider as h,createFloorContext as x,createGraphDataSource as k}from"./adapters";import{bindMobxReactions as C}from"./bindMobxReactions";import{createKioskHandler as P}from"./handlers/kioskHandler";import{createYahHandler as W}from"./handlers/yahHandler";let u=null;export function isWayfindingReady(){return u!==null}function w(){if(!u)throw new Error("Wayfinding is not initialized \u2014 call createWayfinding() first.");return u}export function buildRoute(e,n,r){return w().wayfinding.buildRoute(e,n,r)}export function createWayfinding(e){const{scene:n,store:r,canvas:o}=e,c=g(n.rootLayer),{wayfinding:s,dispose:t}=b(r,c,{attachCardinalSnap:v,update:d}),i=c.icons;return i.onClick=f=>M(s,f),i.onPointerMove=f=>y(s,o,f),i.onPointerOut=()=>y(s,o),d(i),()=>{i.onClick=void 0,i.onPointerMove=void 0,i.onPointerOut=void 0,o.current&&(o.current.style.cursor=""),d(i),t()}}function b(e,n,r){const o=k(),c=h({iconMap:e.fp.icons,pixelRatio:devicePixelRatio}),s=x(e.layerStore,e.routeStore),t=S({dataSource:o,renderer:r,iconProvider:c,floorContext:s,layers:n,gpsConfig:R?.properties?.config,screenSpaceIcons:e.uiState.is3DView,onTransitionClick:a=>{a.role==="exit"&&e.layerStore.updateVisibility(a.targetLayer,!0)},onRouteUpdate:(a,p)=>{e.routeStore.updateRoute([...a]),p.isEmpty()||(e.uiState.moveToRect=p)},onRouteDistance:a=>e.routeStore.updateRouteDistance(a)}),i=P({wayfinding:t,kioskIconMap:e.fp.icons}),f=W({wayfinding:t,iconMap:e.fp.icons,pixelRatio:devicePixelRatio,floorContext:s}),m=C({wayfinding:t,kioskHandler:i,yahHandler:f,stores:{routeStore:e.routeStore,uiState:e.uiState,layerStore:e.layerStore}});e.routeStore.showAccessible=o.getLines().some(a=>a.unaccessible);const l={wayfinding:t};return u=l,t.flush(),{wayfinding:t,dispose(){H(l)&&(u=null,e.routeStore.showAccessible=!1),m(),t.destroy()}}}function H(e){return u===e}function M(e,n){e.handleClick([n.def])&&n.stopPropagation()}function y(e,n,r){const o=n.current;if(!o)return;const c=r?e.handleHover([r.def]):!1;o.style.cursor=c?"pointer":""}
@@ -1 +1 @@
1
- import{degToRad as l}from"@expofp/geometry";import{createKioskCanvas as f}from"../adapters";const n="kiosk",p=0;export function createKioskHandler({wayfinding:t,kioskIconMap:a}){const s=new Map,u=e=>{const o=e??100,c=s.get(o);if(c)return c;const r=f(a,e);return s.set(o,r),r};return(e,o,c)=>{if(!e){t.setIcon(n,null),t.flush();return}if(c!==p&&e.z&&o&&e.z!==o){t.setIcon(n,null),t.flush();return}t.setIcon(n,{canvas:u(e.iconSizePercent),x:e.x,y:e.y,rotation:l(e.heading??0)}),t.flush()}}
1
+ import{degToRad as l}from"@expofp/geometry";import{createKioskCanvas as f}from"../adapters";const n="kiosk",p=0;export function createKioskHandler({wayfinding:t,kioskIconMap:a}){const s=new Map,u=e=>{const c=e??100,o=s.get(c);if(o)return o;const r=f(a,e);return s.set(c,r),r};return(e,c,o)=>{if(!e){t.setIcon(n,null),t.flush();return}if(o!==p&&e.z&&c&&e.z!==c){t.setIcon(n,null),t.flush();return}t.setIcon(n,{canvas:u(e.iconSizePercent),x:e.x,y:e.y,rotation:l(e.heading??0),screenSpace:!1}),t.flush()}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expofp/floorplan",
3
- "version": "3.38.0",
3
+ "version": "3.39.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/expofp/efp-app.git",
@@ -69,15 +69,15 @@
69
69
  "tslib": "^2.3.0",
70
70
  "uuid": "^9.0.1",
71
71
  "zod": "4.4.3",
72
- "@expofp/config": "3.38.0",
73
- "@expofp/debug": "3.38.0",
74
- "@expofp/geometry": "3.38.0",
75
- "@expofp/renderer": "3.38.0",
76
- "@expofp/resolve": "3.38.0",
77
- "@expofp/schema": "3.38.0",
78
- "@expofp/ui": "3.38.0",
79
- "@expofp/utils": "3.38.0",
80
- "@expofp/wayfinding": "3.38.0"
72
+ "@expofp/config": "3.39.0",
73
+ "@expofp/debug": "3.39.0",
74
+ "@expofp/geometry": "3.39.0",
75
+ "@expofp/renderer": "3.39.0",
76
+ "@expofp/resolve": "3.39.0",
77
+ "@expofp/schema": "3.39.0",
78
+ "@expofp/ui": "3.39.0",
79
+ "@expofp/utils": "3.39.0",
80
+ "@expofp/wayfinding": "3.39.0"
81
81
  },
82
82
  "devDependencies": {
83
83
  "@babel/plugin-proposal-decorators": "^8.0.2",