@expofp/floorplan 3.3.8 → 3.4.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 (200) hide show
  1. package/dist/browser/{CookieConsent-DhAS93Nm.js → CookieConsent-DfcrHJE4.js} +8 -8
  2. package/dist/browser/{Debug-DciNEVl6.js → Debug-CmqdoArn.js} +7 -7
  3. package/dist/browser/{Demo-Dh3K6IRU.js → Demo-Hoy_N0Z_.js} +11 -11
  4. package/dist/browser/{Free-BHUzZwj9.js → Free-CT6O_Rnj.js} +11 -11
  5. package/dist/browser/{Gallery-C0nPxxJB.js → Gallery-BljmDte7.js} +10 -10
  6. package/dist/browser/{GpsLoader-De8VPIEW.js → GpsLoader-gAQ2jImu.js} +49 -49
  7. package/dist/browser/{KioskStore-D1jnGTbv.js → KioskStore-pVMWw1SV.js} +31 -31
  8. package/dist/browser/MaplibreAdapter-BSNFyqqO.js +35131 -0
  9. package/dist/browser/{Modal-D8kuOldj.js → Modal-vx2GyFQU.js} +10 -10
  10. package/dist/browser/{PermissionNotice-v9vhrWnr.js → PermissionNotice-dzFosoL5.js} +7 -7
  11. package/dist/browser/{SetKioskMode-D2cDGv9V.js → SetKioskMode-DpKxhNjj.js} +21 -21
  12. package/dist/browser/ShowKiosk-DK4cf8sZ.js +26 -0
  13. package/dist/browser/{TouchHand-hrkQyTE4.js → TouchHand-DJqTFALN.js} +4 -4
  14. package/dist/browser/{ViewerMenuPanel-BVfEToAO.js → ViewerMenuPanel-BLMOVmrA.js} +13 -13
  15. package/dist/browser/{add-debug-secret-listener-CdWQ5IqR.js → add-debug-secret-listener-lzYkiNT3.js} +1 -1
  16. package/dist/browser/{boolean-editor-D24_ATfB.js → boolean-editor-BIo7t1o3.js} +10 -10
  17. package/dist/browser/{bootIntercom-DSRi4yws.js → bootIntercom-_8PT4FQ5.js} +2 -2
  18. package/dist/browser/{box-BXDPYk7M.js → box-ClFQfPBk.js} +5 -5
  19. package/dist/browser/{browser-Dk-lVBqy.js → browser-CNl61l-H.js} +2 -2
  20. package/dist/browser/bundle.json +61 -64
  21. package/dist/browser/{classnames-DNY5NR54.js → classnames-CzOdLC35.js} +2 -2
  22. package/dist/browser/{client-CWN096Nx.js → client-uxC45MrM.js} +4 -4
  23. package/dist/browser/components-rG8z7y3m.js +6300 -0
  24. package/dist/browser/createWayfinding-BnWXhjaY.js +1889 -0
  25. package/dist/browser/{debug-overlay-DQG-UfZv.js → debug-overlay-hexy4zxM.js} +15 -16
  26. package/dist/browser/{debug-ui-yYN-_8G_.js → debug-ui-DTEjq_eB.js} +18 -14
  27. package/dist/browser/{dist-uPMox8hh.js → dist-Cv_TFco-.js} +6 -6
  28. package/dist/browser/{dist-7_sOACbd.js → dist-DZk5xw-4.js} +5 -5
  29. package/dist/browser/{dist-CAs4SFEJ.js → dist-EPpxz8po.js} +3 -3
  30. package/dist/browser/{efp-debug-init-Dwp-psKk.js → efp-debug-init-Bs3FZwZP.js} +5 -4
  31. package/dist/browser/{enum-editor-PV_iv0tr.js → enum-editor-C-CMuvRj.js} +11 -11
  32. package/dist/browser/{event-not-found-BjBg31r7.js → event-not-found-BoO2R7hM.js} +1 -1
  33. package/dist/browser/{exports-lMrT2XbM.js → exports-CaawsP5N.js} +1 -1
  34. package/dist/browser/{favicon-qwrv2N2K.js → favicon-Cfw5edT7.js} +1 -1
  35. package/dist/browser/{fetch-retry.umd-D_06P7tx.js → fetch-retry.umd-BNuFWdhd.js} +2 -2
  36. package/dist/browser/{flex-DMyWG2k5.js → flex-C_CBGYoG.js} +6 -6
  37. package/dist/browser/{flex.props-DJYmgUbO.js → flex.props-BrTX-e6I.js} +2 -2
  38. package/dist/browser/{floorplan.loader-CkEu28br.js → floorplan.loader-BC6HaV0P.js} +298 -299
  39. package/dist/browser/{floorplan.ready-CL42thhp.js → floorplan.ready-DyEjsSpU.js} +256 -256
  40. package/dist/browser/{fuse-BrJpK9Lv.js → fuse-5Y1S2aYX.js} +2 -2
  41. package/dist/browser/{i18n-ST-5I_Xd.js → i18n-CDf6bxFZ.js} +5 -5
  42. package/dist/browser/index.js +12 -13
  43. package/dist/browser/{jsx-runtime-z-VgZsNI.js → jsx-runtime-CQQX82Qz.js} +2 -2
  44. package/dist/browser/{lib-resthkmx.js → lib-D8YEKiMm.js} +4 -4
  45. package/dist/browser/locales/ar.json +0 -1
  46. package/dist/browser/locales/de.json +0 -1
  47. package/dist/browser/locales/es.json +0 -1
  48. package/dist/browser/locales/fr.json +0 -1
  49. package/dist/browser/locales/he.json +0 -1
  50. package/dist/browser/locales/it.json +0 -1
  51. package/dist/browser/locales/kk.json +0 -1
  52. package/dist/browser/locales/ko.json +0 -1
  53. package/dist/browser/locales/mn.json +0 -1
  54. package/dist/browser/locales/nl.json +0 -1
  55. package/dist/browser/locales/pl.json +0 -1
  56. package/dist/browser/locales/pt.json +0 -1
  57. package/dist/browser/locales/ru.json +0 -1
  58. package/dist/browser/locales/sv.json +0 -1
  59. package/dist/browser/locales/th.json +0 -1
  60. package/dist/browser/locales/tr.json +0 -1
  61. package/dist/browser/locales/uk.json +0 -1
  62. package/dist/browser/locales/vi.json +0 -1
  63. package/dist/browser/locales/zh.json +0 -1
  64. package/dist/browser/{main-BOaUt8eX.js → main-DLV6-NmW.js} +1 -1
  65. package/dist/browser/{mobx-BGVJo_6r.js → mobx-BJrcB0Vj.js} +5 -5
  66. package/dist/browser/{particles.min-D3-LD_RC.js → particles.min-MhzX8Iok.js} +2 -2
  67. package/dist/browser/{prop-types-xS5Y65WT.js → prop-types-BQqJiJ_U.js} +2 -2
  68. package/dist/browser/{react-CDDaD-I1.js → react-CsfnOko-.js} +2 -2
  69. package/dist/browser/{react-dom-B1aPQ40g.js → react-dom-l6xfbLNt.js} +3 -3
  70. package/dist/browser/{reset-all-settings-DHgz1Ud7.js → reset-all-settings-Dmpe88yX.js} +13 -10
  71. package/dist/browser/{rolldown-runtime-Bb8iYlSJ.js → rolldown-runtime-BrK3KJzc.js} +1 -1
  72. package/dist/browser/{settings-BD9hHBVE.js → settings-BDwO4gl1.js} +2 -2
  73. package/dist/browser/{settings-item-BMJ0aBEh.js → settings-item-CbJ6ldaB.js} +6 -6
  74. package/dist/browser/{storage-B0mOBJql.js → storage-c5Z4yjiL.js} +5 -3
  75. package/dist/browser/{store-Dyrv6nnP.js → store-D_Y9lFsn.js} +5190 -5623
  76. package/dist/browser/{string-editor-DoAiUhFX.js → string-editor-BOID14bU.js} +8 -8
  77. package/dist/browser/{theme-7rduvM4D.js → theme-Ca3r5e2H.js} +8 -8
  78. package/dist/browser/{ui-CgRQk7e0.js → ui-BTe-W0zP.js} +9 -9
  79. package/dist/browser/{useRenderTarget-rq9Hu7Z3.js → useRenderTarget-CbXuqspA.js} +4 -4
  80. package/dist/esm/_misc_to_move/manifest.d.ts +1 -0
  81. package/dist/esm/components/AlertContainer.d.ts +3 -1
  82. package/dist/esm/components/AlertContainer.js +1 -1
  83. package/dist/esm/components/Booth/Booth.js +1 -1
  84. package/dist/esm/components/Controls.js +1 -1
  85. package/dist/esm/components/EntityItemContainer.d.ts +25 -2
  86. package/dist/esm/components/EntityItemContainer.js +1 -1
  87. package/dist/esm/components/EntityList.js +1 -1
  88. package/dist/esm/components/EntityListRow.d.ts +3 -2
  89. package/dist/esm/components/EntityListRow.js +1 -1
  90. package/dist/esm/components/Exhibitor.js +1 -1
  91. package/dist/esm/components/Kiosk/KioskStore.d.ts +1 -1
  92. package/dist/esm/components/Kiosk/SetKiosk/types.d.ts +1 -1
  93. package/dist/esm/components/Layout.js +1 -1
  94. package/dist/esm/components/LevelSelector.js +1 -1
  95. package/dist/esm/components/LogoOverlay.js +1 -1
  96. package/dist/esm/components/Map/Map.js +1 -1
  97. package/dist/esm/components/Map/drawing/config/config-booth-bg.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-booths.js +1 -1
  100. package/dist/esm/components/Map/drawing/config/config-load-layer.js +1 -1
  101. package/dist/esm/components/Map/traffic/useManageTraffic.js +1 -1
  102. package/dist/esm/components/Maplibre/MaplibreAdapter.d.ts +14 -0
  103. package/dist/esm/components/Maplibre/MaplibreAdapter.js +1 -0
  104. package/dist/esm/components/Maplibre/MaplibreWrapper.d.ts +69 -0
  105. package/dist/esm/components/Maplibre/MaplibreWrapper.js +1 -0
  106. package/dist/esm/components/Maplibre/useCameraReactions.d.ts +10 -0
  107. package/dist/esm/components/Maplibre/useCameraReactions.js +1 -0
  108. package/dist/esm/components/Maplibre/useDimming.d.ts +16 -0
  109. package/dist/esm/components/Maplibre/useDimming.js +1 -0
  110. package/dist/esm/components/Maplibre/useLayerVisibilitySync.d.ts +11 -0
  111. package/dist/esm/components/Maplibre/useLayerVisibilitySync.js +1 -0
  112. package/dist/esm/components/Maplibre/useRendererEvents.d.ts +9 -0
  113. package/dist/esm/components/Maplibre/useRendererEvents.js +1 -0
  114. package/dist/esm/components/Maplibre/useWayfindingAndMarkers.d.ts +8 -0
  115. package/dist/esm/components/Maplibre/useWayfindingAndMarkers.js +1 -0
  116. package/dist/esm/components/Maplibre/utils/geo-config.d.ts +30 -0
  117. package/dist/esm/components/Maplibre/utils/geo-config.js +1 -0
  118. package/dist/esm/components/Maplibre/utils/layer-defs.d.ts +4 -0
  119. package/dist/esm/components/Maplibre/utils/layer-defs.js +1 -0
  120. package/dist/esm/components/Maplibre/utils/map-helpers.d.ts +9 -0
  121. package/dist/esm/components/Maplibre/utils/map-helpers.js +1 -0
  122. package/dist/esm/components/Maplibre/utils/solver.d.ts +24 -0
  123. package/dist/esm/components/Maplibre/utils/solver.js +1 -0
  124. package/dist/esm/components/Speakers.js +1 -1
  125. package/dist/esm/components/index.d.ts +2 -1
  126. package/dist/esm/data/Flags.d.ts +1 -0
  127. package/dist/esm/data/fpGeo.d.ts +20 -1
  128. package/dist/esm/floorplan.loader.d.ts +1 -0
  129. package/dist/esm/floorplan.loader.js +1 -1
  130. package/dist/esm/floorplan.ready.js +1 -1
  131. package/dist/esm/renderer/RendererService.d.ts +5 -0
  132. package/dist/esm/renderer/RendererService.js +1 -1
  133. package/dist/esm/services/routing.js +1 -1
  134. package/dist/esm/store/MaplibreStore.d.ts +22 -0
  135. package/dist/esm/store/MaplibreStore.js +1 -0
  136. package/dist/esm/store/RootStore.d.ts +2 -2
  137. package/dist/esm/store/RootStore.js +1 -1
  138. package/dist/esm/store/RouteStore.js +1 -1
  139. package/dist/esm/store/init/init-booths.js +1 -1
  140. package/dist/esm/types.d.ts +9 -0
  141. package/dist/esm/ui/Alert/Alert.d.ts +1 -1
  142. package/dist/esm/ui/Alert/Alert.js +1 -1
  143. package/dist/esm/ui/EntityItem/EntityItem.d.ts +46 -0
  144. package/dist/esm/ui/EntityItem/EntityItem.js +1 -0
  145. package/dist/esm/ui/EntityItem/index.d.ts +3 -0
  146. package/dist/esm/ui/EntityItem/index.js +1 -0
  147. package/dist/esm/utils/dimming.d.ts +16 -0
  148. package/dist/esm/utils/dimming.js +1 -0
  149. package/dist/esm/utils/isNumericLevel.d.ts +2 -0
  150. package/dist/esm/utils/isNumericLevel.js +1 -0
  151. package/dist/esm/wayfinding/core/position/gpsThreshold.d.ts +1 -1
  152. package/package.json +5 -9
  153. package/dist/browser/Mapbox-CzVyYzjj.js +0 -120
  154. package/dist/browser/ShowKiosk-DjrDUQUM.js +0 -26
  155. package/dist/browser/ThreeComponent-CUKVDY94.js +0 -1494
  156. package/dist/browser/components-D9o158HA.js +0 -8128
  157. package/dist/browser/data-ZH4_sxkL.js +0 -27967
  158. package/dist/browser/vendor/mapbox/mapbox-gl.css +0 -1
  159. package/dist/esm/components/EntityItem.d.ts +0 -44
  160. package/dist/esm/components/EntityItem.js +0 -1
  161. package/dist/esm/components/Mapbox/Button.d.ts +0 -10
  162. package/dist/esm/components/Mapbox/Button.js +0 -1
  163. package/dist/esm/components/Mapbox/Dot.d.ts +0 -10
  164. package/dist/esm/components/Mapbox/Dot.js +0 -1
  165. package/dist/esm/components/Mapbox/MapLoader.d.ts +0 -4
  166. package/dist/esm/components/Mapbox/MapLoader.js +0 -1
  167. package/dist/esm/components/Mapbox/Mapbox.d.ts +0 -4
  168. package/dist/esm/components/Mapbox/Mapbox.js +0 -1
  169. package/dist/esm/components/Mapbox/utils/data.d.ts +0 -38
  170. package/dist/esm/components/Mapbox/utils/data.js +0 -1
  171. package/dist/esm/components/Threejs/ThreeComponent.d.ts +0 -7
  172. package/dist/esm/components/Threejs/ThreeComponent.js +0 -1
  173. package/dist/esm/components/Threejs/UIManager.d.ts +0 -28
  174. package/dist/esm/components/Threejs/UIManager.js +0 -1
  175. package/dist/esm/components/Threejs/common/BoothMesh.d.ts +0 -20
  176. package/dist/esm/components/Threejs/common/BoothMesh.js +0 -1
  177. package/dist/esm/components/Threejs/common/Scene.d.ts +0 -13
  178. package/dist/esm/components/Threejs/common/Scene.js +0 -1
  179. package/dist/esm/components/Threejs/common/SpriteMesh.d.ts +0 -5
  180. package/dist/esm/components/Threejs/common/SpriteMesh.js +0 -1
  181. package/dist/esm/components/Threejs/common/dataLoader.d.ts +0 -31
  182. package/dist/esm/components/Threejs/common/dataLoader.js +0 -1
  183. package/dist/esm/components/Threejs/common/modelLoader.d.ts +0 -3
  184. package/dist/esm/components/Threejs/common/modelLoader.js +0 -1
  185. package/dist/esm/components/Threejs/common/sceneLoader.d.ts +0 -7
  186. package/dist/esm/components/Threejs/common/sceneLoader.js +0 -1
  187. package/dist/esm/components/Threejs/index.d.ts +0 -4
  188. package/dist/esm/components/Threejs/index.js +0 -1
  189. package/dist/esm/components/Threejs/mapbox/configureWebGLForMapbox.d.ts +0 -2
  190. package/dist/esm/components/Threejs/mapbox/configureWebGLForMapbox.js +0 -1
  191. package/dist/esm/components/Threejs/mapbox/index_mapbox.d.ts +0 -4
  192. package/dist/esm/components/Threejs/mapbox/index_mapbox.js +0 -1
  193. package/dist/esm/components/Threejs/mapbox/init-mapbox.d.ts +0 -3
  194. package/dist/esm/components/Threejs/mapbox/init-mapbox.js +0 -1
  195. package/dist/esm/components/Threejs/utils/canvasFromText.d.ts +0 -2
  196. package/dist/esm/components/Threejs/utils/canvasFromText.js +0 -1
  197. package/dist/esm/components/Threejs/utils/textureMerger.d.ts +0 -60
  198. package/dist/esm/components/Threejs/utils/textureMerger.js +0 -1
  199. package/dist/esm/store/MapboxStore.d.ts +0 -13
  200. package/dist/esm/store/MapboxStore.js +0 -1
