@expofp/floorplan 3.42.1 → 3.43.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 (170) hide show
  1. package/dist/browser/{Button-CFOilpWS.js → Button-ChvBlyDe.js} +6 -6
  2. package/dist/browser/{CookieConsent-7xtFQUAC.js → CookieConsent-B79szHaS.js} +8 -8
  3. package/dist/browser/{Debug-Ccq8j5HJ.js → Debug-BmtrxpLX.js} +10 -10
  4. package/dist/browser/{DebugTools-dIItZaUb.js → DebugTools-D4NbQEtd.js} +7 -7
  5. package/dist/browser/{Demo-waaMiBvy.js → Demo-C1jGPlTZ.js} +13 -13
  6. package/dist/browser/{Free-DdCaOZ8Q.js → Free-CrPKA8NB.js} +16 -15
  7. package/dist/browser/{GalleryContainer-DlucEORI.js → GalleryContainer-Byk_AjCO.js} +470 -469
  8. package/dist/browser/{GpsLoader-cqPoX_Zr.js → GpsLoader-xcrMJQ3k.js} +40 -37
  9. package/dist/browser/{KioskStore-BJwAcVii.js → KioskStore-CCqEIeOE.js} +52 -48
  10. package/dist/browser/{store-DKVnQzpY.js → LayerStore-CfhO9JTt.js} +21374 -31265
  11. package/dist/browser/{MaplibreAdapter-BZD4cOe-.js → MaplibreAdapter-BkdCl4p0.js} +290 -285
  12. package/dist/browser/{ModalContainer-BSvSFPr9.js → ModalContainer-CdqhG7DC.js} +11 -11
  13. package/dist/browser/{PermissionNotice-DXt-j2f7.js → PermissionNotice-271evNUE.js} +7 -7
  14. package/dist/browser/RouteStore-DYDocOLg.js +1203 -0
  15. package/dist/browser/SetKioskMode-DWceqgEp.js +50 -0
  16. package/dist/browser/{ShowKiosk-BhS74u62.js → ShowKiosk-D5DyThTi.js} +18 -17
  17. package/dist/browser/UIState-Saj7Kjjr.js +2026 -0
  18. package/dist/browser/{ViewerMenuPanel-BYTeVxTR.js → ViewerMenuPanel--NAIzyGt.js} +25 -24
  19. package/dist/browser/{add-debug-secret-listener-B3Oo6_V2.js → add-debug-secret-listener-BqwoAVWZ.js} +1 -1
  20. package/dist/browser/{adopt-global-settings-Yr-a_0F-.js → adopt-global-settings-DvAJraFg.js} +10 -10
  21. package/dist/browser/{boolean-editor-BA7H18pG.js → boolean-editor-Co1Ily6N.js} +10 -10
  22. package/dist/browser/{bootIntercom-BEZV9AQ2.js → bootIntercom-BxKpklX4.js} +3 -3
  23. package/dist/browser/bundle.json +110 -71
  24. package/dist/browser/{camera-events-CJhSKz2q.js → camera-events-BnYGheBl.js} +1 -1
  25. package/dist/browser/{classnames-D4c_D7C1.js → classnames-NaSmbmqt.js} +2 -2
  26. package/dist/browser/{client-DGjMk9A1.js → client-CvZjZ5MY.js} +6 -6
  27. package/dist/browser/{components-MaSv6j2M.js → components-BC_4Rrtm.js} +1491 -1457
  28. package/dist/browser/create-live-plan-DdDxRVpo.js +3650 -0
  29. package/dist/browser/{debug-context-C2PWyEVT.js → debug-context-rb_t7BzM.js} +6 -6
  30. package/dist/browser/{debug-overlay-BXHh1LRW.js → debug-overlay-DX9d63U6.js} +11 -11
  31. package/dist/browser/{debug-ui-CO-3GLEU.js → debug-ui-1zRSn-Pt.js} +7 -7
  32. package/dist/browser/{dimming-kPNlXUew.js → dimming-D9erakE3.js} +277 -270
  33. package/dist/browser/{dist-DEm0E-fN.js → dist-BupLuz7e.js} +6 -6
  34. package/dist/browser/{dist-3gOjtf_f.js → dist-Dy3X0upa.js} +3 -3
  35. package/dist/browser/{dist-B3PLpTVy.js → dist-Dy4ATR13.js} +7 -7
  36. package/dist/browser/{efp-debug-init-DkOOpU1g.js → efp-debug-init-DTmBNC1u.js} +4 -4
  37. package/dist/browser/{enum-editor-DPAX_cAI.js → enum-editor-DS9Mi20y.js} +5 -5
  38. package/dist/browser/{es5-CpN6LQeU.js → es5-TGy8TG8S.js} +2 -2
  39. package/dist/browser/{event-head-oYEDbvk3.js → event-head-ccloCQPA.js} +1 -1
  40. package/dist/browser/{event-not-found-C7GLCJX7.js → event-not-found-B4UzwYx9.js} +4 -4
  41. package/dist/browser/event-scoped-cache-Bo8Pi1bU.js +22 -0
  42. package/dist/browser/{exports-3uPTDFG9.js → exports-DkrDN44T.js} +1 -1
  43. package/dist/browser/{favicon-CQpg641Z.js → favicon-BO6r3JQD.js} +1 -1
  44. package/dist/browser/{fetch-retry.umd-Chmlkexp.js → fetch-retry.umd-CBKWHeDp.js} +2 -2
  45. package/dist/browser/{flex--99NWgQk.js → flex-DK-UWQj-.js} +6 -6
  46. package/dist/browser/{floorplan.loader-Ci226yql.js → floorplan.loader-C3iy3aV0.js} +658 -707
  47. package/dist/browser/{floorplan.ready-y0hYLknK.js → floorplan.ready-Dfo1nWhu.js} +373 -359
  48. package/dist/browser/freeBanner-C7xKlqKw.js +31 -0
  49. package/dist/browser/{fuse-BuFi3LTO.js → fuse-BQcpTy7r.js} +2 -2
  50. package/dist/browser/{i18n-BAQekIFF.js → i18n-D6Lq_Buf.js} +1821 -3872
  51. package/dist/browser/index.js +131 -47
  52. package/dist/browser/{index.module-CXN9GK4C.js → index.module-BSoufRTU.js} +17 -17
  53. package/dist/browser/init-ui-1FfbXJGw.js +286 -0
  54. package/dist/browser/integrateKiosk-D9Q6DLBE.js +35 -0
  55. package/dist/browser/{loadImage-xbueiJmr.js → is-debug-COmQqgiL.js} +30 -14
  56. package/dist/browser/{is-own-domain-DPJZoBiw.js → is-own-domain-DJo0J_LD.js} +1 -1
  57. package/dist/browser/{is-webview-Bs8mxX94.js → is-webview-BBchBwKM.js} +1 -1
  58. package/dist/browser/{jsx-runtime-BXbSNrYY.js → jsx-runtime-DL-d6MrM.js} +2 -2
  59. package/dist/browser/kiosk-mode-_np8_B-l.js +33 -0
  60. package/dist/browser/{kiosk-record-CaWjqNGY.js → kiosk-record-BmaguqBS.js} +1 -1
  61. package/dist/browser/kioskApi-C07lc5Lj.js +440 -0
  62. package/dist/browser/{lib-jJ4yMeEA.js → lib-DrLsicOU.js} +3 -3
  63. package/dist/browser/loadImage-gvajvqmr.js +17 -0
  64. package/dist/browser/{logDeviceInfo-DSmmt_FU.js → logDeviceInfo-Dp6nkPPj.js} +9 -9
  65. package/dist/browser/{mobx-BQA2EJH7.js → mobx-Dfa_Tj0c.js} +11 -11
  66. package/dist/browser/mobx.module-ionKiiCb.js +2064 -0
  67. package/dist/browser/{optional-boolean-editor-Y_exy4JL.js → optional-boolean-editor-IDS6OcC1.js} +4 -4
  68. package/dist/browser/{optional-enum-editor-CKfj0OB9.js → optional-enum-editor-CmHeQhFh.js} +5 -5
  69. package/dist/browser/{optional-string-editor-DeavwcWv.js → optional-string-editor-5lm4OVVA.js} +5 -5
  70. package/dist/browser/{particles.min-BJkirBpN.js → particles.min-Djywwk9n.js} +2 -2
  71. package/dist/browser/{react-CV1gH7Zp.js → react-DATIS1Wg.js} +2 -2
  72. package/dist/browser/{react-dom-BEwgcqEB.js → react-dom-CZoP3ON8.js} +3 -3
  73. package/dist/browser/{rolldown-runtime-BiAnyumg.js → rolldown-runtime-C54u_qRI.js} +1 -1
  74. package/dist/browser/scene-CR4jNFce.js +108 -0
  75. package/dist/browser/{scheduler-CcNpP8xn.js → scheduler-B2SwSUg3.js} +2 -2
  76. package/dist/browser/{select-B13QBWfy.js → select-BXuAa5Mm.js} +11 -11
  77. package/dist/browser/{settings-DJUw3GyU.js → settings-DWSfrYuK.js} +2 -2
  78. package/dist/browser/{settings-item-VzMuDMX6.js → settings-item-Bg1kzAE-.js} +7 -7
  79. package/dist/browser/store-DKFByqxw.js +58 -0
  80. package/dist/browser/{string-editor-B6mio7nq.js → string-editor-CHJTsfW0.js} +5 -5
  81. package/dist/browser/{text-field-7dZmg829.js → text-field-Daedvncr.js} +6 -6
  82. package/dist/browser/{theme-BotlxmwW.js → theme-hSwmbdBg.js} +9 -9
  83. package/dist/browser/{ui-Dn5rbA7O.js → ui-BIFt_vYU.js} +9 -9
  84. package/dist/browser/{useRenderTarget-Rz0x5k4l.js → useRenderTarget-Cf0eV2dg.js} +5 -5
  85. package/dist/browser/{viewport-DOIlU3cR.js → viewport-Dvo8x5tc.js} +4 -3
  86. package/dist/browser/wayfinding-UIwKgl3o.js +2322 -0
  87. package/dist/esm/components/GalleryContainer.js +1 -1
  88. package/dist/esm/components/Kiosk/integrateKiosk.js +1 -1
  89. package/dist/esm/components/LogoOverlay.js +1 -1
  90. package/dist/esm/components/Map/Map.js +1 -1
  91. package/dist/esm/components/Map/MapCamera.js +1 -1
  92. package/dist/esm/components/Map/booth-by-xy.d.ts +8 -10
  93. package/dist/esm/components/Map/booth-by-xy.js +1 -1
  94. package/dist/esm/components/Map/drawing/config/BoothShape.d.ts +0 -1
  95. package/dist/esm/components/Map/drawing/config/BoothShape.js +1 -1
  96. package/dist/esm/components/Map/drawing/config/config-booth-bg.js +1 -1
  97. package/dist/esm/components/Map/drawing/config/config-booth-bookmark.js +1 -1
  98. package/dist/esm/components/Map/drawing/config/config-booth-border.js +1 -1
  99. package/dist/esm/components/Map/drawing/config/config-booth-labels-special.js +2 -2
  100. package/dist/esm/components/Map/drawing/config/config-booth-labels.js +1 -1
  101. package/dist/esm/components/Map/drawing/config/config-booths.js +1 -1
  102. package/dist/esm/components/Map/drawing/config/config-markers.js +1 -1
  103. package/dist/esm/components/Map/drawing/config/layer-images.d.ts +7 -2
  104. package/dist/esm/components/Map/drawing/config/layer-images.js +1 -1
  105. package/dist/esm/components/Map/traffic/useManageTraffic.js +1 -1
  106. package/dist/esm/components/Maplibre/MaplibreAdapter.js +1 -1
  107. package/dist/esm/components/Maplibre/useCameraReactions.js +1 -1
  108. package/dist/esm/components/Maplibre/utils/geo-config.js +1 -1
  109. package/dist/esm/components/Maplibre/utils/map-helpers.js +1 -1
  110. package/dist/esm/components/Menu.js +1 -1
  111. package/dist/esm/data/fpGeo.d.ts +6 -1
  112. package/dist/esm/data/fpGeo.js +1 -1
  113. package/dist/esm/data/index.d.ts +9 -4
  114. package/dist/esm/data/index.js +1 -1
  115. package/dist/esm/data/svg.d.ts +15 -13
  116. package/dist/esm/data/svg.js +1 -1
  117. package/dist/esm/floorplan.loader.d.ts +6 -1
  118. package/dist/esm/floorplan.loader.js +1 -1
  119. package/dist/esm/floorplan.ready.d.ts +8 -2
  120. package/dist/esm/floorplan.ready.js +1 -1
  121. package/dist/esm/load.js +11 -11
  122. package/dist/esm/plan-lifecycle.d.ts +65 -0
  123. package/dist/esm/plan-lifecycle.js +1 -0
  124. package/dist/esm/services/URLFilterManager.js +1 -1
  125. package/dist/esm/services/url-dispatch.js +1 -1
  126. package/dist/esm/services/url-sync.d.ts +5 -1
  127. package/dist/esm/services/url-sync.js +1 -1
  128. package/dist/esm/store/MaplibreStore.js +1 -1
  129. package/dist/esm/store/OverlayStore.d.ts +15 -2
  130. package/dist/esm/store/OverlayStore.js +1 -1
  131. package/dist/esm/store/RouteStore.js +1 -1
  132. package/dist/esm/store/UIState.js +1 -1
  133. package/dist/esm/store/create-live-plan.d.ts +13 -0
  134. package/dist/esm/store/create-live-plan.js +1 -0
  135. package/dist/esm/store/index.d.ts +2 -13
  136. package/dist/esm/store/index.js +1 -1
  137. package/dist/esm/store/init/init-booths.js +1 -1
  138. package/dist/esm/store/init/init-events.js +1 -1
  139. package/dist/esm/store/init/init-exhibitors.js +1 -1
  140. package/dist/esm/store/init/init-layers.js +1 -1
  141. package/dist/esm/store/init/init-speakers.js +1 -1
  142. package/dist/esm/store/init/init-ui.d.ts +4 -6
  143. package/dist/esm/store/init/init-ui.js +1 -1
  144. package/dist/esm/store/live-store.d.ts +19 -0
  145. package/dist/esm/store/live-store.js +1 -0
  146. package/dist/esm/store/search-buttons/SearchButtonsStore.js +1 -1
  147. package/dist/esm/tools/event-scoped-cache.d.ts +13 -0
  148. package/dist/esm/tools/event-scoped-cache.js +1 -0
  149. package/dist/esm/tools/gtag.d.ts +15 -1
  150. package/dist/esm/tools/gtag.js +1 -1
  151. package/dist/esm/tools/reset.js +1 -1
  152. package/dist/esm/tools/settings.d.ts +7 -2
  153. package/dist/esm/tools/settings.js +1 -1
  154. package/dist/esm/tools/slug.js +1 -1
  155. package/dist/esm/tools/style-registry.d.ts +28 -0
  156. package/dist/esm/tools/style-registry.js +1 -0
  157. package/dist/esm/tools/track-event.js +1 -1
  158. package/dist/esm/types.d.ts +7 -1
  159. package/dist/esm/utils/entity-storage.js +1 -1
  160. package/dist/esm/utils/gps.js +1 -1
  161. package/dist/esm/utils/plan-reactions.d.ts +20 -0
  162. package/dist/esm/utils/plan-reactions.js +1 -0
  163. package/dist/esm/utils/preview-exhibitor.d.ts +9 -2
  164. package/dist/esm/utils/preview-exhibitor.js +1 -1
  165. package/dist/esm/utils/swappable-proxy.d.ts +28 -0
  166. package/dist/esm/utils/swappable-proxy.js +1 -0
  167. package/dist/esm/wayfinding/createWayfinding.js +1 -1
  168. package/package.json +32 -10
  169. package/dist/browser/SetKioskMode-CCZNdKum.js +0 -48
  170. package/dist/browser/integrateKiosk-DjIKsfAy.js +0 -34
