@expofp/floorplan 3.42.1 → 3.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/{Button-CFOilpWS.js → Button-Bs_UxgiQ.js} +6 -6
- package/dist/browser/{CookieConsent-7xtFQUAC.js → CookieConsent-Dyu43_hP.js} +8 -8
- package/dist/browser/{Debug-Ccq8j5HJ.js → Debug-BsTTWQvE.js} +10 -10
- package/dist/browser/{DebugTools-dIItZaUb.js → DebugTools-aXs-5eza.js} +7 -7
- package/dist/browser/{Demo-waaMiBvy.js → Demo-B-7KGDMJ.js} +13 -13
- package/dist/browser/{Free-DdCaOZ8Q.js → Free-CNL5OIgo.js} +16 -15
- package/dist/browser/{GalleryContainer-DlucEORI.js → GalleryContainer-vKUdXOJc.js} +470 -469
- package/dist/browser/{GpsLoader-cqPoX_Zr.js → GpsLoader-CTx41t_T.js} +40 -37
- package/dist/browser/{KioskStore-BJwAcVii.js → KioskStore-DryCUldq.js} +52 -48
- package/dist/browser/{store-DKVnQzpY.js → LayerStore-KA0vMV1s.js} +21374 -31265
- package/dist/browser/{MaplibreAdapter-BZD4cOe-.js → MaplibreAdapter-VThms9qo.js} +290 -285
- package/dist/browser/{ModalContainer-BSvSFPr9.js → ModalContainer-BnQWgJFk.js} +11 -11
- package/dist/browser/{PermissionNotice-DXt-j2f7.js → PermissionNotice-C6o0LjTv.js} +7 -7
- package/dist/browser/RouteStore-dygrca38.js +1203 -0
- package/dist/browser/SetKioskMode-BlUF1qvU.js +50 -0
- package/dist/browser/{ShowKiosk-BhS74u62.js → ShowKiosk-DFoRzTZf.js} +18 -17
- package/dist/browser/UIState-DOeFZ2L0.js +2026 -0
- package/dist/browser/{ViewerMenuPanel-BYTeVxTR.js → ViewerMenuPanel-BTQx7alw.js} +25 -24
- package/dist/browser/{add-debug-secret-listener-B3Oo6_V2.js → add-debug-secret-listener-DEG-kL4W.js} +1 -1
- package/dist/browser/{adopt-global-settings-Yr-a_0F-.js → adopt-global-settings-CbCj9y4x.js} +10 -10
- package/dist/browser/{boolean-editor-BA7H18pG.js → boolean-editor-MewBldvq.js} +10 -10
- package/dist/browser/{bootIntercom-BEZV9AQ2.js → bootIntercom-Dhf8kEsO.js} +3 -3
- package/dist/browser/bundle.json +110 -71
- package/dist/browser/{camera-events-CJhSKz2q.js → camera-events-BGPhoW-g.js} +1 -1
- package/dist/browser/{classnames-D4c_D7C1.js → classnames-CjOzT3Et.js} +2 -2
- package/dist/browser/{client-DGjMk9A1.js → client-B7ipF6CH.js} +6 -6
- package/dist/browser/{components-MaSv6j2M.js → components-z1AUvMqv.js} +1245 -1228
- package/dist/browser/create-live-plan-BV3wMQvQ.js +3650 -0
- package/dist/browser/{debug-context-C2PWyEVT.js → debug-context-DHcoFmUh.js} +6 -6
- package/dist/browser/{debug-overlay-BXHh1LRW.js → debug-overlay-DyWRfHNB.js} +11 -11
- package/dist/browser/{debug-ui-CO-3GLEU.js → debug-ui--YQc14iG.js} +7 -7
- package/dist/browser/{dimming-kPNlXUew.js → dimming-B3eCxIBl.js} +277 -270
- package/dist/browser/{dist-DEm0E-fN.js → dist-CFpNRHGA.js} +6 -6
- package/dist/browser/{dist-3gOjtf_f.js → dist-DZnPa7Gt.js} +3 -3
- package/dist/browser/{dist-B3PLpTVy.js → dist-d1mv4aS_.js} +7 -7
- package/dist/browser/{efp-debug-init-DkOOpU1g.js → efp-debug-init-Fe6M60if.js} +4 -4
- package/dist/browser/{enum-editor-DPAX_cAI.js → enum-editor-Bpqhj_kX.js} +5 -5
- package/dist/browser/{es5-CpN6LQeU.js → es5-Tm811jgW.js} +2 -2
- package/dist/browser/{event-head-oYEDbvk3.js → event-head-DUUPR6gG.js} +1 -1
- package/dist/browser/{event-not-found-C7GLCJX7.js → event-not-found-payUnjNK.js} +4 -4
- package/dist/browser/event-scoped-cache-C5u7vr_A.js +22 -0
- package/dist/browser/{exports-3uPTDFG9.js → exports-DqGDS1fu.js} +1 -1
- package/dist/browser/{favicon-CQpg641Z.js → favicon-DsfOrGNO.js} +1 -1
- package/dist/browser/{fetch-retry.umd-Chmlkexp.js → fetch-retry.umd-CC5xe8w5.js} +2 -2
- package/dist/browser/{flex--99NWgQk.js → flex-CezZmi5f.js} +6 -6
- package/dist/browser/{floorplan.loader-Ci226yql.js → floorplan.loader-Dlxv8xv-.js} +658 -707
- package/dist/browser/{floorplan.ready-y0hYLknK.js → floorplan.ready-Bet-4Pmf.js} +373 -359
- package/dist/browser/freeBanner-D8r4eSMx.js +31 -0
- package/dist/browser/{fuse-BuFi3LTO.js → fuse-hqr4jkDB.js} +2 -2
- package/dist/browser/{i18n-BAQekIFF.js → i18n-CbKfwktv.js} +1821 -3872
- package/dist/browser/index.js +131 -47
- package/dist/browser/{index.module-CXN9GK4C.js → index.module-BbVqiHXM.js} +17 -17
- package/dist/browser/init-ui-BqvkD2nz.js +286 -0
- package/dist/browser/integrateKiosk-DaSOYn36.js +35 -0
- package/dist/browser/{loadImage-xbueiJmr.js → is-debug-dWXc5YUy.js} +30 -14
- package/dist/browser/{is-own-domain-DPJZoBiw.js → is-own-domain-D8anlQ_Q.js} +1 -1
- package/dist/browser/{is-webview-Bs8mxX94.js → is-webview-fqXWp538.js} +1 -1
- package/dist/browser/{jsx-runtime-BXbSNrYY.js → jsx-runtime-DO7PmxNL.js} +2 -2
- package/dist/browser/kiosk-mode-7b7iDbkP.js +33 -0
- package/dist/browser/{kiosk-record-CaWjqNGY.js → kiosk-record-UJxF1fjj.js} +1 -1
- package/dist/browser/kioskApi-CgpMBKhv.js +440 -0
- package/dist/browser/{lib-jJ4yMeEA.js → lib-Czk5Lszd.js} +3 -3
- package/dist/browser/loadImage-CFo9-YJJ.js +17 -0
- package/dist/browser/{logDeviceInfo-DSmmt_FU.js → logDeviceInfo-DJjhYuqu.js} +9 -9
- package/dist/browser/{mobx-BQA2EJH7.js → mobx-C81AIECP.js} +11 -11
- package/dist/browser/mobx.module-CWCYJWja.js +2064 -0
- package/dist/browser/{optional-boolean-editor-Y_exy4JL.js → optional-boolean-editor-B62ChR7X.js} +4 -4
- package/dist/browser/{optional-enum-editor-CKfj0OB9.js → optional-enum-editor-BBO6A0hj.js} +5 -5
- package/dist/browser/{optional-string-editor-DeavwcWv.js → optional-string-editor-7Q9UPGmg.js} +5 -5
- package/dist/browser/{particles.min-BJkirBpN.js → particles.min-BKHVPr2d.js} +2 -2
- package/dist/browser/{react-CV1gH7Zp.js → react-Cg2OORRh.js} +2 -2
- package/dist/browser/{react-dom-BEwgcqEB.js → react-dom-Ty-lfgLt.js} +3 -3
- package/dist/browser/{rolldown-runtime-BiAnyumg.js → rolldown-runtime-CWnoF_DQ.js} +1 -1
- package/dist/browser/scene-C5l_d13f.js +108 -0
- package/dist/browser/{scheduler-CcNpP8xn.js → scheduler-BU0IIfqL.js} +2 -2
- package/dist/browser/{select-B13QBWfy.js → select-BzHMeDb4.js} +11 -11
- package/dist/browser/{settings-DJUw3GyU.js → settings-BtJgR42s.js} +2 -2
- package/dist/browser/{settings-item-VzMuDMX6.js → settings-item-DdFFETI3.js} +7 -7
- package/dist/browser/store-BTr1tlEV.js +58 -0
- package/dist/browser/{string-editor-B6mio7nq.js → string-editor-BEEQ6kcc.js} +5 -5
- package/dist/browser/{text-field-7dZmg829.js → text-field-DoMqPokj.js} +6 -6
- package/dist/browser/{theme-BotlxmwW.js → theme-BvRXg3tc.js} +9 -9
- package/dist/browser/{ui-Dn5rbA7O.js → ui-CjqBOwnM.js} +9 -9
- package/dist/browser/{useRenderTarget-Rz0x5k4l.js → useRenderTarget-CaMfMKd3.js} +5 -5
- package/dist/browser/{viewport-DOIlU3cR.js → viewport-D1DrneSN.js} +4 -3
- package/dist/browser/wayfinding-BFQ3ZTEN.js +2322 -0
- package/dist/esm/components/GalleryContainer.js +1 -1
- package/dist/esm/components/Kiosk/integrateKiosk.js +1 -1
- package/dist/esm/components/LogoOverlay.js +1 -1
- package/dist/esm/components/Map/Map.js +1 -1
- package/dist/esm/components/Map/MapCamera.js +1 -1
- package/dist/esm/components/Map/booth-by-xy.d.ts +8 -10
- package/dist/esm/components/Map/booth-by-xy.js +1 -1
- package/dist/esm/components/Map/drawing/config/BoothShape.d.ts +0 -1
- package/dist/esm/components/Map/drawing/config/BoothShape.js +1 -1
- package/dist/esm/components/Map/drawing/config/config-booth-bg.js +1 -1
- package/dist/esm/components/Map/drawing/config/config-booth-bookmark.js +1 -1
- package/dist/esm/components/Map/drawing/config/config-booth-border.js +1 -1
- package/dist/esm/components/Map/drawing/config/config-booth-labels-special.js +2 -2
- package/dist/esm/components/Map/drawing/config/config-booth-labels.js +1 -1
- package/dist/esm/components/Map/drawing/config/config-booths.js +1 -1
- package/dist/esm/components/Map/drawing/config/config-markers.js +1 -1
- package/dist/esm/components/Map/drawing/config/layer-images.d.ts +7 -2
- package/dist/esm/components/Map/drawing/config/layer-images.js +1 -1
- package/dist/esm/components/Map/traffic/useManageTraffic.js +1 -1
- package/dist/esm/components/Maplibre/MaplibreAdapter.js +1 -1
- package/dist/esm/components/Maplibre/useCameraReactions.js +1 -1
- package/dist/esm/components/Maplibre/utils/geo-config.js +1 -1
- package/dist/esm/components/Maplibre/utils/map-helpers.js +1 -1
- package/dist/esm/components/Menu.js +1 -1
- package/dist/esm/data/fpGeo.d.ts +6 -1
- package/dist/esm/data/fpGeo.js +1 -1
- package/dist/esm/data/index.d.ts +9 -4
- package/dist/esm/data/index.js +1 -1
- package/dist/esm/data/svg.d.ts +15 -13
- package/dist/esm/data/svg.js +1 -1
- package/dist/esm/floorplan.loader.d.ts +6 -1
- package/dist/esm/floorplan.loader.js +1 -1
- package/dist/esm/floorplan.ready.d.ts +8 -2
- package/dist/esm/floorplan.ready.js +1 -1
- package/dist/esm/load.js +11 -11
- package/dist/esm/plan-lifecycle.d.ts +65 -0
- package/dist/esm/plan-lifecycle.js +1 -0
- package/dist/esm/services/URLFilterManager.js +1 -1
- package/dist/esm/services/url-dispatch.js +1 -1
- package/dist/esm/services/url-sync.d.ts +5 -1
- package/dist/esm/services/url-sync.js +1 -1
- package/dist/esm/store/MaplibreStore.js +1 -1
- package/dist/esm/store/OverlayStore.d.ts +15 -2
- package/dist/esm/store/OverlayStore.js +1 -1
- package/dist/esm/store/RouteStore.js +1 -1
- package/dist/esm/store/UIState.js +1 -1
- package/dist/esm/store/create-live-plan.d.ts +13 -0
- package/dist/esm/store/create-live-plan.js +1 -0
- package/dist/esm/store/index.d.ts +2 -13
- package/dist/esm/store/index.js +1 -1
- package/dist/esm/store/init/init-booths.js +1 -1
- package/dist/esm/store/init/init-events.js +1 -1
- package/dist/esm/store/init/init-exhibitors.js +1 -1
- package/dist/esm/store/init/init-layers.js +1 -1
- package/dist/esm/store/init/init-speakers.js +1 -1
- package/dist/esm/store/init/init-ui.d.ts +4 -6
- package/dist/esm/store/init/init-ui.js +1 -1
- package/dist/esm/store/live-store.d.ts +19 -0
- package/dist/esm/store/live-store.js +1 -0
- package/dist/esm/store/search-buttons/SearchButtonsStore.js +1 -1
- package/dist/esm/tools/event-scoped-cache.d.ts +13 -0
- package/dist/esm/tools/event-scoped-cache.js +1 -0
- package/dist/esm/tools/gtag.d.ts +15 -1
- package/dist/esm/tools/gtag.js +1 -1
- package/dist/esm/tools/reset.js +1 -1
- package/dist/esm/tools/settings.d.ts +7 -2
- package/dist/esm/tools/settings.js +1 -1
- package/dist/esm/tools/slug.js +1 -1
- package/dist/esm/tools/style-registry.d.ts +28 -0
- package/dist/esm/tools/style-registry.js +1 -0
- package/dist/esm/tools/track-event.js +1 -1
- package/dist/esm/types.d.ts +7 -1
- package/dist/esm/utils/entity-storage.js +1 -1
- package/dist/esm/utils/gps.js +1 -1
- package/dist/esm/utils/plan-reactions.d.ts +20 -0
- package/dist/esm/utils/plan-reactions.js +1 -0
- package/dist/esm/utils/preview-exhibitor.d.ts +9 -2
- package/dist/esm/utils/preview-exhibitor.js +1 -1
- package/dist/esm/utils/swappable-proxy.d.ts +28 -0
- package/dist/esm/utils/swappable-proxy.js +1 -0
- package/dist/esm/wayfinding/createWayfinding.js +1 -1
- package/package.json +32 -10
- package/dist/browser/SetKioskMode-CCZNdKum.js +0 -48
- package/dist/browser/integrateKiosk-DjIKsfAy.js +0 -34
|
@@ -26,6 +26,11 @@ declare class Settings extends FpSettings {
|
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
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);
|
package/dist/esm/tools/slug.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
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{
|
|
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))}}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|
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)}
|
package/dist/esm/utils/gps.js
CHANGED
|
@@ -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{
|
|
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
|
-
|
|
3
|
-
|
|
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
|
|
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
|
|
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.
|
|
3
|
+
"version": "3.43.0",
|
|
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.
|
|
73
|
-
"@expofp/debug": "3.
|
|
74
|
-
"@expofp/geometry": "3.
|
|
75
|
-
"@expofp/renderer": "3.
|
|
76
|
-
"@expofp/resolve": "3.
|
|
77
|
-
"@expofp/schema": "3.
|
|
78
|
-
"@expofp/ui": "3.
|
|
79
|
-
"@expofp/utils": "3.
|
|
80
|
-
"@expofp/wayfinding": "3.
|
|
72
|
+
"@expofp/config": "3.43.0",
|
|
73
|
+
"@expofp/debug": "3.43.0",
|
|
74
|
+
"@expofp/geometry": "3.43.0",
|
|
75
|
+
"@expofp/renderer": "3.43.0",
|
|
76
|
+
"@expofp/resolve": "3.43.0",
|
|
77
|
+
"@expofp/schema": "3.43.0",
|
|
78
|
+
"@expofp/ui": "3.43.0",
|
|
79
|
+
"@expofp/utils": "3.43.0",
|
|
80
|
+
"@expofp/wayfinding": "3.43.0"
|
|
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 };
|