@expofp/floorplan 3.26.0 → 3.27.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 (203) hide show
  1. package/dist/browser/{Button-DI5g1CPS.js → Button-KGleP3m4.js} +6 -6
  2. package/dist/browser/{CookieConsent-Qws_nQ3N.js → CookieConsent-_czkUaUS.js} +8 -8
  3. package/dist/browser/{Debug-DTNPNDds.js → Debug-bz6KlGgY.js} +8 -8
  4. package/dist/browser/DebugTools-CHRXev1e.js +1922 -0
  5. package/dist/browser/{Demo-BDZjOBQc.js → Demo-Duw5xaxW.js} +10 -10
  6. package/dist/browser/{Free-Cage9TkV.js → Free-CTEgif-b.js} +10 -10
  7. package/dist/browser/{GalleryContainer-EeLKgziN.js → GalleryContainer-DHLJOPfK.js} +11 -11
  8. package/dist/browser/{GpsLoader-CJMX_mJN.js → GpsLoader-CJ5KyhZa.js} +34 -34
  9. package/dist/browser/{KioskStore-BSza48xl.js → KioskStore-BMvlzIQe.js} +58 -107
  10. package/dist/browser/{MaplibreAdapter-evVQiVQj.js → MaplibreAdapter-YyHtIPQy.js} +2056 -2141
  11. package/dist/browser/{ModalContainer-CTKDfIyR.js → ModalContainer-DuilVP6n.js} +11 -11
  12. package/dist/browser/{PermissionNotice-O469DuWb.js → PermissionNotice-C5Z1g99X.js} +7 -7
  13. package/dist/browser/SetKioskMode-BcAj0bcd.js +48 -0
  14. package/dist/browser/{ShowKiosk-DumFiuHU.js → ShowKiosk-D7Klhgza.js} +11 -11
  15. package/dist/browser/{ViewerMenuPanel-ByFemA_T.js → ViewerMenuPanel-apP-IAf0.js} +17 -17
  16. package/dist/browser/{add-debug-secret-listener-TLumKuSo.js → add-debug-secret-listener-HZVxK64L.js} +1 -1
  17. package/dist/browser/{adopt-global-settings-ghJrZaU5.js → adopt-global-settings-CWSlkexR.js} +10 -10
  18. package/dist/browser/{boolean-editor-WIpm-pFP.js → boolean-editor-BcBAWb-G.js} +10 -10
  19. package/dist/browser/{bootIntercom-BR_Ehbyl.js → bootIntercom-Jil5W-0K.js} +3 -3
  20. package/dist/browser/bundle.json +77 -65
  21. package/dist/browser/camera-events-DrdhxgVS.js +18 -0
  22. package/dist/browser/{classnames-BmlkHMS8.js → classnames-BU0Ok49m.js} +2 -2
  23. package/dist/browser/{client-CIHxJZmk.js → client-BU_uyO3_.js} +793 -992
  24. package/dist/browser/{components-7lxOhyyi.js → components-CppHY7O7.js} +1952 -2013
  25. package/dist/browser/debug-context-C_w9lssh.js +24315 -0
  26. package/dist/browser/{debug-overlay-B7jCqVlX.js → debug-overlay-fKIQx7R_.js} +11 -11
  27. package/dist/browser/{debug-ui-D1ApG52e.js → debug-ui-BO_gZvdf.js} +7 -7
  28. package/dist/browser/dimming-WtGfPnAD.js +1108 -0
  29. package/dist/browser/{dist-BrF5yJyj.js → dist-BfpVKsX1.js} +6 -6
  30. package/dist/browser/{dist-C67OkD_4.js → dist-C2P11Xlj.js} +7 -7
  31. package/dist/browser/{dist-CnpnDA-V.js → dist-PTVsGItC.js} +3 -3
  32. package/dist/browser/{efp-debug-init-BqEN61Fo.js → efp-debug-init-Ce-CZeeI.js} +4 -4
  33. package/dist/browser/{enum-editor-Cy6VeZZd.js → enum-editor-CupsYrxs.js} +5 -5
  34. package/dist/browser/{es5-DyV1fctu.js → es5-DI5LkTYN.js} +2 -2
  35. package/dist/browser/{event-not-found-BpFVdXz_.js → event-not-found-D4Xi--mZ.js} +1 -1
  36. package/dist/browser/{exports-C7NzL4lf.js → exports-CePcAVlz.js} +1 -1
  37. package/dist/browser/{favicon-BHscWjwp.js → favicon-Dcly9HEc.js} +1 -1
  38. package/dist/browser/{fetch-retry.umd-BytZeydp.js → fetch-retry.umd-dWO0gw3b.js} +2 -2
  39. package/dist/browser/{flex-BQBLAC6l.js → flex-nmgYIErO.js} +6 -6
  40. package/dist/browser/{floorplan.loader-DkaQPhwC.js → floorplan.loader-Nb2QDU7l.js} +10 -10
  41. package/dist/browser/{floorplan.ready-DwuXZphI.js → floorplan.ready-D_9nn960.js} +344 -308
  42. package/dist/browser/{fuse-DZTwJ52u.js → fuse-s0oxaMyr.js} +2 -2
  43. package/dist/browser/{i18n-Bcv8xw_q.js → i18n-D0X-IbhS.js} +5 -5
  44. package/dist/browser/index.js +14 -14
  45. package/dist/browser/{index.module-BFxDVa3K.js → index.module-CtQP4Qv8.js} +4 -4
  46. package/dist/browser/{integrateKiosk-VTNZSSfD.js → integrateKiosk-CTKZOTyE.js} +5 -5
  47. package/dist/browser/{is-webview-CjItzxdV.js → is-webview-C5K2dDqT.js} +1 -1
  48. package/dist/browser/{jsx-runtime-CT2c-IhD.js → jsx-runtime-hIg99QxI.js} +2 -2
  49. package/dist/browser/{kiosk-record-v7r7q7t0.js → kiosk-record-BkSt5SU1.js} +1 -1
  50. package/dist/browser/{lib-DGh8lZgT.js → lib-DyJ1LDRt.js} +3 -3
  51. package/dist/browser/{loadImage-a_ahClbD.js → loadImage-Chw6Qd0w.js} +4 -4
  52. package/dist/browser/{logDeviceInfo-DHfa6NcE.js → logDeviceInfo-3jqov_0t.js} +9 -9
  53. package/dist/browser/{mobx-dAtztuiQ.js → mobx-C29RNezs.js} +7 -7
  54. package/dist/browser/{optional-boolean-editor-D43-yLO3.js → optional-boolean-editor-DYudule5.js} +4 -4
  55. package/dist/browser/{optional-enum-editor-Cvn8TV-x.js → optional-enum-editor-CdOjFlrE.js} +5 -5
  56. package/dist/browser/{optional-string-editor-sY0yVw_j.js → optional-string-editor-DIJigrO5.js} +5 -5
  57. package/dist/browser/{particles.min-BD7iDSr6.js → particles.min-BZCTScUM.js} +2 -2
  58. package/dist/browser/{react-BJopqGbW.js → react-D4xfjtF6.js} +2 -2
  59. package/dist/browser/{react-dom-B77nDdqp.js → react-dom-B6MtngPG.js} +3 -3
  60. package/dist/browser/{rolldown-runtime-BmHtYG9i.js → rolldown-runtime-hkgDPyCj.js} +1 -1
  61. package/dist/browser/scheduler-CUIe3W2m.js +212 -0
  62. package/dist/browser/{select-ByU-Ym6-.js → select-Dt6UIEBZ.js} +11 -11
  63. package/dist/browser/{settings-CEH1i0Pj.js → settings-CyYgXisa.js} +2 -2
  64. package/dist/browser/{settings-item-_PTji9Bz.js → settings-item-COIUD8kZ.js} +7 -7
  65. package/dist/browser/store-C33lZtwI.js +31207 -0
  66. package/dist/browser/{string-editor-DaF1t7MK.js → string-editor-kOSWCbwh.js} +5 -5
  67. package/dist/browser/{text-field-XRLZPyNV.js → text-field-DD6CFKaL.js} +6 -6
  68. package/dist/browser/{theme-D0OZcdto.js → theme-gxjTjrZ9.js} +9 -9
  69. package/dist/browser/{ui-7ozfXlN3.js → ui-DBItAumt.js} +9 -9
  70. package/dist/browser/{useRenderTarget-BG295f3e.js → useRenderTarget-DkuQpLE2.js} +5 -5
  71. package/dist/browser/viewport-A_9Nzrm0.js +41 -0
  72. package/dist/esm/components/Kiosk/KioskStore.d.ts +5 -2
  73. package/dist/esm/components/Kiosk/KioskStore.js +1 -1
  74. package/dist/esm/components/Kiosk/SetKioskMode.d.ts +1 -2
  75. package/dist/esm/components/Kiosk/SetKioskMode.js +1 -1
  76. package/dist/esm/components/Map/Map.d.ts +1 -1
  77. package/dist/esm/components/Map/Map.js +1 -1
  78. package/dist/esm/components/Map/MapCamera.d.ts +17 -0
  79. package/dist/esm/components/Map/MapCamera.js +1 -0
  80. package/dist/esm/components/Map/MapViewport.d.ts +12 -0
  81. package/dist/esm/components/Map/MapViewport.js +1 -0
  82. package/dist/esm/components/Map/booth-by-xy.d.ts +13 -0
  83. package/dist/esm/components/Map/booth-by-xy.js +1 -1
  84. package/dist/esm/components/Map/camera-events.d.ts +16 -0
  85. package/dist/esm/components/Map/camera-events.js +1 -0
  86. package/dist/esm/components/Map/camera.d.ts +48 -0
  87. package/dist/esm/components/Map/camera.js +1 -0
  88. package/dist/esm/components/Map/drawing/config/TextFitter.d.ts +1 -1
  89. package/dist/esm/components/Map/drawing/config/config-all.d.ts +1 -2
  90. package/dist/esm/components/Map/drawing/config/config-all.js +1 -1
  91. package/dist/esm/components/Map/drawing/config/config-bg.d.ts +1 -2
  92. package/dist/esm/components/Map/drawing/config/config-bg.js +1 -1
  93. package/dist/esm/components/Map/drawing/config/config-booth-badge.d.ts +70 -3
  94. package/dist/esm/components/Map/drawing/config/config-booth-badge.js +1 -1
  95. package/dist/esm/components/Map/drawing/config/config-booth-bg.d.ts +3 -6
  96. package/dist/esm/components/Map/drawing/config/config-booth-bg.js +1 -1
  97. package/dist/esm/components/Map/drawing/config/config-booth-bookmark.d.ts +11 -7
  98. package/dist/esm/components/Map/drawing/config/config-booth-bookmark.js +1 -1
  99. package/dist/esm/components/Map/drawing/config/config-booth-border.d.ts +2 -3
  100. package/dist/esm/components/Map/drawing/config/config-booth-border.js +1 -1
  101. package/dist/esm/components/Map/drawing/config/config-booth-labels-special.d.ts +16 -3
  102. package/dist/esm/components/Map/drawing/config/config-booth-labels-special.js +2 -2
  103. package/dist/esm/components/Map/drawing/config/config-booth-labels.d.ts +18 -4
  104. package/dist/esm/components/Map/drawing/config/config-booth-labels.js +1 -1
  105. package/dist/esm/components/Map/drawing/config/config-booths.d.ts +1 -2
  106. package/dist/esm/components/Map/drawing/config/config-booths.js +1 -1
  107. package/dist/esm/components/Map/drawing/config/config-load-layer.d.ts +1 -2
  108. package/dist/esm/components/Map/drawing/config/config-load-layer.js +1 -1
  109. package/dist/esm/components/Map/drawing/config/config-markers.d.ts +23 -2
  110. package/dist/esm/components/Map/drawing/config/config-markers.js +1 -1
  111. package/dist/esm/components/Map/drawing/config/layer-images.d.ts +35 -0
  112. package/dist/esm/components/Map/drawing/config/layer-images.js +1 -0
  113. package/dist/esm/components/Map/drawing/config/loadBoothsImages.d.ts +38 -3
  114. package/dist/esm/components/Map/drawing/config/loadBoothsImages.js +1 -1
  115. package/dist/esm/components/Map/pointer.d.ts +73 -0
  116. package/dist/esm/components/Map/pointer.js +1 -0
  117. package/dist/esm/components/Map/scene.d.ts +20 -0
  118. package/dist/esm/components/Map/scene.js +1 -0
  119. package/dist/esm/components/Map/traffic/trafficLayers.d.ts +2 -7
  120. package/dist/esm/components/Map/traffic/trafficLayers.js +1 -1
  121. package/dist/esm/components/Map/traffic/useBuildRoute.d.ts +4 -3
  122. package/dist/esm/components/Map/traffic/useBuildRoute.js +6 -6
  123. package/dist/esm/components/Map/traffic/useManageTraffic.d.ts +4 -3
  124. package/dist/esm/components/Map/traffic/useManageTraffic.js +1 -1
  125. package/dist/esm/components/Map/viewport.d.ts +63 -0
  126. package/dist/esm/components/Map/viewport.js +1 -0
  127. package/dist/esm/components/Maplibre/MaplibreAdapter.d.ts +6 -2
  128. package/dist/esm/components/Maplibre/MaplibreAdapter.js +1 -1
  129. package/dist/esm/components/Maplibre/MaplibreWrapper.d.ts +30 -8
  130. package/dist/esm/components/Maplibre/MaplibreWrapper.js +1 -1
  131. package/dist/esm/components/Maplibre/useDimming.d.ts +2 -2
  132. package/dist/esm/components/Maplibre/useDimming.js +1 -1
  133. package/dist/esm/components/Maplibre/useKioskIdleEvents.d.ts +5 -6
  134. package/dist/esm/components/Maplibre/useLayerVisibilitySync.d.ts +2 -2
  135. package/dist/esm/components/Maplibre/useLayerVisibilitySync.js +1 -1
  136. package/dist/esm/components/Maplibre/usePoiMarkers.d.ts +1 -2
  137. package/dist/esm/components/Maplibre/useWayfindingAndMarkers.d.ts +8 -5
  138. package/dist/esm/components/Maplibre/useWayfindingAndMarkers.js +1 -1
  139. package/dist/esm/components/Maplibre/utils/layer-defs.d.ts +8 -3
  140. package/dist/esm/components/Maplibre/utils/layer-defs.js +1 -1
  141. package/dist/esm/components/Maplibre/utils/poi-marker-hit-test.d.ts +3 -3
  142. package/dist/esm/components/Ws.js +1 -1
  143. package/dist/esm/engine/defs.d.ts +30 -0
  144. package/dist/esm/engine/defs.js +3 -0
  145. package/dist/esm/engine/fonts.js +1 -0
  146. package/dist/esm/engine/update-def.d.ts +52 -0
  147. package/dist/esm/engine/update-def.js +1 -0
  148. package/dist/esm/engine/utils/rotation.d.ts +6 -0
  149. package/dist/esm/engine/utils/rotation.js +1 -0
  150. package/dist/esm/floorplan.ready.d.ts +2 -0
  151. package/dist/esm/floorplan.ready.js +1 -1
  152. package/dist/esm/store/BoothStore.d.ts +11 -0
  153. package/dist/esm/store/LayerStore.d.ts +2 -0
  154. package/dist/esm/store/LayerStore.js +1 -1
  155. package/dist/esm/store/RootStore.d.ts +0 -2
  156. package/dist/esm/store/RootStore.js +1 -1
  157. package/dist/esm/store/RouteStore.js +1 -1
  158. package/dist/esm/store/UIState.js +1 -1
  159. package/dist/esm/store/details-events.d.ts +11 -0
  160. package/dist/esm/store/details-events.js +1 -0
  161. package/dist/esm/store/init/init-booths.js +1 -1
  162. package/dist/esm/utils/dimming.d.ts +13 -2
  163. package/dist/esm/utils/dimming.js +1 -1
  164. package/dist/esm/utils/mobx.d.ts +2 -2
  165. package/dist/esm/utils/mobx.js +1 -1
  166. package/dist/esm/utils/scene-bounds.d.ts +1 -1
  167. package/dist/esm/utils/scene-bounds.js +1 -1
  168. package/dist/esm/wayfinding/adapters/canvasIconProvider.js +1 -1
  169. package/dist/esm/wayfinding/createWayfinding.d.ts +19 -2
  170. package/dist/esm/wayfinding/createWayfinding.js +1 -1
  171. package/package.json +11 -10
  172. package/dist/browser/SetKioskMode-DUk4c-Gs.js +0 -57
  173. package/dist/browser/booth-by-xy-CyZpg1Fn.js +0 -1130
  174. package/dist/browser/main-sUuehgQu.js +0 -289
  175. package/dist/browser/store-Oj0dGPnb.js +0 -41431
  176. package/dist/esm/components/Map/pointInConvexQuad.d.ts +0 -3
  177. package/dist/esm/components/Map/pointInConvexQuad.js +0 -1
  178. package/dist/esm/components/Map/visibleArea.d.ts +0 -16
  179. package/dist/esm/components/Map/visibleArea.js +0 -1
  180. package/dist/esm/components/Maplibre/useRendererEvents.d.ts +0 -9
  181. package/dist/esm/components/Maplibre/useRendererEvents.js +0 -1
  182. package/dist/esm/components/Maplibre/utils/update-pump.d.ts +0 -18
  183. package/dist/esm/components/Maplibre/utils/update-pump.js +0 -1
  184. package/dist/esm/renderer/HandlerRegistry.d.ts +0 -18
  185. package/dist/esm/renderer/HandlerRegistry.js +0 -1
  186. package/dist/esm/renderer/RendererService.d.ts +0 -44
  187. package/dist/esm/renderer/RendererService.js +0 -1
  188. package/dist/esm/renderer/engine-core/defs.d.ts +0 -40
  189. package/dist/esm/renderer/engine-core/defs.js +0 -3
  190. package/dist/esm/renderer/engine-core/fonts.js +0 -1
  191. package/dist/esm/renderer/engine-core/settings.d.ts +0 -4
  192. package/dist/esm/renderer/engine-core/settings.js +0 -1
  193. package/dist/esm/renderer/engine-core/types.d.ts +0 -50
  194. package/dist/esm/renderer/engine-core/types.js +0 -1
  195. package/dist/esm/renderer/engine-core/update-def.d.ts +0 -12
  196. package/dist/esm/renderer/engine-core/update-def.js +0 -1
  197. package/dist/esm/renderer/engine-core/utils/rotation.d.ts +0 -17
  198. package/dist/esm/renderer/engine-core/utils/rotation.js +0 -1
  199. package/dist/esm/renderer/index.d.ts +0 -19
  200. package/dist/esm/renderer/index.js +0 -1
  201. /package/dist/esm/{renderer/engine-core → engine}/canvases.d.ts +0 -0
  202. /package/dist/esm/{renderer/engine-core → engine}/canvases.js +0 -0
  203. /package/dist/esm/{renderer/engine-core → engine}/fonts.d.ts +0 -0
