@expofp/floorplan 3.24.3 → 3.25.1

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 (80) hide show
  1. package/dist/browser/{Button-p01mffmV.js → Button-4H7Y1oIu.js} +5 -5
  2. package/dist/browser/{CookieConsent-BF8pB73I.js → CookieConsent-CoWK7bx_.js} +7 -7
  3. package/dist/browser/{Debug-B5hyechZ.js → Debug-D-XXdsjt.js} +7 -7
  4. package/dist/browser/{Demo-knBpWccU.js → Demo-c-7YAVSW.js} +9 -9
  5. package/dist/browser/{Free-CMDOPW7B.js → Free-MaZo2dmm.js} +9 -9
  6. package/dist/browser/{GalleryContainer-Ba7QRGqJ.js → GalleryContainer-DOnJhv4I.js} +10 -10
  7. package/dist/browser/{GpsLoader-DOOP_ASm.js → GpsLoader-f-s46e4s.js} +10 -10
  8. package/dist/browser/{KioskStore-IZgF3XDx.js → KioskStore-B5S4imVV.js} +4 -4
  9. package/dist/browser/{MaplibreAdapter-BfUqF5P9.js → MaplibreAdapter-C848yf6N.js} +9 -9
  10. package/dist/browser/{ModalContainer-MRMe33uV.js → ModalContainer-aakS4vkf.js} +10 -10
  11. package/dist/browser/{PermissionNotice-DB5Ift9m.js → PermissionNotice-Bnrs8YcD.js} +6 -6
  12. package/dist/browser/{SetKioskMode-Bg4_U0Ov.js → SetKioskMode-DzZZyS6g.js} +8 -8
  13. package/dist/browser/{ShowKiosk-_EK6VmAV.js → ShowKiosk-O_w7S73S.js} +10 -10
  14. package/dist/browser/{ViewerMenuPanel-BostqgVg.js → ViewerMenuPanel-Db9A3MbQ.js} +9 -9
  15. package/dist/browser/{add-debug-secret-listener-ivErN3mk.js → add-debug-secret-listener-B7IVgt3l.js} +1 -1
  16. package/dist/browser/{adopt-global-settings-B6w6CagP.js → adopt-global-settings-CroPYwuh.js} +9 -9
  17. package/dist/browser/{boolean-editor-CUGJZwH-.js → boolean-editor-ACHtv3re.js} +9 -9
  18. package/dist/browser/{bootIntercom-D-rZAhCK.js → bootIntercom-wfCldz8i.js} +2 -2
  19. package/dist/browser/{booth-by-xy-DzhIUI-Q.js → booth-by-xy-BeNsPAK4.js} +6 -6
  20. package/dist/browser/bundle.json +65 -65
  21. package/dist/browser/{classnames-9nzeif8D.js → classnames-DNJ9erp0.js} +2 -2
  22. package/dist/browser/{client-BsLcgFfO.js → client-B0kI_Wgq.js} +4 -4
  23. package/dist/browser/{components-By6WCr5d.js → components-CH6jzgzD.js} +36 -36
  24. package/dist/browser/{debug-overlay-D6b9zd48.js → debug-overlay-DPLD8G41.js} +10 -10
  25. package/dist/browser/{debug-ui-Da7wcC3i.js → debug-ui-BcuP78GL.js} +6 -6
  26. package/dist/browser/{dist-BvZjZCdR.js → dist-D878OZ4g.js} +3 -3
  27. package/dist/browser/{dist-DhzSPs9e.js → dist-DFYO_yWm.js} +6 -6
  28. package/dist/browser/{dist-E6y2lqRa.js → dist-j5FbLfDv.js} +5 -5
  29. package/dist/browser/{efp-debug-init-4LtPCUPY.js → efp-debug-init-WBPOkifi.js} +3 -3
  30. package/dist/browser/{enum-editor-BghDWgeO.js → enum-editor-Bo1kcz2P.js} +4 -4
  31. package/dist/browser/{es5-B1foSeGv.js → es5-Dw3hh2hq.js} +2 -2
  32. package/dist/browser/{event-not-found-CEyhr6Cq.js → event-not-found-D8_q8mVF.js} +1 -1
  33. package/dist/browser/{exports-BeSO266J.js → exports-CoddzsKD.js} +1 -1
  34. package/dist/browser/{favicon-CWf1ojn0.js → favicon-BT321x5p.js} +1 -1
  35. package/dist/browser/{fetch-retry.umd-CWgAWfkB.js → fetch-retry.umd-CA8ymopQ.js} +2 -2
  36. package/dist/browser/{flex-C64hUG-Y.js → flex-D9q2kF6V.js} +5 -5
  37. package/dist/browser/{floorplan.loader-BF29NpFQ.js → floorplan.loader-CyQJ2YNJ.js} +683 -662
  38. package/dist/browser/{floorplan.ready-ByvBX6zB.js → floorplan.ready-CNRA40yt.js} +325 -339
  39. package/dist/browser/{fuse-B9jyODVz.js → fuse-mrwK1iZf.js} +2 -2
  40. package/dist/browser/{i18n-CyXUWmbq.js → i18n-DAfeAZ8S.js} +5 -5
  41. package/dist/browser/index.js +16 -16
  42. package/dist/browser/{index.module-DlRMnP0h.js → index.module-Dk3kAKpT.js} +4 -4
  43. package/dist/browser/{integrateKiosk-CqDd_6zK.js → integrateKiosk-DxVChOVT.js} +4 -4
  44. package/dist/browser/{is-webview-nZTrftS3.js → is-webview-Co4s-GiT.js} +1 -1
  45. package/dist/browser/{jsx-runtime-BvehpqN1.js → jsx-runtime-BLEarrXz.js} +2 -2
  46. package/dist/browser/{kiosk-record-3zDMdFbA.js → kiosk-record-Dtemk-B5.js} +1 -1
  47. package/dist/browser/{lib-BWguER4h.js → lib-CLrvaGLZ.js} +3 -3
  48. package/dist/browser/{loadImage-DlTxF7hO.js → loadImage-CKDCgeht.js} +4 -4
  49. package/dist/browser/{logDeviceInfo-DkyoRXga.js → logDeviceInfo-DIsLUyHd.js} +9 -9
  50. package/dist/browser/{main-CQISrN-R.js → main-CTB1lHrg.js} +1 -1
  51. package/dist/browser/{mobx-CclSjvoG.js → mobx-DuryiTxo.js} +4 -4
  52. package/dist/browser/{optional-boolean-editor-DQzKDlOi.js → optional-boolean-editor-CWY6Zx6h.js} +3 -3
  53. package/dist/browser/{optional-enum-editor-BoXlfU-Z.js → optional-enum-editor-C8w2_YdD.js} +4 -4
  54. package/dist/browser/{optional-string-editor-D5dIax4i.js → optional-string-editor-BAG27Bz5.js} +4 -4
  55. package/dist/browser/{particles.min-D9wmJdXA.js → particles.min-DG6IF5ip.js} +2 -2
  56. package/dist/browser/{react-6tMZPkhI.js → react-BjxCyCXo.js} +2 -2
  57. package/dist/browser/{react-dom-CutFn8wf.js → react-dom-BbWLMz4w.js} +3 -3
  58. package/dist/browser/{rolldown-runtime-dRo6A-vE.js → rolldown-runtime-D8LGmHLI.js} +1 -1
  59. package/dist/browser/{select-WMTRp4v8.js → select-CTX5p1zp.js} +10 -10
  60. package/dist/browser/{settings-DUe5ncnN.js → settings-XnHelA1L.js} +2 -2
  61. package/dist/browser/{settings-item-COWlJF9-.js → settings-item-Dgr7yr9v.js} +6 -6
  62. package/dist/browser/{store-B0pIa2x7.js → store-YlSxEv0I.js} +1270 -1259
  63. package/dist/browser/{string-editor-oB_Qkp2m.js → string-editor-B-DLDQmW.js} +4 -4
  64. package/dist/browser/{text-field-eEQqOs7Q.js → text-field-DlqnEhco.js} +5 -5
  65. package/dist/browser/{theme-BLk06fsq.js → theme-DHHsQVr7.js} +8 -8
  66. package/dist/browser/{ui-DCurqY1Z.js → ui-ffwGvnRO.js} +8 -8
  67. package/dist/browser/{useRenderTarget-BuFH1LJK.js → useRenderTarget-CAxp6qGQ.js} +4 -4
  68. package/dist/esm/components/Map/drawing/config/config-booth-labels-special.d.ts +3 -3
  69. package/dist/esm/components/Map/drawing/config/config-booth-labels-special.js +2 -2
  70. package/dist/esm/components/Map/drawing/config/config-booth-labels.d.ts +4 -4
  71. package/dist/esm/components/Map/drawing/config/config-booth-labels.js +1 -1
  72. package/dist/esm/components/Map/drawing/config/label-inset.d.ts +26 -0
  73. package/dist/esm/components/Map/drawing/config/label-inset.js +1 -0
  74. package/dist/esm/floorplan.loader.d.ts +30 -0
  75. package/dist/esm/floorplan.loader.js +1 -1
  76. package/dist/esm/floorplan.ready.d.ts +1 -1
  77. package/dist/esm/floorplan.ready.js +1 -1
  78. package/dist/esm/load.js +2 -2
  79. package/dist/esm/types.d.ts +29 -0
  80. package/package.json +9 -9
@@ -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.24.3" };
4
+ e.SENTRY_RELEASE = { id: "3.25.1" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "0a67f4c1-0ef6-428f-92c6-94c57178bf21", e._sentryDebugIdIdentifier = "sentry-dbid-0a67f4c1-0ef6-428f-92c6-94c57178bf21");
7
7
  } catch {}
8
8
  })();
9
- import { t as e } from "./jsx-runtime-BvehpqN1.js";
10
- import { t } from "./settings-item-COWlJF9-.js";
11
- import { t as n } from "./text-field-eEQqOs7Q.js";
9
+ import { t as e } from "./jsx-runtime-BLEarrXz.js";
10
+ import { t } from "./settings-item-Dgr7yr9v.js";
11
+ import { t as n } from "./text-field-DlqnEhco.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.24.3" };
4
+ e.SENTRY_RELEASE = { id: "3.25.1" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "9c5a0877-c176-4e2d-b51c-123d50ab2b3c", e._sentryDebugIdIdentifier = "sentry-dbid-9c5a0877-c176-4e2d-b51c-123d50ab2b3c");
7
7
  } catch {}
8
8
  })();
9
- import { r as e } from "./rolldown-runtime-dRo6A-vE.js";
10
- import { t } from "./react-6tMZPkhI.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-C64hUG-Y.js";
12
- import { t as l } from "./classnames-9nzeif8D.js";
9
+ import { r as e } from "./rolldown-runtime-D8LGmHLI.js";
10
+ import { t } from "./react-BjxCyCXo.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-D9q2kF6V.js";
12
+ import { t as l } from "./classnames-DNJ9erp0.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.24.3" };
4
+ e.SENTRY_RELEASE = { id: "3.25.1" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "f658045a-5be7-4ea4-a4b2-ddea9ab9caf3", e._sentryDebugIdIdentifier = "sentry-dbid-f658045a-5be7-4ea4-a4b2-ddea9ab9caf3");
7
7
  } catch {}
8
8
  })();
9
- import { r as e } from "./rolldown-runtime-dRo6A-vE.js";
10
- import { t } from "./react-6tMZPkhI.js";
11
- import { t as n } from "./jsx-runtime-BvehpqN1.js";
12
- import { t as r } from "./react-dom-CutFn8wf.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-C64hUG-Y.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-DhzSPs9e.js";
15
- import { t as y } from "./classnames-9nzeif8D.js";
9
+ import { r as e } from "./rolldown-runtime-D8LGmHLI.js";
10
+ import { t } from "./react-BjxCyCXo.js";
11
+ import { t as n } from "./jsx-runtime-BLEarrXz.js";
12
+ import { t as r } from "./react-dom-BbWLMz4w.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-D9q2kF6V.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-DFYO_yWm.js";
15
+ import { t as y } from "./classnames-DNJ9erp0.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.24.3" };
4
+ e.SENTRY_RELEASE = { id: "3.25.1" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "3c34ab8b-5d65-4c06-8595-6ed371acabc5", e._sentryDebugIdIdentifier = "sentry-dbid-3c34ab8b-5d65-4c06-8595-6ed371acabc5");
7
7
  } catch {}
8
8
  })();
9
- import { r as e } from "./rolldown-runtime-dRo6A-vE.js";
10
- import { a as t, i as n, s as r } from "./efp-debug-init-4LtPCUPY.js";
11
- import { a as i, i as a } from "./adopt-global-settings-B6w6CagP.js";
12
- import { t as o } from "./jsx-runtime-BvehpqN1.js";
13
- import "./settings-DUe5ncnN.js";
14
- import { t as s } from "./add-debug-secret-listener-ivErN3mk.js";
9
+ import { r as e } from "./rolldown-runtime-D8LGmHLI.js";
10
+ import { a as t, i as n, s as r } from "./efp-debug-init-WBPOkifi.js";
11
+ import { a as i, i as a } from "./adopt-global-settings-CroPYwuh.js";
12
+ import { t as o } from "./jsx-runtime-BLEarrXz.js";
13
+ import "./settings-XnHelA1L.js";
14
+ import { t as s } from "./add-debug-secret-listener-B7IVgt3l.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-Da7wcC3i.js"), { createRoot: i } = await import("./client-BsLcgFfO.js").then((t) => /* @__PURE__ */ e(t.default, 1)), a = document.createElement("div");
29
+ let { DebugUi: n } = await import("./debug-ui-BcuP78GL.js"), { createRoot: i } = await import("./client-B0kI_Wgq.js").then((t) => /* @__PURE__ */ e(t.default, 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.24.3" };
4
+ e.SENTRY_RELEASE = { id: "3.25.1" };
5
5
  var t = new e.Error().stack;
6
6
  t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "7407e64e-4c4e-4bfb-b2ef-80063ad22998", e._sentryDebugIdIdentifier = "sentry-dbid-7407e64e-4c4e-4bfb-b2ef-80063ad22998");
7
7
  } catch {}
8
8
  })();
9
- import { r as e } from "./rolldown-runtime-dRo6A-vE.js";
10
- import { t } from "./react-6tMZPkhI.js";
11
- import { l as n } from "./store-B0pIa2x7.js";
9
+ import { r as e } from "./rolldown-runtime-D8LGmHLI.js";
10
+ import { t } from "./react-BjxCyCXo.js";
11
+ import { l as n } from "./store-YlSxEv0I.js";
12
12
  //#region ../ui/src/shared/activeElement.ts
13
13
  var r = (e) => !!e && "activeElement" in e;