@@ -1 +1 @@
1
- import E from"./config-booth-bg";import{Rect as f}from"./Rect";import H from"./config-booth-labels";import{SEPARATOR as s}from"../../../../constants";import U from"./config-booth-labels-special";import W from"./config-booth-border";import _ from"./config-booth-bookmark";import K from"../../../../tools/settings";import P,{boothStore as Z,uiState as j}from"../../../../store";import{loadImagesInBatchesById as q}from"../../../../utils/loadImagesInBatches";import{createBoothImg as z,getImageLayerName as F,mapBoothsLogos as G}from"./loadBoothsImages";import{degToRad as J}from"three/src/math/MathUtils";import{createImageDef as M}from"../../../../renderer";export const BOOTHS_CHUNK_SIZE=350;export default function Q(a,I,k){return(h=>{const t=I,p=[],m=[],l=[],g=[],b=[],d=F(t),B={name:d,children:[]};for(const o of h){const r=E(a,o)?.getShape();r&&p.push(...r);const n=H(a,o)?.getShape();n&&m.push(...n);const i=U(a,o)?.getShape();if(i&&l.push(...i),!K.borderless){const e=W(a,o)?.getShape();e&&g.push(e)}const c=_(a,o)?.getShape();c&&b.push(c)}const S=m.filter(o=>o.lines),R=l.filter(o=>o.lines),D=m.filter(o=>o.source),x=l.filter(o=>o.source);if(!j.hideLogoInBooth){const o=G(h);a.onLayerImages(d,async()=>{const r=await q(o,BOOTHS_CHUNK_SIZE),n=[];for(const[i,c]of r){const e=P.boothStore.boothById.get(i);if(!e)continue;const{bounds:{x:L,y:$,height:w,angle:N,width:O},htmlImage:T}=z(e,c),y=M(T,new f({x:L,y:$},{x:L+O,y:$+w},J(N))),A=f.fromCoreRect(e.rect,e.rotate),C=f.inflateRect(A,e.borderWidth||Z.borderWidth);e.shapes.push(y),n.push({shape:y,parentRect:C})}return{layer:B,children:n}})}let u=[];return h.length&&(u=[{name:`${t}${s}boothBackground`,children:p,interactive:!0},{name:`${t}${s}labels`,children:S},{name:`${t}${s}specialLabels`,children:R},{name:`${t}${s}bots`,children:D},{name:`${t}${s}specialDots`,children:x},B,{name:`${t}${s}boothsBookmark`,children:b},{name:`${t}${s}boothBorder`,children:g}]),{name:t,children:u}})(k)}
1
+ import H from"./config-booth-bg";import{Rect as f}from"./Rect";import T from"./config-booth-labels";import{SEPARATOR as s}from"../../../../constants";import U from"./config-booth-labels-special";import W from"./config-booth-border";import _ from"./config-booth-bookmark";import K from"../../../../tools/settings";import P,{boothStore as Z,uiState as j}from"../../../../store";import{toRadians as q}from"../../../../utils/math";import{loadImagesInBatchesById as z}from"../../../../utils/loadImagesInBatches";import{createBoothImg as F,getImageLayerName as G,mapBoothsLogos as J}from"./loadBoothsImages";import{createImageDef as M}from"../../../../renderer";export const BOOTHS_CHUNK_SIZE=350;export default function Q(a,I,k){return(h=>{const t=I,p=[],m=[],l=[],g=[],b=[],d=G(t),B={name:d,children:[]};for(const o of h){const r=H(a,o)?.getShape();r&&p.push(...r);const n=T(a,o)?.getShape();n&&m.push(...n);const i=U(a,o)?.getShape();if(i&&l.push(...i),!K.borderless){const e=W(a,o)?.getShape();e&&g.push(e)}const c=_(a,o)?.getShape();c&&b.push(c)}const S=m.filter(o=>o.lines),R=l.filter(o=>o.lines),D=m.filter(o=>o.source),x=l.filter(o=>o.source);if(!j.hideLogoInBooth){const o=J(h);a.onLayerImages(d,async()=>{const r=await z(o,BOOTHS_CHUNK_SIZE),n=[];for(const[i,c]of r){const e=P.boothStore.boothById.get(i);if(!e)continue;const{bounds:{x:L,y:$,height:w,angle:N,width:O},htmlImage:A}=F(e,c),y=M(A,new f({x:L,y:$},{x:L+O,y:$+w},q(N))),C=f.fromCoreRect(e.rect,e.rotate),E=f.inflateRect(C,e.borderWidth||Z.borderWidth);e.shapes.push(y),n.push({shape:y,parentRect:E})}return{layer:B,children:n}})}let u=[];return h.length&&(u=[{name:`${t}${s}boothBackground`,children:p,interactive:!0},{name:`${t}${s}labels`,children:S},{name:`${t}${s}specialLabels`,children:R},{name:`${t}${s}bots`,children:D},{name:`${t}${s}specialDots`,children:x},B,{name:`${t}${s}boothsBookmark`,children:b},{name:`${t}${s}boothBorder`,children:g}]),{name:t,children:u}})(k)}
@@ -1 +1 @@
1
- import c,{boothStore as C}from"../../../../store";import O from"../../../../store/init/init-booths";import{LayersMode as T}from"../../../../store/LayerStore";import{loadJs as x}from"../../../../tools/loaders";import M,{BOOTHS_CHUNK_SIZE as D}from"./config-booths";import{chunkArray as H}from"../../../../utils";import{BOOTHS_PAINTER_MARKER as k,SEPARATOR as m}from"../../../../constants";import{Rect as G}from"@expofp/renderer";import K,{BG_LAYER_NAME as w,FG_LAYER_NAME as B}from"./config-bg";import{getChildLayers as U}from"../../../../store/init/init-layers";import{createImageDef as Y,createLayerDef as j}from"../../../../renderer";import{getImageLayerName as v,getLayerIcons as F}from"./loadBoothsImages";import{loadIcons as J}from"../../../../utils/imageloader";import{degToRad as Z}from"three/src/math/MathUtils";function q(e){return e.childLayers.length?e.childLayers:U(e,e.basePriority,15).layers}function P(e,t,h){return new Promise(async f=>{let n=[];const s=O(c,t),a=await K(t),i=[],d=H(s,D);C.booths.filter(o=>o.rect&&(!o.layer||o.layer===t||o.layer.childLayers.includes(t))&&o.exhibitors.find(r=>!!r.logoInBooth&&!!r.logo)&&!c.uiState.hideLogoInBooth).forEach(o=>o.noLabels=!0),s.length&&d.forEach((o,r)=>{i.push(M(e,`${t.name}${m}${k}${m}${r}`,o))}),t.loaded=!0;const g=a.children.find(o=>o.name===w),y=a.children.find(o=>o.name===B),u=v(t.name),l=F(t),p={name:u,children:[]};l.length&&e.onLayerImages(u,async()=>{const o=await J(l),r=[];for(const I of o.filter(Boolean)){const{bounds:{x:L,y:$,height:b,angle:E,width:A},htmlImage:R}=I,S=new G({x:L,y:$},{x:L+A,y:$+b},Z(E)),N=Y(R,S);r.push({shape:N})}return{layer:p,children:r}}),g&&n.push({...g,name:`${a.name}${m}${w}`}),i.length&&n.push(...i),y&&n.push({...y,name:`${a.name}${m}${B}`}),l.length&&n.push(p);const _=t.childLayers.sort((o,r)=>o.basePriority-r.basePriority).map(async o=>P(e,o,!0));Promise.all(_).then(o=>{const r=o.flat();r.length&&n.push(...r),f(j(t.name,n,{hidden:!h}))})})}export default async function z(e,t){return e.configured?Promise.resolve({name:e.name,children:e.children}):new Promise(async(h,f)=>{if(c.layerStore.mode!==T.Default&&!window[`__fpPaths${e.name}`]&&!e.rootParent)try{await x(`${window.__dataUrlBase}fp.svg.${e.name}.js`)}catch{return f()}const n=q(e);n.length&&(e.childLayers=n);const{layers:s}=c.layerStore;c.layerStore.layers=[...s,...n.filter(i=>!s.some(d=>d.name===i.name))];const a=await P(t,e,e.visible);h(a)})}
1
+ import c,{boothStore as O}from"../../../../store";import x from"../../../../store/init/init-booths";import{LayersMode as T}from"../../../../store/LayerStore";import{loadJs as D}from"../../../../tools/loaders";import H,{BOOTHS_CHUNK_SIZE as k}from"./config-booths";import{chunkArray as G}from"../../../../utils";import{BOOTHS_PAINTER_MARKER as K,SEPARATOR as m}from"../../../../constants";import{Rect as U}from"@expofp/renderer";import Y,{BG_LAYER_NAME as b,FG_LAYER_NAME as P}from"./config-bg";import{getChildLayers as j}from"../../../../store/init/init-layers";import{createImageDef as v,createLayerDef as F}from"../../../../renderer";import{getImageLayerName as J,getLayerIcons as Z}from"./loadBoothsImages";import{loadIcons as q}from"../../../../utils/imageloader";import{toRadians as z}from"../../../../utils/math";function Q(e){return e.childLayers.length?e.childLayers:j(e,e.basePriority,15).layers}function _(e,t,h){return new Promise(async f=>{let r=[];const s=x(c,t),a=await Y(t),i=[],d=G(s,k),l=O.booths.filter(o=>o.rect&&(!o.layer||o.layer===t||o.layer.childLayers.includes(t))&&o.exhibitors.find(n=>!!n.logoInBooth&&!!n.logo)&&!c.uiState.hideLogoInBooth),B=new Map(l.map(o=>[o.id,o.noLabels]));l.forEach(o=>o.noLabels=!0),s.length&&d.forEach((o,n)=>{i.push(H(e,`${t.name}${m}${K}${m}${n}`,o))}),l.forEach(o=>{o.noLabels=B.get(o.id)}),t.loaded=!0;const u=a.children.find(o=>o.name===b),y=a.children.find(o=>o.name===P),p=J(t.name),g=Z(t),L={name:p,children:[]};g.length&&e.onLayerImages(p,async()=>{const o=await q(g),n=[];for(const I of o.filter(Boolean)){const{bounds:{x:$,y:w,height:A,angle:R,width:S},htmlImage:N}=I,C=new U({x:$,y:w},{x:$+S,y:w+A},z(R)),M=v(N,C);n.push({shape:M})}return{layer:L,children:n}}),u&&r.push({...u,name:`${a.name}${m}${b}`}),i.length&&r.push(...i),y&&r.push({...y,name:`${a.name}${m}${P}`}),g.length&&r.push(L);const E=t.childLayers.sort((o,n)=>o.basePriority-n.basePriority).map(async o=>_(e,o,!0));Promise.all(E).then(o=>{const n=o.flat();n.length&&r.push(...n),t.children=r,t.configured=!0,f(F(t.name,r,{hidden:!h}))})})}export default async function V(e,t){return e.configured?Promise.resolve({name:e.name,children:e.children}):new Promise(async(h,f)=>{if(c.layerStore.mode!==T.Default&&!window[`__fpPaths${e.name}`]&&!e.rootParent)try{await D(`${window.__dataUrlBase}fp.svg.${e.name}.js`)}catch{return f()}const r=Q(e);r.length&&(e.childLayers=r);const{layers:s}=c.layerStore;c.layerStore.layers=[...s,...r.filter(i=>!s.some(d=>d.name===i.name))];const a=await _(t,e,e.visible);h(a)})}
@@ -1 +1 @@
1
- import{useEffect as yt,useRef as L}from"react";import{getBounds as k}from"../../../renderer";import{getRouteLayerRegex as pt,getRouteStopLayerRegex as wt,TRAFFIC_VEHICLES as xt}from"./trafficLayers";import{loadImage as Et}from"../../../utils/loadImage";import{createImageCanvas as It}from"../drawing/config/canvases";import{UpdateQueue as Mt}from"./UpdateQueue";import Lt from"../../../tools/base-runtime-url";import{toRadians as bt}from"../../../utils/math";import{isDefaultScene as Rt}from"../../../renderer/engine-core/defs";const tt=2,Ft=tt*3.5,G=tt*12,it=G*.7,At=8,Tt="transport_locations",Pt=150,et="#a4aab6",at=1e3,vt=2e4,ut=500;export function useManageTraffic({permission:e,rendererService:n,dataJsonUrl:c,websocketUrl:i}){const t=L(window.devicePixelRatio),s=L(new Map),o=L(new Map),r=L(),y=L(),f=L(performance.now()),M=L(1),w=L(new Mt),A=L(new Map),x=L(),g=L(at),p=L(new Map),u=L();yt(()=>{async function S(){if(!(!e||!n.scene))try{let h;try{const a=await fetch(c,{method:"GET",headers:{"Content-Type":"application/json"}});if(!a.ok||a.status===204)return;h=await a.json()}catch(a){console.warn("useManageTraffic failed to get JSON",a)}if(!h||h?.disabled||h?.error)return;t.current=lt(n.scale);const V=new Map(h.routes.map(({id:a,color:E})=>[a,E])),C=n.scene.rootLayer.children,W=new Map;V.forEach(a=>{W.set(a,Ct({radius:Ft,color:a,scale:window.devicePixelRatio}))});const z=pt(),Y=C.filter(a=>z.test(a.name)),B=wt(),U=C.filter(a=>B.test(a.name));h.routes.slice(0,Y.length).forEach(({id:a,color:E,path:R,stops:D,hiddenPoints:I},d)=>{A.current.set(a,R);const T=Y[d];if(T){const N=new Map(I?.map(l=>[ot(l),l])??[]);for(let l=1;l<R.length;l++){const O=R[l-1],H=R[l];N.has(ot(O))||N.has(ot(H))||T.children.push({points:[O,H],color:E,width:tt})}T.children.length&&w.current.add(()=>n.update(T))}const m=U[d];if(m&&D?.length){const N=W.get(E);D.forEach(l=>{m.children.push({source:N,bounds:k(l.x,l.y,N.width,N.height,t.current)})}),m.children.length&&w.current.add(()=>n.update(m))}});const $=C.find(a=>a.name===xt),X=new Map;x.current=({ptScale:a,sceneId:E})=>{try{if(!Rt(E))return;t.current=lt(a);const R=[];for(let I=0;I<U.length;I++){const d=U[I].children;for(let T=0;T<d.length;T++){const m=d[T];m.bounds=k(m.bounds.center.x,m.bounds.center.y,m.source.width,m.source.height,t.current,m.bounds.rotation),R.push(m)}}const D=[...s.current.values()];for(let I=0;I<D.length;I++){const d=D[I];d.bounds=k(d.bounds.center.x,d.bounds.center.y,d.source.width,d.source.height,t.current,d.bounds.rotation)}w.current.add(()=>n.update(...R,...D))}catch(R){console.error("ptscale",R)}},n.renderer.events.addEventListener("viewport:ptscale",x.current),V.forEach((a,E)=>{X.set(E,ht({id:E,width:G,height:G,color:a,scale:window.devicePixelRatio}))}),X.set(et,ht({id:"orphan",width:G,height:G,color:et,scale:window.devicePixelRatio}));let j=null;try{const a=await Et(`${Lt}icons/bus-white.svg`);j=It(a,it,it,window.devicePixelRatio)}catch(a){console.error(a)}y.current=a=>{try{const E=JSON.parse(a.data);if(E.type!==Tt)return;const R=a.timeStamp||performance.now();M.current=Math.round(R-f.current),f.current=R;const D=Math.max(M.current??ut,ut),I=o.current,d=s.current,T=$.children,m=w.current;let N=!1;E.data.forEach(({id:l,x:O,y:H,route_id:ct,hidden:gt})=>{if(I.has(l)&&(I.get(l)?.(),I.delete(l)),gt&&d.has(l)&&d.has(Q(l))){const P=d.get(l);P.hidden=!0;const F=d.get(Q(l));F.hidden=!0,m.add(()=>n.update(P,F));return}if(p.current.set(l,performance.now()),!d.has(l)){const P=X.get(ct)||X.get(et),F={id:l,source:P,bounds:k(O,H,P.width,P.height,t.current,0)};if(d.set(l,F),j){const q=Q(l),rt={id:q,source:j,bounds:k(O,H,j.width,j.height,t.current,0)};j.setAttribute("id",q),d.set(q,rt),T.push(F,rt)}else T.push(F);N=!0;return}const Z=d.get(l),st=d.get(Q(l)),mt=Z.bounds.center,K=St(mt,{x:O,y:H},A.current.get(ct));if(K.reduce((P,F,q)=>q===0?P:P+nt(K[q-1],F),0)>=Pt||document.hidden)dt({rendererService:n,updateQueue:m,vehicle:Z,vehicleFinery:st,x:O,y:H,scale:t.current,angle:_t(Z.bounds.center,{x:O,y:H})});else{const P=Dt(K,D,F=>{dt({rendererService:n,updateQueue:m,vehicle:Z,vehicleFinery:st,x:F.x,y:F.y,scale:t.current,angle:F.angle})});I.set(l,P)}}),N&&m.add(()=>n.update($))}catch(E){console.error("handleSocketMessage",E)}},v(),_(h.config?(Number(h.config.vehicle_inactive_interval)||20)*1e3:vt)}catch(h){console.warn(h)}}S();function v(){r.current?.readyState===WebSocket.OPEN||r.current?.readyState===WebSocket.CONNECTING||(r.current=new WebSocket(i),r.current.onmessage=y.current,r.current.onopen=()=>{g.current=at},r.current.onclose=()=>{if(!navigator.onLine)return;setTimeout(v,g.current);const h=3e4;g.current=Math.min(g.current*2,h)})}function b(){v()}window.addEventListener("online",b);function _(h){clearInterval(u.current),u.current=window.setInterval(()=>{const V=performance.now(),C=[],W=[];p.current.forEach((z,Y)=>{if(V-z<h)return;const B=s.current.get(Y);B&&(B.hidden=!0,W.push(B),C.push(Y));const U=Q(Y),$=s.current.get(U);$&&($.hidden=!0,W.push($),C.push(U))}),W.length&&w.current.add(()=>n.update(...W)),C.forEach(z=>p.current.delete(z))},h)}return()=>{x.current&&n.renderer&&n.renderer.events.removeEventListener("viewport:ptscale",x.current),o.current.forEach(h=>h?.()),o.current.clear(),s.current.clear(),w.current.destroy(),window.removeEventListener("online",b),clearInterval(u.current)}},[e,n,c,i])}function lt(e){return Math.min(e||window.devicePixelRatio,At)}function _t(e,n){return Math.atan2(n.y-e.y,n.x-e.x)}function Ct({radius:e,scale:n,color:c}){const i=document.createElement("canvas"),t=i.getContext("2d");t.imageSmoothingEnabled=!1;const s=Math.ceil(e*2*n),o=s/2,r=e*.78,y=e*.33;return i.width=s,i.height=s,t.translate(o,o),t.scale(n,n),t.beginPath(),t.arc(0,0,e,0,2*Math.PI),t.fillStyle="#FFFFFF",t.fill(),t.beginPath(),t.arc(0,0,r,0,2*Math.PI),t.fillStyle=c,t.fill(),t.beginPath(),t.arc(0,0,y,0,2*Math.PI),t.fillStyle="#FFFFFF",t.fill(),i}function ht({id:e,width:n,height:c,color:i,scale:t}){const s=2*t,o=n/2*t,r=c*t,y=.6,f=.01,M=r*y,w=r,A=8*t,x=w+s+M/2+A*2,g=o*2+M+s+A*2,p=document.createElement("canvas");p.setAttribute("id",e),p.width=x,p.height=g;const u=p.getContext("2d"),S=x/2,v=g/2;u.save(),u.translate(S,v),u.rotate(-Math.PI/2),u.translate(-S,-v);const b=S,_=v-w/2+o,h=_+M;return u.shadowColor="rgba(16, 24, 40, 0.2)",u.shadowBlur=A/2,u.beginPath(),u.arc(b,_,o,Math.PI,0,!1),u.bezierCurveTo(b+o,_+r*.3,b+f*o,h,b,h),u.bezierCurveTo(b-f*o,h,b-o,_+r*.3,b-o,_),u.closePath(),u.fillStyle=i,u.fill(),u.strokeStyle="#FFFFFF",u.lineWidth=s,u.stroke(),u.restore(),p}function nt(e,n){return Math.hypot(e.x-n.x,e.y-n.y)}function Q(e){return`${e}_finery`}function dt({rendererService:e,updateQueue:n,vehicle:c,vehicleFinery:i,x:t,y:s,scale:o,angle:r}){c.bounds=k(t,s,c.source.width,c.source.height,o,r),c.hidden=!1,i?(i.bounds=k(t,s,i.source.width,i.source.height,o,bt(e.angle)),i.hidden=!1,n.add(()=>e.update(i,c))):n.add(()=>e.update(c))}function J(e,n,c){return{x:e.x+(n.x-e.x)*c,y:e.y+(n.y-e.y)*c}}function ft(e,n){let c=1/0,i={index:0,t:0};for(let t=0;t<n.length-1;t++){const s=n[t],o=n[t+1],r=o.x-s.x,y=o.y-s.y,f=r*r+y*y,M=f?((e.x-s.x)*r+(e.y-s.y)*y)/f:0,w=Math.max(0,Math.min(1,M)),A=J(s,o,w),x=nt(e,A);x<c&&(c=x,i={index:t,t:w})}return i}function Nt(e,n,c){const i=nt(e,n),t=Math.max(2,Math.ceil(i/c)+1),s=[];for(let o=0;o<t;o++){const r=o/(t-1),y=J(e,n,r);s.push({x:y.x,y:y.y})}return s}function St(e,n,c){if(!c||!c.length)return Nt(e,n,10);const i=ft(e,c),t=ft(n,c),s=[],o=r=>s.push({x:r.x,y:r.y});i.index+1<c.length?o(J(c[i.index],c[i.index+1],i.t)):o(c[i.index]);for(let r=i.index+1;r<=t.index&&r<c.length;r++)o(c[r]);return t.index+1<c.length?o(J(c[t.index],c[t.index+1],t.t)):o(c[t.index]),s}function Dt(e,n,c,i){if(e.length<2)return()=>{};let t=null,s;const o=[];let r=0;for(let f=0;f<e.length-1;f++){const M=Math.hypot(e[f+1].x-e[f].x,e[f+1].y-e[f].y);o.push(M),r+=M}const y=f=>{t||(t=f);const M=f-t,w=Math.min(M/n,1),A=w*r;let x=0,g=0;for(;g<o.length&&x+o[g]<A;)x+=o[g],g++;g>=o.length&&(g=o.length-1);const p=e[g],u=e[Math.min(g+1,e.length-1)],S=o[g]||0,v=S===0?0:(A-x)/S,b=p.x+(u.x-p.x)*v,_=p.y+(u.y-p.y)*v,h=u.x-p.x,V=u.y-p.y,C=h===0&&V===0?0:Math.atan2(V,h);c({x:b,y:_,angle:C}),w<1?s=requestAnimationFrame(y):i&&i()};return s=requestAnimationFrame(y),()=>{s&&cancelAnimationFrame(s)}}function ot(e){return`${e.x},${e.y}`}
1
+ import{useEffect as pt,useRef as F}from"react";import{getBounds as k}from"../../../renderer";import{getRouteLayerRegex as wt,getRouteStopLayerRegex as xt,TRAFFIC_VEHICLES as Et}from"./trafficLayers";import{loadImage as It}from"../../../utils/loadImage";import{createImageCanvas as Mt}from"../drawing/config/canvases";import{UpdateQueue as Lt}from"./UpdateQueue";import bt from"../../../tools/base-runtime-url";import{toRadians as Ft}from"../../../utils/math";import{isDefaultScene as Rt}from"../../../renderer/engine-core/defs";const et=2,At=et*3.5,Q=et*12,at=Q*.7,Pt=8,Tt="transport_locations",vt=150,nt="#a4aab6",ut=1e3,_t=2e4,lt=500;export function useManageTraffic({permission:t,rendererService:n,dataJsonUrl:c,websocketUrl:i}){const e=F(window.devicePixelRatio),s=F(new Map),o=F(new Map),r=F(),p=F(),f=F(performance.now()),M=F(1),E=F(new Lt),A=F(new Map),I=F(),g=F(ut),w=F(new Map),u=F();pt(()=>{let T;async function N(){if(!(!t||!n.scene))try{let d;try{const a=await fetch(c,{method:"GET",headers:{"Content-Type":"application/json"}});if(!a.ok||a.status===204)return;d=await a.json()}catch(a){console.warn("useManageTraffic failed to get JSON",a)}if(!d||d?.disabled||d?.error)return;e.current=dt(n.scale);const Y=new Map(d.routes.map(({id:a,color:x})=>[a,x])),H=n.scene.rootLayer.children,V=new Map;Y.forEach(a=>{V.set(a,St({radius:At,color:a,scale:window.devicePixelRatio}))});const B=wt(),q=H.filter(a=>B.test(a.name)),G=xt(),z=H.filter(a=>G.test(a.name));d.routes.slice(0,q.length).forEach(({id:a,color:x,path:C,stops:W,hiddenPoints:_},h)=>{A.current.set(a,C);const m=q[h];if(m){const y=new Map(_?.map(l=>[ct(l),l])??[]);for(let l=1;l<C.length;l++){const D=C[l-1],O=C[l];y.has(ct(D))||y.has(ct(O))||m.children.push({points:[D,O],color:x,width:et})}m.children.length&&E.current.add(()=>n.update(m))}const b=z[h];if(b&&W?.length){const y=V.get(x);W.forEach(l=>{b.children.push({source:y,bounds:k(l.x,l.y,y.width,y.height,e.current)})}),b.children.length&&E.current.add(()=>n.update(b))}});const U=H.find(a=>a.name===Et),Z=new Map;I.current=a=>{try{const{ptScale:x,sceneId:C}=Ct(a);if(!Rt(C))return;e.current=dt(x);const W=[];for(let h=0;h<z.length;h++){const m=z[h].children;for(let b=0;b<m.length;b++){const y=m[b];y.bounds=k(y.bounds.center.x,y.bounds.center.y,y.source.width,y.source.height,e.current,y.bounds.rotation),W.push(y)}}const _=[...s.current.values()];for(let h=0;h<_.length;h++){const m=_[h];m.bounds=k(m.bounds.center.x,m.bounds.center.y,m.source.width,m.source.height,e.current,m.bounds.rotation)}E.current.add(()=>n.update(...W,..._))}catch(x){console.error("ptscale",x)}},n.renderer.events.addEventListener("viewport:ptscale",I.current),T=requestAnimationFrame(()=>{I.current?.(n.scale)}),Y.forEach((a,x)=>{Z.set(x,ht({id:x,width:Q,height:Q,color:a,scale:window.devicePixelRatio}))}),Z.set(nt,ht({id:"orphan",width:Q,height:Q,color:nt,scale:window.devicePixelRatio}));let $=null;try{const a=await It(`${bt}icons/bus-white.svg`);$=Mt(a,at,at,window.devicePixelRatio)}catch(a){console.error(a)}p.current=a=>{try{const x=JSON.parse(a.data);if(x.type!==Tt)return;const C=a.timeStamp||performance.now();M.current=Math.round(C-f.current),f.current=C;const W=Math.max(M.current??lt,lt),_=o.current,h=s.current,m=U.children,b=E.current;let y=!1;x.data.forEach(({id:l,x:D,y:O,route_id:st,hidden:mt})=>{if(_.has(l)&&(_.get(l)?.(),_.delete(l)),mt&&h.has(l)&&h.has(X(l))){const P=h.get(l);P.hidden=!0;const R=h.get(X(l));R.hidden=!0,b.add(()=>n.update(P,R));return}if(w.current.set(l,performance.now()),!h.has(l)){const P=Z.get(st)||Z.get(nt),R={id:l,source:P,bounds:k(D,O,P.width,P.height,e.current,0)};if(h.set(l,R),$){const j=X(l),it={id:j,source:$,bounds:k(D,O,$.width,$.height,e.current,0)};$.setAttribute("id",j),h.set(j,it),m.push(R,it)}else m.push(R);y=!0;return}const J=h.get(l),rt=h.get(X(l)),yt=J.bounds.center,tt=Ot(yt,{x:D,y:O},A.current.get(st));if(tt.reduce((P,R,j)=>j===0?P:P+ot(tt[j-1],R),0)>=vt||document.hidden)ft({rendererService:n,updateQueue:b,vehicle:J,vehicleFinery:rt,x:D,y:O,scale:e.current,angle:Nt(J.bounds.center,{x:D,y:O})});else{const P=Ht(tt,W,R=>{ft({rendererService:n,updateQueue:b,vehicle:J,vehicleFinery:rt,x:R.x,y:R.y,scale:e.current,angle:R.angle})});_.set(l,P)}}),y&&b.add(()=>n.update(U))}catch(x){console.error("handleSocketMessage",x)}},L(),S(d.config?(Number(d.config.vehicle_inactive_interval)||20)*1e3:_t)}catch(d){console.warn(d)}}N();function L(){r.current?.readyState===WebSocket.OPEN||r.current?.readyState===WebSocket.CONNECTING||(r.current=new WebSocket(i),r.current.onmessage=p.current,r.current.onopen=()=>{g.current=ut},r.current.onclose=()=>{if(!navigator.onLine)return;setTimeout(L,g.current);const d=3e4;g.current=Math.min(g.current*2,d)})}function v(){L()}window.addEventListener("online",v);function S(d){clearInterval(u.current),u.current=window.setInterval(()=>{const Y=performance.now(),H=[],V=[];w.current.forEach((B,q)=>{if(Y-B<d)return;const G=s.current.get(q);G&&(G.hidden=!0,V.push(G),H.push(q));const z=X(q),U=s.current.get(z);U&&(U.hidden=!0,V.push(U),H.push(z))}),V.length&&E.current.add(()=>n.update(...V)),H.forEach(B=>w.current.delete(B))},d)}return()=>{I.current&&n.renderer&&n.renderer.events.removeEventListener("viewport:ptscale",I.current),T!==void 0&&cancelAnimationFrame(T),o.current.forEach(d=>d?.()),o.current.clear(),s.current.clear(),E.current.destroy(),window.removeEventListener("online",v),clearInterval(u.current)}},[t,n,c,i])}function dt(t){return Math.min(t||window.devicePixelRatio,Pt)}function Ct(t){return typeof t=="number"?{ptScale:t}:t}function Nt(t,n){return Math.atan2(n.y-t.y,n.x-t.x)}function St({radius:t,scale:n,color:c}){const i=document.createElement("canvas"),e=i.getContext("2d");e.imageSmoothingEnabled=!1;const s=Math.ceil(t*2*n),o=s/2,r=t*.78,p=t*.33;return i.width=s,i.height=s,e.translate(o,o),e.scale(n,n),e.beginPath(),e.arc(0,0,t,0,2*Math.PI),e.fillStyle="#FFFFFF",e.fill(),e.beginPath(),e.arc(0,0,r,0,2*Math.PI),e.fillStyle=c,e.fill(),e.beginPath(),e.arc(0,0,p,0,2*Math.PI),e.fillStyle="#FFFFFF",e.fill(),i}function ht({id:t,width:n,height:c,color:i,scale:e}){const s=2*e,o=n/2*e,r=c*e,p=.6,f=.01,M=r*p,E=r,A=8*e,I=E+s+M/2+A*2,g=o*2+M+s+A*2,w=document.createElement("canvas");w.setAttribute("id",t),w.width=I,w.height=g;const u=w.getContext("2d"),T=I/2,N=g/2;u.save(),u.translate(T,N),u.rotate(-Math.PI/2),u.translate(-T,-N);const L=T,v=N-E/2+o,S=v+M;return u.shadowColor="rgba(16, 24, 40, 0.2)",u.shadowBlur=A/2,u.beginPath(),u.arc(L,v,o,Math.PI,0,!1),u.bezierCurveTo(L+o,v+r*.3,L+f*o,S,L,S),u.bezierCurveTo(L-f*o,S,L-o,v+r*.3,L-o,v),u.closePath(),u.fillStyle=i,u.fill(),u.strokeStyle="#FFFFFF",u.lineWidth=s,u.stroke(),u.restore(),w}function ot(t,n){return Math.hypot(t.x-n.x,t.y-n.y)}function X(t){return`${t}_finery`}function ft({rendererService:t,updateQueue:n,vehicle:c,vehicleFinery:i,x:e,y:s,scale:o,angle:r}){c.bounds=k(e,s,c.source.width,c.source.height,o,r),c.hidden=!1,i?(i.bounds=k(e,s,i.source.width,i.source.height,o,Ft(t.angle)),i.hidden=!1,n.add(()=>t.update(i,c))):n.add(()=>t.update(c))}function K(t,n,c){return{x:t.x+(n.x-t.x)*c,y:t.y+(n.y-t.y)*c}}function gt(t,n){let c=1/0,i={index:0,t:0};for(let e=0;e<n.length-1;e++){const s=n[e],o=n[e+1],r=o.x-s.x,p=o.y-s.y,f=r*r+p*p,M=f?((t.x-s.x)*r+(t.y-s.y)*p)/f:0,E=Math.max(0,Math.min(1,M)),A=K(s,o,E),I=ot(t,A);I<c&&(c=I,i={index:e,t:E})}return i}function Dt(t,n,c){const i=ot(t,n),e=Math.max(2,Math.ceil(i/c)+1),s=[];for(let o=0;o<e;o++){const r=o/(e-1),p=K(t,n,r);s.push({x:p.x,y:p.y})}return s}function Ot(t,n,c){if(!c||!c.length)return Dt(t,n,10);const i=gt(t,c),e=gt(n,c),s=[],o=r=>s.push({x:r.x,y:r.y});i.index+1<c.length?o(K(c[i.index],c[i.index+1],i.t)):o(c[i.index]);for(let r=i.index+1;r<=e.index&&r<c.length;r++)o(c[r]);return e.index+1<c.length?o(K(c[e.index],c[e.index+1],e.t)):o(c[e.index]),s}function Ht(t,n,c,i){if(t.length<2)return()=>{};let e=null,s;const o=[];let r=0;for(let f=0;f<t.length-1;f++){const M=Math.hypot(t[f+1].x-t[f].x,t[f+1].y-t[f].y);o.push(M),r+=M}const p=f=>{e||(e=f);const M=f-e,E=Math.min(M/n,1),A=E*r;let I=0,g=0;for(;g<o.length&&I+o[g]<A;)I+=o[g],g++;g>=o.length&&(g=o.length-1);const w=t[g],u=t[Math.min(g+1,t.length-1)],T=o[g]||0,N=T===0?0:(A-I)/T,L=w.x+(u.x-w.x)*N,v=w.y+(u.y-w.y)*N,S=u.x-w.x,d=u.y-w.y,Y=S===0&&d===0?0:Math.atan2(d,S);c({x:L,y:v,angle:Y}),E<1?s=requestAnimationFrame(p):i&&i()};return s=requestAnimationFrame(p),()=>{s&&cancelAnimationFrame(s)}}function ct(t){return`${t.x},${t.y}`}
@@ -0,0 +1,14 @@
1
+ import type { MaplibreViewMode } from '../../store/MaplibreStore';
2
+ /**
3
+ * Main MobX adapter component that bridges application state to the
4
+ * state-agnostic MaplibreWrapper.
5
+ *
6
+ * Reused renderer config modules still read singleton stores internally;
7
+ * MaplibreWrapper itself remains pure and decoupled from application state.
8
+ */
9
+ interface MaplibreAdapterProps {
10
+ viewMode: MaplibreViewMode;
11
+ }
12
+ declare const MaplibreAdapter: import("react").FunctionComponent<MaplibreAdapterProps>;
13
+ export default MaplibreAdapter;
14
+ //# sourceMappingURL=MaplibreAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ import{jsx as U}from"react/jsx-runtime";import w from"color";import{runInAction as G}from"mobx";import{observer as V}from"mobx-react-lite";import{useCallback as h,useEffect as P,useMemo as m,useRef as b,useState as E}from"react";import{getLayerSvg as J,svgArea as _}from"../../data/svg";import{createSceneDef as W}from"../../renderer";import t,{uiState as f}from"../../store";import R from"../../tools/settings";import X from"../Map/drawing/config/config-all";import{loadLayersImages as H}from"../Map/drawing/config/loadBoothsImages";import{Rect as K}from"../Map/drawing/config/Rect";import{useBuildRoute as Z}from"../Map/traffic/useBuildRoute";import{useManageTraffic as Q}from"../Map/traffic/useManageTraffic";import Y from"./MaplibreWrapper";import{useCameraReactions as q}from"./useCameraReactions";import{useDimming as ee}from"./useDimming";import{useLayerVisibilitySync as re}from"./useLayerVisibilitySync";import{useRendererEvents as oe}from"./useRendererEvents";import{useWayfindingAndMarkers as te}from"./useWayfindingAndMarkers";import{deriveGeoConfig as ne,deriveVenueMapBounds as ae,getLocalRectGeoBounds as ie,getVisibleRectFitPadding as se,INITIAL_FIT_ZOOM_ADJUSTMENT as le}from"./utils/geo-config";import{applyMapOptions as k,DEFAULT_MAP_OPTIONS as ce,getTileSource as me,MAP_2D_OPTIONS as fe}from"./utils/map-helpers";import{calculateTransformMatrix as ue}from"./utils/solver";const x="routes-api.expofp.com";function I(){G(()=>{t.layerStore.layers.forEach(u=>{u.configured=!1,u.children=[],u.loaded=!1}),t.layerStore.layersLoaded=!1})}const pe=V(function({viewMode:M}){const[D,$]=E(null),[C,T]=E(null),e=t.rendererService,S=b(null),a=b(null),v=b(null),r=m(()=>ne(),[]),i=m(()=>r?{center:r.center,bearing:r.bearing,zoom:r.zoom,bounds:ie(_,r.gpsConfig),fitPadding:se(0),zoomAdjustment:le}:null,[r]),L=m(()=>r?ue(r.gpsConfig,J()?.getAttribute("units")):null,[r]),s=m(()=>({...M==="map2d"?fe:ce,maxBounds:r?ae(r.gpsConfig):void 0}),[r,M]),O=b(s),F=m(()=>me(),[]),{mapDimAnimatorRef:p,venueDimAnimatorRef:d,handleMapDimLayerReady:j}=ee(a,e);P(()=>{if(!r)return;let o=!1;I();const g=X(e).then(n=>{if(o)return;const y=w(R.backgroundColor==="none"?"#ebebeb":R.backgroundColor).string(),c=W(n,K.fromCoreRect(_),y);$(c)}).catch(n=>{o||console.warn("Maplibre scene configuration failed.",n)}),A=p.current,l=d.current;return()=>{o=!0,I();const n=S.current;g.finally(()=>e.disposeIfCurrent(n)),S.current=null,a.current=null,v.current=null,T(null),A?.stop(),l?.stop(),f.sceneDefReady=!1}},[r,p,e,d]);const z=h((o,g,A,l)=>{S.current=o,a.current=g,v.current=l,T(o),e.attach(o,A,l),k(g,O.current),p.current?.setTarget(f.dimmed,{immediate:!0}),d.current?.setTarget(f.dimmed,{immediate:!0}),H(e);const n=e.ptScaleRegistry.invoke(e.scale||1);n.length&&e.update(...n);const y=e.rollRegistry.invoke(e.angle||0).flatMap(c=>Array.isArray(c)?c:[c]);y.length&&e.update(...y),t.layerStore.layersLoaded=!0,t.fp.onFpConfigured&&t.fp.onFpConfigured(),f.sceneDefReady=!0,l()},[e,p,d]);P(()=>{O.current=s,k(a.current,s,!0)},[s]),oe(C,e),te(C,e),re(e,a,r),q(a,r),Z({enabled:t.layerStore.layersLoaded&&f.buildRoute,rendererService:e}),Q({permission:t.layerStore.layersLoaded,rendererService:e,dataJsonUrl:`https://${x}/v1/routes?expo=${R.EXPO}`,websocketUrl:`wss://${x}/locations?expo=${R.EXPO}`});const B=h(o=>{console.warn("Maplibre map failed to load; falling back to floorplan mode.",o),t.maplibreStore.deactivateMaplibre()},[]);if(!r||!i||!L||!D)return null;const N=`${i.center.join(",")}:${i.bearing}:${i.zoom}`;return U(Y,{sceneDef:D,geoConfig:i,staticTransform:L,tileSource:F,mapOptions:s,onRendererReady:z,onMapDimLayerReady:j,onMapLoadError:B},N)});export default pe;
@@ -0,0 +1,69 @@
1
+ import 'maplibre-gl/dist/maplibre-gl.css';
2
+ import { Renderer, type SceneDef } from '@expofp/renderer';
3
+ import type { LngLatBoundsLike, StyleSpecification } from 'maplibre-gl';
4
+ import { Map as MaplibreMap } from 'maplibre-gl';
5
+ export declare const MAP_DIM_LAYER_ID = "expofp-map-dim";
6
+ /**
7
+ * Configuration for the map tile source.
8
+ * Abstracted so we can swap between online and offline (PMTiles) later
9
+ * without touching MaplibreWrapper.
10
+ */
11
+ export interface TileSourceConfig {
12
+ /** Maplibre style URL or inline style JSON object */
13
+ style: string | StyleSpecification;
14
+ }
15
+ export interface CameraPaddingOptions {
16
+ top: number;
17
+ bottom: number;
18
+ left: number;
19
+ right: number;
20
+ }
21
+ /** Geographic configuration derived from fpGeo.properties */
22
+ export interface GeoConfig {
23
+ /** Center of the venue in [lng, lat] */
24
+ center: [number, number];
25
+ /** Map bearing in degrees */
26
+ bearing: number;
27
+ /** Initial zoom level */
28
+ zoom: number;
29
+ /** Optional initial bounds. When present, MapLibre computes the initial zoom. */
30
+ bounds?: LngLatBoundsLike;
31
+ /** Padding used with initial bounds. */
32
+ fitPadding?: CameraPaddingOptions;
33
+ /** Small correction after bounds-based initial fit. */
34
+ zoomAdjustment?: number;
35
+ }
36
+ export interface MapOptions {
37
+ pitch?: number;
38
+ maxPitch?: number;
39
+ minZoom?: number;
40
+ maxZoom?: number;
41
+ maxBounds?: LngLatBoundsLike;
42
+ }
43
+ export interface MaplibreWrapperProps {
44
+ /** The scene definition to render inside the map */
45
+ sceneDef: SceneDef;
46
+ /** Geographic configuration for map positioning and floorplan locking */
47
+ geoConfig: GeoConfig;
48
+ /** Static SVG-to-Mercator transform prepared by the adapter */
49
+ staticTransform: number[];
50
+ /** Tile source configuration (online style URL for now) */
51
+ tileSource: TileSourceConfig;
52
+ /** Map camera constraints and defaults */
53
+ mapOptions?: MapOptions;
54
+ /** Called when the renderer instance is ready for external interaction */
55
+ onRendererReady?: (renderer: Renderer, map: MaplibreMap, sceneDef: SceneDef, requestRepaint: () => void) => void;
56
+ /** Called when the dim overlay layer is available for paint updates. */
57
+ onMapDimLayerReady?: (map: MaplibreMap) => void;
58
+ /** Called when the map style cannot be loaded. */
59
+ onMapLoadError?: (error: unknown) => void;
60
+ }
61
+ /**
62
+ * A pure, state-agnostic React component that renders a Maplibre map
63
+ * with the ExpoFP floorplan embedded via CustomLayerInterface.
64
+ *
65
+ * This component does NOT import MobX or any application state.
66
+ * All state synchronization is done externally via the onRendererReady callback.
67
+ */
68
+ export default function MaplibreWrapper({ sceneDef, geoConfig, staticTransform, tileSource, mapOptions, onRendererReady, onMapDimLayerReady, onMapLoadError, }: MaplibreWrapperProps): import("react").JSX.Element;
69
+ //# sourceMappingURL=MaplibreWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ import{jsx as T}from"react/jsx-runtime";import"maplibre-gl/dist/maplibre-gl.css";import{Renderer as Z}from"@expofp/renderer";import{addProtocol as B,Map as N}from"maplibre-gl";import{Protocol as G}from"pmtiles";import{useEffect as R,useRef as s}from"react";export const MAP_DIM_LAYER_ID="expofp-map-dim";const y="expofp-map-dim-source",U="3d-expofp";let g=null;const Y=["coalesce",["get","name:en"],["get","name_en"],["get","name:latin"],["get","name"]],k={type:"Feature",geometry:{type:"Polygon",coordinates:[[[-180,-85],[180,-85],[180,85],[-180,85],[-180,-85]]]},properties:{}};function S(e){if(!e||typeof e!="object")return!1;const r=e.length;if(typeof r!="number"||r<16)return!1;const o=e[0];return typeof o=="number"&&Number.isFinite(o)}function H(e){if(S(e))return Array.from(e);const o=e?.defaultProjectionData?.mainMatrix;return S(o)?Array.from(o):(console.warn("Maplibre custom layer received an unsupported projection matrix payload.",e),null)}function b(e){return typeof e=="string"?e.includes("name"):Array.isArray(e)?e.some(r=>b(r)):!e||typeof e!="object"?!1:Object.values(e).some(r=>b(r))}function J(e){return e.type!=="symbol"||!e.id||!e.layout?!1:b(e.layout["text-field"])}function V(e){const r=e.getStyle();for(const o of r.layers??[])J(o)&&e.setLayoutProperty(o.id,"text-field",Y)}function W(){if(!g){g=new G;try{B("pmtiles",g.tile)}catch(e){console.warn("Maplibre PMTiles protocol registration failed.",e)}}}export default function X({sceneDef:e,geoConfig:r,staticTransform:o,tileSource:D,mapOptions:E,onRendererReady:x,onMapDimLayerReady:L,onMapLoadError:M}){const f=s(null),P=s(null),c=s(null),h=s(x),_=s(L),j=s(M),O=s({sceneDef:e,geoConfig:r,staticTransform:o,tileSource:D,mapOptions:E});return R(()=>{h.current=x,_.current=L,j.current=M}),R(()=>{if(!f.current)return;const{sceneDef:d,geoConfig:n,staticTransform:I,tileSource:w,mapOptions:u}=O.current;let p=!1;const l={...d};l.rootLayer={...d.rootLayer};const C=d.rootLayer.children;l.rootLayer.children=C.filter(i=>i?.name?.toString().toLowerCase()!=="areamap"),l.background=void 0,l.staticTransform=I,W();const F=n.bounds?{bounds:n.bounds,fitBoundsOptions:{padding:n.fitPadding,bearing:n.bearing}}:{center:n.center,zoom:n.zoom},t=new N({container:f.current,style:w.style,...F,bearing:n.bearing,pitch:u?.pitch??30,maxPitch:u?.maxPitch??70,minZoom:u?.minZoom,maxZoom:u?.maxZoom,maxBounds:u?.maxBounds,canvasContextAttributes:{antialias:!0}});n.zoomAdjustment&&t.jumpTo({zoom:t.getZoom()+n.zoomAdjustment}),P.current=t,t.once("error",i=>{t.isStyleLoaded()||j.current?.(i?.error??i)});const z={id:U,type:"custom",renderingMode:"3d",onAdd(i,m){if(p)return;const a=new Z({canvas:t.getCanvas(),gl:m});if(p){a.dispose();return}a.init(l),c.current=a,h.current?.(a,t,l,()=>t.triggerRepaint())},render(i,m){if(!c.current||c.current.isDisposed)return;const a=H(m??i);a&&c.current.render(a)}},A=()=>{V(t),t.getSource(y)||t.addSource(y,{type:"geojson",data:k}),t.getLayer(MAP_DIM_LAYER_ID)||t.addLayer({id:MAP_DIM_LAYER_ID,type:"fill",source:y,paint:{"fill-color":"#000000","fill-opacity":0,"fill-opacity-transition":{duration:0,delay:0}}}),_.current?.(t),t.addLayer(z)};return t.on("style.load",A),()=>{p=!0,t.off("style.load",A),c.current?.dispose(),c.current=null,t.remove(),P.current=null}},[]),T("div",{ref:f,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})}
@@ -0,0 +1,10 @@
1
+ import type { Map as MaplibreMap } from 'maplibre-gl';
2
+ import type { RefObject } from 'react';
3
+ import type { GeoConfig } from './utils/geo-config';
4
+ /**
5
+ * Bundles all camera-related MobX reactions: moveToBooths, moveToRect,
6
+ * zoomBy, moveToLocation, and centerMap. Each watches a uiState trigger,
7
+ * moves the camera, and clears the trigger.
8
+ */
9
+ export declare function useCameraReactions(mapRef: RefObject<MaplibreMap | null>, geoConfig: GeoConfig | null): void;
10
+ //# sourceMappingURL=useCameraReactions.d.ts.map
@@ -0,0 +1 @@
1
+ import y from"../../core/Rect";import{svgArea as T}from"../../data/svg";import f,{uiState as c}from"../../store";import{convertLocalToGps as b}from"../../utils/gps";import{useReaction as u}from"../../utils/mobx";import{fitMapToLocalRect as p}from"./utils/geo-config";const i=c;export function useCameraReactions(s,e){u(()=>i.moveToBooths,r=>{const t=s.current;if(!r||!t||!e)return;const o=r.filter(m=>m.rect);if(o.length===0)return;const n=o.map(m=>m.rect),a=y.fromMultiple(n);p(t,a,e),i.moveToBooths=null}),u(()=>i.moveToRect,r=>{const t=s.current;!r||!t||!e||(p(t,r,e),i.moveToRect=null)}),u(()=>i.zoomBy,r=>{const t=s.current;!r||!t||(t.flyTo({zoom:t.getZoom()+(r>1?.5:-.5),animate:!0,duration:500}),i.zoomBy=null)}),u(()=>c.moveToLocation,r=>{const t=s.current,o=f.routeStore.currentPosition;if(!r||!t||!o)return;const{lng:n,lat:a}=o,m=typeof n=="number"&&Number.isFinite(n)&&typeof a=="number"&&Number.isFinite(a);let l;if(m)l=[n,a];else{if(!e)return;l=b(o.x,o.y,e.gpsConfig)}t.flyTo({center:l,animate:!0,duration:1e3}),t.once("moveend",()=>{c.moveToLocation=!1})}),u(()=>c.centerMap,r=>{const t=s.current;if(!r||!t||!e)return;if(!(c.list.type==="search"&&!c.list.text)){const n=f.layerStore.rectangle||T;p(t,n,e,{padding:0})}c.centerMap=!1})}
@@ -0,0 +1,16 @@
1
+ import type { Map as MaplibreMap } from 'maplibre-gl';
2
+ import type { RefObject } from 'react';
3
+ import type { RendererService } from '../../renderer/RendererService';
4
+ import type { DimmingAnimator } from '../../utils/dimming';
5
+ export interface DimmingControls {
6
+ mapDimAnimatorRef: RefObject<DimmingAnimator | null>;
7
+ venueDimAnimatorRef: RefObject<DimmingAnimator | null>;
8
+ handleMapDimLayerReady: (map: MaplibreMap) => void;
9
+ }
10
+ /**
11
+ * Manages scene dimming: creates map and venue dim animators,
12
+ * keeps them in sync with uiState.dimmed via a MobX reaction,
13
+ * and provides a callback for when the map dim layer is ready.
14
+ */
15
+ export declare function useDimming(mapRef: RefObject<MaplibreMap | null>, rendererService: RendererService): DimmingControls;
16
+ //# sourceMappingURL=useDimming.d.ts.map
@@ -0,0 +1 @@
1
+ import{useCallback as I,useEffect as c,useRef as o}from"react";import{uiState as l}from"../../store";import{applyVenueDimValue as T,createDimmingAnimator as s,DIM_INTENSITY as p,VENUE_DIM_INTENSITY as V}from"../../utils/dimming";import{useReaction as d}from"../../utils/mobx";import{applyMapDimValue as f}from"./utils/map-helpers";export function useDimming(i,u){const a=o(u);c(()=>{a.current=u},[u]);const e=o(null),r=o(null);c(()=>{const t=s(m=>{f(i.current,m*p)}),n=s(m=>{T(a.current,m*V)});return e.current=t,r.current=n,()=>{t.stop(),n.stop(),e.current=null,r.current=null}},[i]),d(()=>l.dimmed,t=>{e.current?.setTarget(t),r.current?.setTarget(t)});const D=I(t=>{const n=e.current?.getValue()??(l.dimmed?1:0);f(t,n*p)},[]);return{mapDimAnimatorRef:e,venueDimAnimatorRef:r,handleMapDimLayerReady:D}}
@@ -0,0 +1,11 @@
1
+ import type { Map as MaplibreMap } from 'maplibre-gl';
2
+ import type { RefObject } from 'react';
3
+ import type { RendererService } from '../../renderer/RendererService';
4
+ import type { GeoConfig } from './utils/geo-config';
5
+ /**
6
+ * Keeps the 3D scene layer visibility in sync with LayerStore.
7
+ * When a layer's visibility changes, updates the corresponding LayerDefs
8
+ * and fits the camera to the newly visible floor.
9
+ */
10
+ export declare function useLayerVisibilitySync(rendererService: RendererService, mapRef: RefObject<MaplibreMap | null>, geoConfig: GeoConfig | null): void;
11
+ //# sourceMappingURL=useLayerVisibilitySync.d.ts.map
@@ -0,0 +1 @@
1
+ import{useRef as m}from"react";import s from"../../store";import{useReaction as p}from"../../utils/mobx";import{fitMapToLocalRect as L}from"./utils/geo-config";import{collectLayerDefsByName as b}from"./utils/layer-defs";export function useLayerVisibilitySync(a,y,u){const t=m(null),f=m(null);p(()=>s.layerStore.layers.map(e=>`${e.name}:${e.visible?1:0}`),()=>{const e=a.scene;if(!e)return;t.current?.rootLayer!==e.rootLayer&&(t.current={rootLayer:e.rootLayer,defsByName:b(e.rootLayer)});const d=t.current.defsByName,n=[];for(const o of s.layerStore.layers){const c=d.get(o.name);if(c?.length)for(const i of c){const l=!o.visible;i.hidden!==l&&(i.hidden=l,n.push(i))}}n.length&&a.update(...n);const r=s.layerStore.layers.find(o=>o.visible&&!o.frozen&&!o.rootParent&&!o.pathway);!r||f.current===r.name||(f.current=r.name,L(y.current,r.viewbox??r.rect,u))})}
@@ -0,0 +1,9 @@
1
+ import type { Renderer } from '@expofp/renderer';
2
+ import type { RendererService } from '../../renderer/RendererService';
3
+ /**
4
+ * Attaches pointer and navigation event listeners to the renderer.
5
+ * Listeners are set up when the renderer becomes available and
6
+ * cleaned up when it changes or the component unmounts.
7
+ */
8
+ export declare function useRendererEvents(renderer: Renderer | null, rendererService: RendererService): void;
9
+ //# sourceMappingURL=useRendererEvents.d.ts.map
@@ -0,0 +1 @@
1
+ import{useEffect as g}from"react";import{pickDefaultScene as p}from"../../renderer/engine-core/defs";import l,{uiState as o}from"../../store";import{LayerMode as u}from"../../store/LayerStore";import k from"../Map/booth-by-xy";import{getMarkerFromClick as L}from"../Map/drawing/config/config-markers";import{getBooth as E}from"./utils/layer-defs";const C=o;export function useRendererEvents(t,m){g(()=>{if(!t)return;const v=({data:s})=>{if(o.setKioskModeEnabled)return;const{point:e,defs:r}=p(s),n=k(e.x,e.y),i=E(r[0]);C.hoveredBooth=n||i},d=()=>{o.setKioskModeEnabled||(C.hoveredBooth=null)},f=({data:s})=>{if(!o?.rootElement)return;window.__resett?.(),o.overlayPosition==="bottom"&&o.overlaySize==="full"&&l.showMap();const{point:e,defs:r}=p(s),{x:n,y:i}=e;if(o.onGetCoordsClick){const a=l.layerStore.layers.find(c=>c.visible&&(c.mode===u.TurnedOn||c.mode===u.TurnedOff));o.onGetCoordsClick({x:n,y:i,z:a?.name||null})}if(o.setKioskModeEnabled)return;if(o.onMarkerClick){const a=L(n,i,m.scale);o.onMarkerClick(a)}const y=k(e.x,e.y),b=E(r[0]);l.clickBooth(y||b)},h=()=>window.__resett?.();return t.events.addEventListener("pointer:move",v),t.events.addEventListener("pointer:out",d),t.events.addEventListener("pointer:click",f),t.events.addEventListener("navigation:change",h),()=>{t.events.removeEventListener("pointer:move",v),t.events.removeEventListener("pointer:out",d),t.events.removeEventListener("pointer:click",f),t.events.removeEventListener("navigation:change",h)}},[t,m])}
@@ -0,0 +1,8 @@
1
+ import type { Renderer } from '@expofp/renderer';
2
+ import type { RendererService } from '../../renderer/RendererService';
3
+ /**
4
+ * Sets up wayfinding and markers when the renderer becomes available,
5
+ * and tears them down when the renderer changes or the component unmounts.
6
+ */
7
+ export declare function useWayfindingAndMarkers(renderer: Renderer | null, rendererService: RendererService): void;
8
+ //# sourceMappingURL=useWayfindingAndMarkers.d.ts.map
@@ -0,0 +1 @@
1
+ import{useEffect as a}from"react";import{createWayfinding as i}from"../../wayfinding/createWayfinding";import{configMarkers as m}from"../Map/drawing/config/config-markers";export function useWayfindingAndMarkers(n,f){a(()=>{if(!n)return;const o=i(f),t=m(f);return()=>{o?.(),t?.()}},[n,f])}
@@ -0,0 +1,30 @@
1
+ import type { LngLatBoundsLike, Map as MaplibreMap } from 'maplibre-gl';
2
+ import type CoreRect from '../../../core/Rect';
3
+ import type { GeoConfig as MaplibreGeoConfig } from '../MaplibreWrapper';
4
+ import type { TransformGeoConfig } from './solver';
5
+ export interface GeoConfig extends MaplibreGeoConfig {
6
+ gpsConfig: TransformGeoConfig;
7
+ }
8
+ export interface CameraPaddingOptions {
9
+ top: number;
10
+ bottom: number;
11
+ left: number;
12
+ right: number;
13
+ }
14
+ export interface FitMapOptions {
15
+ duration?: number;
16
+ padding?: number;
17
+ }
18
+ export declare const MAP_BOUNDS_PADDING_FACTOR = 3;
19
+ export declare const MAP_BOUNDS_MIN_PADDING_DEGREES = 0.02;
20
+ export declare const INITIAL_FIT_ZOOM_ADJUSTMENT = 0.15;
21
+ export declare function deriveVenueMapBounds(config: TransformGeoConfig): LngLatBoundsLike | undefined;
22
+ export declare function getLocalRectGeoBounds(rect: CoreRect, config: TransformGeoConfig): LngLatBoundsLike;
23
+ export declare function getVisibleRectFitPadding(extraPadding?: number): CameraPaddingOptions;
24
+ /**
25
+ * Derive the geographic configuration from the fpGeo data.
26
+ * Returns null if geo data is not available.
27
+ */
28
+ export declare function deriveGeoConfig(): GeoConfig | null;
29
+ export declare function fitMapToLocalRect(map: MaplibreMap | null, rect: CoreRect | null, geoConfig: GeoConfig | null, options?: FitMapOptions): void;
30
+ //# sourceMappingURL=geo-config.d.ts.map
@@ -0,0 +1 @@
1
+ import{fpGeo as h}from"../../../data/fpGeo";import{svgArea as s}from"../../../data/svg";import{uiState as M}from"../../../store";import{convertLocalToGps as m}from"../../../utils/gps";export const MAP_BOUNDS_PADDING_FACTOR=3,MAP_BOUNDS_MIN_PADDING_DEGREES=.02,INITIAL_FIT_ZOOM_ADJUSTMENT=.15;export function deriveVenueMapBounds(t){const n=[[s.x1,s.y1],[s.x2,s.y1],[s.x2,s.y2],[s.x1,s.y2]].map(([r,p])=>m(r,p,t));if(!n.every(([r,p])=>Number.isFinite(r)&&Number.isFinite(p)))return;const o=n.map(([r])=>r),i=n.map(([,r])=>r),a=Math.min(...o),e=Math.max(...o),c=Math.min(...i),u=Math.max(...i),x=Math.max((e-a)*MAP_BOUNDS_PADDING_FACTOR,MAP_BOUNDS_MIN_PADDING_DEGREES),f=Math.max((u-c)*MAP_BOUNDS_PADDING_FACTOR,MAP_BOUNDS_MIN_PADDING_DEGREES);return[[a-x,c-f],[e+x,u+f]]}export function getLocalRectGeoBounds(t,n){const o=[m(t.x1,t.y1,n),m(t.x2,t.y1,n),m(t.x2,t.y2,n),m(t.x1,t.y2,n)],i=o.map(([e])=>e),a=o.map(([,e])=>e);return[[Math.min(...i),Math.min(...a)],[Math.max(...i),Math.max(...a)]]}export function getVisibleRectFitPadding(t=0){const n=M.canvasVisibleRectPx,o=M.screenSize;return!n||!o?{top:t,bottom:t,left:t,right:t}:{top:Math.max(0,n.y1)+t,bottom:Math.max(0,o.height-n.y2)+t,left:Math.max(0,n.x1)+t,right:Math.max(0,o.width-n.x2)+t}}export function deriveGeoConfig(){if(!h?.properties?.config)return null;const t=h.properties.config,n=(t.p0.lng+t.p2.lng)/2,o=(t.p0.lat+t.p2.lat)/2;return{center:[n,o],bearing:t.bearing??0,zoom:16,gpsConfig:t}}export function fitMapToLocalRect(t,n,o,i={}){if(!t||!n||!o||n.h===1/0||n.w===1/0||n.h<=0||n.w<=0)return;const a=getLocalRectGeoBounds(n,o.gpsConfig),e=getVisibleRectFitPadding(i.padding??50);t.fitBounds(a,{padding:e,duration:i.duration??1e3,bearing:o.bearing})}
@@ -0,0 +1,4 @@
1
+ import type { LayerDef, ShapeDef } from '@expofp/renderer';
2
+ export declare function collectLayerDefsByName(layer: LayerDef, acc?: Map<string, LayerDef[]>): Map<string, LayerDef[]>;
3
+ export declare function getBooth(shapeDef: ShapeDef): import("../../../store/BoothStore").Booth | null | undefined;
4
+ //# sourceMappingURL=layer-defs.d.ts.map
@@ -0,0 +1 @@
1
+ import{boothStore as t}from"../../../store";export function collectLayerDefsByName(e,n=new Map){if(e.name){const o=n.get(e.name)??[];o.push(e),n.set(e.name,o)}for(const o of e.children??[])o&&"children"in o&&collectLayerDefsByName(o,n);return n}export function getBooth(e){return e?.shape?t.booths.find(n=>n.shapes?.some(o=>o.shape===e.shape)):null}
@@ -0,0 +1,9 @@
1
+ import type { Map as MaplibreMap } from 'maplibre-gl';
2
+ import type { MapOptions, TileSourceConfig } from '../MaplibreWrapper';
3
+ export declare const DEFAULT_TILE_SOURCE: TileSourceConfig;
4
+ export declare const DEFAULT_MAP_OPTIONS: MapOptions;
5
+ export declare const MAP_2D_OPTIONS: MapOptions;
6
+ export declare function applyMapDimValue(map: MaplibreMap | null, value: number): void;
7
+ export declare function applyMapOptions(map: MaplibreMap | null, mapOptions: MapOptions, animatePitch?: boolean): void;
8
+ export declare function getTileSource(): TileSourceConfig;
9
+ //# sourceMappingURL=map-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ import s from"../../../store";import{MAP_DIM_LAYER_ID as c}from"../MaplibreWrapper";export const DEFAULT_TILE_SOURCE={style:"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json"},DEFAULT_MAP_OPTIONS={pitch:30,maxPitch:70,minZoom:14},MAP_2D_OPTIONS={pitch:0,maxPitch:0,minZoom:14};export function applyMapDimValue(t,e){t?.getLayer(c)&&(t.setPaintProperty(c,"fill-opacity",u(e)),t.triggerRepaint())}function u(t){return Math.min(Math.max(t,0),1)}export function applyMapOptions(t,e,i=!1){if(!t)return;t.setMinZoom(e.minZoom??null),t.setMaxZoom(e.maxZoom??null),t.setMaxBounds(e.maxBounds??null);const o=e.pitch,n=e.maxPitch,r=t.getPitch(),l=!!(i&&o!=null&&n!=null&&n<r);n!=null&&!l&&t.setMaxPitch(e.maxPitch),!(o==null||r===o)&&(i?(t.easeTo({pitch:o,duration:300}),l&&t.once("moveend",()=>t.setMaxPitch(n))):t.jumpTo({pitch:o}))}export function getTileSource(){const t=s.fp?.maplibre??window.__efpMaplibre;return t?.style?{style:t.style}:t?.styleUrl?{style:t.styleUrl}:DEFAULT_TILE_SOURCE}
@@ -0,0 +1,24 @@
1
+ interface GeoAnchorPoint {
2
+ x: number;
3
+ y: number;
4
+ lat: number;
5
+ lng: number;
6
+ }
7
+ export interface TransformGeoConfig {
8
+ p0: GeoAnchorPoint;
9
+ p1?: GeoAnchorPoint;
10
+ p2: GeoAnchorPoint;
11
+ }
12
+ /**
13
+ * Calculates an affine transformation matrix that maps SVG floorplan
14
+ * coordinates to Mercator coordinates. This matrix is used as the
15
+ * `staticTransform` in the `SceneDef` so the renderer can position
16
+ * the floorplan correctly inside a Maplibre `CustomLayerInterface`.
17
+ *
18
+ * The solver uses 3 anchor points (p0, p1, p2) from the geo config
19
+ * to set up a system of linear equations, then solves via Gaussian
20
+ * elimination with partial pivoting.
21
+ */
22
+ export declare function calculateTransformMatrix(geoConfig: TransformGeoConfig, units?: string | null): number[];
23
+ export {};
24
+ //# sourceMappingURL=solver.d.ts.map
@@ -0,0 +1 @@
1
+ import{MercatorCoordinate as A}from"maplibre-gl";const F=1e-12,S=3.28084,b=6371e3;export function calculateTransformMatrix(n,i){const o=n.p1??_(n),s=[n.p0,o,n.p2],r=[],t=[],a=[];for(const h of s){N(h),t.push([h.x,h.y]);const p=A.fromLngLat([h.lng,h.lat],0),d=p.meterInMercatorCoordinateUnits();u(p.x),u(p.y),u(d),r.push(d),a.push([p.x,p.y])}const c=[],e=[];for(let h=0;h<3;h++){const[p,d]=t[h],[L,T]=a[h];c.push([p,d,1,0,0,0]),e.push(L),c.push([0,0,0,p,d,1]),e.push(T)}const l=k(c,e),[f,E,y,w,P,v]=l,R=i?.toLowerCase?.().trim()==="ft"?1/S:1,I=r.reduce((h,p)=>h+p,0)/r.length*R,x=[f,w,0,0,E,P,0,0,0,0,I,0,y,v,0,1];if(!x.every(Number.isFinite))throw new Error("Cannot calculate Maplibre transform: geo anchor points produced a non-finite matrix.");return x}function _(n){const i=n.p2.x-n.p0.x,o=n.p2.y-n.p0.y;if(i===0&&o===0)throw new Error("Cannot calculate Maplibre transform: p0 and p2 have identical SVG coordinates.");const s=n.p0.x-o,r=n.p0.y+i,t=D(n.p0.lat,n.p0.lng,n.p2.lat,n.p2.lng),a=Z(n.p0.lat,n.p0.lng,n.p2.lat,n.p2.lng),[c,e]=j(n.p0.lat,n.p0.lng,t,a+90);return{x:s,y:r,lat:e,lng:c}}function N(n){u(n.x),u(n.y),u(n.lat),u(n.lng)}function u(n){if(!Number.isFinite(n))throw new Error("Cannot calculate Maplibre transform: geo anchor points contain invalid coordinates.")}function M(n){return n*Math.PI/180}function m(n){return n*180/Math.PI}function D(n,i,o,s){const r=M(n),t=M(o),a=M(o-n),c=M(s-i),e=Math.sin(a/2)*Math.sin(a/2)+Math.cos(r)*Math.cos(t)*Math.sin(c/2)*Math.sin(c/2),l=2*Math.atan2(Math.sqrt(e),Math.sqrt(1-e));return b*l}function Z(n,i,o,s){const r=M(n),t=M(o),a=M(s-i),c=Math.sin(a)*Math.cos(t),e=Math.cos(r)*Math.sin(t)-Math.sin(r)*Math.cos(t)*Math.cos(a);return(m(Math.atan2(c,e))+360)%360}function j(n,i,o,s){const r=o/b,t=M(s),a=M(n),c=M(i),e=Math.asin(Math.sin(a)*Math.cos(r)+Math.cos(a)*Math.sin(r)*Math.cos(t)),l=c+Math.atan2(Math.sin(t)*Math.sin(r)*Math.cos(a),Math.cos(r)-Math.sin(a)*Math.sin(e));return[m(l),m(e)]}function k(n,i){const o=n.length,s=n.map((t,a)=>[...t,i[a]]);for(let t=0;t<o;t++){let a=t;for(let c=t+1;c<o;c++)Math.abs(s[c][t])>Math.abs(s[a][t])&&(a=c);if([s[t],s[a]]=[s[a],s[t]],Math.abs(s[t][t])<F)throw new Error("Cannot calculate Maplibre transform: geo anchor points are collinear or invalid.");for(let c=t+1;c<o;c++){const e=s[c][t]/s[t][t];for(let l=t;l<=o;l++)s[c][l]-=e*s[t][l]}}const r=new Array(o);for(let t=o-1;t>=0;t--){r[t]=s[t][o];for(let a=t+1;a<o;a++)r[t]-=s[t][a]*r[a];r[t]/=s[t][t]}return r}
@@ -1 +1 @@
1
- import{jsx as r,jsxs as S}from"react/jsx-runtime";import{useRef as y,useMemo as b}from"react";import{useObserver as T}from"mobx-react-lite";import{observer as p}from"mobx-react-lite";import t,{uiState as m}from"../store";import{ShortcutsToolbar as g}from"./Shortcuts";import{t as u}from"../utils/i18n";import v from"fuse.js";import x from"./EntityItemContainer";import"./Speakers.scss";const j=p(({showFilters:i=!0})=>{const d=y(),l=t.speakerStore.speakers,{filters:{selectedCompanies:{value:a},selectedJobTitles:{value:n}}}=t.speakerFilterStore.state,c=b(()=>{let e=l;a.length>0&&(e=e.filter(s=>a.includes(s.company))),n.length>0&&(e=e.filter(s=>n.includes(s.jobTitle)));const o=t.searchStore.searchText;if(o){const s={keys:["name","company","jobTitle"],threshold:.3,ignoreLocation:!0,includeScore:!0};e=new v(e,s).search(o).map(k=>k.item)}return e},[l,t.searchStore.searchText,a,n,t.speakerFilterStore.state]);return T(()=>S("div",{className:"efp-speakers-content",children:[i&&r(g,{interfaceId:"speakers"}),c.length>0?r("div",{className:"efp-speakers-list",ref:d,children:c.map(e=>{const o=t.speakerStore.getEventsBySpeaker(e.id),s=[];return e.company&&s.push({type:"speaker",text:e.jobTitle}),r(x,{id:e.id.toString(),type:"speaker",url:`?${e.slug}`,title:e.name,subtitle:e.company,image:e.photoFile,itemsCount:o.length,additionalInfo:s,bookmarked:e.bookmarked,onClick:(f,h)=>t.selectSpeaker(e,!0)},e.id)})}):r("div",{className:"list-empty",children:t.speakerFilterStore.activeFiltersCount>0||t.searchStore.searchText?u("No speakers found. Try adjusting your filters."):u("No speakers found")})]}))}),C=p(i=>m.list.type!=="speakers"||m.details?null:r(j,{...i}));export default C;
1
+ import{jsx as r,jsxs as h}from"react/jsx-runtime";import{useRef as k,useMemo as S}from"react";import{useObserver as b}from"mobx-react-lite";import{observer as p}from"mobx-react-lite";import t,{uiState as m}from"../store";import{ShortcutsToolbar as T}from"./Shortcuts";import{t as d}from"../utils/i18n";import x from"fuse.js";import y from"./EntityItemContainer";import"./Speakers.scss";const v=p(({showFilters:i=!0})=>{const f=k(),l=t.speakerStore.speakers,{filters:{selectedCompanies:{value:a},selectedJobTitles:{value:n}}}=t.speakerFilterStore.state,c=S(()=>{let e=l;a.length>0&&(e=e.filter(s=>a.includes(s.company))),n.length>0&&(e=e.filter(s=>n.includes(s.jobTitle)));const o=t.searchStore.searchText;if(o){const s={keys:["name","company","jobTitle"],threshold:.3,ignoreLocation:!0,includeScore:!0};e=new x(e,s).search(o).map(u=>u.item)}return e},[l,t.searchStore.searchText,a,n,t.speakerFilterStore.state]);return b(()=>h("div",{className:"efp-speakers-content",children:[i&&r(T,{interfaceId:"speakers"}),c.length>0?r("div",{className:"efp-speakers-list",ref:f,children:c.map(e=>{const o=t.speakerStore.getEventsBySpeaker(e.id),s=[];return e.jobTitle&&s.push({type:"text",text:e.jobTitle}),r(y,{id:e.id.toString(),kind:"speaker",title:e.name,subtitle:e.company,image:e.photoFile,itemsCount:o.length,additionalInfo:s,bookmarked:e.bookmarked,onClick:()=>t.selectSpeaker(e,!0)},e.id)})}):r("div",{className:"list-empty",children:t.speakerFilterStore.activeFiltersCount>0||t.searchStore.searchText?d("No speakers found. Try adjusting your filters."):d("No speakers found")})]}))}),g=p(i=>m.list.type!=="speakers"||m.details?null:r(v,{...i}));export default g;
@@ -22,6 +22,7 @@ export { default as CookieConsent } from "./CookieConsent";
22
22
  export { default as Controls } from "./Controls";