@@ -1 +1 @@
1
- import{Box as v,pointRotate as S,Polygon as tt,Rect as nt}from"@expofp/geometry";import et from"color";import{reaction as W}from"mobx";import{SEPARATOR as $}from"../../../../constants";import N from"../../../../data";import{getTrianglesFromFpPaths as ot}from"../../../../data/svg";import{createShapeDef as st,createTextDef as it,createTextDefLines as rt,getRollValue as ct,getRotation as at,rectToRenderer as X}from"../../../../renderer";import{boothStore as lt,uiState as Z}from"../../../../store";import{RegularBooth as dt}from"../../../../store/BoothStore";import V from"../../../../tools/settings";import{getContrastTextColor as ft}from"../../../../utils/getContrastTextColor";import{getFont as ut}from"./canvases";import{isBoothBadgeEligible as gt}from"./config-booth-badge-eligibility";import{getBadgeFontWeight as ht,getFontUrlByWeight as mt}from"./config-booth-labels";const pt=.5,xt=.3,j=15,Bt=24,q=30,yt=12,At=12,J=.8,K=document.createElement("canvas").getContext("2d");function Et(t){return t.length<=j?t:t.slice(0,j-1)+"\u2026"}function Q(t){if(!t.paths?.length)return[];const n=t.layer?.name||"",s=[];for(const e of t.paths)for(const i of ot(e.index,n))s.push(i);return s}function Tt(t){const n=Q(t);return n.length?v.fromPoints(n.flat().map(([s,e])=>({x:s,y:e}))):null}function It(t){const n=[],s=[];for(const e of t){const i=n.length;n.push({x:e[0][0],y:e[0][1]}),n.push({x:e[1][0],y:e[1][1]}),n.push({x:e[2][0],y:e[2][1]}),s.push([i,i+1,i+2])}return new tt(n,s)}function H(t,n,s){return s.containsPoint({x:t,y:n})}function Rt(t,n,s,e,i,u,l,r){if(!t.length||!H(s,e,n))return l;const c={x:s,y:e};let d=0,B=l;const R=10;for(let p=0;p<R;p++){const g=(d+B)/2,I=i*g,x=u*g;[S({x:s+I,y:e},r,c),S({x:s,y:e+x},r,c),S({x:s+I,y:e+x},r,c)].every(y=>H(y.x,y.y,n))?d=g:B=g}return d}function _t(t){return Tt(t)??t.rect}function Dt(t,n,s,e,i,u){if(n.length){const d=_t(t),B={x:i>0?d.min.x:d.max.x,y:u>0?d.min.y:d.max.y},R=new Set;let p=null,g=1/0;for(const I of n)for(const x of I){const _=`${x[0]},${x[1]}`;if(R.has(_))continue;R.add(_);const A=x[0]+e*i,y=x[1]+e*u;if(H(A,y,s)){const E=Math.abs(A-B.x)+Math.abs(y-B.y);E<g&&(g=E,p={x:A,y})}}if(p)return p}const l=i>0?t.rect.min.x+e:t.rect.max.x-e,r=u>0?t.rect.min.y+e:t.rect.max.y-e,c=t.rotate??0;return c?S({x:l,y:r},c,t.rect.center):{x:l,y:r}}function F(t){return t&&t!=="none"?t:void 0}function St(t){const n=F(t.borderColor)||F(V.boothBorderColor)||V.colors.booths.default;return t.paths?.length>1&&F(t.paths[t.paths.length-1].color)||n}export function createBoothBadge(t,n){const s=Et(n.title||n.name),e=St(n),i=ft(et(e).hex()),u=window.devicePixelRatio||1,l=ht(),r=ut(q,l);K.font=r;const c=K.measureText(s).width,d=Math.ceil(c+yt*2),B=q+At*2,R=(n.borderWidth||lt.borderWidth)/2,p=d*J,g=B*J,I=n.rect.size.width,x=n.rect.size.height,_=o=>{const a=o?x:I,m=o?I:x;return Math.min(a>0?a*pt/p:1/0,m>0?m*xt/g:1/0)},A=Q(n),y=It(A);let E=n.rotate??0,T=0,P,C,M;const L=()=>{const m=Dt(n,A,y,R,T===0||T===3?1:-1,T===0||T===1?1:-1);P=m.x,C=m.y;const G=_(T===1||T===3);M=Rt(A,y,P,C,p,g,G,E)};L();const b=(o,a)=>{const m=o/2,G=a/2,Y=S({x:P+m,y:C+G},E,{x:P,y:C});return new nt(Y,{x:o,y:a},E)},O=o=>{const a=Math.min(o,M);return b(p*a,g*a)},w=mt(l,t.fontUrls),h=st(b(1,1),e);h.hidden=!0,h.dim=n.skipDim?!1:void 0;const f=it(rt([[s],[]],i,0,[w,w]),b(1,1),[0,0],{horizontal:"center",vertical:"center"});f.hidden=!0,f.dim=n.skipDim?!1:void 0;const U=()=>!!(n.layer&&!n.layer.visible),D=[];D.push(W(()=>n.skipDim,o=>{h.dim=o?!1:void 0,f.dim=o?!1:void 0,t.update(h,f)})),D.push(W(()=>n.layer?.visible??!0,o=>{h.hidden=!o,f.hidden=!o,t.update(h,f)}));const k=o=>{h.shape=X(O(o)),h.hidden=U()},z=o=>{const a=Math.min(o,M);f.lines[0].fontSize=Bt/u*a,f.bounds=X(O(o)),f.hidden=U()};return t.onPtScale(`badge-bg-${n.id}`,o=>(k(o),h)),t.onPtScale(`badge-text-${n.id}`,o=>(z(o),f)),D.push(W(()=>Z.mapSettings,({roll:o})=>{ct(o??0)&&t.onRoll(`badge-roll-${n.id}`,a=>{const m=at(a,E);m!==void 0&&(E+=m,T=(T+(m>0?1:3))%4,L(),k(t.scale),z(t.scale),t.update(h,f))})},{fireImmediately:!0})),{bg:h,text:f,dispose:()=>{D.forEach(o=>o()),D.length=0}}}export function configBoothsBadges(t,n,s){const e=[],i=[],u=[];for(const r of s)if(r instanceof dt&&gt({hideExhibitorBoothNumber:N.hideExhibitorBoothNumber,hideBoothBadges:N.hideBoothBadges,hideLogoInBooth:Z.hideLogoInBooth,noLabels:r.noLabels,hasExhibitors:r.exhibitors.length>0,hasLogoInBooth:r.exhibitors.some(c=>c.logoInBooth&&c.logo)})){const{bg:c,text:d,dispose:B}=createBoothBadge(t,r);e.push(c),i.push(d),u.push(B)}const l=()=>{u.forEach(r=>r()),u.length=0};return e.length?{layer:{name:`${n}${$}badges`,children:[{name:`${n}${$}badgeBgs`,children:e},{name:`${n}${$}badgeTexts`,children:i}]},cleanup:l}:{layer:null,cleanup:l}}
1
+ import{Box as J,pointRotate as R,Polygon as K,Rect as v}from"@expofp/geometry";import{update as L}from"@expofp/renderer";import Q from"color";import{reaction as P}from"mobx";import{SEPARATOR as G}from"../../../../constants";import U from"../../../../data";import{getTrianglesFromFpPaths as Y}from"../../../../data/svg";import{createShapeDef as tt,createTextDef as et,createTextDefLines as nt}from"../../../../engine/defs";import{loadCustomFontsUrls as ot}from"../../../../engine/fonts";import{getRollValue as rt,getRotation as st}from"../../../../engine/update-def";import{boothStore as it,uiState as N}from"../../../../store";import{RegularBooth as ct}from"../../../../store/BoothStore";import k from"../../../../tools/settings";import{getContrastTextColor as at}from"../../../../utils/getContrastTextColor";import{getFont as lt}from"./canvases";import{isBoothBadgeEligible as dt}from"./config-booth-badge-eligibility";import{getBadgeFontWeight as ht,getFontUrlByWeight as ut}from"./config-booth-labels";const ft=.5,gt=.3,z=15,mt=24,X=30,xt=12,pt=12,Z=.8,V=document.createElement("canvas").getContext("2d");function yt(t){return t.length<=z?t:t.slice(0,z-1)+"\u2026"}function j(t){if(!t.paths?.length)return[];const n=t.layer?.name||"",e=[];for(const o of t.paths)for(const r of Y(o.index,n))e.push(r);return e}function Bt(t){const n=j(t);return n.length?J.fromPoints(n.flat().map(([e,o])=>({x:e,y:o}))):null}function St(t){const n=[],e=[];for(const o of t){const r=n.length;n.push({x:o[0][0],y:o[0][1]}),n.push({x:o[1][0],y:o[1][1]}),n.push({x:o[2][0],y:o[2][1]}),e.push([r,r+1,r+2])}return new K(n,e)}function H(t,n,e){return e.containsPoint({x:t,y:n})}function At(t,n,e,o,r,d,i,c){if(!t.length||!H(e,o,n))return i;const h={x:e,y:o};let a=0,f=i;const A=10;for(let y=0;y<A;y++){const m=(a+f)/2,I=r*m,g=d*m;[R({x:e+I,y:o},c,h),R({x:e,y:o+g},c,h),R({x:e+I,y:o+g},c,h)].every(l=>H(l.x,l.y,n))?a=m:f=m}return a}function Et(t){return Bt(t)??t.rect}function Tt(t,n,e,o,r,d){if(n.length){const a=Et(t),f={x:r>0?a.min.x:a.max.x,y:d>0?a.min.y:a.max.y},A=new Set;let y=null,m=1/0;for(const I of n)for(const g of I){const _=`${g[0]},${g[1]}`;if(A.has(_))continue;A.add(_);const u=g[0]+o*r,l=g[1]+o*d;if(H(u,l,e)){const B=Math.abs(u-f.x)+Math.abs(l-f.y);B<m&&(m=B,y={x:u,y:l})}}if(y)return y}const i=r>0?t.rect.min.x+o:t.rect.max.x-o,c=d>0?t.rect.min.y+o:t.rect.max.y-o,h=t.rotate??0;return h?R({x:i,y:c},h,t.rect.center):{x:i,y:c}}function W(t){return t&&t!=="none"?t:void 0}function It(t){const n=W(t.borderColor)||W(k.boothBorderColor)||k.colors.booths.default;return t.paths?.length>1&&W(t.paths[t.paths.length-1].color)||n}export function createBoothBadge(t){const n=yt(t.title||t.name),e=It(t),o=at(Q(e).hex()),r=ht(),d=lt(X,r);V.font=d;const i=V.measureText(n).width,c=Math.ceil(i+xt*2),h=X+pt*2,a=(t.borderWidth||it.borderWidth)/2,f=c*Z,A=h*Z,y=t.rect.size.width,m=t.rect.size.height,I=s=>{const E=s?m:y,p=s?y:m;return Math.min(E>0?E*ft/f:1/0,p>0?p*gt/A:1/0)},g=j(t),_=St(g);let u=t.rotate??0,l=0,B=0,D=0,O=0;const w=()=>{const p=Tt(t,g,_,a,l===0||l===3?1:-1,l===0||l===1?1:-1);B=p.x,D=p.y;const T=I(l===1||l===3);O=At(g,_,B,D,f,A,T,u)};w();const F=(s,E)=>{const p=s/2,T=E/2,q=R({x:B+p,y:D+T},u,{x:B,y:D});return new v(q,{x:s,y:E},u,t.elevation)},$=ut(r,ot()),x=tt(F(1,1),e);x.hidden=!0,x.dim=t.skipDim?0:void 0;const S=et(nt([[n],[]],o,0,[$,$]),F(1,1),[0,0],{horizontal:"center",vertical:"center"});S.hidden=!0,S.dim=t.skipDim?0:void 0;const C={booth:t,anchor:{x:B,y:D},source:{x:f,y:A},rotation:u,maxScale:O,bg:x,text:S},M=new BoothBadgeDrawer(C);x.onScale=({pixelSize:s})=>M.layOutBg(s),S.onScale=({pixelSize:s})=>M.layOutText(s);const b=[];return b.push(P(()=>t.skipDim,s=>{x.dim=s?0:void 0,S.dim=s?0:void 0,L(x,S)})),b.push(P(()=>t.layer?.visible??!0,s=>{x.hidden=!s,S.hidden=!s,L(x,S)})),b.push(P(()=>N.mapSettings,({roll:s})=>{rt(s??0)&&(x.onRoll=({roll:E,pixelSize:p})=>{const T=st(E,u);if(T!==void 0)return u+=T,l=(l+(T>0?1:3))%4,w(),C.anchor.x=B,C.anchor.y=D,C.rotation=u,C.maxScale=O,[...M.layOutBg(p),...M.layOutText(p)]})},{fireImmediately:!0})),{bg:x,text:S,dispose:()=>{b.forEach(s=>s()),b.length=0}}}export class BoothBadgeDrawer{constructor(n){this.placement=n}layOutBg(n){const{bg:e}=this.placement;return e.shape=this.rectScaled(n),e.hidden=this.isHidden(),e.hidden?[]:[e]}layOutText(n){const{text:e,maxScale:o}=this.placement;return e.lines[0].fontSize=mt*Math.min(n,o),e.bounds=this.rectScaled(n),e.hidden=this.isHidden(),e.hidden?[]:[e]}rectScaled(n){const{anchor:e,booth:o,source:r,rotation:d,maxScale:i}=this.placement,c=Math.min(n,i),h=r.x*c,a=r.y*c,f=R({x:e.x+h/2,y:e.y+a/2},d,e);return new v(f,{x:h,y:a},d,o.elevation)}isHidden(){const{booth:n}=this.placement;return!!(n.layer&&!n.layer.visible)}}export function configBoothsBadges(t,n){const e=[],o=[],r=[];for(const i of n)if(i instanceof ct&&dt({hideExhibitorBoothNumber:U.hideExhibitorBoothNumber,hideBoothBadges:U.hideBoothBadges,hideLogoInBooth:N.hideLogoInBooth,noLabels:i.noLabels,hasExhibitors:i.exhibitors.length>0,hasLogoInBooth:i.exhibitors.some(c=>c.logoInBooth&&c.logo)})){const{bg:c,text:h,dispose:a}=createBoothBadge(i);e.push(c),o.push(h),r.push(a)}const d=()=>{r.forEach(i=>i()),r.length=0};return e.length?{layer:{name:`${t}${G}badges`,children:[{name:`${t}${G}badgeBgs`,children:e},{name:`${t}${G}badgeTexts`,children:o}]},cleanup:d}:{layer:null,cleanup:d}}
@@ -1,15 +1,12 @@
1
1
  import { ColorInput, ShapeDef } from '@expofp/renderer';