14
14
  function i(e) {
@@ -1,6 +1,6 @@
1
- import { ImageDef, TextDef } from '@expofp/renderer';
2
- import { FontSizeFactor, RendererService } from '../../../../renderer';
3
- import { Booth, SpecialBooth } from '../../../../store/BoothStore';
1
+ import { type ImageDef, type TextDef } from '@expofp/renderer';
2
+ import { type FontSizeFactor, type RendererService } from '../../../../renderer';
3
+ import { type Booth, SpecialBooth } from '../../../../store/BoothStore';
4
4
  import { BoothLabelDrawer } from './config-booth-labels';
5
5
  export default function configBoothLabelsSpecial(rendererService: RendererService, booth: Booth): BoothLabelSpecialDrawer | undefined;
6
6
  declare class BoothLabelSpecialDrawer extends BoothLabelDrawer {
@@ -1,2 +1,2 @@
1
- import{Box as x,Rect as b}from"@expofp/geometry";import{reaction as u}from"mobx";import{FONT_WEIGHT_PRIMARY_BOOTH as L,FONT_WEIGHT_PRIMARY_SPECIAL as D}from"../../../../constants";import{boxToRenderer as R,createTextDef as F,getRollValue as v,getRotation as y,shouldFlip as T,updateRectRotation as z,updateTextDefRotation as P}from"../../../../renderer";import{boothStore as w,heatmapStore as k,layersStore as B,uiState as d}from"../../../../store";import{SpecialBooth as I}from"../../../../store/BoothStore";import M from"../../../../tools/settings";import{getFont as C}from"./canvases";import{BoothLabelDrawer as W,getFontUrlByWeight as V,getMinZoomFactorForDot as _,isDirectionsMode as $}from"./config-booth-labels";import H from"./TextFitter";const p=new Map;function N(i){let t=p.get(i);if(!t){const s=[18,16,14,12,10,7].map(h=>h*i),o=14*i;t=new H(C,s,o),p.set(i,t),setTimeout(()=>p.delete(i),5e3)}return t}export default function O(i,t){if(!(!(t instanceof I)||t.noLabels))return new A(i,t)}class A extends W{constructor(t,s){super(t,s);const o=s.borderWidth/2||w.borderWidth/2,h=this.booth.rect,S=Number(getComputedStyle(document.body).getPropertyValue(D))||Number(getComputedStyle(document.body).getPropertyValue(L))||500,g=V(S,this.rendererService.fontUrls),c=h.expand({x:-(h.size.width*.05+o),y:-(h.size.height*.05+o)});this.setText(),this.canvasRect=new b(c.center,c.size,s.rotate),this.setFactors(this.text),this.labelIsVertical=Math.abs(Math.abs(s.rotate)-Math.PI/2)<.01,this.fontSizes=[this.steps,[]],this.minZoomDotVisible=_(this.steps.map(e=>e.scaleFactor)),this.shapeLabel=F([{text:this.text,color:s.labelColor||M.boothLabelColor,fontUrl:g,fontSize:0}],new b(c.center,c.size,s.rotate),[o,o],{horizontal:"center",text:"center",vertical:"center"}),this.getShapeDot(),u(()=>[this.booth.skipDim,d.selectedRoute,B.layersLoaded],()=>{const e=$();this.shapeLabel.dim=e||this.booth.skipDim?!1:void 0,this.shapeDot.dim=e||this.booth.skipDim?!1:void 0,this.rendererService.update(this.shapeLabel,this.shapeDot)});const m=e=>{let a=this.steps.find(r=>r.scaleFactor<1/e);return a?(this.shapeLabel.lines[0].fontSize=a.value/devicePixelRatio*e,this.shapeLabel.lines[0].text=a.lines.join(`
2
- `),this.shapeLabel.padding=[this.paddingScaled[0]*e+this.padding,this.paddingScaled[1]*e+this.padding],this.shapeLabel):(this.shapeLabel.lines[0].fontSize=0,this.shapeLabel)},f=e=>{let a=this.steps.find(l=>l.scaleFactor<1/e);const r=this.shapeDot.source.width*e,n=this.shapeDot.source.height*e;return this.shapeDot.bounds=R(x.fromCenter(this.canvasRect.center,{x:r,y:n})),this.shapeDot.hidden=!!a,this.shapeDot};this.rendererService.onPtScale(`booth-special-label-${s.id}`,m),this.rendererService.onPtScale(`booth-special-dot-${s.id}`,f),u(()=>d.mapSettings,({roll:e})=>{v(e)&&this.rendererService.onRoll(`booth-special-roll-${s.id}`,a=>{const r=this.shapeLabel.bounds.rotation;if(this.labelIsVertical)T(a,r)&&(this.shapeLabel.bounds.rotation=-r);else{const n=y(a,r);if(n!==void 0){const{size:l}=this.canvasRect;this.shapeLabel=P(this.shapeLabel,n),l.x!==l.y&&!this.shapeLabel.hidden&&(this.canvasRect=z(this.canvasRect,n),this.setFactors(this.text),m(this.rendererService.scale),f(this.rendererService.scale))}}return[this.shapeLabel,this.shapeDot]})},{fireImmediately:!0})}getShape(){return[this.shapeLabel,this.shapeDot]}setFactors(t){this.steps=N(devicePixelRatio).getStepsForRect(t,this.canvasRect.size.x,this.canvasRect.size.y)}setText(){const t=this.booth.title||this.booth.name,o=`Clicks: ${k.getTotalClicksByBooth(this.booth)}`;this.text=d.heatmap?`${t} - ${o}`:t}}
1
+ import{Box as L,Rect as u}from"@expofp/geometry";import{reaction as b}from"mobx";import{FONT_WEIGHT_PRIMARY_BOOTH as x,FONT_WEIGHT_PRIMARY_SPECIAL as R}from"../../../../constants";import{boxToRenderer as D,createTextDef as F,getRollValue as v,getRotation as T,shouldFlip as y,updateRectRotation as z,updateTextDefRotation as I}from"../../../../renderer";import{heatmapStore as P,layersStore as w,uiState as d}from"../../../../store";import{SpecialBooth as B}from"../../../../store/BoothStore";import M from"../../../../tools/settings";import{getFont as k}from"./canvases";import{BoothLabelDrawer as C,getFontUrlByWeight as _,getMinZoomFactorForDot as A,isDirectionsMode as N}from"./config-booth-labels";import{LABEL_MARGIN_FRACTION as S}from"./label-inset.js";import V from"./TextFitter";const p=new Map;function W(i){let t=p.get(i);if(!t){const s=[18,16,14,12,10,7].map(l=>l*i),a=14*i;t=new V(k,s,a),p.set(i,t),setTimeout(()=>p.delete(i),5e3)}return t}export default function $(i,t){if(!(!(t instanceof B)||t.noLabels))return new O(i,t)}class O extends C{constructor(t,s){super(t,s),this.steps=[],this.text="";const a=this.booth.rect,l=Number(getComputedStyle(document.body).getPropertyValue(R))||Number(getComputedStyle(document.body).getPropertyValue(x))||500,g=_(l,this.rendererService.fontUrls),h=a.expand({x:-(a.size.width*S+this.padding),y:-(a.size.height*S+this.padding)});this.setText(),this.canvasRect=new u(h.center,h.size,s.rotate),this.setFactors(this.text),this.labelIsVertical=Math.abs(Math.abs(s.rotate)-Math.PI/2)<.01,this.fontSizes=[this.steps,[]],this.minZoomDotVisible=A(this.steps.map(e=>e.scaleFactor)),this.shapeLabel=F([{text:this.text,color:s.labelColor||M.boothLabelColor,fontUrl:g,fontSize:0}],new u(h.center,h.size,s.rotate),[this.padding,this.padding],{horizontal:"center",text:"center",vertical:"center"}),this.getShapeDot(),b(()=>[this.booth.skipDim,d.selectedRoute,w.layersLoaded],()=>{const e=N();this.shapeLabel.dim=e||this.booth.skipDim?!1:void 0,this.shapeDot.dim=e||this.booth.skipDim?!1:void 0,this.rendererService.update(this.shapeLabel,this.shapeDot)});const m=e=>{const o=this.steps.find(r=>r.scaleFactor<1/e);return o?(this.shapeLabel.lines[0].fontSize=o.value/devicePixelRatio*e,this.shapeLabel.lines[0].text=o.lines.join(`
2
+ `),this.shapeLabel.padding=[this.paddingScaled[0]*e+this.padding,this.paddingScaled[1]*e+this.padding],this.shapeLabel):(this.shapeLabel.lines[0].fontSize=0,this.shapeLabel)},f=e=>{const o=this.steps.find(c=>c.scaleFactor<1/e),r=this.shapeDot.source.width*e,n=this.shapeDot.source.height*e;return this.shapeDot.bounds=D(L.fromCenter(this.canvasRect.center,{x:r,y:n})),this.shapeDot.hidden=!!o,this.shapeDot};this.rendererService.onPtScale(`booth-special-label-${s.id}`,m),this.rendererService.onPtScale(`booth-special-dot-${s.id}`,f),b(()=>d.mapSettings,({roll:e})=>{v(e??0)&&this.rendererService.onRoll(`booth-special-roll-${s.id}`,o=>{const r=this.shapeLabel.bounds.rotation;if(this.labelIsVertical)y(o,r)&&(this.shapeLabel.bounds.rotation=-r);else{const n=T(o,r);if(n!==void 0){const{size:c}=this.canvasRect;this.shapeLabel=I(this.shapeLabel,n),c.x!==c.y&&!this.shapeLabel.hidden&&(this.canvasRect=z(this.canvasRect,n),this.setFactors(this.text),m(this.rendererService.scale),f(this.rendererService.scale))}}return[this.shapeLabel,this.shapeDot]})},{fireImmediately:!0})}getShape(){return[this.shapeLabel,this.shapeDot]}setFactors(t){this.steps=W(devicePixelRatio).getStepsForRect(t,this.canvasRect.size.x,this.canvasRect.size.y)}setText(){const t=this.booth.title||this.booth.name,a=`Clicks: ${P.getTotalClicksByBooth(this.booth)}`;this.text=d.heatmap?`${t} - ${a}`:t}}
@@ -1,8 +1,8 @@
1
1
  import { Rect } from '@expofp/geometry';
2
- import { ImageDef, TextAlignment, TextDef } from '@expofp/renderer';
3
- import { CustomFonts, FontSizeFactor, RendererService } from '../../../../renderer';
4
- import { Booth } from '../../../../store/BoothStore';
5
- import { Exhibitor } from '../../../../store/ExhibitorStore';
2
+ import { type ImageDef, type TextAlignment, type TextDef } from '@expofp/renderer';
3
+ import { type CustomFonts, type FontSizeFactor, type RendererService } from '../../../../renderer';
4
+ import { type Booth } from '../../../../store/BoothStore';
5
+ import { type Exhibitor } from '../../../../store/ExhibitorStore';
6
6
  import { BoothDrawerBaseWithoutPainter } from './BoothDrawerBase';
7
7
  interface Prefix {
8
8
  fontSize: number;
@@ -1 +1 @@
1
- import{Rect as E}from"@expofp/geometry";import{reaction as W}from"mobx";import{FONT_WEIGHT_PRIMARY_BOOTH as N,FONT_WEIGHT_PRIMARY_EXHIBITOR as U,FONT_WEIGHT_SECONDARY_BOOTH as X,FONT_WEIGHT_SECONDARY_EXHIBITOR as V}from"../../../../constants";import p from"../../../../data";import{createShapeDot as Z,createTextDef as G,createTextDefLines as Y,DEFAULT_FONT_LIGHT_URL as $,DEFAULT_FONT_URL as B,getRollValue as k,getRotation as q,updateLinesScale as j,updateRectRotation as J,updateTextDefRotation as K}from"../../../../renderer";import{layersStore as M,uiState as u}from"../../../../store";import{RegularBooth as Q,SpecialBooth as ee}from"../../../../store/BoothStore";import x from"../../../../tools/settings";import{t as v}from"../../../../utils/i18n";import te from"../../../../utils/is-mobile";import ie from"../../../../utils/is-webview";import{isArabicText as se}from"../../../../utils/rtl";import{BoothDrawerBaseWithoutPainter as ne}from"./BoothDrawerBase";import{getFont as _}from"./canvases";let z=x.boothLabelColor;x.EXPO==="tqs2021"&&(z="#000");const b=te||ie,D=r=>r.replace(" ","").substring(0,4).replace(/[0-9]/g,"3").replace(/[A-Z]/gi,"A"),I=document.createElement("canvas").getContext("2d");export default function oe(r,e){if(!(!(e instanceof Q)||e.noLabels))return new BoothLabelDrawer(r,e)}export function getMinZoomFactorForDot(r){return Array.isArray(r)&&r.length>0?Math.max(...r.map(e=>e)):typeof r=="number"?r:-0}export const isDirectionsMode=()=>!!(u.selectedRoute?.from&&u.selectedRoute?.to);export function getFontUrlByWeight(r,e=[],t="normal"){return[...e,{weight:500,url:B,style:"normal"},{weight:300,url:$,style:"normal"}].find(i=>+i.weight===r&&i.style===t)?.url||B}function S(r,e){return Number(getComputedStyle(document.body).getPropertyValue(r))||e}export function getBoothLabelWeights(){return{main:S(N,500),details:S(X,300)}}export function getExhibitorLabelWeights(){return{main:S(U,500),details:S(V,300)}}export function getBadgeFontWeight(){return getExhibitorLabelWeights().details}const F="Details";export class BoothLabelDrawer extends ne{constructor(e,t){if(super(t),this.rendererService=e,this.canvasRect=new E(t.rect.center,t.rect.size,t.rotate),this.paddingScaled=[4,4],this.padding=(t.borderWidth||x.boothBorderWidth)/2,this.topLeftAlignment={horizontal:u.rtl?"right":"left",vertical:"top"},this.centerAlignment={horizontal:"center",vertical:"center"},this.prefixes=b?[{fontSize:7,name:"XS",short:!0},{fontSize:10,name:"S",short:!0},{fontSize:16,name:F,short:!1}]:[{fontSize:7,name:"XS",short:!0},{fontSize:10,name:"S",short:!0},{fontSize:12,name:"M",short:!0},{fontSize:14,name:"L",short:!0},{fontSize:18,name:F,short:!1}],t instanceof ee)return;this.exh=p.hideExhibitors?[]:p.onlyFeaturedExhibitors?t.exhibitors.filter(i=>i.featured):t.exhibitors,b&&this.optimizationLevel()>=3&&(this.prefixes=this.prefixes.filter(i=>i.name!=="S")),this.createLines(),this.calculateFontSizeFactors(),this.shapeLabel=G(Y(this.lines,this.booth.labelColor||z,0,this.fontUrls),new E(this.booth.rect.center,this.booth.rect.size,this.booth.rotate),[...this.paddingScaled],{horizontal:"left",vertical:"top"}),this.getShapeDot();const o=i=>{const n=this.lines[1]??[],s=this.fontSizes[1]??[];if(x.EXPO!=="wineparis2026"){const m=this.exh.length?this.topLeftAlignment:n.length?i<s[s.length-1].scaleFactor?this.topLeftAlignment:this.centerAlignment:this.topLeftAlignment;this.shapeLabel.alignment=m}if(!j(this.shapeLabel.lines,i,this.fontSizes,this.booth.name))return;const l=this.paddingScaled[0]*i+this.padding,d=this.paddingScaled[1]*i+this.padding;return this.shapeLabel.padding[0]=l,this.shapeLabel.padding[1]=d,this.shapeLabel},h=i=>{const n=i>=this.minZoomDotVisible&&i<=this.maxZoomDotVisible,s=this.shapeDot.source.width*i,a=this.shapeDot.source.height*i;if(!(!n&&this.shapeDot.hidden))return this.shapeDot.bounds.size={x:s,y:a},this.shapeDot.hidden=!n,this.shapeDot};W(()=>[this.booth.skipDim,u.selectedRoute,M.layersLoaded],()=>{if(!M.layersLoaded)return;const i=isDirectionsMode();this.shapeLabel.dim=i||this.booth.skipDim?!1:void 0,this.shapeDot.dim=i||this.booth.skipDim?!1:void 0,this.rendererService.update(this.shapeLabel,this.shapeDot)}),W(()=>u.mapSettings,({roll:i})=>{k(i)&&this.rendererService.onRoll(`booth-roll-${t.id}`,n=>{const s=q(n,this.shapeLabel.bounds.rotation),{size:a}=this.canvasRect;return s!==void 0&&(this.shapeLabel=K(this.shapeLabel,s),!this.shapeLabel.hidden&&!this.exh.length&&a.x!==a.y&&(this.canvasRect=J(this.canvasRect,s),this.calculateFontSizeFactors(),o(this.rendererService.scale),h(this.rendererService.scale))),[this.shapeLabel,this.shapeDot]})},{fireImmediately:!0}),this.rendererService.onPtScale(`booth-label-${t.id}`,o),this.rendererService.onPtScale(`booth-dot-${t.id}`,h)}getShape(){return[this.shapeLabel,this.shapeDot]}getShapeDot(){this.shapeDot=Z(this.canvasRect,this.booth.labelColor||z),this.shapeDot.hidden=!0,this.maxZoomDotVisible=Math.min(this.canvasRect.size.x/this.shapeDot.source.width,this.canvasRect.size.y/this.shapeDot.source.height)}createLines(){const e=this.booth,t=[],o=[],h=b&&this.optimizationLevel()>=3?1:3;if(this.exh.length){const i=e.exhibitors.filter(s=>s.order===0),n=e.exhibitors.filter(s=>s.order);if(i.length>0)t.push(...i.map(s=>s.name));else if(p.onlyFeaturedExhibitors)t.push(...e.exhibitors.filter(s=>s.featured).map(s=>s.name));else if(n.length>0){t.push(...n.map(a=>a.name));const s=e.exhibitors.filter(a=>a.order===void 0);s.length>0&&t.push(v("and {{moreCount}} more",{moreCount:s.length}))}else e.exhibitors.length>h?t.push(`${e.exhibitors.length} ${p.exhibitorTermPlural}`):t.push(...e.exhibitors.map(s=>s.name));o.push(e.title||e.name)}else{const i=!!e.exhibitors.length;t.push(e.title||e.name),e.onHold?o.push(v("On Hold")):e.reserved?o.push(v("Reserved")):i||o.push(...e.exhibitors.map(n=>n.name).sort((n,s)=>n>s?1:-1)),e.size&&o.push(e.size.indexOf("/")>-1?e.size.substring(0,e.size.indexOf("/")).trim():e.size),e.price&&e.price!=="0"&&!u.previewMode&&o.push(e.price)}u.rtl&&t.forEach((i,n)=>{(i.endsWith(".")||i.endsWith("!")||i.endsWith("?"))&&(t[n]=t[n]+"\u200F"),se(i)&&(t[n]=t[n]+" ")}),this.lines=[t,o]}calculateFontSizeFactors(){let[e,t]=this.lines;const o=this.canvasRect,h=[],i=[],n=this.prefixes.slice(0,this.exh.length?this.prefixes.length:this.prefixes.length-1),{main:s,details:a}=this.exh.length?getExhibitorLabelWeights():getBoothLabelWeights();for(const{fontSize:l,short:d}of n){const m=l*devicePixelRatio,R=.9*l*devicePixelRatio,f=_(m,s),T=_(R,a),y=p.hideExhibitorBoothNumber||d;let w,A,L,g;if(this.exh.length)d?t=[]:t=this.lines[1],L=Math.max(...e.map(c=>this.measureText(c,f).width),...t.map(c=>this.measureText(c,T).width)),w=Math.max(...e.map(c=>this.exh.length?this.measureText(D(c),f).width:this.measureText(D(c),f).width+3+3),...t.map(c=>this.measureText(D(c),T).width)),g=m*e.length+R*t.length+devicePixelRatio*(e.length+t.length)+3,A=y?g/e.length:null;else{const c=e[0].replace(/[0-9]/g,"3").replace(/[A-Z]/g,"A"),C=4;L=this.measureText(c,f).width+3+3,g=m+C}const H=o.size.x/(w||L),P=o.size.y/(A||g),O=Math.min(H,P);h.push({scaleFactor:O,value:l}),!y&&i.push({scaleFactor:O,value:.9*l})}if(!this.exh.length){const l=h[h.length-1],d=this.prefixes.find(m=>m.name===F);h.push({scaleFactor:l.scaleFactor/1.8,value:d.fontSize}),i.push({scaleFactor:l.scaleFactor/1.8,value:d.fontSize*(b?1:.9)})}this.fontUrls=[getFontUrlByWeight(s,this.rendererService.fontUrls),getFontUrlByWeight(a,this.rendererService.fontUrls)],this.minZoomDotVisible=getMinZoomFactorForDot(h.map(l=>l.scaleFactor)),this.fontSizes=[h,i]}calcArea(e,t){return Math.floor(Math.max(0,e)*Math.max(0,t)/1e3)}optimizationLevel(){return Math.min(p.viewOptimizationLevel?p.viewOptimizationLevel:Math.floor(this.calcArea(this.canvasRect.size.x,this.canvasRect.size.y)/5e3),3)}measureText(e,t){return I.font=t,I.measureText(e)}}
1
+ import{Rect as E}from"@expofp/geometry";import{reaction as W}from"mobx";import{FONT_WEIGHT_PRIMARY_BOOTH as N,FONT_WEIGHT_PRIMARY_EXHIBITOR as U,FONT_WEIGHT_SECONDARY_BOOTH as V,FONT_WEIGHT_SECONDARY_EXHIBITOR as Z}from"../../../../constants";import p from"../../../../data";import{createShapeDot as X,createTextDef as G,createTextDefLines as Y,DEFAULT_FONT_LIGHT_URL as $,DEFAULT_FONT_URL as B,getRollValue as k,getRotation as q,updateLinesScale as j,updateRectRotation as J,updateTextDefRotation as K}from"../../../../renderer";import{boothStore as Q,layersStore as M,uiState as f}from"../../../../store";import{RegularBooth as ee,SpecialBooth as te}from"../../../../store/BoothStore";import L from"../../../../tools/settings";import{t as v}from"../../../../utils/i18n";import ie from"../../../../utils/is-mobile";import se from"../../../../utils/is-webview";import{isArabicText as ne}from"../../../../utils/rtl";import{BoothDrawerBaseWithoutPainter as oe}from"./BoothDrawerBase";import{getFont as _}from"./canvases";import{getLabelBorderInset as re}from"./label-inset.js";let z=L.boothLabelColor;L.EXPO==="tqs2021"&&(z="#000");const x=ie||se,D=r=>r.replace(" ","").substring(0,4).replace(/[0-9]/g,"3").replace(/[A-Z]/gi,"A"),I=document.createElement("canvas").getContext("2d");export default function he(r,e){if(!(!(e instanceof ee)||e.noLabels))return new BoothLabelDrawer(r,e)}export function getMinZoomFactorForDot(r){return Array.isArray(r)&&r.length>0?Math.max(...r.map(e=>e)):typeof r=="number"?r:-0}export const isDirectionsMode=()=>!!(f.selectedRoute?.from&&f.selectedRoute?.to);export function getFontUrlByWeight(r,e=[],t="normal"){return[...e,{weight:500,url:B,style:"normal"},{weight:300,url:$,style:"normal"}].find(i=>+i.weight===r&&i.style===t)?.url||B}function b(r,e){return Number(getComputedStyle(document.body).getPropertyValue(r))||e}export function getBoothLabelWeights(){return{main:b(N,500),details:b(V,300)}}export function getExhibitorLabelWeights(){return{main:b(U,500),details:b(Z,300)}}export function getBadgeFontWeight(){return getExhibitorLabelWeights().details}const F="Details";export class BoothLabelDrawer extends oe{constructor(e,t){if(super(t),this.minZoomDotVisible=0,this.maxZoomDotVisible=0,this.exh=[],this.shapeLabel=void 0,this.shapeDot=void 0,this.fontSizes=[[],[]],this.lines=[[],[]],this.fontUrls=["",""],this.rendererService=e,this.canvasRect=new E(t.rect.center,t.rect.size,t.rotate),this.paddingScaled=[4,4],this.padding=re(t.borderWidth||Q.borderWidth,t.rect.size),this.topLeftAlignment={horizontal:f.rtl?"right":"left",vertical:"top"},this.centerAlignment={horizontal:"center",vertical:"center"},this.prefixes=x?[{fontSize:7,name:"XS",short:!0},{fontSize:10,name:"S",short:!0},{fontSize:16,name:F,short:!1}]:[{fontSize:7,name:"XS",short:!0},{fontSize:10,name:"S",short:!0},{fontSize:12,name:"M",short:!0},{fontSize:14,name:"L",short:!0},{fontSize:18,name:F,short:!1}],t instanceof te)return;this.exh=p.hideExhibitors?[]:p.onlyFeaturedExhibitors?t.exhibitors.filter(i=>i.featured):t.exhibitors,x&&this.optimizationLevel()>=3&&(this.prefixes=this.prefixes.filter(i=>i.name!=="S")),this.createLines(),this.calculateFontSizeFactors(),this.shapeLabel=G(Y(this.lines,this.booth.labelColor||z,0,this.fontUrls),new E(this.booth.rect.center,this.booth.rect.size,this.booth.rotate),[...this.paddingScaled],{horizontal:"left",vertical:"top"}),this.getShapeDot();const o=i=>{const n=this.lines[1]??[],s=this.fontSizes[1]??[];if(L.EXPO!=="wineparis2026"){const m=this.exh.length?this.topLeftAlignment:n.length?i<s[s.length-1].scaleFactor?this.topLeftAlignment:this.centerAlignment:this.topLeftAlignment;this.shapeLabel.alignment=m}if(!j(this.shapeLabel.lines,i,this.fontSizes,this.booth.name))return;const l=this.paddingScaled[0]*i+this.padding,d=this.paddingScaled[1]*i+this.padding;return this.shapeLabel.padding[0]=l,this.shapeLabel.padding[1]=d,this.shapeLabel},h=i=>{const n=i>=this.minZoomDotVisible&&i<=this.maxZoomDotVisible,s=this.shapeDot.source.width*i,a=this.shapeDot.source.height*i;if(!(!n&&this.shapeDot.hidden))return this.shapeDot.bounds.size={x:s,y:a},this.shapeDot.hidden=!n,this.shapeDot};W(()=>[this.booth.skipDim,f.selectedRoute,M.layersLoaded],()=>{if(!M.layersLoaded)return;const i=isDirectionsMode();this.shapeLabel.dim=i||this.booth.skipDim?!1:void 0,this.shapeDot.dim=i||this.booth.skipDim?!1:void 0,this.rendererService.update(this.shapeLabel,this.shapeDot)}),W(()=>f.mapSettings,({roll:i})=>{k(i??0)&&this.rendererService.onRoll(`booth-roll-${t.id}`,n=>{const s=q(n,this.shapeLabel.bounds.rotation),{size:a}=this.canvasRect;return s!==void 0&&(this.shapeLabel=K(this.shapeLabel,s),!this.shapeLabel.hidden&&!this.exh.length&&a.x!==a.y&&(this.canvasRect=J(this.canvasRect,s),this.calculateFontSizeFactors(),o(this.rendererService.scale),h(this.rendererService.scale))),[this.shapeLabel,this.shapeDot]})},{fireImmediately:!0}),this.rendererService.onPtScale(`booth-label-${t.id}`,o),this.rendererService.onPtScale(`booth-dot-${t.id}`,h)}getShape(){return[this.shapeLabel,this.shapeDot]}getShapeDot(){this.shapeDot=X(this.canvasRect,this.booth.labelColor||z),this.shapeDot.hidden=!0,this.maxZoomDotVisible=Math.min(this.canvasRect.size.x/this.shapeDot.source.width,this.canvasRect.size.y/this.shapeDot.source.height)}createLines(){const e=this.booth,t=[],o=[],h=x&&this.optimizationLevel()>=3?1:3;if(this.exh.length){const i=e.exhibitors.filter(s=>s.order===0),n=e.exhibitors.filter(s=>s.order);if(i.length>0)t.push(...i.map(s=>s.name));else if(p.onlyFeaturedExhibitors)t.push(...e.exhibitors.filter(s=>s.featured).map(s=>s.name));else if(n.length>0){t.push(...n.map(a=>a.name));const s=e.exhibitors.filter(a=>a.order===void 0);s.length>0&&t.push(v("and {{moreCount}} more",{moreCount:s.length}))}else e.exhibitors.length>h?t.push(`${e.exhibitors.length} ${p.exhibitorTermPlural}`):t.push(...e.exhibitors.map(s=>s.name));o.push(e.title||e.name)}else{const i=!!e.exhibitors.length;t.push(e.title||e.name),e.onHold?o.push(v("On Hold")):e.reserved?o.push(v("Reserved")):i||o.push(...e.exhibitors.map(n=>n.name).sort((n,s)=>n>s?1:-1)),e.size&&o.push(e.size.indexOf("/")>-1?e.size.substring(0,e.size.indexOf("/")).trim():e.size),e.price&&e.price!=="0"&&!f.previewMode&&o.push(e.price)}f.rtl&&t.forEach((i,n)=>{(i.endsWith(".")||i.endsWith("!")||i.endsWith("?"))&&(t[n]=t[n]+"\u200F"),ne(i)&&(t[n]=t[n]+" ")}),this.lines=[t,o]}calculateFontSizeFactors(){const e=this.lines[0];let t;const o=this.canvasRect,h=[],i=[],n=this.prefixes.slice(0,this.exh.length?this.prefixes.length:this.prefixes.length-1),{main:s,details:a}=this.exh.length?getExhibitorLabelWeights():getBoothLabelWeights();for(const{fontSize:l,short:d}of n){const m=l*devicePixelRatio,R=.9*l*devicePixelRatio,u=_(m,s),T=_(R,a),y=p.hideExhibitorBoothNumber||d;let w,A,S,g;if(this.exh.length)t=d?[]:this.lines[1],S=Math.max(...e.map(c=>this.measureText(c,u).width),...t.map(c=>this.measureText(c,T).width)),w=Math.max(...e.map(c=>this.exh.length?this.measureText(D(c),u).width:this.measureText(D(c),u).width+3+3),...t.map(c=>this.measureText(D(c),T).width)),g=m*e.length+R*t.length+devicePixelRatio*(e.length+t.length)+3,A=y?g/e.length:null;else{const c=e[0].replace(/[0-9]/g,"3").replace(/[A-Z]/g,"A"),C=4;S=this.measureText(c,u).width+3+3,g=m+C}const H=o.size.x/(w||S),P=o.size.y/(A||g),O=Math.min(H,P);h.push({scaleFactor:O,value:l,lines:[]}),y||i.push({scaleFactor:O,value:.9*l,lines:[]})}if(!this.exh.length){const l=h[h.length-1],d=this.prefixes.find(m=>m.name===F);d&&(h.push({scaleFactor:l.scaleFactor/1.8,value:d.fontSize,lines:[]}),i.push({scaleFactor:l.scaleFactor/1.8,value:d.fontSize*(x?1:.9),lines:[]}))}this.fontUrls=[getFontUrlByWeight(s,this.rendererService.fontUrls),getFontUrlByWeight(a,this.rendererService.fontUrls)],this.minZoomDotVisible=getMinZoomFactorForDot(h.map(l=>l.scaleFactor)),this.fontSizes=[h,i]}calcArea(e,t){return Math.floor(Math.max(0,e)*Math.max(0,t)/1e3)}optimizationLevel(){return Math.min(p.viewOptimizationLevel?p.viewOptimizationLevel:Math.floor(this.calcArea(this.canvasRect.size.x,this.canvasRect.size.y)/5e3),3)}measureText(e,t){return I.font=t,I.measureText(e)}}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Geometry shared by the booth label drawers for holding label text clear of
3
+ * the booth border.
4
+ */
5
+ /** Margin held around a booth label, as a share of each rect dimension. */
6
+ export declare const LABEL_MARGIN_FRACTION = 0.05;
7
+ /**
8
+ * How far a label box is pulled in from the booth footprint to clear the drawn
9
+ * border — half the stroke, since the border straddles the footprint edge.
10
+ *
11
+ * Capped at the margin and floored at zero: a plan can publish a
12
+ * `boothBorderWidth` far larger than the strokes it actually draws, and an
13
+ * uncapped inset then deflates the label box to nothing, so no font size fits
14
+ * and the label never renders at all. NaN and negative widths reach here too —
15
+ * an unparsable `stroke-width`, or the empty-booths `0 / 0` in
16
+ * `boothStore.borderWidth` — and fall out to zero rather than poisoning the box.
17
+ *
18
+ * @param borderWidth - stroke width actually painted for the booth
19
+ * @param size - the booth footprint
20
+ * @returns a non-negative inset, at most `LABEL_MARGIN_FRACTION` of the short side
21
+ */
22
+ export declare function getLabelBorderInset(borderWidth: number, size: {
23
+ width: number;
24
+ height: number;
25
+ }): number;
26
+ //# sourceMappingURL=label-inset.d.ts.map
@@ -0,0 +1 @@
1
+ export const LABEL_MARGIN_FRACTION=.05;export function getLabelBorderInset(t,n){const e=.05*Math.min(n.width,n.height);return t>0&&e>0?Math.min(t/2,e):0}
@@ -3,6 +3,16 @@ import { type Camera, type ListPanel, type PlannerOptions } from '@expofp/schema
3
3
  import { type InternalSettings } from './internal-settings.js';
4
4
  import type { CurrentPosition, Floor, FloorPlan, FloorPlanBookmarkClickEvent, FloorPlanBoothClickEvent, FloorPlanCategory, FloorPlanCustomButtonEvent, FloorPlanDetailsEvent, FloorPlanDirectionEvent, FloorPlanGetCoordsEvent, FloorPlanIcon, FloorPlanMarkerEvent, FloorPlanOptions, FloorPlanVisitedClickEvent, GeoConfig, MaplibreOptions, MarkersData, RouteInfo, RouteWaypoint, Visibility } from './types';
5
5
  import { type Bounds, type POISelectors } from './types/sdk.types';
6
+ /**
7
+ * A host element carries the plan occupying it, so a second `load()` into the
8
+ * same container can be refused and {@link FloorPlan.destroy} can hand the
9
+ * element back by clearing the mark.
10
+ */
11
+ export type FloorPlanHostElement = HTMLDivElement & {
12
+ __expofp?: FloorPlan;
13
+ };
14
+ /** Rejection reason for {@link FloorPlan.ready} when the plan is destroyed mid-load. */
15
+ export declare const DESTROYED_BEFORE_READY = "FloorPlan destroyed before it finished loading";
6
16
  export default class FloorPlanLoader implements FloorPlan {
7
17
  protected readonly renderTarget: HTMLDivElement;
8
18
  private readonly _ready;
@@ -19,9 +29,13 @@ export default class FloorPlanLoader implements FloorPlan {
19
29
  /** Called with an event by the `__efpStyleLoad` listener, and bare to drain the registry on construction. */
20
30
  protected efpStyleLoadHandler: (e?: Event) => void;
21
31
  protected resolveReady: () => void;
32
+ /** Counterpart of {@link resolveReady}, called by {@link destroy}; same assignment caveat. */
33
+ protected rejectReady: (reason: Error) => void;
22
34
  readonly icons: Map<FloorPlanIcon, HTMLImageElement>;
23
35
  enableRotation: boolean;
24
36
  alwaysShowSidebar: boolean;
37
+ /** Set by {@link destroy}; checked by `init()` so a plan destroyed mid-load never mounts. */
38
+ protected destroyed: boolean;
25
39
  get ready(): Promise<void>;
26
40
  get previewMode(): boolean;
27
41
  /** @deprecated The consent decision lives on the config — set the `consent` option instead. */
@@ -91,7 +105,23 @@ export default class FloorPlanLoader implements FloorPlan {
91
105
  getBoothRect(name: string): any;
92
106
  convertToGeo(x: number, y: number): any;
93
107
  getGeoConfig(): GeoConfig | null;
108
+ /**
109
+ * Raises the `destroyed` flag — which the pending `init()` checks before it
110
+ * mounts anything — settles {@link ready}, then hands the state-specific
111
+ * teardown to {@link releaseResources}. The guard lives here so both states
112
+ * are idempotent through one implementation.
113
+ */
114
+ destroy(): void;
115
+ /** @deprecated Renamed to {@link destroy}. */
94
116
  unstable_destroy(): void;
117
+ /**
118
+ * Undoes the constructor's side effects — the teardown for a plan destroyed
119
+ * while still loading, where there is no mounted UI yet.
120
+ *
121
+ * `FloorPlanReady` overrides this to unwind the mounted plan first, then
122
+ * calls back here through `super`.
123
+ */
124
+ protected releaseResources(): void;
95
125
  highlightExhibitors(externalIds: string[]): void;
96
126
  highlightBooths(externalIds: string[]): void;
97
127
  onCurrentPositionChanged(point: CurrentPosition): void;
@@ -1 +1 @@
1
- import{getConfig as b}from"@expofp/config";import{PREVIEW_MODE_ATTRIBUTE as j}from"./constants";import{toInternalSettings as D}from"./internal-settings.js";import d from"./tools/base-runtime-url";import{loadCss as x,loadFont as f}from"./tools/loaders";import R from"./tools/logger";import{initSentry as F}from"./tools/sentry";import{heatmapEnabled as A}from"./utils/heatmap-enabled";import{initI18n as V}from"./utils/i18n";import z from"./utils/is-debug";import H from"./utils/is-localhost";import _ from"./utils/is-webview";import{loadCustomCss as G}from"./utils/loadCustomCss";import{loadIcons as N}from"./utils/loadIcons";import I from"./utils/use-shadow";function e(){throw new Error("FloorPlan not ready")}export default class Q{get ready(){return this._ready}get previewMode(){return b().previewMode||this.element.hasAttribute(j)}get allowConsent(){return this.consent==="ask"?void 0:this.consent==="granted"}getInternalSettings(){return D(b())}selectBooth(t){e()}selectExhibitor(t){e()}selectRoute(t,i){e()}getOptimizedRoutes(t){e()}selectCurrentPosition(t,i,s){e()}setBookmarks(t){e()}setEntitiesBookmarks(t){e()}setEntitiesVisited(t){e()}setMarkers(t){e()}updateLayerVisibility(t,i){e()}getCenterCoordinates(){e()}applyParameters(t){e()}exhibitorsList(){e()}boothsList(){e()}categoriesList(){e()}selectCategory(t){e()}select(t){e()}showList(t){e()}selectTour(t){e()}openPlanner(t){e()}startBuildRoute(){e()}getVisibility(){e()}setVisibility(t){e()}findLocation(){e()}zoomIn(){e()}zoomOut(){e()}zoomTo(t,i){e()}switchView(){e()}setCamera(t){e()}getCamera(){e()}fitBounds(){e()}getBounds(t){e()}getBoothRect(t){e()}convertToGeo(t,i){e()}getGeoConfig(){e()}unstable_destroy(){e()}highlightExhibitors(t){e()}highlightBooths(t){e()}onCurrentPositionChanged(t){e()}search(t){e()}getFloors(){e()}onFloorActivated(t){e()}activateFloor(t){e()}showPathway(t,i){e()}showPathwayOnly(t,i){e()}hidePathways(){e()}showSearch(){e()}changeLanguage(t){e()}isGpsTrackingEnabled(){e()}setGpsTrackingEnabled(t){e()}deselectCurrentPosition(){e()}deselectRoute(){e()}reset(){e()}selectAccessibleRoute(t){e()}constructor(t,i){this.resolveReady=()=>{},this.icons=new Map,this.enableRotation=!0,this.alwaysShowSidebar=!1;const s=b();this.noOverlay=!!s.noOverlay,this.offHistory=!!s.offHistory,this.ignoreQuery=s.ignoreQuery,this.consent=s.consent,this.consent==="ask"&&(_?this.consent="granted":H&&!z&&(this.consent="denied")),this.onBoothClick=t.onBoothClick,this.onBookmarkClick=t.onBookmarkClick,this.onVisitedClick=t.onVisitedClick,this.onCategoryClick=t.onCategoryClick,this.onDetails=t.onDetails,this.onExhibitorCustomButtonClick=t.onExhibitorCustomButtonClick,this.onGetCoordsClick=t.onGetCoordsClick,this.onMarkerClick=t.onMarkerClick,this.onFpConfigured=t.onFpConfigured,this.onDirection=t.onDirection,this.onInit=t.onInit,this.onCurrentPositionChanged=t.onCurrentPositionChanged,this.onFloorActivated=t.onFloorActivated,this.onLeaveEvent=t.onLeaveEvent,this.viewerMode=!!s.viewerMode,this.disableRuntimeAlerts=s.disableRuntimeAlerts,this.maplibre=s.maplibre,window.__efpMaplibre=s.maplibre,this._ready=new Promise((c,r)=>{this.resolveReady=c}),this.element=i;const E=i;if(E.__expofp)throw new Error("Element already in use");E.__expofp=this;const g=s.expo;F({eventId:g||"",isWebview:_}),this.eventId=g,window.__efpEvent=g,window.__efpElement=i;const m=document.createElement("div");m.style.height="100%",m.style.width="100%",i.appendChild(m);let n;if(I){n=m.attachShadow({mode:"open"});const c=n,r=document;c.createElement=(...a)=>r.createElement(...a),c.createElementNS=(...a)=>r.createElementNS(...a),c.createTextNode=(...a)=>r.createTextNode(...a)}else n=m;const w=document.createElement("div");w.style.height="100%",w.style.width="100%",n.appendChild(w),I&&Object.defineProperty(w,"ownerDocument",{value:n}),window.__efpShadowDOMStyleParent=I?n:void 0,this.renderTarget=w,R.log("Instantiating ExpoFP floorplan",i,g);let k=0;this.efpStyleLoadHandler=function(c){const r=window.__efpStyleElements??[];for(;k<r.length;){const a=r[k];n.appendChild(a),k++}},window.addEventListener("__efpStyleLoad",this.efpStyleLoadHandler),this.efpStyleLoadHandler();const y=this;(async function(){const r=b();await V();const a=new URLSearchParams(window.location.search);let h,p;if(r?.trackerUrl)try{h=new URL(r.trackerUrl),p=h.searchParams.get("expoId")}catch(o){console.error(o)}const P=async o=>{if(!h||!p)return Promise.reject(new Error("trackerUrl or expoId is missing"));const l=new URL(o.dataUrl,h.origin),u=await fetch(l.toString(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({expoId:p,token:decodeURIComponent(a.get("t")??"")})});let C=[];u.ok&&(C=(await u.json()).map(o.dataMapper)),window.__heatmapDataYah={yah:C}},v=r?.heatmap??{},O=A(v)||a.get("heatmap")==="true",L=v.variant==="yah"||a.get("type")==="yah",U=v.kiosk===!0||a.get("subtype")==="kiosk";if(O)try{if(L)U?await P({dataUrl:"/api/kiosks/list/viewer",dataMapper:o=>({...o,id:o.key,name:`Kiosk ${o.key}`})}):await P({dataUrl:"/api/v1/you-are-here/qr-code/list/viewer",dataMapper:(o,l)=>({...o,name:`QR Code #${l+1}`})});else{if(!h||!p)throw new Error("trackerUrl or expoId is missing");const o=new URL("/api/fp-stats/get",h.origin);o.searchParams.set("expoId",p),o.searchParams.set("type","booview"),o.searchParams.set("t",decodeURIComponent(a.get("t")??""));const l=new URL("api/fp-stats/get",h.origin);l.searchParams.set("expoId",p),l.searchParams.set("type","exview"),l.searchParams.set("t",decodeURIComponent(a.get("t")??""));const[u,C]=await Promise.all([fetch(o.toString()),fetch(l.toString())]),[S,T]=await Promise.all([u.json(),C.json()]);window.__heatmapData={booths:S,exhibitors:T}}}catch(o){console.error("Heatmap: Initialization error",o)}const B=[x(d+"vendor/sanitize-css/sanitize.css",n),x(d+"vendor/perfect-scrollbar/css/perfect-scrollbar.css",n),f("Oswald",d+"fonts/oswald-v17-cyrillic_latin-300.woff",{weight:300}),f("Oswald",d+"fonts/oswald-v17-cyrillic_latin-500.woff",{weight:500}),f("Inter",d+"fonts/inter-400.woff2",{weight:400}),f("Inter",d+"fonts/inter-500.woff2",{weight:500}),f("Inter",d+"fonts/inter-600.woff2",{weight:600}),f("efp-symbols",d+"fonts/efp-symbols.woff",{weight:400}),G(r,n),N(y.icons)];await Promise.all(B),y.enableRotation=r?.enableRotation??!1,y.alwaysShowSidebar=r?.alwaysShowSidebar??!1,R.log("Data loaded"),window.__storeInitAllowed=!0;const{default:M}=await import("./floorplan.ready");for(document.querySelectorAll(".expofp-floorplan-loader").forEach(o=>o.remove());i.firstChild&&i.firstChild!==m;)i.removeChild(i.firstChild);Object.setPrototypeOf(y,M.prototype).init()})()}}
1
+ import{getConfig as b}from"@expofp/config";import{PREVIEW_MODE_ATTRIBUTE as F}from"./constants";import{toInternalSettings as M}from"./internal-settings.js";import d from"./tools/base-runtime-url";import{loadCss as P,loadFont as w}from"./tools/loaders";import S from"./tools/logger";import{resetGlobalVariables as T}from"./tools/reset";import{initSentry as A}from"./tools/sentry";import{heatmapEnabled as V}from"./utils/heatmap-enabled";import{initI18n as H}from"./utils/i18n";import z from"./utils/is-debug";import G from"./utils/is-localhost";import x from"./utils/is-webview";import{loadCustomCss as N}from"./utils/loadCustomCss";import{loadIcons as Y}from"./utils/loadIcons";import E from"./utils/use-shadow";function e(){throw new Error("FloorPlan not ready")}export const DESTROYED_BEFORE_READY="FloorPlan destroyed before it finished loading";export default class Q{get ready(){return this._ready}get previewMode(){return b().previewMode||this.element.hasAttribute(F)}get allowConsent(){return this.consent==="ask"?void 0:this.consent==="granted"}getInternalSettings(){return M(b())}selectBooth(t){e()}selectExhibitor(t){e()}selectRoute(t,i){e()}getOptimizedRoutes(t){e()}selectCurrentPosition(t,i,a){e()}setBookmarks(t){e()}setEntitiesBookmarks(t){e()}setEntitiesVisited(t){e()}setMarkers(t){e()}updateLayerVisibility(t,i){e()}getCenterCoordinates(){e()}applyParameters(t){e()}exhibitorsList(){e()}boothsList(){e()}categoriesList(){e()}selectCategory(t){e()}select(t){e()}showList(t){e()}selectTour(t){e()}openPlanner(t){e()}startBuildRoute(){e()}getVisibility(){e()}setVisibility(t){e()}findLocation(){e()}zoomIn(){e()}zoomOut(){e()}zoomTo(t,i){e()}switchView(){e()}setCamera(t){e()}getCamera(){e()}fitBounds(){e()}getBounds(t){e()}getBoothRect(t){e()}convertToGeo(t,i){e()}getGeoConfig(){e()}destroy(){this.destroyed||(this.destroyed=!0,this.rejectReady(new Error(DESTROYED_BEFORE_READY)),this.releaseResources())}unstable_destroy(){this.destroy()}releaseResources(){for(window.removeEventListener("__efpStyleLoad",this.efpStyleLoadHandler);this.element.firstChild;)this.element.removeChild(this.element.firstChild);delete this.element.__expofp,T()}highlightExhibitors(t){e()}highlightBooths(t){e()}onCurrentPositionChanged(t){e()}search(t){e()}getFloors(){e()}onFloorActivated(t){e()}activateFloor(t){e()}showPathway(t,i){e()}showPathwayOnly(t,i){e()}hidePathways(){e()}showSearch(){e()}changeLanguage(t){e()}isGpsTrackingEnabled(){e()}setGpsTrackingEnabled(t){e()}deselectCurrentPosition(){e()}deselectRoute(){e()}reset(){e()}selectAccessibleRoute(t){e()}constructor(t,i){this.resolveReady=()=>{},this.rejectReady=()=>{},this.icons=new Map,this.enableRotation=!0,this.alwaysShowSidebar=!1,this.destroyed=!1;const a=b();this.noOverlay=!!a.noOverlay,this.offHistory=!!a.offHistory,this.ignoreQuery=a.ignoreQuery,this.consent=a.consent,this.consent==="ask"&&(x?this.consent="granted":G&&!z&&(this.consent="denied")),this.onBoothClick=t.onBoothClick,this.onBookmarkClick=t.onBookmarkClick,this.onVisitedClick=t.onVisitedClick,this.onCategoryClick=t.onCategoryClick,this.onDetails=t.onDetails,this.onExhibitorCustomButtonClick=t.onExhibitorCustomButtonClick,this.onGetCoordsClick=t.onGetCoordsClick,this.onMarkerClick=t.onMarkerClick,this.onFpConfigured=t.onFpConfigured,this.onDirection=t.onDirection,this.onInit=t.onInit,this.onCurrentPositionChanged=t.onCurrentPositionChanged,this.onFloorActivated=t.onFloorActivated,this.onLeaveEvent=t.onLeaveEvent,this.viewerMode=!!a.viewerMode,this.disableRuntimeAlerts=a.disableRuntimeAlerts,this.maplibre=a.maplibre,window.__efpMaplibre=a.maplibre,this._ready=new Promise((c,r)=>{this.resolveReady=c,this.rejectReady=r}),this._ready.catch(()=>{}),this.element=i;const I=i;if(I.__expofp)throw new Error("Element already in use");I.__expofp=this;const g=a.expo;A({eventId:g||"",isWebview:x}),this.eventId=g,window.__efpEvent=g,window.__efpElement=i;const m=document.createElement("div");m.style.height="100%",m.style.width="100%",i.appendChild(m);let n;if(E){n=m.attachShadow({mode:"open"});const c=n,r=document;c.createElement=(...s)=>r.createElement(...s),c.createElementNS=(...s)=>r.createElementNS(...s),c.createTextNode=(...s)=>r.createTextNode(...s)}else n=m;const y=document.createElement("div");y.style.height="100%",y.style.width="100%",n.appendChild(y),E&&Object.defineProperty(y,"ownerDocument",{value:n}),window.__efpShadowDOMStyleParent=E?n:void 0,this.renderTarget=y,S.log("Instantiating ExpoFP floorplan",i,g);let k=0;this.efpStyleLoadHandler=function(c){const r=window.__efpStyleElements??[];for(;k<r.length;){const s=r[k];n.appendChild(s),k++}},window.addEventListener("__efpStyleLoad",this.efpStyleLoadHandler),this.efpStyleLoadHandler();const h=this;(async function(){const r=b();if(await H(),h.destroyed)return;const s=new URLSearchParams(window.location.search);let f,p;if(r?.trackerUrl)try{f=new URL(r.trackerUrl),p=f.searchParams.get("expoId")}catch(o){console.error(o)}const R=async o=>{if(!f||!p)return Promise.reject(new Error("trackerUrl or expoId is missing"));const l=new URL(o.dataUrl,f.origin),u=await fetch(l.toString(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({expoId:p,token:decodeURIComponent(s.get("t")??"")})});let C=[];u.ok&&(C=(await u.json()).map(o.dataMapper)),window.__heatmapDataYah={yah:C}},v=r?.heatmap??{},L=V(v)||s.get("heatmap")==="true",O=v.variant==="yah"||s.get("type")==="yah",U=v.kiosk===!0||s.get("subtype")==="kiosk";if(L)try{if(O)U?await R({dataUrl:"/api/kiosks/list/viewer",dataMapper:o=>({...o,id:o.key,name:`Kiosk ${o.key}`})}):await R({dataUrl:"/api/v1/you-are-here/qr-code/list/viewer",dataMapper:(o,l)=>({...o,name:`QR Code #${l+1}`})});else{if(!f||!p)throw new Error("trackerUrl or expoId is missing");const o=new URL("/api/fp-stats/get",f.origin);o.searchParams.set("expoId",p),o.searchParams.set("type","booview"),o.searchParams.set("t",decodeURIComponent(s.get("t")??""));const l=new URL("api/fp-stats/get",f.origin);l.searchParams.set("expoId",p),l.searchParams.set("type","exview"),l.searchParams.set("t",decodeURIComponent(s.get("t")??""));const[u,C]=await Promise.all([fetch(o.toString()),fetch(l.toString())]),[_,j]=await Promise.all([u.json(),C.json()]);window.__heatmapData={booths:_,exhibitors:j}}}catch(o){console.error("Heatmap: Initialization error",o)}const B=[P(d+"vendor/sanitize-css/sanitize.css",n),P(d+"vendor/perfect-scrollbar/css/perfect-scrollbar.css",n),w("Oswald",d+"fonts/oswald-v17-cyrillic_latin-300.woff",{weight:300}),w("Oswald",d+"fonts/oswald-v17-cyrillic_latin-500.woff",{weight:500}),w("Inter",d+"fonts/inter-400.woff2",{weight:400}),w("Inter",d+"fonts/inter-500.woff2",{weight:500}),w("Inter",d+"fonts/inter-600.woff2",{weight:600}),w("efp-symbols",d+"fonts/efp-symbols.woff",{weight:400}),N(r,n),Y(h.icons)];if(await Promise.all(B),h.destroyed)return;h.enableRotation=r?.enableRotation??!1,h.alwaysShowSidebar=r?.alwaysShowSidebar??!1,S.log("Data loaded"),window.__storeInitAllowed=!0;const{default:D}=await import("./floorplan.ready");for(document.querySelectorAll(".expofp-floorplan-loader").forEach(o=>o.remove());i.firstChild&&i.firstChild!==m;)i.removeChild(i.firstChild);if(h.destroyed)return;Object.setPrototypeOf(h,D.prototype).init()})()}}
@@ -73,7 +73,7 @@ export default class FloorPlanReady extends FloorPlanLoader {
73
73
  getBoothRect(name: string): BoothRect;
74
74
  convertToGeo(x: number, y: number): [number, number] | never;
75
75
  getGeoConfig(): GeoConfig | null;
76
- unstable_destroy(): void;
76
+ protected releaseResources(): void;
77
77
  search(term: string): Promise<{
78
78
  item: unknown;
79
79
  score: number;
@@ -1 +1 @@
1
- import{Fragment as A,jsx as x,jsxs as T}from"react/jsx-runtime";import{Box as E}from"@expofp/geometry";import{CameraSchema as I}from"@expofp/schema";import{optimizeWaypointOrder as M}from"@expofp/wayfinding";import{ErrorBoundary as R}from"@sentry/react";import $ from"debug";import{reaction as V}from"mobx";import{createRoot as z}from"react-dom/client";import{install as j}from"resize-observer";import G from"./components/Layout";import{MAX_ROUTE_WAYPOINTS as d}from"./constants";import N from"./data";import{fpGeo as b}from"./data/fpGeo";import q from"./floorplan.loader";import{shouldLoadIntercom as O}from"./intercom";import{BoundsSchema as U,POISelectorsSchema as w,ZoomToOptionsSchema as P}from"./schemas/sdk.schemas";import{applyDeclarativeConfig as H,applyParameters as Y,applyPathway as _,initUrlRouting as D}from"./services/url-dispatch";import{destroyUrlSync as W}from"./services/url-sync";import r from"./store";import{bindRootElement as X,destroyUiHandlers as K}from"./store/init/init-ui";import{findBooth as S,Route as v,separateExternalIds as B}from"./store/RouteStore";import{destroyGtag as Q,GaEventActions as k,sendEventToGa as F,setConsentSettings as Z}from"./tools/gtag";import J from"./tools/report-error";import{resetGlobalVariables as ee}from"./tools/reset";import te from"./tools/track-event";import{cameraToMapSettings as re,mapSettingsToCamera as oe}from"./utils/camera-map-settings";import{getStorage as L}from"./utils/entity-storage";import{getMostFrequent as ie}from"./utils/getMostFrequent";import{convertLocalToGps as se,isValidPointCoords as y}from"./utils/gps";import{getLocales as ne,hasLocale as ae,setLocale as he}from"./utils/i18n";import{mapEntity as g}from"./utils/mapEntity";const p=$("efp:api");j();export default class ce extends q{init(){H(),this.ignoreQuery||D(this.offHistory),te("load"),X(r),r.fp=this,Z(this.consent),F(k.Load,""),this.root=z(this.renderTarget),this.root.render(x(R,{children:x(G,{offHistory:this.offHistory,consent:this.consent})})),F(k.Rendered,""),V(()=>r.layerStore.layersLoaded,()=>{this.resolveReady(),r.initialized||this.onInit?.(this),r.initialized=!0});const e=O(N);e&&import("./intercom/bootIntercom").then(({bootIntercom:t})=>t(e)).catch(()=>{})}selectBooth(e){if(typeof e!="string"&&!Array.isArray(e)){a("selectBooth","Parameter must be a string or an array of strings.","EFP000000");return}const t=r.boothStore.booths.filter(o=>typeof e=="string"?o.name===e||o.externalId===e:e.includes(o.name)||e.includes(o.externalId));r.selectBooth(t)}selectExhibitor(e){if(typeof e!="string"&&!Array.isArray(e)){a("selectExhibitor","Parameter must be a string or an array of strings.","EFP000100");return}if(!e?.length){r.uiState.menu=!1,r.searchStore.resetSearchBox(),r.uiState.details=null;return}const t=r.exhibitorStore.exhibitors.filter(s=>typeof e=="string"?s.name===e||s.externalId===e:e.includes(s.name)||e.includes(s.externalId));if(!t?.length)return;if(typeof e=="string"){r.selectExhibitor(t[0]),r.moveToList([t[0]]);return}const o=t.flatMap(s=>s.booths.map(i=>i.layer)),n=ie(o.map(s=>s.description));n&&r.layerStore.updateVisibility(n,!0),r.uiState.menu=!1,r.searchStore.resetSearchBox(),r.uiState.details=null,r.uiState.list={type:"filter",items:t,query:{key:"exhibitors",value:t.map(s=>s.name).join(",")}},r.moveToList()}highlightExhibitors(e){Array.isArray(e)||a("highlightExhibitors","Parameter must be an array of strings.","EFP000200"),r.boothStore.highlightedByExternalIds=[],r.exhibitorStore.highlightedByExternalIds=[...e]}highlightBooths(e){Array.isArray(e)||a("highlightBooths","Parameter must be an array of strings.","EFP000300"),r.exhibitorStore.highlightedByExternalIds=[],r.boothStore.highlightedByExternalIds=[...e]}highlightEntities(e){Array.isArray(e)||a("highlightEntities","Parameter must be an array of strings.","EFP000400");const{boothExternalIds:t,exhibitorExternalIds:o}=B(e);r.boothStore.highlightedByExternalIds=[...t],r.exhibitorStore.highlightedByExternalIds=[...o]}selectRoute(e,t){if(Array.isArray(e)){let o=[...e];const n=o.shift(),s=o.pop();if(o.length>d)throw new Error(`The maximum number of waypoints is ${d}.`);if(!n||!s){a("selectRoute","Invalid route format: When providing an array, it must include at least two points: a start and a destination.","EFP000401");return}r.routeStore.selectRoute(new v(m(n),m(s),o.map(m)));return}e||a("selectRoute","At a minimum, the starting point must be passed.","EFP000402"),r.routeStore.selectRoute(new v(m(e),m(t)))}getOptimizedRoutes(e){if(!Array.isArray(e))return a("getOptimizedRoutes","Parameter must be an array.","EFP000500"),[];if(e.length>d)throw new Error(`The maximum number of waypoints is ${d}.`);const t=e.map(m).filter(n=>!!n);if(!t.length)throw new Error("No booths found for the provided waypoints.");const o=new Map;for(const n of t){const s=n.layer?.name??"",i=o.get(s);i?i.push(n):o.set(s,[n])}return Array.from(o.values()).map(n=>({waypoints:M(n.map(s=>[s.name,{x:s.rect.center.x,y:s.rect.center.y}]))}))}selectCurrentPosition(e,t,o){const n=y(e.x)&&y(e.y),s=y(e.lng)&&y(e.lat);!n&&!s&&a("selectCurrentPosition","A point must be passed. Either (x,y) or (lat,lng) are required.","EFP000600"),r.routeStore.selectCurrentPosition(e,t,o),this.onCurrentPositionChanged?.(e)}setBookmarks(e){(!Array.isArray(e)||!e.length)&&a("setBookmarks","Parameter must be an array.","EFP000700"),e.forEach(t=>{const o=r.exhibitorStore.exhibitors.find(n=>n.name===t.name||n.externalId===t.externalId);o&&(o.bookmarked=t.bookmarked)})}setEntitiesBookmarks(e){if(!Array.isArray(e)||!e.length){a("setEntitiesBookmarks","Parameter must be an array.","EFP000701");return}const t=["exhibitor","event","speaker","booth"],o=e.find(i=>!i.type||!t.includes(i.type));if(o){a("setEntitiesBookmarks",`Invalid entity type: ${o.type}. Must be one of: ${t.join(", ")}.`,"EFP000702");return}const n=L("bookmarked"),s={exhibitor:{existingIds:new Set(n.exhibitors||[]),finder:i=>r.exhibitorStore.findExhibitor(i),replacer:i=>r.exhibitorStore.replaceBookmarked(i)},event:{existingIds:new Set(n.events||[]),finder:i=>r.eventStore.findByNameOrSlug(i),replacer:i=>r.eventStore.replaceBookmarked(i)},speaker:{existingIds:new Set(n.speakers||[]),finder:i=>r.speakerStore.speakers.find(h=>h.name===i||h.externalId===i||h.slug===i),replacer:i=>r.speakerStore.replaceBookmarked(i)},booth:{existingIds:new Set(n.booths||[]),finder:i=>{const h=r.boothStore.findBooth(i);return h?.exhibitors.length===0?h:void 0},replacer:i=>r.boothStore.replaceBookmarked(i)}};e.forEach(i=>{const h=s[i.type],u=i.name||i.externalId||"",c=h.finder(u);c?i.bookmarked?h.existingIds.add(c.id):h.existingIds.delete(c.id):console.warn(`Entity not found: ${i.type} with query "${u}"`)}),Object.values(s).forEach(i=>{i.replacer(Array.from(i.existingIds))})}setEntitiesVisited(e){if(!Array.isArray(e)||!e.length){a("setEntitiesVisited","Parameter must be an array.","EFP000703");return}const t=["exhibitor","event"],o=e.find(i=>!i.type||!t.includes(i.type));if(o){a("setEntitiesVisited",`Invalid entity type: ${o.type}. Must be one of: ${t.join(", ")}.`,"EFP000704");return}const n=L("visited"),s={exhibitor:{existingIds:new Set(n.exhibitors||[]),finder:i=>r.exhibitorStore.findExhibitor(i),replacer:i=>r.exhibitorStore.replaceVisited(i)},event:{existingIds:new Set(n.events||[]),finder:i=>r.eventStore.findByNameOrSlug(i),replacer:i=>r.eventStore.replaceVisited(i)}};e.forEach(i=>{const h=s[i.type],u=i.name||i.externalId||"",c=h.finder(u);c?i.visited?h.existingIds.add(c.id):h.existingIds.delete(c.id):console.warn(`Entity not found: ${i.type} with query "${u}"`)}),Object.values(s).forEach(i=>{i.replacer(Array.from(i.existingIds))})}setMarkers(e){if(!e||!Array.isArray(e.icons)||!Array.isArray(e.markers)){a("setMarkers","Invalid input.","EFP000800");return}r.routeStore.setMarkers(e)}selectMarker(e,t=!0){return typeof e!="string"&&a("selectMarker","The identifier must be passed.","EFP000900"),r.routeStore.selectMarker(e,t)}drawCircles(e){Array.isArray(e)||a("drawCircles","Invalid input.","EFP000A00"),r.uiState.debugCircles=e}checkRoutes(){r.routeStore.checkRoutes()}updateLayerVisibility(e,t){typeof e!="string"&&a("updateLayerVisibility","The layer name (string) must be passed.","EFP000B00"),t||a("updateLayerVisibility","Passing a false value to visible will have no effect.","EFP000B01"),r.layerStore.updateVisibility(e,t)}getCenterCoordinates(){return r.fp.getCenterCoordinates()}exhibitorsList(){return r.exhibitorStore.exhibitors.map(e=>g(e))}boothsList(){return r.boothStore.booths.map(e=>g(e))}categoriesList(){return r.categoryStore.categories.map(e=>g(e))}selectCategory(e){if(e==null||typeof e!="string"){r.searchStore.selectSearch();return}const t=e?.toLowerCase(),o=r.categoryStore.categories.find(({name:n,slug:s})=>n?.toLowerCase()===t||s?.toLowerCase()===t);if(!o){a("selectCategory",`Category ${e} not found.`,"EFP000C01");return}r.selectCategory(o)}select(e){if(typeof e!="string"){a("select","Parameter must be a string.","EFP001700");return}const t=e,o=t?.toLowerCase(),n=r.boothStore.booths.find(c=>c.slug?.toLowerCase()===o||c.externalId?.toLowerCase()===o||c.externalId?.toLowerCase()?.replace(/\s+/g,"")===o);if(n){setTimeout(()=>r.selectBooth(n),250);return}const s=r.eventStore.eventItems.find(c=>c.slug?.toLowerCase()===o||c.externalId?.toLowerCase()===o);if(s){r.selectEventItem(s,!0);return}const i=r.exhibitorStore.exhibitors.find(c=>c.slug?.toLowerCase()===o||c.externalId?.toLowerCase()===o);if(i){setTimeout(()=>r.clickExhibitor(i),250);return}const h=r.categoryStore.categories.find(c=>c.slug===t);if(h){r.selectCategory(h);return}const u=r.speakerStore.findBySlug(t);if(u){r.selectSpeaker(u,!0);return}t.includes("heatmap=true")||r.searchStore.selectSearch(t)}showList(e){const t={bookmarks:()=>r.selectBookmarks(),visited:()=>r.selectVisited(),sessions:()=>r.selectSessions(),exhibitors:()=>r.selectExhibitors(),speakers:()=>r.selectSpeakers(),tours:()=>r.selectTours(),language:()=>r.selectLanguage()},o=t[e];if(!o){a("showList",`Unknown list "${e}". Must be one of: ${Object.keys(t).join(", ")}.`,"EFP001800");return}o()}selectTour(e){if(typeof e!="string"||!e){a("selectTour","A tour id must be passed.","EFP001900");return}const t=r.toursStore.getTourById(e);t?r.toursStore.launchTour(t,t.name,t.description):(console.warn(`Route with id "${e}" not found`),r.selectTours())}openPlanner(e={}){if(typeof e!="object"||e===null){a("openPlanner","An options object must be passed.","EFP001A00");return}const t=e.from?S(e.from):null;e.fromBookmarks?r.routePlannerStore.launchFromBookmarks(t??void 0):r.routePlannerStore.launchFromSlugs(e.items??[],t??void 0)}startBuildRoute(){r.uiState.startBuildRoute()}applyParameters(e){typeof e!="string"&&a("applyParameters","A query string must be passed.","EFP000D00"),Y(e)}getVisibility(){return r.uiState.visibility}setVisibility(e){(typeof e!="object"||!Object.keys(e).length)&&a("setVisibility","The parameter must be passed.","EFP000E00"),r.uiState.setVisibility(e)}findLocation(){r.routeStore.findLocation()}zoomIn(){r.uiState.zoomIn()}zoomOut(){r.uiState.zoomOut()}switchView(){r.maplibreStore.activateMaplibre()}setCamera(e){p("setCamera called with camera=%O",e);const t=I.safeParse(e);if(!t.success){a("setCamera",t.error.message,"EFP001B00");return}r.uiState.setMapSettings(re(t.data))}getCamera(){return oe(r.uiState.mapSettings)}zoomTo(e,t){p("zoomTo called with selectors=%O options=%O",e,t);const o=w.safeParse(e);if(!o.success){a("zoomTo",o.error.message,"EFP001600");return}const n=P.safeParse(t);if(!n.success){a("zoomTo",n.error.message,"EFP001601");return}const s=this.getBounds(e);s&&this.fitBounds(s,t)}getBounds(e){p("getBounds called with selectors=%O",e);const t=w.safeParse(e);if(!t.success){a("getBounds",t.error.message,"EFP001400");return}const o=[];if(e.booths?.forEach(s=>{let i;s.externalId?i=r.boothStore.boothByExternalId.get(s.externalId):s.name&&(i=r.boothStore.boothByName.get(s.name.toLowerCase())),i?.rect&&o.push(i.rect)}),e.exhibitors?.forEach(s=>{let i;s.externalId?i=r.exhibitorStore.exhibitorByExternalId.get(s.externalId):s.name&&(i=r.exhibitorStore.exhibitorByName.get(s.name.toLowerCase())),i?.booths?.forEach(h=>{h.rect&&o.push(h.rect)})}),o.length===0)return;const n=E.fromUnion(...o);return{leftTop:{x:n.min.x,y:n.min.y},rightBottom:{x:n.max.x,y:n.max.y}}}fitBounds(e,t){if(p("fitBounds called with bounds=%O options=%O",e,t),!e){r.uiState.fitBounds();return}const o=U.safeParse(e);if(!o.success){a("fitBounds",o.error.message,"EFP001500");return}const n=P.safeParse(t);if(!n.success){a("fitBounds",n.error.message,"EFP001501");return}const s=E.fromMinMax({x:e.leftTop.x,y:e.leftTop.y},{x:e.rightBottom.x,y:e.rightBottom.y});r.uiState.moveToRect=t?.padding?s.expand(t.padding):s}getBoothRect(e){typeof e!="string"&&a("getBoothRect","A booth name must be passed.","EFP000F00");const t=S(e)?.rect;return t?l.fromBox(t):void 0}convertToGeo(e,t){if(!b?.properties?.config){a("convertToGeo","The coordinates cannot be converted because the GPS configuration is not defined.","EFP001000");return}if(!e||!t){a("convertToGeo","Both coordinates must be passed.","EFP001001");return}return se(e,t,b.properties.config)}getGeoConfig(){const e=b?.properties?.config;return e?{bearing:e.bearing??0,p0:e.p0,p1:e.p1,p2:e.p2}:null}unstable_destroy(){let e=window.__efpElement.firstChild;ee(),window.removeEventListener("__efpStyleLoad",this.efpStyleLoadHandler),window.removeEventListener("error",J),r.maplibreStore.dispose(),W(),K(),Q(),this.root.unmount(),e.remove()}search(e){return typeof e!="string"&&a("search","A search string must be passed.","EFP001100"),r.fuzzySearchEngineStore.loadEngine().then(()=>(r.searchStore.selectSearch(e),r.uiState.fuzzySearchItems.map(t=>({item:g(t.item),score:t.score}))))}getFloors(){return r.layerStore.floors.map(e=>({name:e.name,shortName:e.shortName,description:e.description,active:e.active,disabled:e.disabled,index:e.index}))}activateFloor(e){if(!e?.name&&e?.index==null){a("activateFloor","Invalid floorId. It must contain either a name or an index.","EFP001200");return}const t=this.getFloors();if(e.name){const o=t.find(n=>n.name===e.name||n.shortName===e.name);if(!o){a("activateFloor",`Floor with name "${e.name}" not found.`,"EFP001201");return}if(o.active)return;this.updateLayerVisibility(o.name,!0);return}if(e.index!==null){const o=t.find(s=>s.index===e.index),n=o?.name;if(!n){a("activateFloor",`Floor at index ${e.index} does not exist.`,"EFP001203");return}if(o.active)return;this.updateLayerVisibility(n,!0);return}}showPathway(e,t){const{boothExternalIds:o,exhibitorExternalIds:n}=t?.length?B(t):{boothExternalIds:[],exhibitorExternalIds:[]};_({pathwayId:e,boothIds:o,exhibitorIds:n})}showPathwayOnly(e,t){this.activateFloor({name:t}),r.layerStore.showPathWay(e),r.uiState.setPathwayOnlyMode(!0);const o=r.layerStore.findLayer(e),n=r.layerStore.findLayer(t),s=o?.rect||o?.viewbox?o:n;if(s?.rect||s?.viewbox){const i=s.viewbox??s.rect;r.uiState.moveToRect=i.clone()}}hidePathways(){this.highlightBooths([]),r.layerStore.hidePathways(),r.uiState.setPathwayOnlyMode(!1)}showSearch(){r.selectSearch("")}changeLanguage(e){const t=e?.toLowerCase?.();if(!ae(t)){a("changeLanguage",`Language "${e}" was not found. Available languages: ${ne().map(o=>o.id).join(",")}`,"EFP001300");return}he(t)}isGpsTrackingEnabled(){return r.routeStore.gpsEnabled}setGpsTrackingEnabled(e){r.routeStore.setGpsTrackingEnabled(e)}deselectCurrentPosition(){r.routeStore.selectCurrentPosition(null,!1)}deselectRoute(){r.routeStore.selectRoute(null),r.routeStore.setOnlyAccessible(!1)}reset(){this.selectBooth(""),this.selectExhibitor(""),this.selectCategory(),this.deselectCurrentPosition(),this.deselectRoute(),this.highlightEntities([]),r.uiState.kioskData&&r.resetCameraFn?r.resetCameraFn?.():this.fitBounds()}selectAccessibleRoute(e){r.routeStore.setOnlyAccessible(!0),this.selectRoute(e)}}function m(f){return typeof f=="string"?S(f):r.routeStore.getNearestBooth(f)}let C=0;function a(f,e,t){const o=`Error calling "${f}" SDK method.`,n=`${e.endsWith(".")?e:e+"."} More information at`;let s="https://js-sdk.expofp.com/api/packages";if(t&&(s+=`#error-${t}`),console.error(`${o} ${n} ${s}`),r.fp.disableRuntimeAlerts)return;r.uiState.setGlobalErrorMessage({title:o,body:T(A,{children:[n," ",x("a",{href:s,target:"_blank",rel:"noreferrer",children:s})]})}),clearTimeout(C);const i=8e3;C=window.setTimeout(()=>{const h=async()=>{r.uiState.globalErrorMessages.length>0&&(r.uiState.popGlobalErrorMessage(),await new Promise(u=>setTimeout(u,i/2)),h())};h()},i)}class l{get h(){return Math.abs(this.y2-this.y1)}get w(){return Math.abs(this.x2-this.x1)}get cx(){return(this.x1+this.x2)/2}get cy(){return(this.y1+this.y2)/2}constructor(e,t,o,n){if(e>o){const s=e;e=o,o=s}if(t>n){const s=t;t=n,n=s}this.x1=e,this.y1=t,this.x2=o,this.y2=n}static fromBox(e){return new l(e.min.x,e.min.y,e.max.x,e.max.y)}static fromCxcywh(e,t,o,n){return new l(e-o/2,t-n/2,e+o/2,t+n/2)}contains(e){return e.x1>=this.x1&&e.x2<=this.x2&&e.y1>=this.y1&&e.y2<=this.y2}intersects(e){const t=Math.max(this.x1,e.x1),o=Math.min(this.x2,e.x2),n=Math.max(this.y1,e.y1),s=Math.min(this.y2,e.y2);return o>=t&&s>=n}getIntersection(e){const t=Math.max(this.x1,e.x1),o=Math.min(this.x2,e.x2),n=Math.max(this.y1,e.y1),s=Math.min(this.y2,e.y2);return o>=t&&s>=n?new l(t,n,o,s):new l(0,0,0,0)}getRotated90(){return l.fromCxcywh(this.cx,this.cy,this.h,this.w)}normalize(e,t){return new l(this.x1/e,this.y1/t,this.x2/e,this.y2/t)}withPadding(e,t=e){return this.w<e*2||this.h<t*2?this:l.fromCxcywh(this.cx,this.cy,this.w-e*2,this.h-t*2)}scale(e){return new l(this.x1*e,this.y1*e,this.x2*e,this.y2*e)}getArea(){return this.w*this.h}clone(){return new l(this.x1,this.y1,this.x2,this.y2)}translate(e,t){return this.x1+=e,this.x2+=e,this.y1+=t,this.y2+=t,this}equals(e){return e.x1===this.x1&&e.x2===this.x2&&e.y1===this.y1&&e.y2===this.y2}toString(){return this.x1+","+this.y1+","+this.w+","+this.h}containsPoint(e,t){return e>=this.x1&&e<=this.x2&&t>=this.y1&&t<=this.y2}}
1
+ import{Fragment as A,jsx as x,jsxs as T}from"react/jsx-runtime";import{Box as E}from"@expofp/geometry";import{CameraSchema as I}from"@expofp/schema";import{optimizeWaypointOrder as M}from"@expofp/wayfinding";import{ErrorBoundary as R}from"@sentry/react";import $ from"debug";import{reaction as V}from"mobx";import{createRoot as z}from"react-dom/client";import{install as j}from"resize-observer";import G from"./components/Layout";import{MAX_ROUTE_WAYPOINTS as d}from"./constants";import N from"./data";import{fpGeo as b}from"./data/fpGeo";import q from"./floorplan.loader";import{shouldLoadIntercom as O}from"./intercom";import{BoundsSchema as U,POISelectorsSchema as P,ZoomToOptionsSchema as w}from"./schemas/sdk.schemas";import{applyDeclarativeConfig as Y,applyParameters as D,applyPathway as H,initUrlRouting as W}from"./services/url-dispatch";import{destroyUrlSync as X}from"./services/url-sync";import r from"./store";import{bindRootElement as K,destroyUiHandlers as Q}from"./store/init/init-ui";import{findBooth as S,Route as B,separateExternalIds as k}from"./store/RouteStore";import{destroyGtag as Z,GaEventActions as v,sendEventToGa as F,setConsentSettings as J}from"./tools/gtag";import _ from"./tools/report-error";import ee from"./tools/track-event";import{cameraToMapSettings as te,mapSettingsToCamera as re}from"./utils/camera-map-settings";import{getStorage as C}from"./utils/entity-storage";import{getMostFrequent as oe}from"./utils/getMostFrequent";import{convertLocalToGps as ie,isValidPointCoords as y}from"./utils/gps";import{getLocales as se,hasLocale as ne,setLocale as ae}from"./utils/i18n";import{mapEntity as g}from"./utils/mapEntity";const p=$("efp:api");j();export default class he extends q{init(){Y(),this.ignoreQuery||W(this.offHistory),ee("load"),K(r),r.fp=this,J(this.consent),F(v.Load,""),this.root=z(this.renderTarget),this.root.render(x(R,{children:x(G,{offHistory:this.offHistory,consent:this.consent})})),F(v.Rendered,""),V(()=>r.layerStore.layersLoaded,()=>{this.resolveReady(),r.initialized||this.onInit?.(this),r.initialized=!0});const e=O(N);e&&import("./intercom/bootIntercom").then(({bootIntercom:t})=>t(e)).catch(()=>{})}selectBooth(e){if(typeof e!="string"&&!Array.isArray(e)){a("selectBooth","Parameter must be a string or an array of strings.","EFP000000");return}const t=r.boothStore.booths.filter(o=>typeof e=="string"?o.name===e||o.externalId===e:e.includes(o.name)||e.includes(o.externalId));r.selectBooth(t)}selectExhibitor(e){if(typeof e!="string"&&!Array.isArray(e)){a("selectExhibitor","Parameter must be a string or an array of strings.","EFP000100");return}if(!e?.length){r.uiState.menu=!1,r.searchStore.resetSearchBox(),r.uiState.details=null;return}const t=r.exhibitorStore.exhibitors.filter(s=>typeof e=="string"?s.name===e||s.externalId===e:e.includes(s.name)||e.includes(s.externalId));if(!t?.length)return;if(typeof e=="string"){r.selectExhibitor(t[0]),r.moveToList([t[0]]);return}const o=t.flatMap(s=>s.booths.map(i=>i.layer)),n=oe(o.map(s=>s.description));n&&r.layerStore.updateVisibility(n,!0),r.uiState.menu=!1,r.searchStore.resetSearchBox(),r.uiState.details=null,r.uiState.list={type:"filter",items:t,query:{key:"exhibitors",value:t.map(s=>s.name).join(",")}},r.moveToList()}highlightExhibitors(e){Array.isArray(e)||a("highlightExhibitors","Parameter must be an array of strings.","EFP000200"),r.boothStore.highlightedByExternalIds=[],r.exhibitorStore.highlightedByExternalIds=[...e]}highlightBooths(e){Array.isArray(e)||a("highlightBooths","Parameter must be an array of strings.","EFP000300"),r.exhibitorStore.highlightedByExternalIds=[],r.boothStore.highlightedByExternalIds=[...e]}highlightEntities(e){Array.isArray(e)||a("highlightEntities","Parameter must be an array of strings.","EFP000400");const{boothExternalIds:t,exhibitorExternalIds:o}=k(e);r.boothStore.highlightedByExternalIds=[...t],r.exhibitorStore.highlightedByExternalIds=[...o]}selectRoute(e,t){if(Array.isArray(e)){let o=[...e];const n=o.shift(),s=o.pop();if(o.length>d)throw new Error(`The maximum number of waypoints is ${d}.`);if(!n||!s){a("selectRoute","Invalid route format: When providing an array, it must include at least two points: a start and a destination.","EFP000401");return}r.routeStore.selectRoute(new B(m(n),m(s),o.map(m)));return}e||a("selectRoute","At a minimum, the starting point must be passed.","EFP000402"),r.routeStore.selectRoute(new B(m(e),m(t)))}getOptimizedRoutes(e){if(!Array.isArray(e))return a("getOptimizedRoutes","Parameter must be an array.","EFP000500"),[];if(e.length>d)throw new Error(`The maximum number of waypoints is ${d}.`);const t=e.map(m).filter(n=>!!n);if(!t.length)throw new Error("No booths found for the provided waypoints.");const o=new Map;for(const n of t){const s=n.layer?.name??"",i=o.get(s);i?i.push(n):o.set(s,[n])}return Array.from(o.values()).map(n=>({waypoints:M(n.map(s=>[s.name,{x:s.rect.center.x,y:s.rect.center.y}]))}))}selectCurrentPosition(e,t,o){const n=y(e.x)&&y(e.y),s=y(e.lng)&&y(e.lat);!n&&!s&&a("selectCurrentPosition","A point must be passed. Either (x,y) or (lat,lng) are required.","EFP000600"),r.routeStore.selectCurrentPosition(e,t,o),this.onCurrentPositionChanged?.(e)}setBookmarks(e){(!Array.isArray(e)||!e.length)&&a("setBookmarks","Parameter must be an array.","EFP000700"),e.forEach(t=>{const o=r.exhibitorStore.exhibitors.find(n=>n.name===t.name||n.externalId===t.externalId);o&&(o.bookmarked=t.bookmarked)})}setEntitiesBookmarks(e){if(!Array.isArray(e)||!e.length){a("setEntitiesBookmarks","Parameter must be an array.","EFP000701");return}const t=["exhibitor","event","speaker","booth"],o=e.find(i=>!i.type||!t.includes(i.type));if(o){a("setEntitiesBookmarks",`Invalid entity type: ${o.type}. Must be one of: ${t.join(", ")}.`,"EFP000702");return}const n=C("bookmarked"),s={exhibitor:{existingIds:new Set(n.exhibitors||[]),finder:i=>r.exhibitorStore.findExhibitor(i),replacer:i=>r.exhibitorStore.replaceBookmarked(i)},event:{existingIds:new Set(n.events||[]),finder:i=>r.eventStore.findByNameOrSlug(i),replacer:i=>r.eventStore.replaceBookmarked(i)},speaker:{existingIds:new Set(n.speakers||[]),finder:i=>r.speakerStore.speakers.find(h=>h.name===i||h.externalId===i||h.slug===i),replacer:i=>r.speakerStore.replaceBookmarked(i)},booth:{existingIds:new Set(n.booths||[]),finder:i=>{const h=r.boothStore.findBooth(i);return h?.exhibitors.length===0?h:void 0},replacer:i=>r.boothStore.replaceBookmarked(i)}};e.forEach(i=>{const h=s[i.type],u=i.name||i.externalId||"",c=h.finder(u);c?i.bookmarked?h.existingIds.add(c.id):h.existingIds.delete(c.id):console.warn(`Entity not found: ${i.type} with query "${u}"`)}),Object.values(s).forEach(i=>{i.replacer(Array.from(i.existingIds))})}setEntitiesVisited(e){if(!Array.isArray(e)||!e.length){a("setEntitiesVisited","Parameter must be an array.","EFP000703");return}const t=["exhibitor","event"],o=e.find(i=>!i.type||!t.includes(i.type));if(o){a("setEntitiesVisited",`Invalid entity type: ${o.type}. Must be one of: ${t.join(", ")}.`,"EFP000704");return}const n=C("visited"),s={exhibitor:{existingIds:new Set(n.exhibitors||[]),finder:i=>r.exhibitorStore.findExhibitor(i),replacer:i=>r.exhibitorStore.replaceVisited(i)},event:{existingIds:new Set(n.events||[]),finder:i=>r.eventStore.findByNameOrSlug(i),replacer:i=>r.eventStore.replaceVisited(i)}};e.forEach(i=>{const h=s[i.type],u=i.name||i.externalId||"",c=h.finder(u);c?i.visited?h.existingIds.add(c.id):h.existingIds.delete(c.id):console.warn(`Entity not found: ${i.type} with query "${u}"`)}),Object.values(s).forEach(i=>{i.replacer(Array.from(i.existingIds))})}setMarkers(e){if(!e||!Array.isArray(e.icons)||!Array.isArray(e.markers)){a("setMarkers","Invalid input.","EFP000800");return}r.routeStore.setMarkers(e)}selectMarker(e,t=!0){return typeof e!="string"&&a("selectMarker","The identifier must be passed.","EFP000900"),r.routeStore.selectMarker(e,t)}drawCircles(e){Array.isArray(e)||a("drawCircles","Invalid input.","EFP000A00"),r.uiState.debugCircles=e}checkRoutes(){r.routeStore.checkRoutes()}updateLayerVisibility(e,t){typeof e!="string"&&a("updateLayerVisibility","The layer name (string) must be passed.","EFP000B00"),t||a("updateLayerVisibility","Passing a false value to visible will have no effect.","EFP000B01"),r.layerStore.updateVisibility(e,t)}getCenterCoordinates(){return r.fp.getCenterCoordinates()}exhibitorsList(){return r.exhibitorStore.exhibitors.map(e=>g(e))}boothsList(){return r.boothStore.booths.map(e=>g(e))}categoriesList(){return r.categoryStore.categories.map(e=>g(e))}selectCategory(e){if(e==null||typeof e!="string"){r.searchStore.selectSearch();return}const t=e?.toLowerCase(),o=r.categoryStore.categories.find(({name:n,slug:s})=>n?.toLowerCase()===t||s?.toLowerCase()===t);if(!o){a("selectCategory",`Category ${e} not found.`,"EFP000C01");return}r.selectCategory(o)}select(e){if(typeof e!="string"){a("select","Parameter must be a string.","EFP001700");return}const t=e,o=t?.toLowerCase(),n=r.boothStore.booths.find(c=>c.slug?.toLowerCase()===o||c.externalId?.toLowerCase()===o||c.externalId?.toLowerCase()?.replace(/\s+/g,"")===o);if(n){setTimeout(()=>r.selectBooth(n),250);return}const s=r.eventStore.eventItems.find(c=>c.slug?.toLowerCase()===o||c.externalId?.toLowerCase()===o);if(s){r.selectEventItem(s,!0);return}const i=r.exhibitorStore.exhibitors.find(c=>c.slug?.toLowerCase()===o||c.externalId?.toLowerCase()===o);if(i){setTimeout(()=>r.clickExhibitor(i),250);return}const h=r.categoryStore.categories.find(c=>c.slug===t);if(h){r.selectCategory(h);return}const u=r.speakerStore.findBySlug(t);if(u){r.selectSpeaker(u,!0);return}t.includes("heatmap=true")||r.searchStore.selectSearch(t)}showList(e){const t={bookmarks:()=>r.selectBookmarks(),visited:()=>r.selectVisited(),sessions:()=>r.selectSessions(),exhibitors:()=>r.selectExhibitors(),speakers:()=>r.selectSpeakers(),tours:()=>r.selectTours(),language:()=>r.selectLanguage()},o=t[e];if(!o){a("showList",`Unknown list "${e}". Must be one of: ${Object.keys(t).join(", ")}.`,"EFP001800");return}o()}selectTour(e){if(typeof e!="string"||!e){a("selectTour","A tour id must be passed.","EFP001900");return}const t=r.toursStore.getTourById(e);t?r.toursStore.launchTour(t,t.name,t.description):(console.warn(`Route with id "${e}" not found`),r.selectTours())}openPlanner(e={}){if(typeof e!="object"||e===null){a("openPlanner","An options object must be passed.","EFP001A00");return}const t=e.from?S(e.from):null;e.fromBookmarks?r.routePlannerStore.launchFromBookmarks(t??void 0):r.routePlannerStore.launchFromSlugs(e.items??[],t??void 0)}startBuildRoute(){r.uiState.startBuildRoute()}applyParameters(e){typeof e!="string"&&a("applyParameters","A query string must be passed.","EFP000D00"),D(e)}getVisibility(){return r.uiState.visibility}setVisibility(e){(typeof e!="object"||!Object.keys(e).length)&&a("setVisibility","The parameter must be passed.","EFP000E00"),r.uiState.setVisibility(e)}findLocation(){r.routeStore.findLocation()}zoomIn(){r.uiState.zoomIn()}zoomOut(){r.uiState.zoomOut()}switchView(){r.maplibreStore.activateMaplibre()}setCamera(e){p("setCamera called with camera=%O",e);const t=I.safeParse(e);if(!t.success){a("setCamera",t.error.message,"EFP001B00");return}r.uiState.setMapSettings(te(t.data))}getCamera(){return re(r.uiState.mapSettings)}zoomTo(e,t){p("zoomTo called with selectors=%O options=%O",e,t);const o=P.safeParse(e);if(!o.success){a("zoomTo",o.error.message,"EFP001600");return}const n=w.safeParse(t);if(!n.success){a("zoomTo",n.error.message,"EFP001601");return}const s=this.getBounds(e);s&&this.fitBounds(s,t)}getBounds(e){p("getBounds called with selectors=%O",e);const t=P.safeParse(e);if(!t.success){a("getBounds",t.error.message,"EFP001400");return}const o=[];if(e.booths?.forEach(s=>{let i;s.externalId?i=r.boothStore.boothByExternalId.get(s.externalId):s.name&&(i=r.boothStore.boothByName.get(s.name.toLowerCase())),i?.rect&&o.push(i.rect)}),e.exhibitors?.forEach(s=>{let i;s.externalId?i=r.exhibitorStore.exhibitorByExternalId.get(s.externalId):s.name&&(i=r.exhibitorStore.exhibitorByName.get(s.name.toLowerCase())),i?.booths?.forEach(h=>{h.rect&&o.push(h.rect)})}),o.length===0)return;const n=E.fromUnion(...o);return{leftTop:{x:n.min.x,y:n.min.y},rightBottom:{x:n.max.x,y:n.max.y}}}fitBounds(e,t){if(p("fitBounds called with bounds=%O options=%O",e,t),!e){r.uiState.fitBounds();return}const o=U.safeParse(e);if(!o.success){a("fitBounds",o.error.message,"EFP001500");return}const n=w.safeParse(t);if(!n.success){a("fitBounds",n.error.message,"EFP001501");return}const s=E.fromMinMax({x:e.leftTop.x,y:e.leftTop.y},{x:e.rightBottom.x,y:e.rightBottom.y});r.uiState.moveToRect=t?.padding?s.expand(t.padding):s}getBoothRect(e){typeof e!="string"&&a("getBoothRect","A booth name must be passed.","EFP000F00");const t=S(e)?.rect;return t?l.fromBox(t):void 0}convertToGeo(e,t){if(!b?.properties?.config){a("convertToGeo","The coordinates cannot be converted because the GPS configuration is not defined.","EFP001000");return}if(!e||!t){a("convertToGeo","Both coordinates must be passed.","EFP001001");return}return ie(e,t,b.properties.config)}getGeoConfig(){const e=b?.properties?.config;return e?{bearing:e.bearing??0,p0:e.p0,p1:e.p1,p2:e.p2}:null}releaseResources(){window.removeEventListener("error",_),r.maplibreStore.dispose(),X(),Q(),Z(),this.root.unmount(),super.releaseResources()}search(e){return typeof e!="string"&&a("search","A search string must be passed.","EFP001100"),r.fuzzySearchEngineStore.loadEngine().then(()=>(r.searchStore.selectSearch(e),r.uiState.fuzzySearchItems.map(t=>({item:g(t.item),score:t.score}))))}getFloors(){return r.layerStore.floors.map(e=>({name:e.name,shortName:e.shortName,description:e.description,active:e.active,disabled:e.disabled,index:e.index}))}activateFloor(e){if(!e?.name&&e?.index==null){a("activateFloor","Invalid floorId. It must contain either a name or an index.","EFP001200");return}const t=this.getFloors();if(e.name){const o=t.find(n=>n.name===e.name||n.shortName===e.name);if(!o){a("activateFloor",`Floor with name "${e.name}" not found.`,"EFP001201");return}if(o.active)return;this.updateLayerVisibility(o.name,!0);return}if(e.index!==null){const o=t.find(s=>s.index===e.index),n=o?.name;if(!n){a("activateFloor",`Floor at index ${e.index} does not exist.`,"EFP001203");return}if(o.active)return;this.updateLayerVisibility(n,!0);return}}showPathway(e,t){const{boothExternalIds:o,exhibitorExternalIds:n}=t?.length?k(t):{boothExternalIds:[],exhibitorExternalIds:[]};H({pathwayId:e,boothIds:o,exhibitorIds:n})}showPathwayOnly(e,t){this.activateFloor({name:t}),r.layerStore.showPathWay(e),r.uiState.setPathwayOnlyMode(!0);const o=r.layerStore.findLayer(e),n=r.layerStore.findLayer(t),s=o?.rect||o?.viewbox?o:n;if(s?.rect||s?.viewbox){const i=s.viewbox??s.rect;r.uiState.moveToRect=i.clone()}}hidePathways(){this.highlightBooths([]),r.layerStore.hidePathways(),r.uiState.setPathwayOnlyMode(!1)}showSearch(){r.selectSearch("")}changeLanguage(e){const t=e?.toLowerCase?.();if(!ne(t)){a("changeLanguage",`Language "${e}" was not found. Available languages: ${se().map(o=>o.id).join(",")}`,"EFP001300");return}ae(t)}isGpsTrackingEnabled(){return r.routeStore.gpsEnabled}setGpsTrackingEnabled(e){r.routeStore.setGpsTrackingEnabled(e)}deselectCurrentPosition(){r.routeStore.selectCurrentPosition(null,!1)}deselectRoute(){r.routeStore.selectRoute(null),r.routeStore.setOnlyAccessible(!1)}reset(){this.selectBooth(""),this.selectExhibitor(""),this.selectCategory(),this.deselectCurrentPosition(),this.deselectRoute(),this.highlightEntities([]),r.uiState.kioskData&&r.resetCameraFn?r.resetCameraFn?.():this.fitBounds()}selectAccessibleRoute(e){r.routeStore.setOnlyAccessible(!0),this.selectRoute(e)}}function m(f){return typeof f=="string"?S(f):r.routeStore.getNearestBooth(f)}let L=0;function a(f,e,t){const o=`Error calling "${f}" SDK method.`,n=`${e.endsWith(".")?e:e+"."} More information at`;let s="https://js-sdk.expofp.com/api/packages";if(t&&(s+=`#error-${t}`),console.error(`${o} ${n} ${s}`),r.fp.disableRuntimeAlerts)return;r.uiState.setGlobalErrorMessage({title:o,body:T(A,{children:[n," ",x("a",{href:s,target:"_blank",rel:"noreferrer",children:s})]})}),clearTimeout(L);const i=8e3;L=window.setTimeout(()=>{const h=async()=>{r.uiState.globalErrorMessages.length>0&&(r.uiState.popGlobalErrorMessage(),await new Promise(u=>setTimeout(u,i/2)),h())};h()},i)}class l{get h(){return Math.abs(this.y2-this.y1)}get w(){return Math.abs(this.x2-this.x1)}get cx(){return(this.x1+this.x2)/2}get cy(){return(this.y1+this.y2)/2}constructor(e,t,o,n){if(e>o){const s=e;e=o,o=s}if(t>n){const s=t;t=n,n=s}this.x1=e,this.y1=t,this.x2=o,this.y2=n}static fromBox(e){return new l(e.min.x,e.min.y,e.max.x,e.max.y)}static fromCxcywh(e,t,o,n){return new l(e-o/2,t-n/2,e+o/2,t+n/2)}contains(e){return e.x1>=this.x1&&e.x2<=this.x2&&e.y1>=this.y1&&e.y2<=this.y2}intersects(e){const t=Math.max(this.x1,e.x1),o=Math.min(this.x2,e.x2),n=Math.max(this.y1,e.y1),s=Math.min(this.y2,e.y2);return o>=t&&s>=n}getIntersection(e){const t=Math.max(this.x1,e.x1),o=Math.min(this.x2,e.x2),n=Math.max(this.y1,e.y1),s=Math.min(this.y2,e.y2);return o>=t&&s>=n?new l(t,n,o,s):new l(0,0,0,0)}getRotated90(){return l.fromCxcywh(this.cx,this.cy,this.h,this.w)}normalize(e,t){return new l(this.x1/e,this.y1/t,this.x2/e,this.y2/t)}withPadding(e,t=e){return this.w<e*2||this.h<t*2?this:l.fromCxcywh(this.cx,this.cy,this.w-e*2,this.h-t*2)}scale(e){return new l(this.x1*e,this.y1*e,this.x2*e,this.y2*e)}getArea(){return this.w*this.h}clone(){return new l(this.x1,this.y1,this.x2,this.y2)}translate(e,t){return this.x1+=e,this.x2+=e,this.y1+=t,this.y2+=t,this}equals(e){return e.x1===this.x1&&e.x2===this.x2&&e.y1===this.y1&&e.y2===this.y2}toString(){return this.x1+","+this.y1+","+this.w+","+this.h}containsPoint(e,t){return e>=this.x1&&e<=this.x2&&t>=this.y1&&t<=this.y2}}
package/dist/esm/load.js CHANGED
@@ -1,4 +1,4 @@
1
- import"./utils/silence-mobx-react-lite-warning";import{applyIntents as c,loadConfig as p,setConfig as m}from"@expofp/config";import{safeLocalStorage as u}from"@expofp/utils";import l from"debug";import{initHtmlHead as y}from"./_misc_to_move/initHtmlHead";import{logBuildInfo as h}from"./_misc_to_move/logBuildInfo";import g from"./floorplan.loader";import{migrateLegacyStorageKeys as v}from"./utils/legacy-storage-keys";const d=l("efp:load");export async function load(r,e={}){y(),h(),l("efp:device").enabled&&import("./_misc_to_move/logDeviceInfo").then(o=>o.logDeviceInfo()).catch(()=>{});const a=e.element;let t;if(typeof a=="string"){const o=document.querySelector(a);if(!o)throw new Error(`Element not found for selector: ${a}`);t=o}else a?t=a:(t=document.getElementById("floorplan"),t||(t=document.createElement("div"),S(t),document.body.appendChild(t)));w(),t.setAttribute("data-efp-floorplan-defaults",""),document.documentElement.style.overscrollBehavior||="none",document.body.style.overscrollBehavior||="none",requestAnimationFrame(()=>{t.style.backgroundColor="#ebebeb"}),v();let i;try{if(i=await p(r,e,window.location.search,u()??void 0),!i.fpSvgJsRef)throw new Error("No floor plan drawing: the manifest must set `legacyDataUrlBase` (live event) or `fpSvgJsRef` (offline copy)")}catch(o){const{showEventNotFound:f}=await import("./tools/event-not-found");throw f(t),o}d("config",i),m(i);const n=new g(e,t),s=window.___fpResolve;return window.___fp=n,s&&(n.ready.then(()=>s(n)),delete window.___fpResolve),n.ready.then(()=>{const o=new CustomEvent("expofp:ready",{detail:{floorplan:n}});window.__expofpReady=o,window.dispatchEvent(o)}),n.ready.then(()=>c(n,i.intents)).catch(o=>d("config intents skipped:",o)),n}function w(){const r="efp-floorplan-defaults";if(document.getElementById(r))return;const e=document.createElement("style");e.id=r,e.textContent=`
1
+ import"./utils/silence-mobx-react-lite-warning";import{applyIntents as f,loadConfig as p,setConfig as m}from"@expofp/config";import{safeLocalStorage as u}from"@expofp/utils";import d from"debug";import{initHtmlHead as h}from"./_misc_to_move/initHtmlHead";import{logBuildInfo as y}from"./_misc_to_move/logBuildInfo";import v from"./floorplan.loader";import{migrateLegacyStorageKeys as g}from"./utils/legacy-storage-keys";const s=d("efp:load");export async function load(r,e={}){h(),y(),d("efp:device").enabled&&import("./_misc_to_move/logDeviceInfo").then(t=>t.logDeviceInfo()).catch(()=>{});const a=e.element;let o;if(typeof a=="string"){const t=document.querySelector(a);if(!t)throw new Error(`Element not found for selector: ${a}`);o=t}else a?o=a:(o=document.getElementById("floorplan"),o||(o=document.createElement("div"),S(o),document.body.appendChild(o)));w(),o.setAttribute("data-efp-floorplan-defaults",""),document.documentElement.style.overscrollBehavior||="none",document.body.style.overscrollBehavior||="none",requestAnimationFrame(()=>{o.style.backgroundColor="#ebebeb"}),g();let i;try{if(i=await p(r,e,window.location.search,u()??void 0),!i.fpSvgJsRef)throw new Error("No floor plan drawing: the manifest must set `legacyDataUrlBase` (live event) or `fpSvgJsRef` (offline copy)")}catch(t){const{showEventNotFound:c}=await import("./tools/event-not-found");throw c(o),t}s("config",i),m(i);const n=new v(e,o),l=window.___fpResolve;return window.___fp=n,l&&(n.ready.then(()=>l(n)).catch(t=>s("placeholder resolve skipped:",t)),delete window.___fpResolve),n.ready.then(()=>{const t=new CustomEvent("expofp:ready",{detail:{floorplan:n}});window.__expofpReady=t,window.dispatchEvent(t)}).catch(t=>s("ready event skipped:",t)),n.ready.then(()=>f(n,i.intents)).catch(t=>s("config intents skipped:",t)),n}function w(){const r="efp-floorplan-defaults";if(document.getElementById(r))return;const e=document.createElement("style");e.id=r,e.textContent=`
2
2
  [data-efp-floorplan-defaults] {
3
3
  position: fixed;
4
4
  top: 0;
@@ -61,7 +61,7 @@ import"./utils/silence-mobx-react-lite-warning";import{applyIntents as c,loadCon
61
61
  100% {
62
62
  stroke-dashoffset: -125px;
63
63
  }
64
- }`,t=new CSSStyleSheet;t.replaceSync(a),document.adoptedStyleSheets=[...document.adoptedStyleSheets,t],r.innerHTML=`<div class="${e}">
64
+ }`,o=new CSSStyleSheet;o.replaceSync(a),document.adoptedStyleSheets=[...document.adoptedStyleSheets,o],r.innerHTML=`<div class="${e}">
65
65
  <svg viewBox="25 25 50 50">
66
66
  <circle r="20" cy="50" cx="50"></circle>
67
67
  </svg>
@@ -4,6 +4,15 @@ import { type Camera, type ListPanel, type PlannerOptions } from '@expofp/schema
4
4
  * Represents a floor plan.
5
5
  */
6
6
  export interface FloorPlan {
7
+ /**
8
+ * Resolves once the plan has mounted and its API is live.
9
+ *
10
+ * Rejects if {@link destroy} is called first: the initialization it was
11
+ * waiting on has been cancelled, so awaiting it any longer would never
12
+ * return. Await it inside the same chain that owns the teardown, or attach a
13
+ * `catch` — an unhandled rejection here is a destroyed plan, not a failure
14
+ * to load.
15
+ */
7
16
  readonly ready: Promise<void>;
8
17
  readonly element: HTMLDivElement;
9
18
  readonly eventId: string;
@@ -109,6 +118,26 @@ export interface FloorPlan {
109
118
  getBoothRect(name: string): Rect;
110
119
  convertToGeo(x: number, y: number): [number, number] | never;
111
120
  getGeoConfig(): GeoConfig | null;
121
+ /**
122
+ * Tears the floor plan down: unmounts the UI, drops the window listeners,
123
+ * analytics, URL sync and map resources it installed, and empties the
124
+ * container element — the element itself is left in the document, ready to
125
+ * be passed to a new {@link load} call.
126
+ *
127
+ * Safe at any point in the lifecycle: calling it before {@link ready}
128
+ * resolves cancels the pending initialization instead of throwing, so a
129
+ * single-page app can unmount a route while the plan is still loading. That
130
+ * cancellation rejects {@link ready} rather than leaving it pending forever.
131
+ * Calling it more than once does nothing after the first.
132
+ *
133
+ * The instance is spent once destroyed — call {@link load} again for a new
134
+ * plan rather than reusing it.
135
+ */
136
+ destroy(): void;
137
+ /**
138
+ * @deprecated Renamed to {@link destroy}, which carries the same behaviour
139
+ * plus a stable contract. This alias will be removed in a future major.
140
+ */
112
141
  unstable_destroy(): void;
113
142
  highlightExhibitors(externalIds: string[]): void;
114
143
  highlightBooths(externalIds: string[]): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expofp/floorplan",
3
- "version": "3.24.3",
3
+ "version": "3.25.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/expofp/efp-app.git",
@@ -70,14 +70,14 @@
70
70
  "tslib": "^2.3.0",
71
71
  "uuid": "^9.0.1",
72
72
  "zod": "4.4.3",
73
- "@expofp/config": "3.24.3",
74
- "@expofp/debug": "3.24.3",
75
- "@expofp/geometry": "3.24.3",
76
- "@expofp/resolve": "3.24.3",
77
- "@expofp/schema": "3.24.3",
78
- "@expofp/ui": "3.24.3",
79
- "@expofp/utils": "3.24.3",
80
- "@expofp/wayfinding": "3.24.3"
73
+ "@expofp/config": "3.25.1",
74
+ "@expofp/debug": "3.25.1",
75
+ "@expofp/geometry": "3.25.1",
76
+ "@expofp/resolve": "3.25.1",
77
+ "@expofp/schema": "3.25.1",
78
+ "@expofp/ui": "3.25.1",
79
+ "@expofp/utils": "3.25.1",
80
+ "@expofp/wayfinding": "3.25.1"
81
81
  },
82
82
  "devDependencies": {
83
83
  "@babel/plugin-proposal-decorators": "^8.0.2",