23
23
  export { default as Demo } from "./Demo";
24
24
  export { default as EntityItemContainer } from "./EntityItemContainer";
25
+ export type { EntityItemKind } from "./EntityItemContainer";
25
26
  export { default as EntityList } from "./EntityList";
26
27
  export { default as EntityListRow } from "./EntityListRow";
27
28
  export { default as ErrorBoundary } from "./ErrorBoundary";
@@ -84,7 +85,7 @@ export type { ButtonProps, ButtonVariant, ButtonSize } from "../ui/Button";
84
85
  export type { BadgeProps, BadgeVariant } from "../ui/Badge";
85
86
  export type { CheckboxProps } from "../ui/Checkbox";
86
87
  export type { CookieConsentProps } from "./CookieConsent";
87
- export type { EntityItemProps, EntityItemType, EntityItemAdditionalInfo } from "./EntityItem";
88
+ export type { EntityItemProps, EntityItemAdditionalInfo } from "../ui/EntityItem";
88
89
  export type { HeatmapLegendProps } from "../ui/HeatmapLegend";
89
90
  export type { LevelBadgeProps } from "../ui/LevelBadge";
90
91
  export type { MapControlsProps, MapControlLayersItem } from "./MapControls";
@@ -1,4 +1,5 @@
1
1
  export interface FloorPlanFlags {
2
2
  enableExperimentalRerouting?: boolean;
3
+ enableExperimentalMaplibre?: boolean;
3
4
  }