2
2
  import Color from 'color';
3
- import { RendererService } from '../../../../renderer';
4
- import { PathInfo } from '../../../../renderer/engine-core/types';
5
3
  import { Booth } from '../../../../store/BoothStore';
6
- import { ShapeBgDef } from '../../../../types/drawing.types';
4
+ import { PathInfo, ShapeBgDef } from '../../../../types/drawing.types';
7
5
  import { BoothDrawerBaseWithoutPainter } from './BoothDrawerBase';
8
- export default function configBoothBg(rendererService: RendererService, booth: Booth): BoothBgDrawer;
6
+ export default function configBoothBg(booth: Booth): BoothBgDrawer;
9
7
  export declare function pathToShapeDef(paths: PathInfo[], layer: string): ShapeDef[];
10
8
  declare class BoothBgDrawer extends BoothDrawerBaseWithoutPainter {
11
- private readonly rendererService;
12
- constructor(rendererService: RendererService, booth: Booth);
9
+ constructor(booth: Booth);
13
10
  getShape(): ShapeBgDef[];
14
11
  update(): void;
15
12
  getBoothPathColor(defaultColor: ColorInput): Color<string>;
@@ -1 +1 @@
1
- import{__decorate as d}from"tslib";import{Rect as B}from"@expofp/geometry";import l from"color";import y from"color-interpolate";import{computed as u,reaction as m}from"mobx";import h from"../../../../data";import{getFpSvgJs as k}from"../../../../data/fp-payloads";import{createShapeDef as v}from"../../../../renderer";import g,{boothStore as D,layersStore as b,uiState as a}from"../../../../store";import{RegularBooth as x,SpecialBooth as L}from"../../../../store/BoothStore";import{RebookingState as P}from"../../../../store/ExhibitorStore";import{LayersMode as I}from"../../../../store/LayerStore";import{rebookingStateConfig as C}from"../../../../tools/rebooking-config";import s from"../../../../tools/settings";import{BoothDrawerBaseWithoutPainter as w}from"./BoothDrawerBase";import{buildPathDef as A}from"./config-bg";export default function F(i,o){return new c(i,o)}function R(i){if(i.length===0)return null;const o=i[0];return i.every(t=>t===o)?o:null}export function pathToShapeDef(i,o){const e=[];for(const t of i){const r=A({index:t.index,color:t.color,unblinking:t.unblinking},o);r&&e.push(r)}return e}class c extends w{constructor(o,e){if(super(e),this.rendererService=o,e.paths){const t=pathToShapeDef(e.paths,g.layerStore.mode!==I.Default?e.layer.name:"");e.shapes=t.map(r=>{const n=a.monochrome?l(r.color).grayscale().rgb().string():this.getBoothColor().string();return r.color==="transparent"?r.color=n:r.defaultColor=r.color,r})}else{const t=e.borderColor==="none"?0:isNaN(e.borderWidth)?D.borderWidth:e.borderWidth,r=this.booth.rect.expand(-t/2),n=this.getBoothColor().string();e.shapes=[v(new B(r.center,r.size,this.booth.rotate),n)]}m(()=>this.booth.hover,()=>!this.booth.selected&&this.update()),m(()=>[b.layersLoaded,this.booth.skipDim,this.booth.selected,this.boothShape.selectBgAnimationPart],()=>this.update())}getShape(){return this.booth.shapes}update(){if(b.layersLoaded)for(const o of this.booth.shapes){if(o.dim=this.booth.skipDim?!1:void 0,o.color&&!o.unblinking){const e=o.defaultColor?this.getBoothPathColor(o.defaultColor):this.getBoothColor();o.color=e.string()}this.rendererService.update(o)}}getBoothPathColor(o){if(a.heatmap)return this.getHeatmapColor();const e=this.booth;let t=l(o).hsl();if(e.selected){const r=s.colors.booths.selected;if(k().__fpSettings?.fpVer){const f=this.selectedColorInterpolateFunc(this.boothShape.selectBgAnimationPart),p=l(f==="none"?r:f);return a.monochrome?p.grayscale():p}const n=l(r).hsl(),S=n.lightness()*this.boothShape.selectBgAnimationPart;t=t.hue(n.hue()).lightness(S)}else e.hover&&(t=t.darken(.1));return a.monochrome&&(t=t.grayscale()),t}getHeatmapColor(){const o=this.booth,e=g.heatmapStore.getHeatmapColorForBooth(o);if(o.selected){const t=this.selectedColorInterpolateFunc(this.boothShape.selectBgAnimationPart);return l(t==="none"?"#f33":t)}return o.hover?e.darken(.2).alpha(e.alpha()*1.5):e}get defaultColor(){const o=this.booth;let e=s.colors.booths.default;if(o instanceof L)e=o.color||s.colors.booths.empty;else if(o instanceof x){if(h.isRebooking){if(!o.exhibitors?.length)return C[P.Unasked].color.primary;const r=R((o.exhibitors??[]).map(n=>n.rebookingState));return r!==null?C[r].color.primary:"#000000"}const t=s.colors.booths;o.onHold?e=o.holdColor||t.defaultHold:o.exhibitors.length||o.reserved?e=o.soldColor||t.defaultSold:e=o.availColor||t.empty}try{e==="none"&&(e=s.colors.booths.default),l(e)}catch(t){e=s.colors.booths.default,console.error("Booth: defaultColor",t)}return e}get selectedColorInterpolateFunc(){const o=s.colors.booths.seectedLight||(l(this.booth.labelColor||s.boothLabelColor).isLight()?"#000":"#fff"),e=a.selectedRoute?s?.colors?.booths?.wayfinding?.selected:s?.colors?.booths?.selected;return y([o,e])}getBoothColor(){const o=this.booth;if(a.heatmap)return this.getHeatmapColor();let e;o.error?e="#f33":h.isRebooking?e=this.defaultColor:o.selected?e=this.selectedColorInterpolateFunc(this.boothShape.selectBgAnimationPart):e=this.defaultColor;let t;try{t=l(e==="none"?"#f33":e)}catch{t=l(this.defaultColor)}return(o.hover&&!o.selected||o.selected&&h.isRebooking)&&(t=t.darken(.2).alpha(t.alpha()*1.5)),(a.monochrome||a.heatmapYah)&&(t=t.grayscale()),t}}d([u({keepAlive:!0})],c.prototype,"defaultColor",null),d([u({keepAlive:!0})],c.prototype,"selectedColorInterpolateFunc",null);
1
+ import{__decorate as d}from"tslib";import{Rect as S}from"@expofp/geometry";import{update as y}from"@expofp/renderer";import l from"color";import k from"color-interpolate";import{computed as u,reaction as m}from"mobx";import h from"../../../../data";import{getFpSvgJs as v}from"../../../../data/fp-payloads";import{createShapeDef as D}from"../../../../engine/defs";import g,{boothStore as x,layersStore as b,uiState as n}from"../../../../store";import{RegularBooth as L,SpecialBooth as P}from"../../../../store/BoothStore";import{RebookingState as I}from"../../../../store/ExhibitorStore";import{LayersMode as w}from"../../../../store/LayerStore";import{rebookingStateConfig as C}from"../../../../tools/rebooking-config";import s from"../../../../tools/settings";import{BoothDrawerBaseWithoutPainter as A}from"./BoothDrawerBase";import{buildPathDef as F}from"./config-bg";export default function R(i){return new c(i)}function H(i){if(i.length===0)return null;const o=i[0];return i.every(t=>t===o)?o:null}export function pathToShapeDef(i,o){const e=[];for(const t of i){const r=F({index:t.index,color:t.color,unblinking:t.unblinking},o);r&&e.push(r)}return e}class c extends A{constructor(o){if(super(o),o.paths){const e=pathToShapeDef(o.paths,g.layerStore.mode!==w.Default?o.layer.name:"");o.shapes=e.map(t=>{const r=n.monochrome?l(t.color).grayscale().rgb().string():this.getBoothColor().string();return t.color==="transparent"?t.color=r:t.defaultColor=t.color,t})}else{const e=o.borderColor==="none"?0:isNaN(o.borderWidth)?x.borderWidth:o.borderWidth,t=this.booth.rect.expand(-e/2),r=this.getBoothColor().string();o.shapes=[D(new S(t.center,t.size,this.booth.rotate,this.booth.elevation),r)]}m(()=>this.booth.hover,()=>!this.booth.selected&&this.update()),m(()=>[b.layersLoaded,this.booth.skipDim,this.booth.selected,this.boothShape.selectBgAnimationPart],()=>this.update())}getShape(){return this.booth.shapes}update(){if(b.layersLoaded)for(const o of this.booth.shapes){if(o.dim=this.booth.skipDim?!1:void 0,o.color&&!o.unblinking){const e=o.defaultColor?this.getBoothPathColor(o.defaultColor):this.getBoothColor();o.color=e.string()}y(o)}}getBoothPathColor(o){if(n.heatmap)return this.getHeatmapColor();const e=this.booth;let t=l(o).hsl();if(e.selected){const r=s.colors.booths.selected;if(v().__fpSettings?.fpVer){const f=this.selectedColorInterpolateFunc(this.boothShape.selectBgAnimationPart),p=l(f==="none"?r:f);return n.monochrome?p.grayscale():p}const a=l(r).hsl(),B=a.lightness()*this.boothShape.selectBgAnimationPart;t=t.hue(a.hue()).lightness(B)}else e.hover&&(t=t.darken(.1));return n.monochrome&&(t=t.grayscale()),t}getHeatmapColor(){const o=this.booth,e=g.heatmapStore.getHeatmapColorForBooth(o);if(o.selected){const t=this.selectedColorInterpolateFunc(this.boothShape.selectBgAnimationPart);return l(t==="none"?"#f33":t)}return o.hover?e.darken(.2).alpha(e.alpha()*1.5):e}get defaultColor(){const o=this.booth;let e=s.colors.booths.default;if(o instanceof P)e=o.color||s.colors.booths.empty;else if(o instanceof L){if(h.isRebooking){if(!o.exhibitors?.length)return C[I.Unasked].color.primary;const r=H((o.exhibitors??[]).map(a=>a.rebookingState));return r!==null?C[r].color.primary:"#000000"}const t=s.colors.booths;o.onHold?e=o.holdColor||t.defaultHold:o.exhibitors.length||o.reserved?e=o.soldColor||t.defaultSold:e=o.availColor||t.empty}try{e==="none"&&(e=s.colors.booths.default),l(e)}catch(t){e=s.colors.booths.default,console.error("Booth: defaultColor",t)}return e}get selectedColorInterpolateFunc(){const o=s.colors.booths.seectedLight||(l(this.booth.labelColor||s.boothLabelColor).isLight()?"#000":"#fff"),e=n.selectedRoute?s?.colors?.booths?.wayfinding?.selected:s?.colors?.booths?.selected;return k([o,e])}getBoothColor(){const o=this.booth;if(n.heatmap)return this.getHeatmapColor();let e;o.error?e="#f33":h.isRebooking?e=this.defaultColor:o.selected?e=this.selectedColorInterpolateFunc(this.boothShape.selectBgAnimationPart):e=this.defaultColor;let t;try{t=l(e==="none"?"#f33":e)}catch{t=l(this.defaultColor)}return(o.hover&&!o.selected||o.selected&&h.isRebooking)&&(t=t.darken(.2).alpha(t.alpha()*1.5)),(n.monochrome||n.heatmapYah)&&(t=t.grayscale()),t}}d([u({keepAlive:!0})],c.prototype,"defaultColor",null),d([u({keepAlive:!0})],c.prototype,"selectedColorInterpolateFunc",null);
@@ -1,20 +1,24 @@
1
1
  import { Rect } from '@expofp/geometry';
2
2
  import { ImageDef } from '@expofp/renderer';
3
- import { RendererService } from '../../../../renderer';
4
3
  import { Booth } from '../../../../store/BoothStore';
5
4
  import { BoothDrawerBaseWithoutPainter } from './BoothDrawerBase';
6
- export default function configBoothBookmarkImage(rendererService: RendererService, booth: Booth): BoothBookmarkDrawer | undefined;
7
- declare class BoothBookmarkDrawer extends BoothDrawerBaseWithoutPainter {
8
- protected rendererService: RendererService;
5
+ export default function configBoothBookmarkImage(booth: Booth): BoothBookmarkDrawer | undefined;
6
+ export declare class BoothBookmarkDrawer extends BoothDrawerBaseWithoutPainter {
9
7
  protected shape: ImageDef;
10
8
  protected bookmarkId: string;
11
9
  protected readonly canvas: HTMLCanvasElement;
12
10
  protected rect: Rect;
13
11
  protected padding: number;
14
- constructor(rendererService: RendererService, booth: Booth);
12
+ constructor(booth: Booth);
15
13
  getShape: () => ImageDef;
16
14
  update(bookmarked: boolean): void;
17
- handleBookmarkScale(scale?: number): ImageDef | undefined;
15
+ /**
16
+ * Lays this bookmark out for a new pixel size: the ribbon holds its on-screen size, clamped to what
17
+ * fits in the top-right corner of the booth.
18
+ * @param pixelSize - Plan units per device pixel.
19
+ * @returns The bookmark unless hidden — nothing draws a hidden one, and `update()` syncs it on
20
+ * the way back into view.
21
+ */
22
+ layOutBookmark(pixelSize: number): ImageDef[];
18
23
  }
19
- export {};
20
24
  //# sourceMappingURL=config-booth-bookmark.d.ts.map
@@ -1 +1 @@
1
- import{Rect as o}from"@expofp/geometry";import{reaction as s}from"mobx";import{createBookmarkCanvas as k,createImageDef as m,getClampedBoundsCanvas as c,getRollValue as l,getRotation as p}from"../../../../renderer";import{layersStore as a,uiState as h}from"../../../../store";import{BoothDrawerBaseWithoutPainter as u}from"./BoothDrawerBase";export default function f(r,e){if(!h.kiosk)return new b(r,e)}class b extends u{constructor(e,t){super(t),this.getShape=()=>this.shape,this.rendererService=e,this.padding=this.booth.borderWidth/2,this.rect=new o(this.booth.rect.center,this.booth.rect.size,this.booth.rotate),this.canvas=k(11,devicePixelRatio),this.bookmarkId=`bookmark-${this.booth.id}`,this.shape=m(this.canvas,this.rect,{hidden:!t.bookmarked}),s(()=>[t.bookmarked,a.layersLoaded,this.booth.skipDim],()=>this.update(t.bookmarked),{fireImmediately:t.bookmarked}),s(()=>h.mapSettings,({roll:n})=>{l(n)&&this.rendererService.onRoll(`bookmark-roll-${this.bookmarkId}`,d=>{const i=p(d,this.rect.rotation);return i!==void 0&&(this.rect=new o(this.rect.center,{x:this.rect.size.y,y:this.rect.size.x},this.rect.rotation+i),this.handleBookmarkScale()),this.shape})},{fireImmediately:!0})}update(e){a.layersLoaded&&(this.shape.hidden=!e,this.shape.dim=this.booth.skipDim?!1:void 0,this.handleBookmarkScale(),this.shape.hidden?(this.rendererService.ptScaleRegistry.unregisterByName(this.bookmarkId),this.rendererService.rollRegistry.unregisterByName(`bookmark-roll-${this.bookmarkId}`)):this.rendererService.onPtScale(this.bookmarkId,this.handleBookmarkScale.bind(this)),this.rendererService.update(this.shape))}handleBookmarkScale(e){if(!this.shape.hidden)return this.shape.bounds=c(this.rect,this.canvas,this.padding,e||this.rendererService.scale),this.shape}}
1
+ import{Rect as r}from"@expofp/geometry";import{update as m}from"@expofp/renderer";import{reaction as s}from"mobx";import{createBookmarkCanvas as p}from"../../../../engine/canvases";import{createImageDef as c}from"../../../../engine/defs";import{getClampedBoundsCanvas as k,getRollValue as u,getRotation as l}from"../../../../engine/update-def";import{layersStore as a,uiState as h}from"../../../../store";import{BoothDrawerBaseWithoutPainter as f}from"./BoothDrawerBase";export default function b(i){if(!h.kiosk)return new BoothBookmarkDrawer(i)}export class BoothBookmarkDrawer extends f{constructor(t){super(t),this.getShape=()=>this.shape,this.padding=this.booth.borderWidth/2,this.rect=new r(this.booth.rect.center,this.booth.rect.size,this.booth.rotate,this.booth.elevation),this.canvas=p(11,devicePixelRatio),this.bookmarkId=`bookmark-${this.booth.id}`,this.shape=c(this.canvas,this.rect,{hidden:!t.bookmarked}),this.shape.onScale=({pixelSize:e})=>this.layOutBookmark(e),s(()=>[t.bookmarked,a.layersLoaded,this.booth.skipDim],()=>this.update(t.bookmarked),{fireImmediately:t.bookmarked}),s(()=>h.mapSettings,({roll:e})=>{u(e)&&(this.shape.onRoll=({roll:n,pixelSize:d})=>{const o=l(n,this.rect.rotation);if(o!==void 0)return this.rect=new r(this.rect.center,{x:this.rect.size.y,y:this.rect.size.x},this.rect.rotation+o,this.rect.elevation),this.layOutBookmark(d),[this.shape]})},{fireImmediately:!0})}update(t){a.layersLoaded&&(this.shape.hidden=!t,this.shape.dim=this.booth.skipDim?0:void 0,m(this.shape))}layOutBookmark(t){return this.shape.bounds=k(this.rect,this.canvas,this.padding,t),this.shape.hidden?[]:[this.shape]}}
@@ -1,11 +1,10 @@
1
1
  import { ShapeDef } from '@expofp/renderer';
2
- import { RendererService } from '../../../../renderer';
3
2
  import { Booth } from '../../../../store/BoothStore';
4
3
  import { BoothDrawerBaseWithoutPainter } from './BoothDrawerBase';
5
- export default function configBoothBorder(rendererService: RendererService, booth: Booth): BoothBorderDrawer | undefined;
4
+ export default function configBoothBorder(booth: Booth): BoothBorderDrawer | undefined;
6
5
  declare class BoothBorderDrawer extends BoothDrawerBaseWithoutPainter {
7
6
  protected readonly shape: ShapeDef;
8
- constructor(rendererService: RendererService, booth: Booth);
7
+ constructor(booth: Booth);
9
8
  private getBorderColor;
10
9
  getShape(): ShapeDef;
11
10
  }
@@ -1 +1 @@
1
- import{Polygon as S,Rect as W}from"@expofp/geometry";import p from"color";import{reaction as k}from"mobx";import{createShapeDef as D}from"../../../../renderer";import{boothStore as m,heatmapStore as P,layersStore as f,uiState as u}from"../../../../store";import a from"../../../../tools/settings";import{BoothDrawerBaseWithoutPainter as L}from"./BoothDrawerBase";export default function v(c,o){if(a.EXPO!=="confex20"&&!(o.poiType||o.borderColor==="none"||o.borderWidth===0&&!m.borderWidth||o.paths&&!o.pathsWithRect))return new R(c,o)}class R extends L{constructor(o,s){super(s);const t=this.booth.rect,{x:e,y:i}=t.center,{width:n,height:h}=t.size,r=s.borderWidth||m.borderWidth,l=[],d=(B,b,C,x)=>{const w=new W({x:B,y:b},{x:C,y:x}).toPolygon();l.push(w.rotate(s.rotate??0,{x:e,y:i}))};d(e,i-h/2,n+r,r),d(e,i+h/2,n+r,r),d(e-n/2,i,r,h+r),d(e+n/2,i,r,h+r);const g=S.merge(...l),y=this.getBorderColor();this.shape=D(g,y.string()),k(()=>[this.booth.skipDim,f.layersLoaded,this.booth.hover,this.booth.selected,u.heatmap],()=>{f.layersLoaded&&(this.shape.dim=this.booth.skipDim?!1:void 0,this.shape.color=this.getBorderColor().string(),o.update(this.shape))})}getBorderColor(){const o=this.booth;if(u.heatmap){const t=P.getHeatmapColorForBooth(o);if(o.selected){const e=a.colors.booths.selectedBorder;return e?p(e):t.darken(.4)}return o.hover?t.darken(.3):t.darken(.2)}const s=o.selected?a.colors.booths.selectedBorder:o.borderColor;return p(s||a.colors.booths.default)}getShape(){return this.shape}}
1
+ import{Polygon as w,Rect as S}from"@expofp/geometry";import{update as W}from"@expofp/renderer";import l from"color";import{reaction as k}from"mobx";import{createShapeDef as D}from"../../../../engine/defs";import{boothStore as p,heatmapStore as P,layersStore as m,uiState as f}from"../../../../store";import a from"../../../../tools/settings";import{BoothDrawerBaseWithoutPainter as v}from"./BoothDrawerBase";export default function L(s){if(a.EXPO!=="confex20"&&!(s.poiType||s.borderColor==="none"||s.borderWidth===0&&!p.borderWidth||s.paths&&!s.pathsWithRect))return new R(s)}class R extends v{constructor(o){super(o);const i=this.booth.rect,{x:e,y:r}=i.center,{width:n,height:h}=i.size,t=o.borderWidth||p.borderWidth,c=[],d=(y,B,b,C)=>{const x=new S({x:y,y:B},{x:b,y:C},0,o.elevation).toPolygon();c.push(x.rotate(o.rotate??0,{x:e,y:r}))};d(e,r-h/2,n+t,t),d(e,r+h/2,n+t,t),d(e-n/2,r,t,h+t),d(e+n/2,r,t,h+t);const u=w.merge(...c),g=this.getBorderColor();this.shape=D(u,g.string()),k(()=>[this.booth.skipDim,m.layersLoaded,this.booth.hover,this.booth.selected,f.heatmap],()=>{m.layersLoaded&&(this.shape.dim=this.booth.skipDim?!1:void 0,this.shape.color=this.getBorderColor().string(),W(this.shape))})}getBorderColor(){const o=this.booth;if(f.heatmap){const e=P.getHeatmapColorForBooth(o);if(o.selected){const r=a.colors.booths.selectedBorder;return r?l(r):e.darken(.4)}return o.hover?e.darken(.3):e.darken(.2)}const i=o.selected?a.colors.booths.selectedBorder:o.borderColor;return l(i||a.colors.booths.default)}getShape(){return this.shape}}
@@ -1,14 +1,27 @@
1
1
  import { type ImageDef, type TextDef } from '@expofp/renderer';
2
- import { type FontSizeFactor, type RendererService } from '../../../../renderer';
2
+ import { type FontSizeFactor } from '../../../../engine/defs';
3
3
  import { type Booth, SpecialBooth } from '../../../../store/BoothStore';
4
4
  import { BoothLabelDrawer } from './config-booth-labels';
5
- export default function configBoothLabelsSpecial(rendererService: RendererService, booth: Booth): BoothLabelSpecialDrawer | undefined;
5
+ export default function configBoothLabelsSpecial(booth: Booth): BoothLabelSpecialDrawer | undefined;
6
6
  declare class BoothLabelSpecialDrawer extends BoothLabelDrawer {
7
7
  protected steps: FontSizeFactor[];
8
8
  protected labelIsVertical: boolean;
9
9
  protected text: string;
10
- constructor(rendererService: RendererService, booth: SpecialBooth);
10
+ constructor(booth: SpecialBooth);
11
11
  getShape(): (ImageDef | TextDef)[];
12
+ /**
13
+ * Lays a special booth's label out: the text fitter's steps are indexed by the inverse pixel size,
14
+ * and a plan too far out for the smallest step drops the label to nothing.
15
+ * @param pixelSize - Plan units per device pixel.
16
+ * @returns Always the label; every step writes the line, and the fitter's text may change with it.
17
+ */
18
+ layOutLabel(pixelSize: number): TextDef[];
19
+ /**
20
+ * Lays a special booth's dot out: it stands in for the label exactly when no step fits.
21
+ * @param pixelSize - Plan units per device pixel.
22
+ * @returns Always the dot; the bounds are rewritten on every step.
23
+ */
24
+ layOutDot(pixelSize: number): ImageDef[];
12
25
  setFactors(text: string): void;
13
26
  setText(): void;
14
27
  }
@@ -1,2 +1,2 @@
1
- import{Box as L,Rect as u}from"@expofp/geometry";import{reaction as b}from"mobx";import{FONT_WEIGHT_PRIMARY_BOOTH as x,FONT_WEIGHT_PRIMARY_SPECIAL as R}from"../../../../constants";import{boxToRenderer as D,createTextDef as F,getRollValue as v,getRotation as T,shouldFlip as y,updateRectRotation as z,updateTextDefRotation as I}from"../../../../renderer";import{heatmapStore as P,layersStore as w,uiState as d}from"../../../../store";import{SpecialBooth as B}from"../../../../store/BoothStore";import M from"../../../../tools/settings";import{getFont as k}from"./canvases";import{BoothLabelDrawer as C,getFontUrlByWeight as _,getMinZoomFactorForDot as A,isDirectionsMode as N}from"./config-booth-labels";import{LABEL_MARGIN_FRACTION as S}from"./label-inset.js";import V from"./TextFitter";const p=new Map;function W(i){let t=p.get(i);if(!t){const s=[18,16,14,12,10,7].map(l=>l*i),a=14*i;t=new V(k,s,a),p.set(i,t),setTimeout(()=>p.delete(i),5e3)}return t}export default function $(i,t){if(!(!(t instanceof B)||t.noLabels))return new O(i,t)}class O extends C{constructor(t,s){super(t,s),this.steps=[],this.text="";const a=this.booth.rect,l=Number(getComputedStyle(document.body).getPropertyValue(R))||Number(getComputedStyle(document.body).getPropertyValue(x))||500,g=_(l,this.rendererService.fontUrls),h=a.expand({x:-(a.size.width*S+this.padding),y:-(a.size.height*S+this.padding)});this.setText(),this.canvasRect=new u(h.center,h.size,s.rotate),this.setFactors(this.text),this.labelIsVertical=Math.abs(Math.abs(s.rotate)-Math.PI/2)<.01,this.fontSizes=[this.steps,[]],this.minZoomDotVisible=A(this.steps.map(e=>e.scaleFactor)),this.shapeLabel=F([{text:this.text,color:s.labelColor||M.boothLabelColor,fontUrl:g,fontSize:0}],new u(h.center,h.size,s.rotate),[this.padding,this.padding],{horizontal:"center",text:"center",vertical:"center"}),this.getShapeDot(),b(()=>[this.booth.skipDim,d.selectedRoute,w.layersLoaded],()=>{const e=N();this.shapeLabel.dim=e||this.booth.skipDim?!1:void 0,this.shapeDot.dim=e||this.booth.skipDim?!1:void 0,this.rendererService.update(this.shapeLabel,this.shapeDot)});const m=e=>{const o=this.steps.find(r=>r.scaleFactor<1/e);return o?(this.shapeLabel.lines[0].fontSize=o.value/devicePixelRatio*e,this.shapeLabel.lines[0].text=o.lines.join(`
2
- `),this.shapeLabel.padding=[this.paddingScaled[0]*e+this.padding,this.paddingScaled[1]*e+this.padding],this.shapeLabel):(this.shapeLabel.lines[0].fontSize=0,this.shapeLabel)},f=e=>{const o=this.steps.find(c=>c.scaleFactor<1/e),r=this.shapeDot.source.width*e,n=this.shapeDot.source.height*e;return this.shapeDot.bounds=D(L.fromCenter(this.canvasRect.center,{x:r,y:n})),this.shapeDot.hidden=!!o,this.shapeDot};this.rendererService.onPtScale(`booth-special-label-${s.id}`,m),this.rendererService.onPtScale(`booth-special-dot-${s.id}`,f),b(()=>d.mapSettings,({roll:e})=>{v(e??0)&&this.rendererService.onRoll(`booth-special-roll-${s.id}`,o=>{const r=this.shapeLabel.bounds.rotation;if(this.labelIsVertical)y(o,r)&&(this.shapeLabel.bounds.rotation=-r);else{const n=T(o,r);if(n!==void 0){const{size:c}=this.canvasRect;this.shapeLabel=I(this.shapeLabel,n),c.x!==c.y&&!this.shapeLabel.hidden&&(this.canvasRect=z(this.canvasRect,n),this.setFactors(this.text),m(this.rendererService.scale),f(this.rendererService.scale))}}return[this.shapeLabel,this.shapeDot]})},{fireImmediately:!0})}getShape(){return[this.shapeLabel,this.shapeDot]}setFactors(t){this.steps=W(devicePixelRatio).getStepsForRect(t,this.canvasRect.size.x,this.canvasRect.size.y)}setText(){const t=this.booth.title||this.booth.name,a=`Clicks: ${P.getTotalClicksByBooth(this.booth)}`;this.text=d.heatmap?`${t} - ${a}`:t}}
1
+ import{Rect as m}from"@expofp/geometry";import{update as L}from"@expofp/renderer";import{reaction as f}from"mobx";import{FONT_WEIGHT_PRIMARY_BOOTH as g,FONT_WEIGHT_PRIMARY_SPECIAL as D}from"../../../../constants";import{createTextDef as y}from"../../../../engine/defs";import{loadCustomFontsUrls as F}from"../../../../engine/fonts";import{getRollValue as R,getRotation as x,shouldFlip as S,updateRectRotation as T,updateTextDefRotation as v}from"../../../../engine/update-def";import{heatmapStore as I,layersStore as w,uiState as l}from"../../../../store";import{SpecialBooth as z}from"../../../../store/BoothStore";import M from"../../../../tools/settings";import{getFont as O}from"./canvases";import{BoothLabelDrawer as k,getFontUrlByWeight as B,getMinZoomFactorForDot as C,isDirectionsMode as P}from"./config-booth-labels";import{LABEL_MARGIN_FRACTION as b}from"./label-inset.js";import _ from"./TextFitter";const c=new Map;function A(i){let t=c.get(i);if(!t){const s=[18,16,14,12,10,7].map(a=>a*i),e=14*i;t=new _(O,s,e),c.set(i,t),setTimeout(()=>c.delete(i),5e3)}return t}export default function N(i){if(!(!(i instanceof z)||i.noLabels))return new V(i)}class V extends k{constructor(t){super(t),this.steps=[],this.text="";const s=this.booth.rect,e=Number(getComputedStyle(document.body).getPropertyValue(D))||Number(getComputedStyle(document.body).getPropertyValue(g))||500,a=B(e,F()),h=s.expand({x:-(s.size.width*b+this.padding),y:-(s.size.height*b+this.padding)});this.setText(),this.canvasRect=new m(h.center,h.size,t.rotate,t.elevation),this.setFactors(this.text),this.labelIsVertical=Math.abs(Math.abs(t.rotate)-Math.PI/2)<.01,this.fontSizes=[this.steps,[]],this.minZoomDotVisible=C(this.steps.map(o=>o.scaleFactor)),this.shapeLabel=y([{text:this.text,color:t.labelColor||M.boothLabelColor,fontUrl:a,fontSize:0}],new m(h.center,h.size,t.rotate,t.elevation),[this.padding,this.padding],{horizontal:"center",text:"center",vertical:"center"}),this.shapeLabel.onScale=({pixelSize:o})=>this.layOutLabel(o),this.getShapeDot(),f(()=>[this.booth.skipDim,l.selectedRoute,w.layersLoaded],()=>{const o=P();this.shapeLabel.dim=o||this.booth.skipDim?!1:void 0,this.shapeDot.dim=o||this.booth.skipDim?!1:void 0,L(this.shapeLabel,this.shapeDot)}),f(()=>l.mapSettings,({roll:o})=>{R(o??0)&&(this.shapeLabel.onRoll=({roll:p,pixelSize:d})=>{const n=this.shapeLabel.bounds.rotation;if(this.labelIsVertical)return S(p,n)?(this.shapeLabel.bounds.rotate(-2*n,this.shapeLabel.bounds),[this.shapeLabel,this.shapeDot]):void 0;const r=x(p,n);if(r===void 0)return;const{size:u}=this.canvasRect;return this.shapeLabel=v(this.shapeLabel,r),u.x!==u.y&&!this.shapeLabel.hidden&&(this.canvasRect=T(this.canvasRect,r),this.setFactors(this.text),this.layOutLabel(d),this.layOutDot(d)),[this.shapeLabel,this.shapeDot]})},{fireImmediately:!0})}getShape(){return[this.shapeLabel,this.shapeDot]}layOutLabel(t){const s=this.steps.find(e=>e.scaleFactor<1/t);return s?(this.shapeLabel.lines[0].fontSize=s.value*t,this.shapeLabel.lines[0].text=s.lines.join(`
2
+ `),this.shapeLabel.padding=[this.paddingScaled[0]*t+this.padding,this.paddingScaled[1]*t+this.padding],[this.shapeLabel]):(this.shapeLabel.lines[0].fontSize=0,[this.shapeLabel])}layOutDot(t){const s=this.steps.find(a=>a.scaleFactor<1/t),e=this.shapeDot.bounds;return e.scale({x:this.shapeDot.source.width*t/e.size.x,y:this.shapeDot.source.height*t/e.size.y},e.center,e),this.shapeDot.hidden=!!s,[this.shapeDot]}setFactors(t){this.steps=A(devicePixelRatio).getStepsForRect(t,this.canvasRect.size.x,this.canvasRect.size.y)}setText(){const t=this.booth.title||this.booth.name,e=`Clicks: ${I.getTotalClicksByBooth(this.booth)}`;this.text=l.heatmap?`${t} - ${e}`:t}}
@@ -1,6 +1,7 @@
1
1
  import { Rect } from '@expofp/geometry';
2
2
  import { type ImageDef, type TextAlignment, type TextDef } from '@expofp/renderer';
3
- import { type CustomFonts, type FontSizeFactor, type RendererService } from '../../../../renderer';
3
+ import { type FontSizeFactor } from '../../../../engine/defs';
4
+ import { type CustomFonts } from '../../../../engine/fonts';
4
5
  import { type Booth } from '../../../../store/BoothStore';
5
6
  import { type Exhibitor } from '../../../../store/ExhibitorStore';
6
7
  import { BoothDrawerBaseWithoutPainter } from './BoothDrawerBase';
@@ -9,7 +10,7 @@ interface Prefix {
9
10
  name: string;
10
11
  short?: boolean;
11
12
  }
12
- export default function configBoothLabels(rendererService: RendererService, booth: Booth): BoothLabelDrawer | undefined;
13
+ export default function configBoothLabels(booth: Booth): BoothLabelDrawer | undefined;
13
14
  export declare function getMinZoomFactorForDot(scaleFactors: number[]): number;
14
15
  export declare const isDirectionsMode: () => boolean;
15
16
  export declare function getFontUrlByWeight(weight: number, customFonts?: CustomFonts[], style?: string): string;
@@ -21,7 +22,6 @@ export declare function getBoothLabelWeights(): LabelFontWeights;
21
22
  export declare function getExhibitorLabelWeights(): LabelFontWeights;
22
23
  export declare function getBadgeFontWeight(): number;
23
24
  export declare class BoothLabelDrawer extends BoothDrawerBaseWithoutPainter {
24
- protected readonly rendererService: RendererService;
25
25
  protected canvasRect: Rect;
26
26
  protected paddingScaled: [number, number];
27
27
  protected padding: number;
@@ -36,8 +36,22 @@ export declare class BoothLabelDrawer extends BoothDrawerBaseWithoutPainter {
36
36
  protected centerAlignment: TextAlignment;
37
37
  protected prefixes: Prefix[];
38
38
  protected fontUrls: [string, string];
39
- constructor(rendererService: RendererService, booth: Booth);
39
+ constructor(booth: Booth);
40
40
  getShape(): (ImageDef | TextDef)[];
41
+ /**
42
+ * Lays this booth's label out for a new pixel size: the font-size step, the alignment that follows
43
+ * it, and the padding that scales with it.
44
+ * @param pixelSize - Plan units per device pixel.
45
+ * @returns The label when it moved, empty when nothing changed so the renderer skips the write.
46
+ */
47
+ layOutLabel(pixelSize: number): TextDef[];
48
+ /**
49
+ * Lays this booth's dot out for a new pixel size: it is drawn only in the band between the zoom
50
+ * where the label stops fitting and the zoom where the dot itself would overflow the booth.
51
+ * @param pixelSize - Plan units per device pixel.
52
+ * @returns The dot when it moved, empty when nothing changed so the renderer skips the write.
53
+ */
54
+ layOutDot(pixelSize: number): ImageDef[];
41
55
  getShapeDot(): void;
42
56
  private createLines;
43
57
  private calculateFontSizeFactors;
@@ -1 +1 @@
1
- import{Rect as E}from"@expofp/geometry";import{reaction as W}from"mobx";import{FONT_WEIGHT_PRIMARY_BOOTH as N,FONT_WEIGHT_PRIMARY_EXHIBITOR as U,FONT_WEIGHT_SECONDARY_BOOTH as V,FONT_WEIGHT_SECONDARY_EXHIBITOR as Z}from"../../../../constants";import p from"../../../../data";import{createShapeDot as X,createTextDef as G,createTextDefLines as Y,DEFAULT_FONT_LIGHT_URL as $,DEFAULT_FONT_URL as B,getRollValue as k,getRotation as q,updateLinesScale as j,updateRectRotation as J,updateTextDefRotation as K}from"../../../../renderer";import{boothStore as Q,layersStore as M,uiState as f}from"../../../../store";import{RegularBooth as ee,SpecialBooth as te}from"../../../../store/BoothStore";import L from"../../../../tools/settings";import{t as v}from"../../../../utils/i18n";import ie from"../../../../utils/is-mobile";import se from"../../../../utils/is-webview";import{isArabicText as ne}from"../../../../utils/rtl";import{BoothDrawerBaseWithoutPainter as oe}from"./BoothDrawerBase";import{getFont as _}from"./canvases";import{getLabelBorderInset as re}from"./label-inset.js";let z=L.boothLabelColor;L.EXPO==="tqs2021"&&(z="#000");const x=ie||se,D=r=>r.replace(" ","").substring(0,4).replace(/[0-9]/g,"3").replace(/[A-Z]/gi,"A"),I=document.createElement("canvas").getContext("2d");export default function he(r,e){if(!(!(e instanceof ee)||e.noLabels))return new BoothLabelDrawer(r,e)}export function getMinZoomFactorForDot(r){return Array.isArray(r)&&r.length>0?Math.max(...r.map(e=>e)):typeof r=="number"?r:-0}export const isDirectionsMode=()=>!!(f.selectedRoute?.from&&f.selectedRoute?.to);export function getFontUrlByWeight(r,e=[],t="normal"){return[...e,{weight:500,url:B,style:"normal"},{weight:300,url:$,style:"normal"}].find(i=>+i.weight===r&&i.style===t)?.url||B}function b(r,e){return Number(getComputedStyle(document.body).getPropertyValue(r))||e}export function getBoothLabelWeights(){return{main:b(N,500),details:b(V,300)}}export function getExhibitorLabelWeights(){return{main:b(U,500),details:b(Z,300)}}export function getBadgeFontWeight(){return getExhibitorLabelWeights().details}const F="Details";export class BoothLabelDrawer extends oe{constructor(e,t){if(super(t),this.minZoomDotVisible=0,this.maxZoomDotVisible=0,this.exh=[],this.shapeLabel=void 0,this.shapeDot=void 0,this.fontSizes=[[],[]],this.lines=[[],[]],this.fontUrls=["",""],this.rendererService=e,this.canvasRect=new E(t.rect.center,t.rect.size,t.rotate),this.paddingScaled=[4,4],this.padding=re(t.borderWidth||Q.borderWidth,t.rect.size),this.topLeftAlignment={horizontal:f.rtl?"right":"left",vertical:"top"},this.centerAlignment={horizontal:"center",vertical:"center"},this.prefixes=x?[{fontSize:7,name:"XS",short:!0},{fontSize:10,name:"S",short:!0},{fontSize:16,name:F,short:!1}]:[{fontSize:7,name:"XS",short:!0},{fontSize:10,name:"S",short:!0},{fontSize:12,name:"M",short:!0},{fontSize:14,name:"L",short:!0},{fontSize:18,name:F,short:!1}],t instanceof te)return;this.exh=p.hideExhibitors?[]:p.onlyFeaturedExhibitors?t.exhibitors.filter(i=>i.featured):t.exhibitors,x&&this.optimizationLevel()>=3&&(this.prefixes=this.prefixes.filter(i=>i.name!=="S")),this.createLines(),this.calculateFontSizeFactors(),this.shapeLabel=G(Y(this.lines,this.booth.labelColor||z,0,this.fontUrls),new E(this.booth.rect.center,this.booth.rect.size,this.booth.rotate),[...this.paddingScaled],{horizontal:"left",vertical:"top"}),this.getShapeDot();const o=i=>{const n=this.lines[1]??[],s=this.fontSizes[1]??[];if(L.EXPO!=="wineparis2026"){const m=this.exh.length?this.topLeftAlignment:n.length?i<s[s.length-1].scaleFactor?this.topLeftAlignment:this.centerAlignment:this.topLeftAlignment;this.shapeLabel.alignment=m}if(!j(this.shapeLabel.lines,i,this.fontSizes,this.booth.name))return;const l=this.paddingScaled[0]*i+this.padding,d=this.paddingScaled[1]*i+this.padding;return this.shapeLabel.padding[0]=l,this.shapeLabel.padding[1]=d,this.shapeLabel},h=i=>{const n=i>=this.minZoomDotVisible&&i<=this.maxZoomDotVisible,s=this.shapeDot.source.width*i,a=this.shapeDot.source.height*i;if(!(!n&&this.shapeDot.hidden))return this.shapeDot.bounds.size={x:s,y:a},this.shapeDot.hidden=!n,this.shapeDot};W(()=>[this.booth.skipDim,f.selectedRoute,M.layersLoaded],()=>{if(!M.layersLoaded)return;const i=isDirectionsMode();this.shapeLabel.dim=i||this.booth.skipDim?!1:void 0,this.shapeDot.dim=i||this.booth.skipDim?!1:void 0,this.rendererService.update(this.shapeLabel,this.shapeDot)}),W(()=>f.mapSettings,({roll:i})=>{k(i??0)&&this.rendererService.onRoll(`booth-roll-${t.id}`,n=>{const s=q(n,this.shapeLabel.bounds.rotation),{size:a}=this.canvasRect;return s!==void 0&&(this.shapeLabel=K(this.shapeLabel,s),!this.shapeLabel.hidden&&!this.exh.length&&a.x!==a.y&&(this.canvasRect=J(this.canvasRect,s),this.calculateFontSizeFactors(),o(this.rendererService.scale),h(this.rendererService.scale))),[this.shapeLabel,this.shapeDot]})},{fireImmediately:!0}),this.rendererService.onPtScale(`booth-label-${t.id}`,o),this.rendererService.onPtScale(`booth-dot-${t.id}`,h)}getShape(){return[this.shapeLabel,this.shapeDot]}getShapeDot(){this.shapeDot=X(this.canvasRect,this.booth.labelColor||z),this.shapeDot.hidden=!0,this.maxZoomDotVisible=Math.min(this.canvasRect.size.x/this.shapeDot.source.width,this.canvasRect.size.y/this.shapeDot.source.height)}createLines(){const e=this.booth,t=[],o=[],h=x&&this.optimizationLevel()>=3?1:3;if(this.exh.length){const i=e.exhibitors.filter(s=>s.order===0),n=e.exhibitors.filter(s=>s.order);if(i.length>0)t.push(...i.map(s=>s.name));else if(p.onlyFeaturedExhibitors)t.push(...e.exhibitors.filter(s=>s.featured).map(s=>s.name));else if(n.length>0){t.push(...n.map(a=>a.name));const s=e.exhibitors.filter(a=>a.order===void 0);s.length>0&&t.push(v("and {{moreCount}} more",{moreCount:s.length}))}else e.exhibitors.length>h?t.push(`${e.exhibitors.length} ${p.exhibitorTermPlural}`):t.push(...e.exhibitors.map(s=>s.name));o.push(e.title||e.name)}else{const i=!!e.exhibitors.length;t.push(e.title||e.name),e.onHold?o.push(v("On Hold")):e.reserved?o.push(v("Reserved")):i||o.push(...e.exhibitors.map(n=>n.name).sort((n,s)=>n>s?1:-1)),e.size&&o.push(e.size.indexOf("/")>-1?e.size.substring(0,e.size.indexOf("/")).trim():e.size),e.price&&e.price!=="0"&&!f.previewMode&&o.push(e.price)}f.rtl&&t.forEach((i,n)=>{(i.endsWith(".")||i.endsWith("!")||i.endsWith("?"))&&(t[n]=t[n]+"\u200F"),ne(i)&&(t[n]=t[n]+" ")}),this.lines=[t,o]}calculateFontSizeFactors(){const e=this.lines[0];let t;const o=this.canvasRect,h=[],i=[],n=this.prefixes.slice(0,this.exh.length?this.prefixes.length:this.prefixes.length-1),{main:s,details:a}=this.exh.length?getExhibitorLabelWeights():getBoothLabelWeights();for(const{fontSize:l,short:d}of n){const m=l*devicePixelRatio,R=.9*l*devicePixelRatio,u=_(m,s),T=_(R,a),y=p.hideExhibitorBoothNumber||d;let w,A,S,g;if(this.exh.length)t=d?[]:this.lines[1],S=Math.max(...e.map(c=>this.measureText(c,u).width),...t.map(c=>this.measureText(c,T).width)),w=Math.max(...e.map(c=>this.exh.length?this.measureText(D(c),u).width:this.measureText(D(c),u).width+3+3),...t.map(c=>this.measureText(D(c),T).width)),g=m*e.length+R*t.length+devicePixelRatio*(e.length+t.length)+3,A=y?g/e.length:null;else{const c=e[0].replace(/[0-9]/g,"3").replace(/[A-Z]/g,"A"),C=4;S=this.measureText(c,u).width+3+3,g=m+C}const H=o.size.x/(w||S),P=o.size.y/(A||g),O=Math.min(H,P);h.push({scaleFactor:O,value:l,lines:[]}),y||i.push({scaleFactor:O,value:.9*l,lines:[]})}if(!this.exh.length){const l=h[h.length-1],d=this.prefixes.find(m=>m.name===F);d&&(h.push({scaleFactor:l.scaleFactor/1.8,value:d.fontSize,lines:[]}),i.push({scaleFactor:l.scaleFactor/1.8,value:d.fontSize*(x?1:.9),lines:[]}))}this.fontUrls=[getFontUrlByWeight(s,this.rendererService.fontUrls),getFontUrlByWeight(a,this.rendererService.fontUrls)],this.minZoomDotVisible=getMinZoomFactorForDot(h.map(l=>l.scaleFactor)),this.fontSizes=[h,i]}calcArea(e,t){return Math.floor(Math.max(0,e)*Math.max(0,t)/1e3)}optimizationLevel(){return Math.min(p.viewOptimizationLevel?p.viewOptimizationLevel:Math.floor(this.calcArea(this.canvasRect.size.x,this.canvasRect.size.y)/5e3),3)}measureText(e,t){return I.font=t,I.measureText(e)}}
1
+ import{Rect as M}from"@expofp/geometry";import{update as U}from"@expofp/renderer";import{reaction as W}from"mobx";import{FONT_WEIGHT_PRIMARY_BOOTH as V,FONT_WEIGHT_PRIMARY_EXHIBITOR as Z,FONT_WEIGHT_SECONDARY_BOOTH as X,FONT_WEIGHT_SECONDARY_EXHIBITOR as G}from"../../../../constants";import c from"../../../../data";import{createShapeDot as k,createTextDef as Y,createTextDefLines as $}from"../../../../engine/defs";import{DEFAULT_FONT_LIGHT_URL as q,DEFAULT_FONT_URL as B,loadCustomFontsUrls as j}from"../../../../engine/fonts";import{getRollValue as J,getRotation as K,updateLinesScale as Q,updateRectRotation as tt,updateTextDefRotation as et}from"../../../../engine/update-def";import{boothStore as it,layersStore as _,uiState as m}from"../../../../store";import{RegularBooth as st,SpecialBooth as ot}from"../../../../store/BoothStore";import v from"../../../../tools/settings";import{t as S}from"../../../../utils/i18n";import nt from"../../../../utils/is-mobile";import at from"../../../../utils/is-webview";import{isArabicText as ht}from"../../../../utils/rtl";import{BoothDrawerBaseWithoutPainter as rt}from"./BoothDrawerBase";import{getFont as I}from"./canvases";import{getLabelBorderInset as lt}from"./label-inset.js";let z=v.boothLabelColor;v.EXPO==="tqs2021"&&(z="#000");const x=nt||at,F=n=>n.replace(" ","").substring(0,4).replace(/[0-9]/g,"3").replace(/[A-Z]/gi,"A"),P=document.createElement("canvas").getContext("2d");export default function ct(n){if(!(!(n instanceof st)||n.noLabels))return new BoothLabelDrawer(n)}export function getMinZoomFactorForDot(n){return Array.isArray(n)&&n.length>0?Math.max(...n.map(t=>t)):typeof n=="number"?n:-0}export const isDirectionsMode=()=>!!(m.selectedRoute?.from&&m.selectedRoute?.to);export function getFontUrlByWeight(n,t=[],e="normal"){return[...t,{weight:500,url:B,style:"normal"},{weight:300,url:q,style:"normal"}].find(s=>+s.weight===n&&s.style===e)?.url||B}function b(n,t){return Number(getComputedStyle(document.body).getPropertyValue(n))||t}export function getBoothLabelWeights(){return{main:b(V,500),details:b(X,300)}}export function getExhibitorLabelWeights(){return{main:b(Z,500),details:b(G,300)}}export function getBadgeFontWeight(){return getExhibitorLabelWeights().details}const R="Details";export class BoothLabelDrawer extends rt{constructor(t){super(t),this.minZoomDotVisible=0,this.maxZoomDotVisible=0,this.exh=[],this.shapeLabel=void 0,this.shapeDot=void 0,this.fontSizes=[[],[]],this.lines=[[],[]],this.fontUrls=["",""],this.canvasRect=new M(t.rect.center,t.rect.size,t.rotate,t.elevation),this.paddingScaled=[4,4],this.padding=lt(t.borderWidth||it.borderWidth,t.rect.size),this.topLeftAlignment={horizontal:m.rtl?"right":"left",vertical:"top"},this.centerAlignment={horizontal:"center",vertical:"center"},this.prefixes=x?[{fontSize:7,name:"XS",short:!0},{fontSize:10,name:"S",short:!0},{fontSize:16,name:R,short:!1}]:[{fontSize:7,name:"XS",short:!0},{fontSize:10,name:"S",short:!0},{fontSize:12,name:"M",short:!0},{fontSize:14,name:"L",short:!0},{fontSize:18,name:R,short:!1}],!(t instanceof ot)&&(this.exh=c.hideExhibitors?[]:c.onlyFeaturedExhibitors?t.exhibitors.filter(e=>e.featured):t.exhibitors,x&&this.optimizationLevel()>=3&&(this.prefixes=this.prefixes.filter(e=>e.name!=="S")),this.createLines(),this.calculateFontSizeFactors(),this.shapeLabel=Y($(this.lines,this.booth.labelColor||z,0,this.fontUrls),new M(this.booth.rect.center,this.booth.rect.size,this.booth.rotate,this.booth.elevation),[...this.paddingScaled],{horizontal:"left",vertical:"top"}),this.shapeLabel.onScale=({pixelSize:e})=>this.layOutLabel(e),this.getShapeDot(),W(()=>[this.booth.skipDim,m.selectedRoute,_.layersLoaded],()=>{if(!_.layersLoaded)return;const e=isDirectionsMode();this.shapeLabel.dim=e||this.booth.skipDim?0:void 0,this.shapeDot.dim=e||this.booth.skipDim?0:void 0,U(this.shapeLabel,this.shapeDot)}),W(()=>m.mapSettings,({roll:e})=>{J(e??0)&&(this.shapeLabel.onRoll=({roll:i,pixelSize:h})=>{const s=K(i,this.shapeLabel.bounds.rotation);if(s===void 0)return;const{size:a}=this.canvasRect;return this.shapeLabel=et(this.shapeLabel,s),!this.shapeLabel.hidden&&!this.exh.length&&a.x!==a.y&&(this.canvasRect=tt(this.canvasRect,s),this.calculateFontSizeFactors(),this.layOutLabel(h),this.layOutDot(h)),[this.shapeLabel,this.shapeDot]})},{fireImmediately:!0}))}getShape(){return[this.shapeLabel,this.shapeDot]}layOutLabel(t){const e=this.lines[1]??[],i=this.fontSizes[1]??[];if(v.EXPO!=="wineparis2026"){const s=this.exh.length?this.topLeftAlignment:e.length?t<i[i.length-1].scaleFactor?this.topLeftAlignment:this.centerAlignment:this.topLeftAlignment;this.shapeLabel.alignment=s}return Q(this.shapeLabel.lines,t,this.fontSizes)?(this.shapeLabel.padding[0]=this.paddingScaled[0]*t+this.padding,this.shapeLabel.padding[1]=this.paddingScaled[1]*t+this.padding,[this.shapeLabel]):[]}layOutDot(t){const e=t>=this.minZoomDotVisible&&t<=this.maxZoomDotVisible;if(!e&&this.shapeDot.hidden)return[];const i=this.shapeDot.bounds;return i.scale({x:this.shapeDot.source.width*t/i.size.x,y:this.shapeDot.source.height*t/i.size.y},i.center,i),this.shapeDot.hidden=!e,[this.shapeDot]}getShapeDot(){this.shapeDot=k(this.canvasRect,this.booth.labelColor||z),this.shapeDot.hidden=!0,this.shapeDot.onScale=({pixelSize:t})=>this.layOutDot(t),this.maxZoomDotVisible=Math.min(this.canvasRect.size.x/this.shapeDot.source.width,this.canvasRect.size.y/this.shapeDot.source.height)}createLines(){const t=this.booth,e=[],i=[],h=x&&this.optimizationLevel()>=3?1:3;if(this.exh.length){const s=t.exhibitors.filter(o=>o.order===0),a=t.exhibitors.filter(o=>o.order);if(s.length>0)e.push(...s.map(o=>o.name));else if(c.onlyFeaturedExhibitors)e.push(...t.exhibitors.filter(o=>o.featured).map(o=>o.name));else if(a.length>0){e.push(...a.map(p=>p.name));const o=t.exhibitors.filter(p=>p.order===void 0);o.length>0&&e.push(S("and {{moreCount}} more",{moreCount:o.length}))}else t.exhibitors.length>h?e.push(`${t.exhibitors.length} ${c.exhibitorTermPlural}`):e.push(...t.exhibitors.map(o=>o.name));i.push(t.title||t.name)}else{const s=!!t.exhibitors.length;e.push(t.title||t.name),t.onHold?i.push(S("On Hold")):t.reserved?i.push(S("Reserved")):s||i.push(...t.exhibitors.map(a=>a.name).sort((a,o)=>a>o?1:-1)),t.size&&i.push(t.size.indexOf("/")>-1?t.size.substring(0,t.size.indexOf("/")).trim():t.size),t.price&&t.price!=="0"&&!m.previewMode&&i.push(t.price)}m.rtl&&e.forEach((s,a)=>{(s.endsWith(".")||s.endsWith("!")||s.endsWith("?"))&&(e[a]=e[a]+"\u200F"),ht(s)&&(e[a]=e[a]+" ")}),this.lines=[e,i]}calculateFontSizeFactors(){const t=this.lines[0];let e;const i=this.canvasRect,h=[],s=[],a=this.prefixes.slice(0,this.exh.length?this.prefixes.length:this.prefixes.length-1),{main:o,details:p}=this.exh.length?getExhibitorLabelWeights():getBoothLabelWeights();for(const{fontSize:l,short:u}of a){const d=l*devicePixelRatio,L=.9*l*devicePixelRatio,f=I(d,o),T=I(L,p),O=c.hideExhibitorBoothNumber||u;let w,A,D,g;if(this.exh.length)e=u?[]:this.lines[1],D=Math.max(...t.map(r=>this.measureText(r,f).width),...e.map(r=>this.measureText(r,T).width)),w=Math.max(...t.map(r=>this.exh.length?this.measureText(F(r),f).width:this.measureText(F(r),f).width+3+3),...e.map(r=>this.measureText(F(r),T).width)),g=d*t.length+L*e.length+devicePixelRatio*(t.length+e.length)+3,A=O?g/t.length:null;else{const r=t[0].replace(/[0-9]/g,"3").replace(/[A-Z]/g,"A"),H=4;D=this.measureText(r,f).width+3+3,g=d+H}const C=i.size.x/(w||D),N=i.size.y/(A||g),E=Math.min(C,N);h.push({scaleFactor:E,value:d,lines:[]}),O||s.push({scaleFactor:E,value:L,lines:[]})}if(!this.exh.length){const l=h[h.length-1],u=this.prefixes.find(d=>d.name===R);u&&(h.push({scaleFactor:l.scaleFactor/1.8,value:u.fontSize*devicePixelRatio,lines:[]}),s.push({scaleFactor:l.scaleFactor/1.8,value:u.fontSize*(x?1:.9)*devicePixelRatio,lines:[]}))}const y=j();this.fontUrls=[getFontUrlByWeight(o,y),getFontUrlByWeight(p,y)],this.minZoomDotVisible=getMinZoomFactorForDot(h.map(l=>l.scaleFactor)),this.fontSizes=[h,s]}calcArea(t,e){return Math.floor(Math.max(0,t)*Math.max(0,e)/1e3)}optimizationLevel(){return Math.min(c.viewOptimizationLevel?c.viewOptimizationLevel:Math.floor(this.calcArea(this.canvasRect.size.x,this.canvasRect.size.y)/5e3),3)}measureText(t,e){return P.font=e,P.measureText(t)}}
@@ -1,6 +1,5 @@
1
1
  import { LayerDef } from '@expofp/renderer';
2
- import { RendererService } from '../../../../renderer';
3
2
  import { Booth } from '../../../../store/BoothStore';
4
3
  export declare const BOOTHS_CHUNK_SIZE = 350;
5
- export default function configBooths(rendererService: RendererService, layerID: string, booths: Booth[]): LayerDef;
4
+ export default function configBooths(layerID: string, booths: Booth[]): LayerDef;
6
5
  //# sourceMappingURL=config-booths.d.ts.map
@@ -1 +1 @@
1
- import{Rect as W}from"@expofp/geometry";import{SEPARATOR as s}from"../../../../constants";import{createImageDef as w}from"../../../../renderer";import A,{boothStore as E,uiState as H}from"../../../../store";import T from"../../../../tools/settings";import{loadImagesInBatchesById as U}from"../../../../utils/loadImagesInBatches";import _ from"./config-booth-bg";import z from"./config-booth-bookmark";import C from"./config-booth-border";import K from"./config-booth-labels";import P from"./config-booth-labels-special";import{createBoothImg as Z,getImageLayerName as j,mapBoothsLogos as q}from"./loadBoothsImages";export const BOOTHS_CHUNK_SIZE=350;export default function F(n,$,I){return(h=>{const t=$,p=[],m=[],l=[],f=[],b=[],g=j(t),d={name:g,children:[]};for(const o of h){const r=_(n,o)?.getShape();r&&p.push(...r);const a=K(n,o)?.getShape();a&&m.push(...a);const c=P(n,o)?.getShape();if(c&&l.push(...c),!T.borderless){const e=C(n,o)?.getShape();e&&f.push(e)}const i=z(n,o)?.getShape();i&&b.push(i)}const y=m.filter(o=>o.lines),k=l.filter(o=>o.lines),S=m.filter(o=>o.source),D=l.filter(o=>o.source);if(!H.hideLogoInBooth){const o=q(h);n.onLayerImages(g,async()=>{const r=await U(o,BOOTHS_CHUNK_SIZE),a=[];for(const[c,i]of r){const e=A.boothStore.boothById.get(c);if(!e)continue;const{bounds:x,htmlImage:R}=Z(e,i),u=w(R,x),N=e.borderWidth||E.borderWidth,L=e.rect.expand(-N),O=new W(L.center,L.size,e.rotate);e.shapes.push(u),a.push({shape:u,parentRect:O})}return{layer:d,children:a}})}let B=[];return h.length&&(B=[{name:`${t}${s}boothBackground`,children:p,interactive:!0},{name:`${t}${s}labels`,children:y},{name:`${t}${s}specialLabels`,children:k},{name:`${t}${s}bots`,children:S},{name:`${t}${s}specialDots`,children:D},d,{name:`${t}${s}boothsBookmark`,children:b},{name:`${t}${s}boothBorder`,children:f}]),{name:t,children:B}})(I)}
1
+ import{Rect as v}from"@expofp/geometry";import{SEPARATOR as u}from"../../../../constants";import{createImageDef as H}from"../../../../engine/defs";import N,{boothStore as P,uiState as W}from"../../../../store";import w from"../../../../tools/settings";import{loadImagesInBatchesById as A}from"../../../../utils/loadImagesInBatches";import{clearHoveredBooth as C,hoverBooth as E,rememberBoothShapes as T,selectBooth as U}from"../../pointer";import _ from"./config-booth-bg";import z from"./config-booth-bookmark";import K from"./config-booth-border";import M from"./config-booth-labels";import Z from"./config-booth-labels-special";import{registerLayerImages as j}from"./layer-images";import{createBoothImg as q,getImageLayerName as F,mapBoothsLogos as G}from"./loadBoothsImages";export const BOOTHS_CHUNK_SIZE=350;export default function J(L,S){return(i=>{const s=L,m=[],c=[],h=[],l=[],p=[],f=F(s),d={name:f,children:[]};for(const o of i){const t=_(o)?.getShape();t&&(m.push(...t),T(o,t));const r=M(o)?.getShape();r&&c.push(...r);const n=Z(o)?.getShape();if(n&&h.push(...n),!w.borderless){const e=K(o)?.getShape();e&&l.push(e)}const a=z(o)?.getShape();a&&p.push(a)}const I=c.filter(o=>o.lines),k=h.filter(o=>o.lines),y=c.filter(o=>o.source),$=h.filter(o=>o.source);if(!W.hideLogoInBooth){const o=G(i);j(f,async()=>{const t=await A(o,BOOTHS_CHUNK_SIZE),r=[];for(const[n,a]of t){const e=N.boothStore.boothById.get(n);if(!e)continue;const{bounds:x,htmlImage:D}=q(e,a),b=H(D,x),O=e.borderWidth||P.borderWidth,B=e.rect.expand(-O),R=new v(B.center,B.size,e.rotate);e.shapes.push(b),r.push({shape:b,parentRect:R})}return{layer:d,children:r}})}let g=[];if(i.length){const o=s+u;g=[{name:`${o}boothBackground`,children:m,onPointerMove:E,onPointerOut:C,onClick:U},{name:`${o}labels`,children:I},{name:`${o}specialLabels`,children:k},{name:`${o}dots`,children:y},{name:`${o}specialDots`,children:$},d,{name:`${o}boothsBookmark`,children:p},{name:`${s}${u}boothBorder`,children:l}]}return{name:s,children:g}})(S)}
@@ -1,5 +1,4 @@
1
1
  import { LayerDef } from '@expofp/renderer';
2
- import { RendererService } from '../../../../renderer';
3
2
  import { Layer } from '../../../../store/LayerStore';
4
- export default function loadLayer(layer: Layer, rendererService: RendererService): Promise<LayerDef>;
3
+ export default function loadLayer(layer: Layer): Promise<LayerDef>;
5
4
  //# sourceMappingURL=config-load-layer.d.ts.map
@@ -1 +1 @@
1
- import{getConfig as x}from"@expofp/config";import{degToRad as T,Rect as D}from"@expofp/geometry";import{resolve as H}from"@expofp/resolve";import{BOOTHS_PAINTER_MARKER as k,SEPARATOR as m}from"../../../../constants";import{getFpPaths as v}from"../../../../data/fp-payloads";import{createImageDef as F,createLayerDef as R}from"../../../../renderer";import c,{boothStore as G}from"../../../../store";import K from"../../../../store/init/init-booths";import{getChildLayers as Y}from"../../../../store/init/init-layers";import{LayersMode as j}from"../../../../store/LayerStore";import{chunkArray as J}from"../../../../utils";import{loadIcons as U}from"../../../../utils/imageloader";import Z,{BG_LAYER_NAME as $,FG_LAYER_NAME as E}from"./config-bg";import q,{BOOTHS_CHUNK_SIZE as z}from"./config-booths";import{configOutdoorPoiLayer as Q}from"./config-outdoor-poi";import{getImageLayerName as V,getLayerIcons as W}from"./loadBoothsImages";function X(e){return e.childLayers.length?e.childLayers:Y(e,e.basePriority,15).layers}function I(e,r,f){return new Promise(async h=>{let n=[];const i=K(c,r);if(Q(r,i)){r.loaded=!0,r.configured=!0,r.children=[],h(R(r.name,[],{hidden:!0}));return}const s=await Z(r),a=[],d=J(i,z),l=G.booths.filter(o=>o.rect&&(!o.layer||o.layer===r||o.layer.childLayers.includes(r))&&o.exhibitors.find(t=>!!t.logoInBooth&&!!t.logo?.url)&&!c.uiState.hideLogoInBooth),B=new Map(l.map(o=>[o.id,o.noLabels]));l.forEach(o=>o.noLabels=!0),i.length&&d.forEach((o,t)=>{a.push(q(e,`${r.name}${m}${k}${m}${t}`,o))}),l.forEach(o=>{o.noLabels=B.get(o.id)}),r.loaded=!0;const u=s.children.find(o=>o.name===$),y=s.children.find(o=>o.name===E),p=V(r.name),g=W(r),L={name:p,children:[]};g.length&&e.onLayerImages(p,async()=>{const o=await U(g),t=[];for(const A of o.filter(Boolean)){const{bounds:{x:P,y:b,height:S,angle:_,width:M},htmlImage:N}=A,C=D.fromMinMax({x:P,y:b},{x:P+M,y:b+S},T(_)),O=F(N,C);t.push({shape:O})}return{layer:L,children:t}}),u&&n.push({...u,name:`${s.name}${m}${$}`}),a.length&&n.push(...a),y&&n.push({...y,name:`${s.name}${m}${E}`}),g.length&&n.push(L);const w=r.childLayers.sort((o,t)=>o.basePriority-t.basePriority).map(async o=>I(e,o,!0));Promise.all(w).then(o=>{const t=o.flat();t.length&&n.push(...t),r.children=n,r.configured=!0,h(R(r.name,n,{hidden:!f}))})})}export default async function oo(e,r){return e.configured?Promise.resolve({name:e.name,children:e.children}):new Promise(async(f,h)=>{if(c.layerStore.mode!==j.Default&&!v(e.name)&&!e.rootParent)try{const a=x().fpSvgLayerJsRefs[e.name];a&&await H(a)}catch(a){console.warn(`Layer data not loaded: ${e.name}`,a)}const n=X(e);n.length&&(e.childLayers=n);const{layers:i}=c.layerStore;c.layerStore.layers=[...i,...n.filter(a=>!i.some(d=>d.name===a.name))];const s=await I(r,e,e.visible);f(s)})}
1
+ import{getConfig as T}from"@expofp/config";import{degToRad as v,Rect as D}from"@expofp/geometry";import{resolve as F}from"@expofp/resolve";import{BOOTHS_PAINTER_MARKER as G,SEPARATOR as m}from"../../../../constants";import{getFpPaths as H}from"../../../../data/fp-payloads";import{createImageDef as k,createLayerDef as g}from"../../../../engine/defs";import s,{boothStore as K}from"../../../../store";import Y from"../../../../store/init/init-booths";import{getChildLayers as j}from"../../../../store/init/init-layers";import{LayersMode as J}from"../../../../store/LayerStore";import{chunkArray as U}from"../../../../utils";import{loadIcons as Z}from"../../../../utils/imageloader";import q,{BG_LAYER_NAME as R,FG_LAYER_NAME as $}from"./config-bg";import z,{BOOTHS_CHUNK_SIZE as Q}from"./config-booths";import{configOutdoorPoiLayer as V}from"./config-outdoor-poi";import{registerLayerImages as W}from"./layer-images";import{createModelDefFromElement as X,getImageLayerName as ee,getLayerGraphics as oe,getModelLayerName as re}from"./loadBoothsImages";function te(e){return e.childLayers.length?e.childLayers:j(e,e.basePriority,15).layers}function S(e,c){return new Promise(async f=>{let r=[];const a=Y(s,e);if(V(e,a)){e.loaded=!0,e.configured=!0,e.children=[],f(g(e.name,[],{hidden:!0}));return}const i=await q(e),n=[],h=U(a,Q),d=K.booths.filter(o=>o.rect&&(!o.layer||o.layer===e||o.layer.childLayers.includes(e))&&o.exhibitors.find(t=>!!t.logoInBooth&&!!t.logo?.url)&&!s.uiState.hideLogoInBooth),B=new Map(d.map(o=>[o.id,o.noLabels]));d.forEach(o=>o.noLabels=!0),a.length&&h.forEach((o,t)=>{n.push(z(`${e.name}${m}${G}${m}${t}`,o))}),d.forEach(o=>{o.noLabels=B.get(o.id)}),e.loaded=!0;const u=i.children.find(o=>o.name===R),y=i.children.find(o=>o.name===$),p=ee(e.name),{icons:l,models:I}=oe(e),L={name:p,children:[]},b={name:re(e.name),children:I.map(X)};l.length&&W(p,async()=>{const o=await Z(l),t=[];for(const A of o.filter(Boolean)){const{bounds:{x:E,y:P,height:M,angle:N,width:_},htmlImage:C}=A,O=D.fromMinMax({x:E,y:P},{x:E+_,y:P+M},v(N)),x=k(C,O);t.push({shape:x})}return{layer:L,children:t}}),u&&r.push({...u,name:`${i.name}${m}${R}`}),n.length&&r.push(...n),y&&r.push({...y,name:`${i.name}${m}${$}`}),l.length&&r.push(L),b.children.length&&r.push(b);const w=e.childLayers.sort((o,t)=>o.basePriority-t.basePriority).map(async o=>S(o,!0));Promise.all(w).then(o=>{const t=o.flat();t.length&&r.push(...t),e.children=r,e.configured=!0,f(g(e.name,r,{hidden:!c}))})})}export default async function ne(e){return e.configured?g(e.name,e.children,{hidden:!e.visible}):new Promise(async(c,f)=>{if(s.layerStore.mode!==J.Default&&!H(e.name)&&!e.rootParent)try{const n=T().fpSvgLayerJsRefs[e.name];n&&await F(n)}catch(n){console.warn(`Layer data not loaded: ${e.name}`,n)}const r=te(e);r.length&&(e.childLayers=r);const{layers:a}=s.layerStore;s.layerStore.layers=[...a,...r.filter(n=>!a.some(h=>h.name===n.name))];const i=await S(e,e.visible);c(i)})}
@@ -1,5 +1,26 @@
1
- import { RendererService } from '../../../../renderer';
1
+ import { SceneDef } from '@expofp/renderer';
2
+ import { FloorPlanMarkerEvent } from '../../../../types';
2
3
  export declare const MARKER_LAYER_NAME = "markers";
3
- export declare function configMarkers(rendererService: RendererService): () => void;
4
+ /** What {@link configMarkers} needs: the scene whose root layers hold the marker layer. */
5
+ export interface MarkerOptions {
6
+ /** The scene markers are drawn into; `config-all` pre-creates their layer in it. */
7
+ readonly scene: SceneDef;
8
+ }
9
+ /**
10
+ * Draws the plan's markers into a renderer scene and keeps them current with the store.
11
+ * @param options - The scene to draw into.
12
+ * @returns A disposer.
13
+ */
14
+ export declare function configMarkers(options: MarkerOptions): () => void;
15
+ /**
16
+ * The marker a click on the plan landed on, at the size markers are currently drawn.
17
+ *
18
+ * The pixel size comes from the marker layer's own handler rather than from a renderer the plan holds
19
+ * a reference to — which is the whole of what this adds over {@link getMarkerFromClick}.
20
+ * @param x - Where the click landed, in plan units.
21
+ * @param y - Where the click landed, in plan units.
22
+ * @returns The marker, or `null` when the click reached none.
23
+ */
24
+ export declare function markerAt(x: number, y: number): FloorPlanMarkerEvent | null;
4
25
  export declare function getMarkerFromClick(x: number, y: number, scale: number): import("../../../../store/RouteStore").Marker | null;
5
26
  //# sourceMappingURL=config-markers.d.ts.map
@@ -1 +1 @@
1
- import{Box as K,degToRad as T}from"@expofp/geometry";import{reaction as I}from"mobx";import{createImageDef as C,getBounds as b,rectToRenderer as F}from"../../../../renderer";import l,{layersStore as S}from"../../../../store";import{createImageCanvas as v}from"./canvases";const B="_selected";export const MARKER_LAYER_NAME="markers";export function configMarkers(s){const u=[],d=new Map,r=new Map;let n=[];const m=s.scene.rootLayer.children.find(t=>t.name===MARKER_LAYER_NAME);async function w(t){const o=[];t.forEach(a=>{const{name:e,content:i,width:c,height:g,scale:k}=a;if(d.has(e))return;const h=new Image,y=new Promise((D,M)=>{h.onload=()=>{d.set(e,{img:h,width:c,height:g,scale:k}),D()},h.onerror=x=>{M(x)}});o.push(y),h.src=i,h.crossOrigin="anonymous"}),await Promise.all(o)}const f=t=>`marker-ptScaleHandlers-${t.id}`,E=t=>`marker-rollHandlers-${t.id}`,P=(t,o)=>{s.onPtScale(o,a=>{const{center:e,rotation:i}=t.bounds,{width:c,height:g}=t.source;return t.bounds=F(b(e.x,e.y,c,g,a,i)),t})},H=(t,o)=>{s.onRoll(o,a=>(t.bounds.rotation=a,t))};function L(){const t=l.routeStore.markersData.markers;if(!t.length)return;n=[];const o=s.scale,a=T(s.angle);t.forEach(e=>{const i=d.get(e.icon);if(!i)return;const c=i.scale||window.devicePixelRatio,g=e.icon;if(!r.has(g)){const R=v(i.img,i.width,i.height,c);r.set(g,R)}const k=r.get(g),h=d.get(e.selectedIcon),y=e.selectedIcon;if(!r.has(y)){const R=v(h.img,h.width,h.height,c);r.set(y,R)}const D=r.get(y),M=S.findLayer(e.z)?.visible??!0,x=b(e.x,e.y,k.width,k.height,o,a),_=b(e.x,e.y,D.width,D.height,o,a);let p;switch(e.position){case"lefttop":p=[0,0];break;case"centertop":p=[.5,0];break;case"centerbottom":p=[.5,1];break;default:p=[.5,.5]}const z={...C(k,x,{hidden:!M,origin:p}),id:e.id,scale:c},A={...C(D,_,{hidden:!(M&&e.active),origin:p}),id:`${e.id}${B}`,scale:c};n.push(z,A)}),m.children=n,n.forEach(e=>{P(e,f(e)),H(e,E(e))})}function $(){n.forEach(t=>{s.ptScaleRegistry.unregisterByName(f(t)),s.rollRegistry.unregisterByName(E(t))}),m.children=[],n=[]}function N(){const t=l.routeStore.markersData.markers;t.length&&t.forEach(o=>{const a=n.find(c=>c.id===o.id),e=n.find(c=>c.id===`${o.id}${B}`);if(!a)return;const i=S.findLayer(o.z)?.visible??!0;o.active?(a.hidden=!0,e.hidden=!(i&&o.active)):(a.hidden=!i,e.hidden=!0)})}return u.push(I(()=>[l.routeStore.selectedMarkers,l.layerStore.visible],()=>{if(!l.routeStore.markersData.markers.length){$(),s.update(m);return}N(),s.update(...n)})),u.push(I(()=>l.routeStore.markersData.markers,()=>{w(l.routeStore.markersData.icons).then(()=>{L(),s.update(m)})},{fireImmediately:!0})),function(){u.forEach(o=>o()),u.length=0}}export function getMarkerFromClick(s,u,d){for(const r of l.routeStore.markersData.markers){const n=l.routeStore.markersData.icons.find(f=>f.name===r.icon);if(!n)continue;const m=n.width*d*devicePixelRatio,w=n.height*d*devicePixelRatio;if(O(s,u,r.x,r.y,m,w)){const f=l.layerStore.findLayer(r.z);if(!f||f&&f.visible)return r}}return null}function O(s,u,d,r,n,m){return K.fromCenter({x:d,y:r},{x:2*n,y:2*m}).containsPoint({x:s,y:u})}
1
+ import{Box as O}from"@expofp/geometry";import{update as D}from"@expofp/renderer";import{reaction as I}from"mobx";import{getBounds as w}from"../../../../engine/canvases";import{createImageDef as E}from"../../../../engine/defs";import u,{layersStore as C}from"../../../../store";import{setMarkerResolver as R}from"../../pointer";import{createImageCanvas as P}from"./canvases";const L="_selected";export const MARKER_LAYER_NAME="markers";function T(o,f){const{center:c,rotation:r}=o.bounds,{width:i,height:s}=o.source;return o.bounds=w(c.x,c.y,i,s,f,r),[o]}function W(o){B=o}export function configMarkers(o){const{scene:f}=o,c=[],r=new Map,i=new Map;let s=[];const a=f.rootLayer.children.find(e=>e.name===MARKER_LAYER_NAME);a.onScale=({pixelSize:e})=>W(e),R(markerAt),D(a);async function g(e){const n=[];e.forEach(m=>{const{name:t,content:d,width:l,height:k,scale:y}=m;if(r.has(t))return;const h=new Image,S=new Promise((v,M)=>{h.onload=()=>{r.set(t,{img:h,width:l,height:k,scale:y}),v()},h.onerror=b=>{M(b)}});n.push(S),h.src=d,h.crossOrigin="anonymous"}),await Promise.all(n)}const z=e=>{e.onScale=({pixelSize:n})=>T(e,n)},A=e=>{e.onRoll=({roll:n})=>{if(n!==e.bounds.rotation)return e.bounds.rotate(n-e.bounds.rotation,e.bounds),[e]}};function _(){const e=u.routeStore.markersData.markers;if(!e.length)return;s=[];const n=1,m=0;e.forEach(t=>{const d=r.get(t.icon);if(!d)return;const l=d.scale||window.devicePixelRatio,k=t.icon;if(!i.has(k)){const x=P(d.img,d.width,d.height,l);i.set(k,x)}const y=i.get(k),h=r.get(t.selectedIcon),S=t.selectedIcon;if(!i.has(S)){const x=P(h.img,h.width,h.height,l);i.set(S,x)}const v=i.get(S),M=C.findLayer(t.z)?.visible??!0,b=w(t.x,t.y,y.width,y.height,n,m),F=w(t.x,t.y,v.width,v.height,n,m);let p;switch(t.position){case"lefttop":p=[0,0];break;case"centertop":p=[.5,0];break;case"centerbottom":p=[.5,1];break;default:p=[.5,.5]}const H={...E(y,b,{hidden:!M,origin:p}),id:t.id,scale:l},N={...E(v,F,{hidden:!(M&&t.active),origin:p}),id:`${t.id}${L}`,scale:l};s.push(H,N)}),a.children=s,s.forEach(t=>{z(t),A(t)})}function $(){a.children=[],s=[]}function K(){const e=u.routeStore.markersData.markers;e.length&&e.forEach(n=>{const m=s.find(l=>l.id===n.id),t=s.find(l=>l.id===`${n.id}${L}`);if(!m)return;const d=C.findLayer(n.z)?.visible??!0;n.active?(m.hidden=!0,t.hidden=!(d&&n.active)):(m.hidden=!d,t.hidden=!0)})}return c.push(I(()=>[u.routeStore.selectedMarkers,u.layerStore.visible],()=>{if(!u.routeStore.markersData.markers.length){$(),D(a);return}K(),D(...s)})),c.push(I(()=>u.routeStore.markersData.markers,()=>{g(u.routeStore.markersData.icons).then(()=>{_(),D(a)})},{fireImmediately:!0})),function(){c.forEach(n=>n()),c.length=0,a.onScale=void 0,R(),D(a)}}export function markerAt(o,f){return getMarkerFromClick(o,f,B)}export function getMarkerFromClick(o,f,c){for(const r of u.routeStore.markersData.markers){const i=u.routeStore.markersData.icons.find(g=>g.name===r.icon);if(!i)continue;const s=i.width*c*devicePixelRatio,a=i.height*c*devicePixelRatio;if(Y(o,f,r.x,r.y,s,a)){const g=u.layerStore.findLayer(r.z);if(!g||g&&g.visible)return r}}return null}function Y(o,f,c,r,i,s){return O.fromCenter({x:c,y:r},{x:2*i,y:2*s}).containsPoint({x:o,y:f})}let B=1;
@@ -0,0 +1,35 @@
1
+ import { type ImageDef, type LayerDef } from '@expofp/renderer';
2
+ export interface ParentRectLike {
3
+ readonly center: {
4
+ readonly x: number;
5
+ readonly y: number;
6
+ };
7
+ readonly size: {
8
+ readonly x: number;
9
+ readonly y: number;
10
+ };
11
+ readonly rotation: number;
12
+ }
13
+ /** A loaded layer image, with the bounds of whatever it was placed inside. */
14
+ export interface ImageDefWithParentBounds {
15
+ parentRect?: ParentRectLike;
16
+ shape: ImageDef;
17
+ }
18
+ /** Loads one configured layer's designer images and hands back where they belong. */
19
+ export type LayerImagesHandler = () => Promise<{
20
+ layer: LayerDef;
21
+ children: ImageDefWithParentBounds[];
22
+ }>;
23
+ /**
24
+ * Registers a layer's image loader under its layer name.
25
+ * @param name - The image layer's name.
26
+ * @param handler - Loads the images.
27
+ * @returns A disposer removing this registration, unless a newer one replaced it.
28
+ */
29
+ export declare function registerLayerImages(name: string, handler: LayerImagesHandler): () => void;
30
+ /**
31
+ * Starts every registered loader.
32
+ * @returns One promise per registered layer.
33
+ */
34
+ export declare function invokeLayerImages(): ReturnType<LayerImagesHandler>[];
35
+ //# sourceMappingURL=layer-images.d.ts.map
@@ -0,0 +1 @@
1
+ const t=new Map;export function registerLayerImages(e,r){return t.set(e,r),()=>{t.get(e)===r&&t.delete(e)}}export function invokeLayerImages(){return[...t.values()].map(e=>e())}
@@ -1,12 +1,47 @@
1
1
  import { Rect } from '@expofp/geometry';
2
- import { RendererService } from '../../../../renderer';
2
+ import { ModelDef } from '@expofp/renderer';
3
3
  import { type Booth } from '../../../../store/BoothStore';
4
4
  import { type Layer } from '../../../../store/LayerStore';
5
5
  import { ImageUrls } from '../../../../utils/loadImagesInBatches';
6
- export declare function loadLayersImages(rendererService: RendererService): Promise<void>;
6
+ export declare function loadLayersImages(): Promise<void>;
7
7
  export declare const getImageLayerName: (layerName: string) => string;
8
+ export declare const getModelLayerName: (layerName: string) => string;
8
9
  export declare function mapBoothsLogos(booths: Booth[]): Map<number, ImageUrls>;
9
- export declare function getLayerIcons(layer: Layer): SVGImageElement[];
10
+ /** The attribute that turns a designer `<image>` into a 3D model: a relative URL to a .glb/.gltf. */
11
+ export declare const MODEL_3D_ATTRIBUTE = "data-model-3d";
12
+ /**
13
+ * A layer's designer images, split by what they actually are. An `<image>` carrying
14
+ * {@link MODEL_3D_ATTRIBUTE} is a placeholder for a 3D model, so it must be kept out of image
15
+ * loading entirely — its `href` is never fetched — and rendered from the model URL instead.
16
+ */
17
+ export interface LayerGraphics {
18
+ /** Ordinary images, to be loaded and drawn as textured quads. */
19
+ icons: SVGImageElement[];
20
+ /** Images standing in for 3D models. */
21
+ models: SVGImageElement[];
22
+ }
23
+ export declare function getLayerGraphics(layer: Layer): LayerGraphics;
24
+ /**
25
+ * The rotation an SVG graphic carries, in radians.
26
+ *
27
+ * Shared by icons and models so the two cannot drift. It inherits the assumption `loadIcons` has
28
+ * always made: an SVG `rotate(a, cx, cy)` is treated as pivoting about the element's own center,
29
+ * because that is what a geometry `Rect` does. A transform with a different pivot is placed wrongly —
30
+ * pre-existing behavior, recorded rather than fixed here.
31
+ * @param element - The graphic to read.
32
+ * @returns The rotation in radians, positive = clockwise.
33
+ */
34
+ export declare function graphicRotation(element: SVGGraphicsElement): number;
35
+ /**
36
+ * Builds a {@link ModelDef} from an `<image>` carrying {@link MODEL_3D_ATTRIBUTE}.
37
+ *
38
+ * Bounds come from the element's own x/y/width/height — `Box.fromSvg` reads an `<image>` as readily
39
+ * as a `<rect>` — combined with its transform's rotation. The URL is relative to the plan's data
40
+ * base, the same resolution ordinary image hrefs get.
41
+ * @param element - The placeholder image.
42
+ * @returns The model def.
43
+ */
44
+ export declare function createModelDefFromElement(element: SVGImageElement): ModelDef;
10
45
  export interface BoothImg {
11
46
  booth: Booth;
12
47
  name?: string;
@@ -1 +1 @@
1
- import{degToRad as f,radToDeg as d,Rect as h}from"@expofp/geometry";import{select as u}from"d3";import{SEPARATOR as y}from"../../../../constants";import{getFpSvgJs as R}from"../../../../data/fp-payloads";import{getLayerSvg as x}from"../../../../data/svg";import{flipImageDef as I,isInnerInsideOuter as w}from"../../../../renderer";import{rotateImageDef as A}from"../../../../renderer/engine-core/utils/rotation";import{getLogoUrl as L}from"../../../../utils/getLogoUrl";export async function loadLayersImages(e){const a=e.layerImagesRegistry.invoke();await Promise.all(a.map(async s=>{const n=await s;if(!n)return;const{layer:r,children:c}=n;if(c.length){const i=[];for(let o=0;o<c.length;o++){const{shape:t,parentRect:g}=c[o],l=w(t.bounds,g);if(!r.name.includes("Pathway_")){const m=l?"image-rotate":"image-flip";e.onRoll(`${m}-${r.name}-${o}`,l?p=>A(t,p):p=>I(t,p))}i.push(t)}r.children.push(...i),e.update(r)}}))}export const getImageLayerName=e=>`${e}${y}images`;export function mapBoothsLogos(e){return new Map(e.map(a=>{const s=a.rect&&a.exhibitors.find(n=>n.logoInBooth&&n.logo);return s?[a.id,{preferred:L(s.logo),fallback:s.logo.url}]:null}).filter(Boolean))}export function getLayerIcons(e){const a=u(x(e)).select(`[data-layer="${e.name}"]`);return(R().__fpVersion>5?a.selectAll(":scope > image, :scope > g:not([data-layer]) image").nodes():a.selectAll(":scope > g[data-is-editable='false'] image").nodes()).filter(Boolean)}export function createBoothImg(e,a){const s=e.rect,n=s.size.width,r=s.size.height,c=r?n/r:1,i=a.height?a.width/a.height:1;let o,t,g;const l=.9;c>i?(t=r*l,o=t*i):(o=n*l,t=o/i);const m=e.rotate||0;return i>=2&&!m&&r>=n*2?(t=n*l,o=t*i,g=-90):g=d(m),o>n&&(o=n,t=o/i),t>r&&(t=r,o=t*i),{name:e.slug,bounds:new h(s.center,{x:o,y:t},f(g)),htmlImage:a,booth:e}}
1
+ import{Box as u,degToRad as d,radToDeg as h,Rect as g}from"@expofp/geometry";import{update as x}from"@expofp/renderer";import{select as y}from"d3";import{SEPARATOR as p}from"../../../../constants";import{getFpSvgJs as R}from"../../../../data/fp-payloads";import{getLayerSvg as A}from"../../../../data/svg";import{flipImageDef as L,isInnerInsideOuter as w,rotateImageDef as B}from"../../../../engine/utils/rotation";import{getLogoUrl as T}from"../../../../utils/getLogoUrl";import{invokeLayerImages as _}from"./layer-images";export async function loadLayersImages(){const e=_();await Promise.all(e.map(async o=>{const r=await o;if(!r)return;const{layer:n,children:a}=r;if(a.length){const c=[];for(const s of a){const{shape:t,parentRect:i}=s,m=w(t.bounds,i);n.name.includes("Pathway_")||(t.onRoll=m?({roll:l})=>B(t,l)?[t]:void 0:({roll:l})=>L(t,l)?[t]:void 0),c.push(t)}n.children.push(...c),x(n)}}))}export const getImageLayerName=e=>`${e}${p}images`,getModelLayerName=e=>`${e}${p}models`;export function mapBoothsLogos(e){return new Map(e.map(o=>{const r=o.rect&&o.exhibitors.find(n=>n.logoInBooth&&n.logo);return r?[o.id,{preferred:T(r.logo),fallback:r.logo.url}]:null}).filter(Boolean))}export const MODEL_3D_ATTRIBUTE="data-model-3d";export function getLayerGraphics(e){const o=y(A(e)).select(`[data-layer="${e.name}"]`),r=(R().__fpVersion>5?o.selectAll(":scope > image, :scope > g:not([data-layer]) image").nodes():o.selectAll(":scope > g[data-is-editable='false'] image").nodes()).filter(Boolean),n=[],a=[];for(const c of r)(c.hasAttribute(MODEL_3D_ATTRIBUTE)?a:n).push(c);return{icons:n,models:a}}export function graphicRotation(e){return d(e.transform?.animVal[0]?.angle??0)}export function createModelDefFromElement(e){const o=u.fromSvg(e);return{url:D(e.getAttribute(MODEL_3D_ATTRIBUTE)),bounds:g.fromMinMax(o.min,o.max,graphicRotation(e))}}function D(e){return!e?.startsWith("data:")&&e?.indexOf("://")===-1?window.__dataUrlBase+e:e}export function createBoothImg(e,o){const r=e.rect,n=r.size.width,a=r.size.height,c=a?n/a:1,s=o.height?o.width/o.height:1;let t,i,m;const l=.9;c>s?(i=a*l,t=i*s):(t=n*l,i=t/s);const f=e.rotate||0;return s>=2&&!f&&a>=n*2?(i=n*l,t=i*s,m=-90):m=h(f),t>n&&(t=n,i=t/s),i>a&&(i=a,t=i*s),{name:e.slug,bounds:new g(r.center,{x:t,y:i},d(m),e.elevation),htmlImage:o,booth:e}}