@@ -26,6 +26,11 @@ declare class Settings extends FpSettings {
26
26
  };
27
27
  };
28
28
  }
29
- declare let settings: Settings;
30
- export default settings;
29
+ /**
30
+ * The live event's settings. Every property read forwards to the settings of
31
+ * whichever plan is loaded now, so importers can keep holding this binding
32
+ * across a plan swap — capturing a field from it at module scope cannot.
33
+ */
34
+ declare const _default: Settings;
35
+ export default _default;
31
36
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- import t from"deepmerge";import{getFpSvgJs as l}from"../data/fp-payloads.js";export class FpSettings{constructor(){this.boothLabelColor="#fff",this.boothBorderColor="#fff",this.backgroundColor="#ebebeb",this.heatmapColors=["#FDE7C7","#FDDBAE","#FDC48D","#FCB37C","#FCA26D","#F67B5B","#EB483E","#E03143","#6C0022"]}}class i extends FpSettings{constructor(){super(...arguments),this.EXPO=window.__efpEvent,this.borderless=!1,this.wayfinding=!1,this.colors={booths:{default:"#41b6e7",defaultHold:"#48484A",defaultSold:"#41b6e7",seectedLight:null,selected:"#fb3e59",selectedBorder:null,wayfinding:{selected:"#0088D6",selectedBorder:null},empty:"#aaaaaa"}}}}let e=new i;e.EXPO.startsWith("sxsw2024")?(e.colors.booths.selected="#FF6400",e.colors.booths.seectedLight="#808080"):e.EXPO==="whxdubai2026"?(e.colors.booths.selected="#2B66FE",e.maxZoom=450):e.EXPO==="whxlabs2026"?e.colors.booths.selected="#2B66FE":(e.EXPO==="wineparis2026"||e.EXPO==="rdemo2025")&&(e.maxZoom=450);const r=window.__settings,s=l().__fpSettings??{};e=t(e,r??s),e=t(e,s);export default e;
1
+ import{getConfig as o}from"@expofp/config";import s from"deepmerge";import{getFpSvgJs as l,getWfData as r}from"../data/fp-payloads.js";import{createSwappableProxy as a}from"../utils/swappable-proxy.js";import{eventScopedValue as n}from"./event-scoped-cache.js";export class FpSettings{constructor(){this.boothLabelColor="#fff",this.boothBorderColor="#fff",this.backgroundColor="#ebebeb",this.heatmapColors=["#FDE7C7","#FDDBAE","#FDC48D","#FCB37C","#FCA26D","#F67B5B","#EB483E","#E03143","#6C0022"]}}class f extends FpSettings{constructor(){super(...arguments),this.EXPO=o().expo,this.borderless=!1,this.wayfinding=!1,this.colors={booths:{default:"#41b6e7",defaultHold:"#48484A",defaultSold:"#41b6e7",seectedLight:null,selected:"#fb3e59",selectedBorder:null,wayfinding:{selected:"#0088D6",selectedBorder:null},empty:"#aaaaaa"}}}}function d(){let e=new f;e.EXPO.startsWith("sxsw2024")?(e.colors.booths.selected="#FF6400",e.colors.booths.seectedLight="#808080"):e.EXPO==="whxdubai2026"?(e.colors.booths.selected="#2B66FE",e.maxZoom=450):e.EXPO==="whxlabs2026"?e.colors.booths.selected="#2B66FE":(e.EXPO==="wineparis2026"||e.EXPO==="rdemo2025")&&(e.maxZoom=450);const i=window.__settings,t=l().__fpSettings??{};return e=s(e,i??t),e=s(e,t),e.wayfinding=!!(!o().hideDirections&&r()),e}const c=n(d);export default a("settings",c);
@@ -1 +1 @@
1
- import o from"slugify";const r=new Set;export function generateUniqueSlug(l){let t=0;const n=o(l,{remove:/[*+~.()'"!:@]/g,lower:!0});let e;do e=n+(t++>0||!n?t:"");while(r.has(e));return r.add(e),e}
1
+ import l from"slugify";import{eventScopedValue as s}from"./event-scoped-cache.js";const u=s(()=>new Set);export function generateUniqueSlug(r){const t=u();let o=0;const n=l(r,{remove:/[*+~.()'"!:@]/g,lower:!0});let e;do e=n+(o++>0||!n?o:"");while(t.has(e));return t.add(e),e}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Where the chunk-injected `<style>` elements live between plans.
3
+ *
4
+ * A chunk injects its CSS once per page, when it first evaluates
5
+ * (`vite/per-chunk-css-injection.ts`), so the elements have to outlive every
6
+ * plan: it registers each one on `window.__efpStyleElements`, and
7
+ * `floorplan.loader` adopts the whole registry into each new container —
8
+ * `appendChild` *moving* every element out of the previous, discarded one.
9
+ * That migration is why a swap leaves the node count flat instead of stacking
10
+ * a stylesheet set per generation, and it is why `resetGlobalVariables()`
11
+ * deliberately skips this one key.
12
+ *
13
+ * It has one edge, though, and only on the destroy that no `load()` follows:
14
+ * the registry still points at elements whose parent is the dead plan's
15
+ * ShadowRoot. A node keeps its parent reachable, so a single adopted `<style>`
16
+ * pins that root, its host and the ~7,200-node tree under it for the life of
17
+ * the page.
18
+ *
19
+ * Parking cuts that edge without giving up re-adoption.
20
+ */
21
+ /**
22
+ * Moves every registered `<style>` out of the container being torn down and
23
+ * into {@link parkingLot}, leaving `window.__efpStyleElements` itself intact —
24
+ * the next `load()` adopts them out of the holder exactly as it would out of a
25
+ * previous plan's container.
26
+ */
27
+ export declare function parkRegisteredStyles(): void;
28
+ //# sourceMappingURL=style-registry.d.ts.map
@@ -0,0 +1 @@
1
+ let t;export function parkRegisteredStyles(){const e=window.__efpStyleElements;if(!(!e||e.length===0)){t||(t=document.createDocumentFragment());for(const n of e)t.appendChild(n)}}
@@ -1 +1 @@
1
- import{getConfig as g}from"@expofp/config";import{createKiosk as v}from"../components/Kiosk/kioskApi";import{getSavedKiosk as S}from"../components/Kiosk/SetKiosk";import{KIOSK_STATS_ID_STORAGE_KEY as s}from"../components/Kiosk/SetKiosk/constants";import{getLocationHistory as h}from"../services/url-sync";import{uiState as E}from"../store";import l from"./logger";import{createTelemetry as w}from"./telemetry";let i,u;function p(){try{return g()}catch{return}}function y(){const o=window.__efpEvent;if(i&&u===o)return i;i?.flush();let e;try{const t=new URL(p()?.trackerUrl??"").searchParams.get("expoId");e=t?Number(t):void 0}catch(t){l.error(t)}return i=w({url:"https://app.expofp.com/api/telemetry",expo:o,expoId:e}),u=o,i}function I(o,e,t){const n=h(),r=n[n.length-2];return{type:o,subtype:t,value:e==null?"":String(e),timestamp:new Date().toISOString(),url:window.location.href,referrer:r?window.location.origin+r:""}}function d(){return!!window.__efpEvent&&!!p()?.trackerUrl&&process.env.NODE_ENV==="production"&&!E.heatmap}export default async function _(o,e,t){if(l.log("trackEvent",o,e,t),!!d())try{const n=I(o,e,t),r=S();let f=null;if(r?f=await k(r):localStorage.removeItem(s),!d())return;const a=y();if(r&&!f){a.enqueue(n);return}a.setKioskId(f??""),T(a),await a.send(n)}catch(n){l.error("trackEvent",String(n))}}let c;async function k(o){if(!o)return null;const e=localStorage.getItem(s);if(e)return e;if(!c){const t=window.__efpEvent;c=v(o,"https://app.expofp.com/").then(n=>!n||window.__efpEvent!==t?null:(localStorage.setItem(s,n),n)).finally(()=>{c=void 0})}return c}let m=!1;export function resetTelemetry(){i?.flush(),i=void 0,u=void 0,m=!1}function T(o){if(m)return;m=!0;const e="efp-track-events";try{const t=localStorage.getItem(e);if(!t)return;const n=JSON.parse(t);if(!Array.isArray(n)){localStorage.removeItem(e);return}for(const r of n)!r||typeof r!="object"||!r.headers||o.enqueue({type:r.type,value:r.value==null?"":String(r.value),timestamp:r.timeStamp,url:r.headers["X-href"],referrer:r.headers["X-ref"]??""});localStorage.removeItem(e)}catch(t){localStorage.removeItem(e),l.error("Failed to migrate old events.",String(t))}}
1
+ import{peekConfig as p}from"@expofp/config";import{createKiosk as g}from"../components/Kiosk/kioskApi";import{getSavedKiosk as v}from"../components/Kiosk/SetKiosk";import{KIOSK_STATS_ID_STORAGE_KEY as f}from"../components/Kiosk/SetKiosk/constants";import{registerPlanDisposer as S}from"../plan-lifecycle.js";import{getLocationHistory as E}from"../services/url-sync";import{uiState as h}from"../store";import l from"./logger";import{createTelemetry as w}from"./telemetry";let i,m;function I(){const n=window.__efpEvent;if(i&&m===n)return i;i?.flush();let e;try{const t=new URL(p()?.trackerUrl??"").searchParams.get("expoId");e=t?Number(t):void 0}catch(t){l.error(t)}return i=w({url:"https://app.expofp.com/api/telemetry",expo:n,expoId:e}),m=n,S(resetTelemetry),i}function k(n,e,t){const o=E(),r=o[o.length-2];return{type:n,subtype:t,value:e==null?"":String(e),timestamp:new Date().toISOString(),url:window.location.href,referrer:r?window.location.origin+r:""}}function d(){return!!window.__efpEvent&&!!p()?.trackerUrl&&process.env.NODE_ENV==="production"&&!h.heatmap}export default async function y(n,e,t){if(l.log("trackEvent",n,e,t),!!d())try{const o=k(n,e,t),r=v();let c=null;if(r?c=await _(r):localStorage.removeItem(f),!d())return;const a=I();if(r&&!c){a.enqueue(o);return}a.setKioskId(c??""),T(a),await a.send(o)}catch(o){l.error("trackEvent",String(o))}}let s;async function _(n){if(!n)return null;const e=localStorage.getItem(f);if(e)return e;if(!s){const t=window.__efpEvent;s=g(n,"https://app.expofp.com/").then(o=>!o||window.__efpEvent!==t?null:(localStorage.setItem(f,o),o)).finally(()=>{s=void 0})}return s}let u=!1;export function resetTelemetry(){i?.flush(),i=void 0,m=void 0,u=!1}function T(n){if(u)return;u=!0;const e="efp-track-events";try{const t=localStorage.getItem(e);if(!t)return;const o=JSON.parse(t);if(!Array.isArray(o)){localStorage.removeItem(e);return}for(const r of o)!r||typeof r!="object"||!r.headers||n.enqueue({type:r.type,value:r.value==null?"":String(r.value),timestamp:r.timeStamp,url:r.headers["X-href"],referrer:r.headers["X-ref"]??""});localStorage.removeItem(e)}catch(t){localStorage.removeItem(e),l.error("Failed to migrate old events.",String(t))}}
@@ -128,7 +128,13 @@ export interface FloorPlan {
128
128
  * resolves cancels the pending initialization instead of throwing, so a
129
129
  * single-page app can unmount a route while the plan is still loading. That
130
130
  * cancellation rejects {@link ready} rather than leaving it pending forever.
131
- * Calling it more than once does nothing after the first.
131
+ * Synchronous and idempotent — safe to call from a framework unmount hook
132
+ * without awaiting or guarding, and calling it more than once does nothing
133
+ * after the first.
134
+ *
135
+ * One live plan per page, so this is also the first half of a *plan swap*:
136
+ * destroy, then `load()` the next event. Calling `load()` before this
137
+ * rejects. See the Switching plans guide.
132
138
  *
133
139
  * The instance is spent once destroyed — call {@link load} again for a new
134
140
  * plan rather than reusing it.
@@ -1 +1 @@
1
- import a from"../tools/logger";import f from"../tools/settings";import{isLocalStorageAvailable as c}from"./localStorage";const s={};function u(o){return`${f.EXPO}-${o}`}function m(o){return o}function g(o){return o==="bookmarked"?{exhibitors:[],events:[],speakers:[],booths:[]}:{exhibitors:[],events:[]}}function b(o,r){if(r==null||typeof r!="object")return a.log(`Invalid ${o} data in localStorage - using defaults`),g(o);if(Array.isArray(r)){const t=o==="bookmarked"?{exhibitors:r,events:[],speakers:[],booths:[]}:{exhibitors:r,events:[]};return a.log(`Migrated ${o} data from array to object format`),saveStorage(o,t),t}if(o==="bookmarked"){const t=r,e={...t};return"speakers"in e||(e.speakers=[]),"booths"in e||(e.booths=[]),(!t.speakers||!t.booths)&&(a.log(`Migrated ${o} data (added speakers or booths field)`),saveStorage(o,e)),e}return o==="visited"?r:(a.log(`Unsupported ${o} data format - using defaults`),g(o))}export function getStorage(o){if(s[o])return s[o];const r=g(o);if(!c)return a.warn(`localStorage unavailable \u2014 using default for ${o}`),s[o]=r,r;const t=u(o),e=o;let i=null;try{i=localStorage.getItem(t)??localStorage.getItem(e)}catch(n){a.warn(`localStorage access error for ${o}`,n)}if(!i)return s[o]=r,r;try{const n=JSON.parse(i),l=b(o,n);return s[o]=l,l}catch(n){return a.error(`Error parsing ${o} data`,n),s[o]=r,r}}export function saveStorage(o,r){if(!c)return;const t=u(o);try{localStorage.setItem(t,JSON.stringify(r)),s[o]=r;const e={exhibitors:r.exhibitors.length,events:r.events.length};r.speakers&&(e.speakers=r.speakers.length),r.booths&&(e.booths=r.booths.length),a.log(`save${o[0].toUpperCase()+o.slice(1)}ToLocalStorage`,e)}catch(e){a.error(`Failed to save ${o} data`,e)}}export function getBookmarkStorage(){return getStorage("bookmarked")}export function getVisitedStorage(){return getStorage("visited")}export function saveBookmarkStorage(o){saveStorage("bookmarked",o)}export function saveVisitedStorage(o){saveStorage("visited",o)}
1
+ import{eventScopedCache as b}from"../tools/event-scoped-cache.js";import a from"../tools/logger";import h from"../tools/settings";import{isLocalStorageAvailable as c}from"./localStorage";const s=b();function u(e){return`${h.EXPO}-${e}`}function x(e){return e}function g(e){return e==="bookmarked"?{exhibitors:[],events:[],speakers:[],booths:[]}:{exhibitors:[],events:[]}}function k(e,o){if(o==null||typeof o!="object")return a.log(`Invalid ${e} data in localStorage - using defaults`),g(e);if(Array.isArray(o)){const t=e==="bookmarked"?{exhibitors:o,events:[],speakers:[],booths:[]}:{exhibitors:o,events:[]};return a.log(`Migrated ${e} data from array to object format`),saveStorage(e,t),t}if(e==="bookmarked"){const t=o,r={...t};return"speakers"in r||(r.speakers=[]),"booths"in r||(r.booths=[]),(!t.speakers||!t.booths)&&(a.log(`Migrated ${e} data (added speakers or booths field)`),saveStorage(e,r)),r}return e==="visited"?o:(a.log(`Unsupported ${e} data format - using defaults`),g(e))}export function getStorage(e){const o=s().get(e);if(o)return o;const t=g(e);if(!c)return a.warn(`localStorage unavailable \u2014 using default for ${e}`),s().set(e,t),t;const r=u(e),f=e;let i=null;try{i=localStorage.getItem(r)??localStorage.getItem(f)}catch(n){a.warn(`localStorage access error for ${e}`,n)}if(!i)return s().set(e,t),t;try{const n=JSON.parse(i),l=k(e,n);return s().set(e,l),l}catch(n){return a.error(`Error parsing ${e} data`,n),s().set(e,t),t}}export function saveStorage(e,o){if(!c)return;const t=u(e);try{localStorage.setItem(t,JSON.stringify(o)),s().set(e,o);const r={exhibitors:o.exhibitors.length,events:o.events.length};o.speakers&&(r.speakers=o.speakers.length),o.booths&&(r.booths=o.booths.length),a.log(`save${e[0].toUpperCase()+e.slice(1)}ToLocalStorage`,r)}catch(r){a.error(`Failed to save ${e} data`,r)}}export function getBookmarkStorage(){return getStorage("bookmarked")}export function getVisitedStorage(){return getStorage("visited")}export function saveBookmarkStorage(e){saveStorage("bookmarked",e)}export function saveVisitedStorage(e){saveStorage("visited",e)}
@@ -1 +1 @@
1
- import{haversineDistance as m,lineCenter as x,lineLength as d,pointDistance as v,projectGpsToLocal as b,projectLocalToGps as G}from"@expofp/geometry";import{fpGeo as y}from"../data/fpGeo";import p from"../tools/logger";import{planBearing as L}from"./planBearing";function c(e){return[{local:{x:e.p0.x,y:e.p0.y},geo:{lat:e.p0.lat,lng:e.p0.lng}},{local:{x:e.p2.x,y:e.p2.y},geo:{lat:e.p2.lat,lng:e.p2.lng}}]}export function isValidPointCoords(e){return typeof e=="number"&&Number.isFinite(e)}export function convertGpsToLocal({lat:e,lng:n,angle:o},l){if(!(isValidPointCoords(e)&&isValidPointCoords(n)))return null;let{p0:t,p2:r}=l;const i=m(t,r);if(!isValidPointCoords(i)||i<=0)return p.warn("Invalid GPS config: zero or negative distance",{fullGpsDistance:i,p0:t,p2:r}),null;const[s,u]=c(l);let a=b({lat:e,lng:n},s,u),g=d({p0:a,p1:x({p0:t,p1:r})}),f=v(t,r);return g>5*f?(p.warn("Current position too far"),null):{...a,angle:o}}export function convertLocalToGps(e,n,o){const[l,t]=c(o),{lat:r,lng:i}=G({x:e,y:n},l,t);return[i,r]}export function calculateRelativeBearing(e){const n=y?.properties?.config,o=n?L(n.p0,n.p2):NaN,l=Number.isFinite(o)?o:n?.bearing??0;return e?.angle===null?0:(((e.angle-l)%360+360)%360-90+360)%360}
1
+ import{haversineDistance as m,lineCenter as x,lineLength as d,pointDistance as v,projectGpsToLocal as b,projectLocalToGps as G}from"@expofp/geometry";import{getFpGeo as y}from"../data/fpGeo.js";import p from"../tools/logger";import{planBearing as L}from"./planBearing";function c(e){return[{local:{x:e.p0.x,y:e.p0.y},geo:{lat:e.p0.lat,lng:e.p0.lng}},{local:{x:e.p2.x,y:e.p2.y},geo:{lat:e.p2.lat,lng:e.p2.lng}}]}export function isValidPointCoords(e){return typeof e=="number"&&Number.isFinite(e)}export function convertGpsToLocal({lat:e,lng:n,angle:o},l){if(!(isValidPointCoords(e)&&isValidPointCoords(n)))return null;let{p0:t,p2:r}=l;const i=m(t,r);if(!isValidPointCoords(i)||i<=0)return p.warn("Invalid GPS config: zero or negative distance",{fullGpsDistance:i,p0:t,p2:r}),null;const[s,u]=c(l);let a=b({lat:e,lng:n},s,u),g=d({p0:a,p1:x({p0:t,p1:r})}),f=v(t,r);return g>5*f?(p.warn("Current position too far"),null):{...a,angle:o}}export function convertLocalToGps(e,n,o){const[l,t]=c(o),{lat:r,lng:i}=G({x:e,y:n},l,t);return[i,r]}export function calculateRelativeBearing(e){const n=y()?.properties?.config,o=n?L(n.p0,n.p2):NaN,l=Number.isFinite(o)?o:n?.bearing??0;return e?.angle===null?0:(((e.angle-l)%360+360)%360-90+360)%360}
@@ -0,0 +1,20 @@
1
+ import { autorun, type IReactionOptions, type IReactionPublic, type IWhenOptions } from 'mobx';
2
+ /**
3
+ * `autorun`, `reaction` and `when` whose disposers belong to the live plan.
4
+ *
5
+ * A reaction created while a plan is loading stays subscribed to the store
6
+ * instance it first read, so one left undisposed survives
7
+ * `unstable_destroy()` — it pins the dead event's graph in memory and keeps
8
+ * writing to storage on its behalf, while never seeing the next plan
9
+ * (ADR-0011; spike finding in
10
+ * `docs/2026-08-27-plan-swap-proxy-spike-verdict.md`).
11
+ *
12
+ * Use these anywhere the plan's own construction creates a reaction: the store
13
+ * constructors, `store/init/*`, `floorplan.ready`, the drawing config. React
14
+ * components keep using plain MobX — unmount disposes them.
15
+ */
16
+ export declare function planAutorun(...args: Parameters<typeof autorun>): void;
17
+ export declare function planReaction<T>(expression: (r: IReactionPublic) => T, effect: (argument: T, r: IReactionPublic) => void, options?: IReactionOptions): void;
18
+ /** A `when` that fires once, and is disposed unfired if the plan goes first. */
19
+ export declare function planWhen(predicate: () => boolean, effect: () => void, options?: IWhenOptions): void;
20
+ //# sourceMappingURL=plan-reactions.d.ts.map
@@ -0,0 +1 @@
1
+ import{autorun as e,reaction as i,when as p}from"mobx";import{registerPlanDisposer as t}from"../plan-lifecycle.js";export function planAutorun(...n){t(e(...n))}export function planReaction(n,o,r){t(i(n,o,r))}export function planWhen(n,o,r){t(p(n,o,r))}
@@ -1,4 +1,11 @@
1
1
  import { type RawExhibitor } from '@expofp/schema';
2
- declare var exhibitor: RawExhibitor;
3
- export default exhibitor;
2
+ /**
3
+ * `?__data=` / `?__lzdata=` — platform-editor glue: the exhibitor editor opens the floor plan
4
+ * with the draft exhibitor inlined in the URL (plain or lz-compressed JSON). Not part of the
5
+ * public URL grammar, stays a direct read (retirement plan §4.11).
6
+ *
7
+ * Read per call rather than at module load: a host that swaps plans changes the URL under us,
8
+ * and the draft exhibitor belongs to whichever event is being loaded now (ADR-0011).
9
+ */
10
+ export default function getPreviewExhibitor(): RawExhibitor | null;
4
11
  //# sourceMappingURL=preview-exhibitor.d.ts.map
@@ -1 +1 @@
1
- import o from"./lz-utils";const t=new URL(window.location.href);var a=null;const s=t.searchParams.get("__data");if(s)a=JSON.parse(s).exhibitors[0];else{const e=t.searchParams.get("__lzdata");if(e){const r=o.decompress(e);a=JSON.parse(r).exhibitors[0]}}export default a;
1
+ import a from"./lz-utils";export default function i(){const t=new URL(window.location.href).searchParams,r=t.get("__data");if(r)return JSON.parse(r).exhibitors[0];const e=t.get("__lzdata");return e?JSON.parse(a.decompress(e)).exhibitors[0]:null}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A stable object that forwards every operation to whatever instance is live
3
+ * at the moment of access — the mechanism behind the one-live-plan contract
4
+ * (ADR-0011). Importers hold the proxy forever; a plan swap replaces the
5
+ * instance underneath it, and the dead window between `destroy()` and the next
6
+ * `load()` (when `resolve` yields nothing) makes every access throw rather than
7
+ * silently serve a dead object.
8
+ *
9
+ * MobX 5 tolerates this because its administration lives on the instance and
10
+ * every trap dereferences afresh — proven end-to-end by the spike recorded in
11
+ * `docs/2026-08-27-plan-swap-proxy-spike-verdict.md` and locked in by
12
+ * `store/live-store.spec.tsx`. The one thing it cannot paper over: a reaction
13
+ * created before a swap stays subscribed to the old instance, which is why
14
+ * `destroy()` disposes every reaction it owns.
15
+ *
16
+ * Used by the store barrel (`store/live-store.ts`) and by the event-data
17
+ * bindings that importers hold as objects rather than call as functions —
18
+ * `data/index.ts` and `tools/settings.ts`.
19
+ *
20
+ * Note that proxy identity is not instance identity — `store.uiState` is not
21
+ * `===` the `uiState` export. No store-object identity comparisons exist in
22
+ * `src` today; don't introduce one.
23
+ *
24
+ * @param name How the proxy is known to importers, used in the dead-window error.
25
+ * @param resolve Yields the live instance, or a nullish value while none is.
26
+ */
27
+ export declare function createSwappableProxy<T extends object>(name: string, resolve: () => T | null | undefined): T;
28
+ //# sourceMappingURL=swappable-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ export function createSwappableProxy(s,c){const t=()=>{const r=c();if(!r)throw new Error(`${s} accessed after destroy`);return r};return new Proxy({},{get:(r,e)=>{const n=t();return Reflect.get(n,e,n)},set:(r,e,n)=>{const o=t();return Reflect.set(o,e,n,o)},has:(r,e)=>Reflect.has(t(),e),deleteProperty:(r,e)=>Reflect.deleteProperty(t(),e),ownKeys:()=>Reflect.ownKeys(t()),getOwnPropertyDescriptor:(r,e)=>{const n=Reflect.getOwnPropertyDescriptor(t(),e);return n&&{...n,configurable:!0}},defineProperty:(r,e,n)=>Reflect.defineProperty(t(),e,n),getPrototypeOf:()=>Reflect.getPrototypeOf(t()),setPrototypeOf:(r,e)=>Reflect.setPrototypeOf(t(),e),isExtensible:()=>(t(),!0),preventExtensions:()=>(t(),!1)})}
@@ -1 +1 @@
1
- import{update as d}from"@expofp/renderer";import{createWayfinding as S,resolveWayfindingLayers as g}from"@expofp/wayfinding";import{fpGeo as R}from"../data/fpGeo";import{attachCardinalSnap as v}from"../engine/utils/rotation";import{createCanvasIconProvider as h,createFloorContext as x,createGraphDataSource as k}from"./adapters";import{bindMobxReactions as C}from"./bindMobxReactions";import{createKioskHandler as P}from"./handlers/kioskHandler";import{createYahHandler as W}from"./handlers/yahHandler";let u=null;export function isWayfindingReady(){return u!==null}function w(){if(!u)throw new Error("Wayfinding is not initialized \u2014 call createWayfinding() first.");return u}export function buildRoute(e,n,r){return w().wayfinding.buildRoute(e,n,r)}export function createWayfinding(e){const{scene:n,store:r,canvas:o}=e,c=g(n.rootLayer),{wayfinding:s,dispose:t}=b(r,c,{attachCardinalSnap:v,update:d}),i=c.icons;return i.onClick=f=>M(s,f),i.onPointerMove=f=>y(s,o,f),i.onPointerOut=()=>y(s,o),d(i),()=>{i.onClick=void 0,i.onPointerMove=void 0,i.onPointerOut=void 0,o.current&&(o.current.style.cursor=""),d(i),t()}}function b(e,n,r){const o=k(),c=h({iconMap:e.fp.icons,pixelRatio:devicePixelRatio}),s=x(e.layerStore,e.routeStore),t=S({dataSource:o,renderer:r,iconProvider:c,floorContext:s,layers:n,gpsConfig:R?.properties?.config,screenSpaceIcons:e.uiState.is3DView,onTransitionClick:a=>{a.role==="exit"&&e.layerStore.updateVisibility(a.targetLayer,!0)},onRouteUpdate:(a,p)=>{e.routeStore.updateRoute([...a]),p.isEmpty()||(e.uiState.moveToRect=p)},onRouteDistance:a=>e.routeStore.updateRouteDistance(a)}),i=P({wayfinding:t,kioskIconMap:e.fp.icons}),f=W({wayfinding:t,iconMap:e.fp.icons,pixelRatio:devicePixelRatio,floorContext:s}),m=C({wayfinding:t,kioskHandler:i,yahHandler:f,stores:{routeStore:e.routeStore,uiState:e.uiState,layerStore:e.layerStore}});e.routeStore.showAccessible=o.getLines().some(a=>a.unaccessible);const l={wayfinding:t};return u=l,t.flush(),{wayfinding:t,dispose(){H(l)&&(u=null,e.routeStore.showAccessible=!1),m(),t.destroy()}}}function H(e){return u===e}function M(e,n){e.handleClick([n.def])&&n.stopPropagation()}function y(e,n,r){const o=n.current;if(!o)return;const c=r?e.handleHover([r.def]):!1;o.style.cursor=c?"pointer":""}
1
+ import{update as d}from"@expofp/renderer";import{createWayfinding as g,resolveWayfindingLayers as S}from"@expofp/wayfinding";import{getFpGeo as R}from"../data/fpGeo.js";import{attachCardinalSnap as v}from"../engine/utils/rotation";import{createCanvasIconProvider as h,createFloorContext as x,createGraphDataSource as k}from"./adapters";import{bindMobxReactions as C}from"./bindMobxReactions";import{createKioskHandler as P}from"./handlers/kioskHandler";import{createYahHandler as W}from"./handlers/yahHandler";let u=null;export function isWayfindingReady(){return u!==null}function w(){if(!u)throw new Error("Wayfinding is not initialized \u2014 call createWayfinding() first.");return u}export function buildRoute(e,n,r){return w().wayfinding.buildRoute(e,n,r)}export function createWayfinding(e){const{scene:n,store:r,canvas:o}=e,c=S(n.rootLayer),{wayfinding:s,dispose:i}=b(r,c,{attachCardinalSnap:v,update:d}),t=c.icons;return t.onClick=f=>M(s,f),t.onPointerMove=f=>y(s,o,f),t.onPointerOut=()=>y(s,o),d(t),()=>{t.onClick=void 0,t.onPointerMove=void 0,t.onPointerOut=void 0,o.current&&(o.current.style.cursor=""),d(t),i()}}function b(e,n,r){const o=k(),c=h({iconMap:e.fp.icons,pixelRatio:devicePixelRatio}),s=x(e.layerStore,e.routeStore),i=g({dataSource:o,renderer:r,iconProvider:c,floorContext:s,layers:n,gpsConfig:R()?.properties?.config,screenSpaceIcons:e.uiState.is3DView,onTransitionClick:a=>{a.role==="exit"&&e.layerStore.updateVisibility(a.targetLayer,!0)},onRouteUpdate:(a,p)=>{e.routeStore.updateRoute([...a]),p.isEmpty()||(e.uiState.moveToRect=p)},onRouteDistance:a=>e.routeStore.updateRouteDistance(a)}),t=P({wayfinding:i,kioskIconMap:e.fp.icons}),f=W({wayfinding:i,iconMap:e.fp.icons,pixelRatio:devicePixelRatio,floorContext:s}),m=C({wayfinding:i,kioskHandler:t,yahHandler:f,stores:{routeStore:e.routeStore,uiState:e.uiState,layerStore:e.layerStore}});e.routeStore.showAccessible=o.getLines().some(a=>a.unaccessible);const l={wayfinding:i};return u=l,i.flush(),{wayfinding:i,dispose(){H(l)&&(u=null,e.routeStore.showAccessible=!1),m(),i.destroy()}}}function H(e){return u===e}function M(e,n){e.handleClick([n.def])&&n.stopPropagation()}function y(e,n,r){const o=n.current;if(!o)return;const c=r?e.handleHover([r.def]):!1;o.style.cursor=c?"pointer":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expofp/floorplan",
3
- "version": "3.42.1",
3
+ "version": "3.43.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/expofp/efp-app.git",
@@ -69,22 +69,24 @@
69
69
  "tslib": "^2.3.0",
70
70
  "uuid": "^9.0.1",
71
71
  "zod": "4.4.3",
72
- "@expofp/config": "3.42.1",
73
- "@expofp/debug": "3.42.1",
74
- "@expofp/geometry": "3.42.1",
75
- "@expofp/renderer": "3.42.1",
76
- "@expofp/resolve": "3.42.1",
77
- "@expofp/schema": "3.42.1",
78
- "@expofp/ui": "3.42.1",
79
- "@expofp/utils": "3.42.1",
80
- "@expofp/wayfinding": "3.42.1"
72
+ "@expofp/config": "3.43.1",
73
+ "@expofp/debug": "3.43.1",
74
+ "@expofp/geometry": "3.43.1",
75
+ "@expofp/renderer": "3.43.1",
76
+ "@expofp/resolve": "3.43.1",
77
+ "@expofp/schema": "3.43.1",
78
+ "@expofp/ui": "3.43.1",
79
+ "@expofp/utils": "3.43.1",
80
+ "@expofp/wayfinding": "3.43.1"
81
81
  },
82
82
  "devDependencies": {
83
83
  "@babel/plugin-proposal-decorators": "^8.0.2",
84
84
  "@babel/plugin-transform-class-properties": "^8.0.1",
85
+ "@playwright/test": "^1.62.0",
85
86
  "@sentry/vite-plugin": "^5.4.0",
86
87
  "@types/color": "^3.0.7",
87
88
  "@types/d3": "^7.1.0",
89
+ "@types/d3-ease": "^3.0.2",
88
90
  "@types/d3-selection": "^3.0.11",
89
91
  "@types/dateformat": "^3.0.1",
90
92
  "@types/history": "^4.7.11",
@@ -116,6 +118,26 @@
116
118
  "typecheck"
117
119
  ],
118
120
  "command": "node scripts/minify-dir.js packages/floorplan/dist/esm"
121
+ },
122
+ "test-plan-swap": {
123
+ "dependsOn": [
124
+ "build-browser"
125
+ ],
126
+ "command": "playwright test --project=swap",
127
+ "options": {
128
+ "cwd": "{projectRoot}"
129
+ },
130
+ "cache": false
131
+ },
132
+ "test-plan-swap-memory": {
133
+ "dependsOn": [
134
+ "build-browser"
135
+ ],
136
+ "command": "playwright test --project=memory",
137
+ "options": {
138
+ "cwd": "{projectRoot}"
139
+ },
140
+ "cache": false
119
141
  }
120
142
  }
121
143
  }
@@ -1,48 +0,0 @@
1
- (function() {
2
- try {
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.42.1" };
5
- var t = new e.Error().stack;
6
- t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "820cbec4-e0c2-48fc-bbad-14637e5e7668", e._sentryDebugIdIdentifier = "sentry-dbid-820cbec4-e0c2-48fc-bbad-14637e5e7668");
7
- } catch {}
8
- })();
9
- import { r as e } from "./rolldown-runtime-BiAnyumg.js";
10
- import { t } from "./react-CV1gH7Zp.js";
11
- import { t as n } from "./jsx-runtime-BXbSNrYY.js";
12
- import { At as r, B as i, c as a, et as o } from "./store-DKVnQzpY.js";
13
- import { t as s } from "./index.module-CXN9GK4C.js";
14
- import { n as c } from "./mobx-BQA2EJH7.js";
15
- import { n as l } from "./camera-events-CJhSKz2q.js";
16
- import { t as u } from "./KioskStore-BJwAcVii.js";
17
- //#region src/components/Kiosk/SetKioskMode.tsx
18
- var d = /* @__PURE__ */ e(t(), 1), f = n(), p = s(() => {
19
- var e, t, n;
20
- c(() => {
21
- Promise.resolve().then(() => u.handleSetupReady());
22
- }), (0, d.useEffect)(() => {
23
- var e;
24
- let t = (e = i()) == null ? void 0 : e.state();
25
- t && u.setInitialPtScale(t.pixelSize);
26
- }, []), (0, d.useEffect)(() => (r((e) => u.handleClick(e)), () => r()), []), (0, d.useEffect)(() => l(() => u.handleNavigationChange()), []);
27
- let s = !!u.kiosk;
28
- return /* @__PURE__ */ (0, f.jsx)(o, {
29
- isSaveDisabled: !s || !u.hasUnsavedChanges,
30
- isDeleteDisabled: !s,
31
- areControlsDisabled: !s,
32
- confirmOnClose: s ? u.hasUnsavedChanges : !1,
33
- angle: ((e = u.kiosk) == null ? void 0 : e.heading) || 0,
34
- uiScale: ((t = u.kiosk) == null ? void 0 : t.uiScale) || a.uiState.uiScale,
35
- minUiScale: a.uiState.minUIScale,
36
- maxUiScale: a.uiState.maxUIScale,
37
- uiScaleStep: .01,
38
- iconSizePercent: ((n = u.kiosk) == null ? void 0 : n.iconSizePercent) || 100,
39
- isInfoVisible: !s,
40
- statusMessages: u.statusMessages,
41
- onClose: () => u.handleClose(),
42
- onDelete: () => u.handleDelete(),
43
- onSave: () => u.handleSave(),
44
- onChange: (e) => u.handleChange(e)
45
- });
46
- });
47
- //#endregion
48
- export { p as default };
@@ -1,34 +0,0 @@
1
- (function() {
2
- try {
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.42.1" };
5
- var t = new e.Error().stack;
6
- t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "639f50a3-678a-425c-a0b0-8daa6c119b22", e._sentryDebugIdIdentifier = "sentry-dbid-639f50a3-678a-425c-a0b0-8daa6c119b22");
7
- } catch {}
8
- })();
9
- import { w as e, y as t } from "./i18n-BAQekIFF.js";
10
- import { c as n } from "./store-DKVnQzpY.js";
11
- import { t as r } from "./kiosk-record-CaWjqNGY.js";
12
- //#region src/components/Kiosk/integrateKiosk.ts
13
- function i(e, i) {
14
- e && t(() => {
15
- var t;
16
- if (n.uiState.setKioskData(e), n.uiState.kiosk = i, n.maplibreStore.showMaplibre) return;
17
- let a = e.mapCenterX != null && e.mapCenterY != null;
18
- n.uiState.setMapSettings({
19
- centerxy: a ? `${e.mapCenterX},${e.mapCenterY}` : "",
20
- z: (t = e.z) == null ? void 0 : t,
21
- bearing: e.mapRollDegrees
22
- });
23
- let o = r(e);
24
- o !== void 0 && n.uiState.changeZoom(o);
25
- });
26
- }
27
- function a(t) {
28
- t && (t.z != null && n.fp.activateFloor({ name: t.z.toString() }), e(() => !!n.uiState.selectedRoute, () => {
29
- let e = n.uiState.selectedRoute;
30
- e != null && e.to && !e.from && n.routeStore.selectRoute(e, !1, !0);
31
- }));
32
- }
33
- //#endregion
34
- export { a as n, i as t };