4
5
  //# sourceMappingURL=Flags.d.ts.map
@@ -4,8 +4,27 @@ interface ImageData {
4
4
  data: string;
5
5
  points: [][];
6
6
  }
7
+ interface GeoAnchorPoint {
8
+ x: number;
9
+ y: number;
10
+ lat: number;
11
+ lng: number;
12
+ }
13
+ interface FpGeoProperties {
14
+ bearing?: number;
15
+ config?: {
16
+ p0: GeoAnchorPoint;
17
+ p1?: GeoAnchorPoint;
18
+ p2: GeoAnchorPoint;
19
+ bearing?: number;
20
+ snapThreshold?: number;
21
+ };
22
+ mpViewbox?: number[];
23
+ useMaplibre?: boolean;
24
+ [key: string]: unknown;
25
+ }
7
26
  interface ExtendFeatureCollection extends FeatureCollection {
8
- properties: any;
27
+ properties: FpGeoProperties;
9
28
  images: ImageData[];
10
29
  }
11
30
  export declare const fpGeo: ExtendFeatureCollection;
@@ -16,6 +16,7 @@ export default class FloorPlanLoader implements FloorPlan {
16
16
  readonly onInit: (fp: FloorPlan) => void;
17
17
  readonly disableRuntimeAlerts: boolean;
18
18
  readonly viewerMode: boolean;
19
+ readonly maplibre: FloorPlanOptions["maplibre"];
19
20
  protected efpStyleLoadHandler: (e: Event) => void;
20
21
  protected resolveReady: () => void;
21
22
  readonly icons: Map<FloorPlanIcon, HTMLImageElement>;
@@ -1 +1 @@
1
- import{PREVIEW_MODE_ATTRIBUTE as T}from"./constants";import l from"./tools/base-runtime-url";import{buildRebookingUrl as F,getRebookingToken as A,retainRebookingToken as V}from"./tools/rebookingUrl";import{loadCss as x,loadFont as g,loadJs as b}from"./tools/loaders";import U from"./tools/logger";import{sleep as H}from"./utils";import{initI18n as z}from"./utils/i18n";import S from"./utils/is-webview";import{loadCustomCss as G}from"./utils/loadCustomCss";import{loadIcons as N}from"./utils/loadIcons";import Q from"./utils/mergeExhibitors";import E from"./utils/use-shadow";import q from"./utils/is-debug";import W from"./utils/is-localhost";import{initSentry as $}from"./tools/sentry";import{shouldLoadIntercom as J}from"./intercom";function t(){throw new Error("FloorPlan not ready")}export default class K{options;renderTarget;_ready;element;eventId;dataUrl;noOverlay;offHistory;ignoreQuery;allowConsent;onInit;disableRuntimeAlerts;viewerMode;efpStyleLoadHandler;resolveReady;icons=new Map;enableRotation=!0;alwaysShowSidebar=!1;get ready(){return this._ready}get previewMode(){return this.options.previewMode||this.element.hasAttribute(T)}onBoothClick;onBookmarkClick;onVisitedClick;onCategoryClick;onFpConfigured;onDirection;onDetails;onExhibitorCustomButtonClick;onGetCoordsClick;onMarkerClick;onLeaveEvent;selectBooth(e){t()}selectExhibitor(e){t()}selectRoute(e,r){t()}getOptimizedRoutes(e){t()}selectCurrentPosition(e,r,h){t()}setBookmarks(e){t()}setEntitiesBookmarks(e){t()}setEntitiesVisited(e){t()}setMarkers(e){t()}updateLayerVisibility(e,r){t()}getCenterCoordinates(){t()}applyParameters(e){t()}exhibitorsList(){t()}boothsList(){t()}categoriesList(){t()}selectCategory(e){t()}getVisibility(){t()}setVisibility(e){t()}findLocation(){t()}zoomIn(){t()}zoomOut(){t()}zoomTo(e,r){t()}switchView(){t()}fitBounds(){t()}getBounds(e){t()}getBoothRect(e){t()}convertToGeo(e,r){t()}unstable_destroy(){t()}highlightExhibitors(e){t()}highlightBooths(e){t()}onCurrentPositionChanged(e){t()}search(e){t()}getFloors(){t()}onFloorActivated(e){t()}activateFloor(e){t()}showPathway(e,r){t()}showPathwayOnly(e,r){t()}hidePathways(){t()}showSearch(){t()}changeLanguage(e){t()}isGpsTrackingEnabled(){t()}setGpsTrackingEnabled(e){t()}deselectCurrentPosition(){t()}deselectRoute(){t()}reset(){t()}selectAccessibleRoute(e){t()}constructor(e){this.options=e,this.noOverlay=!!e.noOverlay,this.offHistory=!!e.offHistory,this.ignoreQuery=e.ignoreQuery,this.allowConsent=W&&!q?!1:e.allowConsent,this.onBoothClick=e.onBoothClick,this.onBookmarkClick=e.onBookmarkClick,this.onVisitedClick=e.onVisitedClick,this.onCategoryClick=e.onCategoryClick,this.onDetails=e.onDetails,this.onExhibitorCustomButtonClick=e.onExhibitorCustomButtonClick,this.onGetCoordsClick=e.onGetCoordsClick,this.onMarkerClick=e.onMarkerClick,this.onFpConfigured=e.onFpConfigured,this.onDirection=e.onDirection,this.onInit=e.onInit,this.onCurrentPositionChanged=e.onCurrentPositionChanged,this.onFloorActivated=e.onFloorActivated,this.onLeaveEvent=e.onLeaveEvent,this.viewerMode=!!e.viewerMode,this.disableRuntimeAlerts=e.disableRuntimeAlerts??!0,this._ready=new Promise((d,a)=>{this.resolveReady=d});const r=e.element;if(this.element=r,r.__expofp)throw new Error("Element already in use");if(r.__expofp=this,r.getAttribute("data-event-id")||r.getAttribute("data-event"))throw new Error("data-xxx attributes are removed, use options instead");const h=e.expo||e.event;if(!h)throw new Error("`expo` option is required");$({eventId:h||"",isWebview:S}),this.eventId=h,window.__efpEvent=h,window.__efpElement=r;const m=document.createElement("div");m.style.height="100%",m.style.width="100%",r.appendChild(m);let n;if(S&&(this.allowConsent=!0),e.allowConsent===void 0){const a=new URL(window.location.href).searchParams.get("allowConsent");a&&(this.allowConsent=a==="true")}if(E){n=m.attachShadow({mode:"open"});const d=n,a=document;d.createElement=(...i)=>a.createElement(...i),d.createElementNS=(...i)=>a.createElementNS(...i),d.createTextNode=(...i)=>a.createTextNode(...i)}else n=m;const y=document.createElement("div");if(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,r.getAttribute("data-data-url"))throw new Error("data-xxx attributes are removed, use options instead");const u=e.legacyDataUrlBase;window.__dataUrlBase=u,this.dataUrl=u,U.log("Instantiating ExpoFP floorplan",e.element,h);const L=u+"data.js",O=u+"wf.data.js",P=u+"fp.svg.js",B=[b(O),b(L),b(P)];let v=0;this.efpStyleLoadHandler=function(d){const a=window.__efpStyleElements;for(;v<a.length;){const i=a[v];n.appendChild(i),v++}},window.addEventListener("__efpStyleLoad",this.efpStyleLoadHandler);const k=this;(async function(){await Promise.all(B);let a=0;for(;window.__fpPending&&!window.__fp;)await H(2e3),await b(P+`?v=${++a}`);const i=window.__data;if(!i){const{showEventNotFound:o}=await import("./tools/event-not-found");o(r);return}const R=J(i);R&&import("./intercom/bootIntercom").then(({bootIntercom:o})=>o(R)).catch(()=>{}),await z();const w=new URLSearchParams(window.location.search);let f,C;if(i?.trackerUrl)try{f=new URL(i.trackerUrl),C=f.searchParams.get("expoId")}catch(o){console.error(o)}const I=async o=>{if(!f||!C)return Promise.reject(new Error("trackerUrl or expoId is missing"));const s=new URL(o.dataUrl,f.origin),c=await fetch(s.toString(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({expoId:C,token:decodeURIComponent(w.get("t"))})});let p=[];c.ok&&(p=(await c.json()).map(o.dataMapper)),window.__heatmapDataYah={yah:p}};if(w.get("heatmap")==="true")try{if(w.get("type")==="yah")w.get("subtype")==="kiosk"?await I({dataUrl:"/api/kiosks/list/viewer",dataMapper:o=>({...o,id:o.key,name:`Kiosk ${o.key}`})}):await I({dataUrl:"/api/v1/you-are-here/qr-code/list/viewer",dataMapper:(o,s)=>({...o,name:`QR Code #${s+1}`})});else{const o=new URL("/api/fp-stats/get",f.origin);o.searchParams.set("expoId",C),o.searchParams.set("type","booview"),o.searchParams.set("t",decodeURIComponent(w.get("t")));const s=new URL("api/fp-stats/get",f.origin);s.searchParams.set("expoId",C),s.searchParams.set("type","exview"),s.searchParams.set("t",decodeURIComponent(w.get("t")));const[c,p]=await Promise.all([fetch(o.toString()),fetch(s.toString())]),[_,M]=await Promise.all([c.json(),p.json()]);window.__heatmapData={booths:_,exhibitors:M}}}catch(o){console.error("Heatmap: Initialization error",o)}try{const o=A();if(o){V(o);const s=F("api/rebooking-data",{rt:o,expoKey:h}),c=await fetch(s);if(c.ok){const p=await c.json();Q(i,p)}i.isRebooking=c.ok}else i.isRebooking=!1}catch(o){console.error(o)}const D=[x(l+"vendor/sanitize-css/sanitize.css",n),x(l+"vendor/perfect-scrollbar/css/perfect-scrollbar.css",n),x(l+"vendor/mapbox/mapbox-gl.css",n),g("Oswald",l+"fonts/oswald-v17-cyrillic_latin-300.woff",{weight:300}),g("Oswald",l+"fonts/oswald-v17-cyrillic_latin-500.woff",{weight:500}),g("Inter",l+"fonts/inter-400.woff2",{weight:400}),g("Inter",l+"fonts/inter-500.woff2",{weight:500}),g("Inter",l+"fonts/inter-600.woff2",{weight:600}),g("efp-symbols",l+"fonts/efp-symbols.woff",{weight:400}),G(i,n),N(k.icons)];await Promise.all(D),k.enableRotation=i?.enableRotation??!1,k.alwaysShowSidebar=i?.alwaysShowSidebar??!1,U.log("Data loaded");const{default:j}=await import("./floorplan.ready");for(document.querySelectorAll(".expofp-floorplan-loader").forEach(o=>o.remove());r.firstChild&&r.firstChild!==m;)r.removeChild(r.firstChild);Object.setPrototypeOf(k,j.prototype).init()})()}}
1
+ import{PREVIEW_MODE_ATTRIBUTE as T}from"./constants";import c from"./tools/base-runtime-url";import{buildRebookingUrl as F,getRebookingToken as A,retainRebookingToken as V}from"./tools/rebookingUrl";import{loadCss as I,loadFont as g,loadJs as k}from"./tools/loaders";import U from"./tools/logger";import{sleep as H}from"./utils";import{initI18n as z}from"./utils/i18n";import S from"./utils/is-webview";import{loadCustomCss as G}from"./utils/loadCustomCss";import{loadIcons as N}from"./utils/loadIcons";import Q from"./utils/mergeExhibitors";import E from"./utils/use-shadow";import q from"./utils/is-debug";import W from"./utils/is-localhost";import{initSentry as $}from"./tools/sentry";import{shouldLoadIntercom as J}from"./intercom";function t(){throw new Error("FloorPlan not ready")}export default class K{options;renderTarget;_ready;element;eventId;dataUrl;noOverlay;offHistory;ignoreQuery;allowConsent;onInit;disableRuntimeAlerts;viewerMode;maplibre;efpStyleLoadHandler;resolveReady;icons=new Map;enableRotation=!0;alwaysShowSidebar=!1;get ready(){return this._ready}get previewMode(){return this.options.previewMode||this.element.hasAttribute(T)}onBoothClick;onBookmarkClick;onVisitedClick;onCategoryClick;onFpConfigured;onDirection;onDetails;onExhibitorCustomButtonClick;onGetCoordsClick;onMarkerClick;onLeaveEvent;selectBooth(e){t()}selectExhibitor(e){t()}selectRoute(e,r){t()}getOptimizedRoutes(e){t()}selectCurrentPosition(e,r,h){t()}setBookmarks(e){t()}setEntitiesBookmarks(e){t()}setEntitiesVisited(e){t()}setMarkers(e){t()}updateLayerVisibility(e,r){t()}getCenterCoordinates(){t()}applyParameters(e){t()}exhibitorsList(){t()}boothsList(){t()}categoriesList(){t()}selectCategory(e){t()}getVisibility(){t()}setVisibility(e){t()}findLocation(){t()}zoomIn(){t()}zoomOut(){t()}zoomTo(e,r){t()}switchView(){t()}fitBounds(){t()}getBounds(e){t()}getBoothRect(e){t()}convertToGeo(e,r){t()}unstable_destroy(){t()}highlightExhibitors(e){t()}highlightBooths(e){t()}onCurrentPositionChanged(e){t()}search(e){t()}getFloors(){t()}onFloorActivated(e){t()}activateFloor(e){t()}showPathway(e,r){t()}showPathwayOnly(e,r){t()}hidePathways(){t()}showSearch(){t()}changeLanguage(e){t()}isGpsTrackingEnabled(){t()}setGpsTrackingEnabled(e){t()}deselectCurrentPosition(){t()}deselectRoute(){t()}reset(){t()}selectAccessibleRoute(e){t()}constructor(e){this.options=e,this.noOverlay=!!e.noOverlay,this.offHistory=!!e.offHistory,this.ignoreQuery=e.ignoreQuery,this.allowConsent=W&&!q?!1:e.allowConsent,this.onBoothClick=e.onBoothClick,this.onBookmarkClick=e.onBookmarkClick,this.onVisitedClick=e.onVisitedClick,this.onCategoryClick=e.onCategoryClick,this.onDetails=e.onDetails,this.onExhibitorCustomButtonClick=e.onExhibitorCustomButtonClick,this.onGetCoordsClick=e.onGetCoordsClick,this.onMarkerClick=e.onMarkerClick,this.onFpConfigured=e.onFpConfigured,this.onDirection=e.onDirection,this.onInit=e.onInit,this.onCurrentPositionChanged=e.onCurrentPositionChanged,this.onFloorActivated=e.onFloorActivated,this.onLeaveEvent=e.onLeaveEvent,this.viewerMode=!!e.viewerMode,this.disableRuntimeAlerts=e.disableRuntimeAlerts??!0,this.maplibre=e.maplibre,window.__efpMaplibre=e.maplibre,this._ready=new Promise((l,a)=>{this.resolveReady=l});const r=e.element;if(this.element=r,r.__expofp)throw new Error("Element already in use");if(r.__expofp=this,r.getAttribute("data-event-id")||r.getAttribute("data-event"))throw new Error("data-xxx attributes are removed, use options instead");const h=e.expo||e.event;if(!h)throw new Error("`expo` option is required");$({eventId:h||"",isWebview:S}),this.eventId=h,window.__efpEvent=h,window.__efpElement=r;const m=document.createElement("div");m.style.height="100%",m.style.width="100%",r.appendChild(m);let n;if(S&&(this.allowConsent=!0),e.allowConsent===void 0){const a=new URL(window.location.href).searchParams.get("allowConsent");a&&(this.allowConsent=a==="true")}if(E){n=m.attachShadow({mode:"open"});const l=n,a=document;l.createElement=(...i)=>a.createElement(...i),l.createElementNS=(...i)=>a.createElementNS(...i),l.createTextNode=(...i)=>a.createTextNode(...i)}else n=m;const y=document.createElement("div");if(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,r.getAttribute("data-data-url"))throw new Error("data-xxx attributes are removed, use options instead");const u=e.legacyDataUrlBase;window.__dataUrlBase=u,this.dataUrl=u,U.log("Instantiating ExpoFP floorplan",e.element,h);const L=u+"data.js",O=u+"wf.data.js",x=u+"fp.svg.js",B=[k(O),k(L),k(x)];let v=0;this.efpStyleLoadHandler=function(l){const a=window.__efpStyleElements;for(;v<a.length;){const i=a[v];n.appendChild(i),v++}},window.addEventListener("__efpStyleLoad",this.efpStyleLoadHandler);const b=this;(async function(){await Promise.all(B);let a=0;for(;window.__fpPending&&!window.__fp;)await H(2e3),await k(x+`?v=${++a}`);const i=window.__data;if(!i){const{showEventNotFound:o}=await import("./tools/event-not-found");o(r);return}const P=J(i);P&&import("./intercom/bootIntercom").then(({bootIntercom:o})=>o(P)).catch(()=>{}),await z();const w=new URLSearchParams(window.location.search);let f,C;if(i?.trackerUrl)try{f=new URL(i.trackerUrl),C=f.searchParams.get("expoId")}catch(o){console.error(o)}const R=async o=>{if(!f||!C)return Promise.reject(new Error("trackerUrl or expoId is missing"));const s=new URL(o.dataUrl,f.origin),d=await fetch(s.toString(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({expoId:C,token:decodeURIComponent(w.get("t"))})});let p=[];d.ok&&(p=(await d.json()).map(o.dataMapper)),window.__heatmapDataYah={yah:p}};if(w.get("heatmap")==="true")try{if(w.get("type")==="yah")w.get("subtype")==="kiosk"?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,s)=>({...o,name:`QR Code #${s+1}`})});else{const o=new URL("/api/fp-stats/get",f.origin);o.searchParams.set("expoId",C),o.searchParams.set("type","booview"),o.searchParams.set("t",decodeURIComponent(w.get("t")));const s=new URL("api/fp-stats/get",f.origin);s.searchParams.set("expoId",C),s.searchParams.set("type","exview"),s.searchParams.set("t",decodeURIComponent(w.get("t")));const[d,p]=await Promise.all([fetch(o.toString()),fetch(s.toString())]),[_,M]=await Promise.all([d.json(),p.json()]);window.__heatmapData={booths:_,exhibitors:M}}}catch(o){console.error("Heatmap: Initialization error",o)}try{const o=A();if(o){V(o);const s=F("api/rebooking-data",{rt:o,expoKey:h}),d=await fetch(s);if(d.ok){const p=await d.json();Q(i,p)}i.isRebooking=d.ok}else i.isRebooking=!1}catch(o){console.error(o)}const D=[I(c+"vendor/sanitize-css/sanitize.css",n),I(c+"vendor/perfect-scrollbar/css/perfect-scrollbar.css",n),g("Oswald",c+"fonts/oswald-v17-cyrillic_latin-300.woff",{weight:300}),g("Oswald",c+"fonts/oswald-v17-cyrillic_latin-500.woff",{weight:500}),g("Inter",c+"fonts/inter-400.woff2",{weight:400}),g("Inter",c+"fonts/inter-500.woff2",{weight:500}),g("Inter",c+"fonts/inter-600.woff2",{weight:600}),g("efp-symbols",c+"fonts/efp-symbols.woff",{weight:400}),G(i,n),N(b.icons)];await Promise.all(D),b.enableRotation=i?.enableRotation??!1,b.alwaysShowSidebar=i?.alwaysShowSidebar??!1,U.log("Data loaded");const{default:j}=await import("./floorplan.ready");for(document.querySelectorAll(".expofp-floorplan-loader").forEach(o=>o.remove());r.firstChild&&r.firstChild!==m;)r.removeChild(r.firstChild);Object.setPrototypeOf(b,j.prototype).init()})()}}