@expofp/floorplan 3.11.3 → 3.11.5

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 (120) hide show
  1. package/dist/browser/{Button-CWw2sVgd.js → Button-cW8nOyr7.js} +5 -5
  2. package/dist/browser/{CookieConsent-FeVIJ_Yk.js → CookieConsent-DgvNz2-R.js} +7 -7
  3. package/dist/browser/{Debug-CAteGKZH.js → Debug-B8Gsofcy.js} +7 -7
  4. package/dist/browser/{Demo-aIUISr3G.js → Demo-BRgYJptn.js} +13 -11
  5. package/dist/browser/{Free-C98X4LrP.js → Free-DL8lBmJq.js} +13 -11
  6. package/dist/browser/{Gallery-CWjQm4hj.js → Gallery-BD-RLpir.js} +9 -9
  7. package/dist/browser/{GpsLoader-BTo2dZds.js → GpsLoader-D-re9FTf.js} +9 -9
  8. package/dist/browser/{KioskStore-CX5ThkIn.js → KioskStore-BJNx5Tcr.js} +3 -3
  9. package/dist/browser/{MaplibreAdapter-CRcB_u5I.js → MaplibreAdapter-1NqFsZM1.js} +9 -9
  10. package/dist/browser/{ModalContainer-VauFMnIc.js → ModalContainer-CW1LLEm-.js} +10 -10
  11. package/dist/browser/{PermissionNotice-BSPFngCq.js → PermissionNotice-Dsa-GqT0.js} +6 -6
  12. package/dist/browser/{SetKioskMode-Dbd6T5-O.js → SetKioskMode-O-H81LeY.js} +8 -8
  13. package/dist/browser/{ShowKiosk-OuxwmOwy.js → ShowKiosk-DmHjLF6Y.js} +10 -10
  14. package/dist/browser/{TouchHand-Br-CwL-F.js → TouchHand-_BQthb0c.js} +4 -4
  15. package/dist/browser/{ViewerMenuPanel-DVByBv9z.js → ViewerMenuPanel-qLf3WyOW.js} +9 -9
  16. package/dist/browser/{add-debug-secret-listener-BR1iPsb9.js → add-debug-secret-listener-DLshy8sj.js} +1 -1
  17. package/dist/browser/{boolean-editor-DSTgDbmc.js → boolean-editor-VUiLykpJ.js} +9 -9
  18. package/dist/browser/{bootIntercom-CUea_DL-.js → bootIntercom-Btfot_oL.js} +2 -2
  19. package/dist/browser/{booth-by-xy-Bek_OU5N.js → booth-by-xy-D6AXHHgL.js} +6 -6
  20. package/dist/browser/{browser-BZR5FRBQ.js → browser-DZs48Iz5.js} +2 -2
  21. package/dist/browser/bundle.json +61 -61
  22. package/dist/browser/{classnames-KtBHe88l.js → classnames-Bs6fEBfQ.js} +2 -2
  23. package/dist/browser/{client-DJnYedJs.js → client-6N6uSJl-.js} +4 -4
  24. package/dist/browser/{components-CUaqFBY3.js → components-ufUbszNV.js} +631 -631
  25. package/dist/browser/{debug-overlay-2tBkBbRy.js → debug-overlay-DGcVO6ry.js} +10 -10
  26. package/dist/browser/{debug-ui-CP2nQv-1.js → debug-ui-A_u8KPY6.js} +6 -6
  27. package/dist/browser/{dist-CpM1INPI.js → dist-BHBdwYIm.js} +5 -5
  28. package/dist/browser/{dist-DlM1oWid.js → dist-CjYIs-s0.js} +6 -6
  29. package/dist/browser/{dist-DP9l2rrk.js → dist-D2K_bZQY.js} +3 -3
  30. package/dist/browser/{efp-debug-init-BH2nDNO5.js → efp-debug-init-CkR453Xy.js} +2 -2
  31. package/dist/browser/{enum-editor-B4p1ELb6.js → enum-editor-NNRkgdUY.js} +11 -11
  32. package/dist/browser/{es5-DdpBCK3Q.js → es5-DCFcfU2R.js} +2 -2
  33. package/dist/browser/{event-not-found-CWE-0MrG.js → event-not-found-D8HQ23ap.js} +1 -1
  34. package/dist/browser/{exports-B7NIvrUp.js → exports-O8XjKvRg.js} +1 -1
  35. package/dist/browser/{favicon-BOK9avcY.js → favicon-BEHe-EI3.js} +1 -1
  36. package/dist/browser/{fetch-retry.umd-CipkNsrX.js → fetch-retry.umd-C3YzA_e2.js} +2 -2
  37. package/dist/browser/{flex-B2wy4xSD.js → flex-DNr-nnJO.js} +5 -5
  38. package/dist/browser/{floorplan.loader-D3kQCb99.js → floorplan.loader-BgmlRCqt.js} +11 -11
  39. package/dist/browser/{floorplan.ready-B4mDkXRm.js → floorplan.ready-C1Ko5LQv.js} +12 -12
  40. package/dist/browser/{fuse-CqO1cqnn.js → fuse-DFivryfG.js} +2 -2
  41. package/dist/browser/{i18n-B_V1H0HQ.js → i18n-CtD4ktVP.js} +4 -4
  42. package/dist/browser/index.js +12 -12
  43. package/dist/browser/{index.module-D2erzLUJ.js → index.module-BFGHcA-z.js} +4 -4
  44. package/dist/browser/{is-webview-DGL-PdzN.js → is-webview-BGMbVT8P.js} +1 -1
  45. package/dist/browser/{jsx-runtime-uuMRT9NQ.js → jsx-runtime-DKfaEd8M.js} +2 -2
  46. package/dist/browser/{lib-osu8gY8B.js → lib-DN41dFq1.js} +4 -4
  47. package/dist/browser/{loadImage-m-4ixNVH.js → loadImage-zScPwiNs.js} +4 -4
  48. package/dist/browser/{logDeviceInfo-DRtA-dL6.js → logDeviceInfo-DwILNgjk.js} +9 -9
  49. package/dist/browser/{main-Bjk86dRG.js → main-DiIqziFi.js} +1 -1
  50. package/dist/browser/{mobx-CRjt7H7o.js → mobx-BVz1d1Yv.js} +4 -4
  51. package/dist/browser/{particles.min-CSGhGGgI.js → particles.min-DLmw35iw.js} +2 -2
  52. package/dist/browser/{prop-types-C3o0VrkV.js → prop-types-BrRP9I8R.js} +2 -2
  53. package/dist/browser/{react-dom-CKp4cqT6.js → react-dom-Cp3zL50s.js} +3 -3
  54. package/dist/browser/{react-B7FM7U0J.js → react-u7dD7nVM.js} +2 -2
  55. package/dist/browser/{reset-all-settings-CE8btvu_.js → reset-all-settings-C84qUm-F.js} +7 -7
  56. package/dist/browser/{rolldown-runtime-CyrAgb5O.js → rolldown-runtime-Dum_XGHV.js} +1 -1
  57. package/dist/browser/{settings-ZQMSNgyk.js → settings-Dj2P9R9l.js} +2 -2
  58. package/dist/browser/{settings-item-DYAlR7v3.js → settings-item-CTWwUwhU.js} +6 -6
  59. package/dist/browser/{store-Cufsn9Pk.js → store-gsgcyMD-.js} +266 -224
  60. package/dist/browser/{string-editor-NN8vdXTM.js → string-editor-zaEv64Fb.js} +7 -7
  61. package/dist/browser/{theme-7hRavfue.js → theme-kppufad8.js} +8 -8
  62. package/dist/browser/{ui-F8v9_gqS.js → ui-z6pxxEMr.js} +8 -8
  63. package/dist/browser/{useRenderTarget-CzK9YRAN.js → useRenderTarget-CBsqqPXa.js} +4 -4
  64. package/dist/esm/components/BaseFilterModal.js +1 -1
  65. package/dist/esm/components/Demo.js +1 -1
  66. package/dist/esm/components/Event.js +1 -1
  67. package/dist/esm/components/Exhibitor.js +1 -1
  68. package/dist/esm/components/Free.js +1 -1
  69. package/dist/esm/components/Layout.js +1 -1
  70. package/dist/esm/components/MobileToggleButtonContainer.d.ts +3 -0
  71. package/dist/esm/components/MobileToggleButtonContainer.js +1 -0
  72. package/dist/esm/components/MultiSelectGroupsContainer.d.ts +5 -0
  73. package/dist/esm/components/MultiSelectGroupsContainer.js +1 -0
  74. package/dist/esm/components/Schedule.js +1 -1
  75. package/dist/esm/components/SessionsFiltersModal.js +1 -1
  76. package/dist/esm/components/ShowMoreButtonContainer.d.ts +5 -0
  77. package/dist/esm/components/ShowMoreButtonContainer.js +1 -0
  78. package/dist/esm/components/SpeakersFiltersModal.js +1 -1
  79. package/dist/esm/components/index.d.ts +6 -5
  80. package/dist/esm/components/index.js +1 -1
  81. package/dist/esm/store/UIState.d.ts +2 -2
  82. package/dist/esm/store/UIState.js +1 -1
  83. package/dist/esm/ui/MobileToggleButton/MobileToggleButton.d.ts +12 -0
  84. package/dist/esm/ui/MobileToggleButton/MobileToggleButton.js +1 -0
  85. package/dist/esm/ui/MobileToggleButton/index.d.ts +3 -0
  86. package/dist/esm/ui/MobileToggleButton/index.js +1 -0
  87. package/dist/esm/{components → ui/MultiSelectGroups}/MultiSelectGroups.d.ts +9 -5
  88. package/dist/esm/ui/MultiSelectGroups/MultiSelectGroups.js +1 -0
  89. package/dist/esm/ui/MultiSelectGroups/index.d.ts +3 -0
  90. package/dist/esm/ui/MultiSelectGroups/index.js +1 -0
  91. package/dist/esm/ui/ShowMoreButton/ShowMoreButton.d.ts +11 -0
  92. package/dist/esm/ui/ShowMoreButton/ShowMoreButton.js +1 -0
  93. package/dist/esm/ui/ShowMoreButton/index.d.ts +3 -0
  94. package/dist/esm/ui/ShowMoreButton/index.js +1 -0
  95. package/dist/esm/utils/lazy-qr-code.d.ts +3 -1
  96. package/dist/esm/wayfinding/createWayfinding.d.ts +1 -1
  97. package/dist/esm/wayfinding/createWayfinding.js +1 -1
  98. package/dist/esm/wayfinding/renderer/createWayfindingRenderer.d.ts +5 -6
  99. package/dist/esm/wayfinding/renderer/createWayfindingRenderer.js +1 -1
  100. package/dist/esm/wayfinding/renderer/iconManager.d.ts +18 -12
  101. package/dist/esm/wayfinding/renderer/iconManager.js +1 -1
  102. package/dist/esm/wayfinding/renderer/index.d.ts +1 -1
  103. package/dist/esm/wayfinding/renderer/layerManager.d.ts +6 -7
  104. package/dist/esm/wayfinding/renderer/layerManager.js +1 -1
  105. package/dist/esm/{renderer/engine-core/animation.d.ts → wayfinding/renderer/lineAnimation.d.ts} +2 -2
  106. package/dist/esm/wayfinding/renderer/routeLineManager.d.ts +2 -3
  107. package/dist/esm/wayfinding/renderer/routeLineManager.js +1 -1
  108. package/dist/esm/wayfinding/renderer/trailManager.d.ts +11 -8
  109. package/dist/esm/wayfinding/renderer/trailManager.js +1 -1
  110. package/dist/esm/wayfinding/renderer/types.d.ts +53 -86
  111. package/dist/esm/wayfinding/runtime/routeRenderData.js +1 -1
  112. package/package.json +4 -4
  113. package/dist/esm/components/LargeMessage.d.ts +0 -4
  114. package/dist/esm/components/LargeMessage.js +0 -1
  115. package/dist/esm/components/MobileToggleButton.d.ts +0 -5
  116. package/dist/esm/components/MobileToggleButton.js +0 -1
  117. package/dist/esm/components/MultiSelectGroups.js +0 -1
  118. package/dist/esm/components/ShowMoreButton.d.ts +0 -9
  119. package/dist/esm/components/ShowMoreButton.js +0 -1
  120. /package/dist/esm/{renderer/engine-core/animation.js → wayfinding/renderer/lineAnimation.js} +0 -0
@@ -1,11 +1,11 @@
1
1
  import type { LayerDef } from '@expofp/renderer';
2
- import type { RendererService } from '../../renderer';
2
+ import type { RendererPort } from './types';
3
3
  /**
4
4
  * Manages scene layer resolution, caching, dirty-tracking, and flush.
5
5
  *
6
- * Layers are resolved by name from `scene.rootLayer.children` and cached.
7
- * `touchLayer` marks a layer as dirty; `flush` commits all dirty layers
8
- * to `RendererService` in a single update call.
6
+ * Layers are resolved by name from `rendererPort.getLayers()` and cached. `touchLayer`
7
+ * marks a layer as dirty; `flush` commits all dirty layers via `rendererPort.update`
8
+ * in a single call.
9
9
  */
10
10
  export interface LayerManager {
11
11
  /** Layers modified since the last {@link flush}. */
@@ -20,8 +20,7 @@ export interface LayerManager {
20
20
  destroy(): void;
21
21
  }
22
22
  /**
23
- * Create a {@link LayerManager} bound to the given `RendererService`.
24
- * Throws if `rendererService.scene` is null.
23
+ * Create a {@link LayerManager} bound to the given {@link RendererPort}.
25
24
  */
26
- export declare function createLayerManager(rendererService: RendererService): LayerManager;
25
+ export declare function createLayerManager(rendererPort: RendererPort): LayerManager;
27
26
  //# sourceMappingURL=layerManager.d.ts.map
@@ -1 +1 @@
1
- export function createLayerManager(o){const s=o.scene;if(!s)throw new Error("renderer: rendererService.scene is null \u2014 start RendererService before constructing renderer");const a=s.rootLayer.children,t=new Map,r=new Map;return{touchedLayers:r,resolveLayer(e){const n=t.get(e);if(n)return n;const c=a.find(l=>l.name===e);if(!c)throw new Error(`renderer: layer "${e}" not found in scene`);return t.set(e,c),c},touchLayer(e){const n=this.resolveLayer(e);return r.set(e,n),n},flush(){if(r.size!==0){for(const e of r.values())e.children=[...e.children];o.update(...r.values()),r.clear()}},destroy(){r.clear(),t.clear()}}}
1
+ export function createLayerManager(s){const c=s.getLayers(),a=new Map,r=new Map;return{touchedLayers:r,resolveLayer(e){const t=a.get(e);if(t)return t;const n=c.find(o=>o.name===e);if(!n)throw new Error(`renderer: layer "${e}" not found in scene`);return a.set(e,n),n},touchLayer(e){const t=this.resolveLayer(e);return r.set(e,t),t},flush(){if(r.size!==0){for(const e of r.values())e.children=[...e.children];s.update(...r.values()),r.clear()}},destroy(){r.clear(),a.clear()}}}
@@ -1,7 +1,7 @@
1
- import { LineDef } from '@expofp/renderer';
1
+ import type { LineDef } from '@expofp/renderer';
2
2
  export interface AnimationHandle {
3
3
  stop: () => void;
4
4
  getProgress: () => number;
5
5
  }
6
6
  export declare function animateLineSegments(lineSegments: LineDef[], callback: (segment: LineDef, segmentIndex: number, reset: boolean) => void, getScale: () => number, startProgress?: number): AnimationHandle | undefined;
7
- //# sourceMappingURL=animation.d.ts.map
7
+ //# sourceMappingURL=lineAnimation.d.ts.map
@@ -1,6 +1,5 @@
1
- import { type RendererService } from '../../renderer';
2
1
  import type { LayerManager } from './layerManager';
3
- import type { RouteColors } from './types';
2
+ import type { RendererPort, RouteColors } from './types';
4
3
  /**
5
4
  * Manages static route lines (passed + remaining) and an animated overlay
6
5
  * on the remaining segment.
@@ -38,5 +37,5 @@ export interface RouteLineManager {
38
37
  * Create a {@link RouteLineManager} that renders `LineDef` segments
39
38
  * into layers managed by the given {@link LayerManager}.
40
39
  */
41
- export declare function createRouteLineManager(layerManager: LayerManager, rendererService: RendererService, colors: RouteColors): RouteLineManager;
40
+ export declare function createRouteLineManager(layerManager: LayerManager, colors: RouteColors, rendererPort: RendererPort): RouteLineManager;
42
41
  //# sourceMappingURL=routeLineManager.d.ts.map
@@ -1 +1 @@
1
- import{createLineDef as d}from"../../renderer";import{animateLineSegments as A}from"../../renderer/engine-core/animation";export function createRouteLineManager(s,m,r){let e=null,n=null,i=null;return{setRouteLines(f,h,l){const o=s.touchLayer(l.linesLayer),a=s.touchLayer(l.animatedLinesLayer);n=o,i=a;const p=l.resetAnimation??!0;let u=0;e&&(p||(u=e.getProgress()),e.stop(),e=null);const y=f.map(t=>d(t,r.passed)),c=h.map(t=>d(t,r.remaining));if(o.children=[...y,...c],!c.length){a.children=[];return}const L=c.map(t=>({...t,color:r.active}));e=A(L,(t,g,D)=>{a.children=D?[]:[...L.slice(0,g),t],m.update(a)},()=>m.scale,u)??null},clearLines(){e&&(e.stop(),e=null),n&&(n.children=[],s.touchedLayers.set(n.name,n)),i&&(i.children=[],s.touchedLayers.set(i.name,i))},destroy(){this.clearLines()}}}
1
+ import{animateLineSegments as D}from"./lineAnimation";export function createRouteLineManager(a,c,s){let e=null,n=null,i=null;return{setRouteLines(d,f,m){const L=a.touchLayer(m.linesLayer),l=a.touchLayer(m.animatedLinesLayer);n=L,i=l;const h=m.resetAnimation??!0;let u=0;e&&(h||(u=e.getProgress()),e.stop(),e=null);const p=d.map(t=>s.createLineDef(t,c.passed)),r=f.map(t=>s.createLineDef(t,c.remaining));if(L.children=[...p,...r],!r.length){l.children=[];return}const o=r.map(t=>({...t,color:c.active}));e=D(o,(t,y,g)=>{l.children=g?[]:[...o.slice(0,y),t],s.update(l)},()=>s.getScale(),u)??null},clearLines(){e&&(e.stop(),e=null),n&&(n.children=[],a.touchedLayers.set(n.name,n)),i&&(i.children=[],a.touchedLayers.set(i.name,i))},destroy(){this.clearLines()}}}
@@ -1,27 +1,30 @@
1
- import { type RendererService } from '../../renderer';
1
+ import { type Point2Like } from '@expofp/geometry';
2
+ import type { RenderableDef } from '@expofp/renderer';
2
3
  import type { LayerManager } from './layerManager';
3
- import type { Point } from './types';
4
+ import type { RendererPort } from './types';
4
5
  /**
5
6
  * Manages named trails of evenly-spaced dots between two points.
6
7
  *
7
- * Each trail has its own scale handler — when the camera zooms, dots are
8
- * recalculated so visual spacing stays constant.
8
+ * On camera zoom the app glue calls `applyScale` so dots are recalculated and
9
+ * visual spacing stays constant.
9
10
  */
10
11
  export interface TrailManager {
11
12
  /**
12
13
  * Place, update, or remove a named trail.
13
- * Pass `from/to = null` to remove the trail and unregister its scale handler.
14
+ * Pass `from/to = null` to remove the trail.
14
15
  */
15
- setTrail(name: string, from: Point | null, to: Point | null, options?: {
16
+ setTrail(name: string, from: Point2Like | null, to: Point2Like | null, options?: {
16
17
  readonly canvas: HTMLCanvasElement;
17
18
  readonly layer: string;
18
19
  }): void;
19
- /** Remove all trails and unregister their scale handlers. */
20
+ /** Redraw all trails for `scale`; returns changed layer defs. */
21
+ applyScale(scale: number): RenderableDef[];
22
+ /** Remove all trails. */
20
23
  destroy(): void;
21
24
  }
22
25
  /**
23
26
  * Create a {@link TrailManager} that renders dot trails into layers
24
27
  * managed by the given {@link LayerManager}.
25
28
  */
26
- export declare function createTrailManager(layerManager: LayerManager, rendererService: RendererService): TrailManager;
29
+ export declare function createTrailManager(layerManager: LayerManager, rendererPort: RendererPort): TrailManager;
27
30
  //# sourceMappingURL=trailManager.d.ts.map
@@ -1 +1 @@
1
- import{createImageDef as w,getBounds as d}from"../../renderer";import{computeTrailPoints as g}from"../core";const D=40;export function createTrailManager(l,c){const s=new Map;function f(t){return`trail#${t}`}function u(t){if(!t.dotDefs.length)return;const e=l.touchLayer(t.layerName),n=new Set(t.dotDefs);e.children=e.children.filter(r=>!n.has(r)),t.dotDefs=[]}function i(t){const e=l.touchLayer(t.layerName),n=c.scale,r=D*n,a=g(t.from,t.to,r),o=t.canvas,h=a.map(m=>w(o,d(m.x,m.y,o.width,o.height,n)));u(t),e.children.push(...h),t.dotDefs=h}function y(t){const e=s.get(t);e&&(u(e),c.ptScaleRegistry.unregisterByName(f(t)),s.delete(t))}return{setTrail(t,e,n,r){if(e===null||n===null){y(t);return}if(!r)throw new Error(`renderer: setTrail("${t}") requires options when from/to are non-null`);const a=s.get(t);if(a){if(a.canvas!==r.canvas||a.layerName!==r.layer)throw new Error(`renderer: trail "${t}" cannot change canvas or layer after first call`);a.from=e,a.to=n,i(a);return}const o={from:e,to:n,canvas:r.canvas,layerName:r.layer,dotDefs:[]};s.set(t,o),c.onPtScale(f(t),()=>(i(o),l.touchLayer(o.layerName))),i(o)},destroy(){for(const t of[...s.keys()])y(t)}}}
1
+ import{Rect as w}from"@expofp/geometry";import{computeTrailPoints as d}from"../core";const m=40;export function createTrailManager(c,l){const o=new Map;function f(e){if(!e.dotDefs.length)return;const t=c.touchLayer(e.layerName),r=new Set(e.dotDefs);t.children=t.children.filter(a=>!r.has(a)),e.dotDefs=[]}function i(e,t){const r=c.touchLayer(e.layerName),a=m*t,n=d(e.from,e.to,a),s=e.canvas,y=n.map(h=>l.createImageDef(s,new w({x:h.x,y:h.y},{x:s.width*t,y:s.height*t})));f(e),r.children.push(...y),e.dotDefs=y}function u(e){const t=o.get(e);t&&(f(t),o.delete(e))}return{setTrail(e,t,r,a){if(t===null||r===null){u(e);return}if(!a)throw new Error(`renderer: setTrail("${e}") requires options when from/to are non-null`);const n=o.get(e);if(n){if(n.canvas!==a.canvas||n.layerName!==a.layer)throw new Error(`renderer: trail "${e}" cannot change canvas or layer after first call`);n.from=t,n.to=r,i(n,l.getScale());return}const s={from:t,to:r,canvas:a.canvas,layerName:a.layer,dotDefs:[]};o.set(e,s),i(s,l.getScale())},applyScale(e){const t=new Set;for(const r of o.values())i(r,e),t.add(c.touchLayer(r.layerName));return[...t]},destroy(){for(const e of[...o.keys()])u(e)}}}
@@ -1,12 +1,30 @@
1
+ import type { Point2Like, Rect } from '@expofp/geometry';
2
+ import type { ImageDef, ImageSource, LayerDef, LineDef, RenderableDef } from '@expofp/renderer';
1
3
  /**
2
- * renderer public types.
3
- *
4
- * Generic, domain-neutral renderer abstraction over @expofp/renderer.
5
- * Knows nothing about wayfinding domain (source/destination/transition/kiosk).
4
+ * The renderer this layer talks to, injected so it stays free of a concrete
5
+ * renderer. Typed only against `@expofp/renderer` / `@expofp/geometry` so it
6
+ * carries no dependency on `src/renderer`.
6
7
  */
7
- export interface Point {
8
- readonly x: number;
9
- readonly y: number;
8
+ export interface RendererPort {
9
+ createImageDef(source: ImageSource, bounds: Rect, options?: {
10
+ hidden?: boolean;
11
+ dim?: boolean;
12
+ interactive?: boolean;
13
+ origin?: [number, number];
14
+ }): ImageDef;
15
+ createLineDef(line: {
16
+ p0: Point2Like;
17
+ p1: Point2Like;
18
+ }, color?: string, width?: number): LineDef;
19
+ getRotation(newAngle: number, currentRotation: number): number | undefined;
20
+ /** Convert a geometry rect to the renderer's bounds rect (`ImageDef['bounds']`). */
21
+ rectToRenderer(rect: Rect): ImageDef['bounds'];
22
+ /** Current camera point-scale. */
23
+ getScale(): number;
24
+ /** Scene root-layer children, used to resolve wf layers by name. */
25
+ getLayers(): LayerDef[];
26
+ /** Commit changed defs/layers to the renderer. */
27
+ update(...defs: RenderableDef[]): void;
10
28
  }
11
29
  export interface RouteColors {
12
30
  readonly passed: string;
@@ -56,107 +74,56 @@ export interface WayfindingRendererConfig {
56
74
  /**
57
75
  * WayfindingRenderer — generic ImageDef/LineDef renderer for wayfinding visuals.
58
76
  *
59
- * **Batching contract**: every mutator method (`setIcon`, `clearIcons`,
60
- * `setTrail`, `setRouteLines`, `clearRoute`) only mutates
61
- * internal state and scene-graph data structures. None of them push changes
62
- * to `RendererService`. The caller MUST call `flush()` after a batch of
63
- * mutations to commit them. This lets the caller group many changes into
64
- * one render frame.
65
- *
66
- * Exceptions: animation tick + camera-scale handlers update the renderer
67
- * directly because they fire asynchronously, outside any caller batch.
77
+ * Mutators (`setIcon`/`clearIcons`/`setTrail`/`setRouteLines`/`clearRoute`) only
78
+ * mutate scene state; call `flush()` to commit a batch. The route animation tick
79
+ * updates the renderer directly, outside any batch.
68
80
  */
69
81
  export interface WayfindingRenderer {
70
82
  /**
71
- * Place or update an icon by `name`. `key` distinguishes multiple
72
- * instances sharing the same name (transitions, kiosks).
73
- *
74
- * First call with a (name, key) pair creates an ImageDef in `config.layer`,
75
- * registers a scale handler (and a roll handler if `cardinalSnap`), and
76
- * stores the icon. Subsequent calls mutate the existing ImageDef in place
77
- * (bounds, hidden, dim, onClick, source).
78
- *
79
- * Pass `config: null` to hide that icon (ImageDef stays alive for reuse).
80
- *
81
- * `config.layer` MUST stay stable for the same (name, key) — changing it
82
- * after first call throws.
83
- *
84
- * **Buffered**: call `flush()` to commit.
83
+ * Place or update an icon by `(name, key)`. First call creates it in
84
+ * `config.layer`; later calls mutate in place. `config: null` hides it.
85
+ * `config.layer` must stay stable for a `(name, key)`. Buffered — `flush()` to commit.
85
86
  */
86
87
  setIcon(name: string, config: IconConfig | null, key?: string | number): void;
87
- /**
88
- * Hide every icon that shares one of the given `names`. ImageDefs stay
89
- * alive for reuse on next `setIcon`.
90
- *
91
- * **Buffered**: call `flush()` to commit.
92
- */
88
+ /** Hide every icon sharing one of `names` (kept alive for reuse). Buffered. */
93
89
  clearIcons(names: string | readonly string[]): void;
94
90
  /**
95
- * Place or update a named trail of dots between two points. Multiple
96
- * trails can coexist (e.g. one from-side, one to-side, possibly on
97
- * different layers / floors). `name` identifies the trail; subsequent
98
- * calls with the same `name` reuse its scale handler and replace its dots.
99
- *
100
- * Dot interval is fixed (visual constant). Renderer regenerates dots
101
- * whenever the camera scale changes — count adapts so spacing stays
102
- * constant.
103
- *
104
- * `options` is required when `from`/`to` are non-null. Pass both as `null`
105
- * to clear that trail (no `options` needed).
106
- *
107
- * `options.canvas` and `options.layer` MUST stay stable for a given
108
- * `name` — changing them after first call throws.
109
- *
110
- * **Buffered**: call `flush()` to commit.
91
+ * Place or update a named dot trail between two points; `from/to = null`
92
+ * clears it. `options` required when non-null; `canvas`/`layer` must stay
93
+ * stable. Buffered — `flush()` to commit.
111
94
  */
112
- setTrail(name: string, from: Point | null, to: Point | null, options?: {
95
+ setTrail(name: string, from: Point2Like | null, to: Point2Like | null, options?: {
113
96
  readonly canvas: HTMLCanvasElement;
114
97
  readonly layer: string;
115
98
  }): void;
116
99
  /**
117
- * Replace the static route lines (passed + remaining) and (re)start the
118
- * animation on the remaining segment.
119
- *
120
- * **Buffered**: call `flush()` to commit. The animation tick itself
121
- * updates the renderer directly (it runs async outside caller batches).
100
+ * Replace static route lines (passed + remaining) and (re)start the remaining
101
+ * animation. Buffered — `flush()` to commit.
122
102
  */
123
103
  setRouteLines(passed: readonly {
124
- readonly p0: Point;
125
- readonly p1: Point;
104
+ readonly p0: Point2Like;
105
+ readonly p1: Point2Like;
126
106
  }[], remaining: readonly {
127
- readonly p0: Point;
128
- readonly p1: Point;
107
+ readonly p0: Point2Like;
108
+ readonly p1: Point2Like;
129
109
  }[], options: {
130
- /**
131
- * TODO(future): remove. renderer will create this layer
132
- * dynamically inside `createWayfindingRenderer` — caller will no
133
- * longer pass layer names per call.
134
- */
135
110
  readonly linesLayer: string;
136
- /**
137
- * TODO(future): remove. Same as above — animated lines layer will
138
- * be created in `createWayfindingRenderer`.
139
- */
140
111
  readonly animatedLinesLayer: string;
141
112
  readonly resetAnimation?: boolean;
142
113
  }): void;
143
- /**
144
- * Clear route lines, drop all trails, hide all icons. Icon ImageDefs stay
145
- * alive for reuse; trail records and their scale handlers are removed.
146
- *
147
- * **Buffered**: call `flush()` to commit.
148
- */
114
+ /** Recompute icon/trail bounds for `scale`; returns changed defs to render. */
115
+ applyScale(scale: number): RenderableDef[];
116
+ /** Apply camera roll to cardinal-snap icons; returns changed defs to render. */
117
+ applyRoll(cameraAngle: number): RenderableDef[];
118
+ /** Fire the hit clickable icon's `onClick` from already-picked defs. */
119
+ handleClick(defs: readonly RenderableDef[]): void;
120
+ /** Whether a clickable icon is under the already-picked defs (for cursor). */
121
+ handleHover(defs: readonly RenderableDef[]): boolean;
122
+ /** Clear route lines, drop trails, hide icons. Buffered — `flush()` to commit. */
149
123
  clearRoute(): void;
150
- /**
151
- * Commit all buffered mutations to `RendererService`. Pushes every layer
152
- * touched since the last `flush()` (or since construction).
153
- */
124
+ /** Commit buffered mutations to the renderer (via the injected port). */
154
125
  flush(): void;
155
- /**
156
- * Full teardown: `clearRoute()` + remove DOM listeners + unregister all
157
- * scale and roll handlers. Does NOT call `flush()` — the renderer is
158
- * going away, so committing pending changes is the caller's choice.
159
- */
126
+ /** Full teardown (managers cleared). Does NOT flush. */
160
127
  destroy(): void;
161
128
  }
162
129
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- import{getRouteLength as p,normalizeRouteDirection as u,splitRouteByPoint as m}from"../core";export function computeRouteRenderData({routeLines:s,currentRouteLayer:o,from:d,to:a,snap:t}){const i=u(s.filter(r=>!r.virtual),d,a),n=o===null?i:i.filter(r=>r.p0.layer===o);if(!t?.snapped)return{passed:[],remaining:n,distance:p(i)};const{passed:c,remaining:e}=m(n,t.snappedPoint),l=e!==n&&e.length>0?[{...e[0],p0:t.snappedPoint},...e.slice(1)]:e;return{passed:c,remaining:l,distance:t.distance}}
1
+ import{getRouteLength as u,normalizeRouteDirection as m,splitRouteByPoint as g}from"../core";export function computeRouteRenderData({routeLines:s,currentRouteLayer:r,from:a,to:c,snap:t}){const i=m(s.filter(n=>!n.virtual),a,c),o=n=>r===null?n:n.filter(p=>p.p0.layer===r);if(!t?.snapped)return{passed:[],remaining:o(i),distance:u(i)};const{passed:d,remaining:e}=g(i,t.snappedPoint),l=e!==i&&e.length>0?[{...e[0],p0:t.snappedPoint},...e.slice(1)]:e;return{passed:o(d),remaining:o(l),distance:t.distance}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expofp/floorplan",
3
- "version": "3.11.3",
3
+ "version": "3.11.5",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/expofp/efp-app.git",
@@ -72,9 +72,9 @@
72
72
  "tslib": "^2.3.0",
73
73
  "uuid": "^9.0.1",
74
74
  "zod": "4.3.5",
75
- "@expofp/debug": "3.11.3",
76
- "@expofp/geometry": "3.11.3",
77
- "@expofp/resolve": "3.11.3"
75
+ "@expofp/debug": "3.11.5",
76
+ "@expofp/geometry": "3.11.5",
77
+ "@expofp/resolve": "3.11.5"
78
78
  },
79
79
  "devDependencies": {
80
80
  "@babel/plugin-proposal-decorators": "^8.0.2",
@@ -1,4 +0,0 @@
1
- import './LargeMessage.scss';
2
- import React from 'react';
3
- export default function LargeMessage(): React.JSX.Element | null;
4
- //# sourceMappingURL=LargeMessage.d.ts.map
@@ -1 +0,0 @@
1
- import{jsx as o}from"react/jsx-runtime";import"./LargeMessage.scss";import{autorun as r,reaction as a}from"mobx";import{useLocalStore as l,useObserver as n}from"mobx-react-lite";import{uiState as i}from"../store";import m from"../tools/logger";import{useInit as u}from"../utils/mobx";const g=1e3;export default function f(){const e=l(()=>({shouldShow:!1,visible:!1,transitioning:!1}));return u(()=>{let t;a(()=>i.largeMessageLastSet,()=>{i.largeMessageLastSet&&(window.clearTimeout(t),m.log("Showing large message"),e.shouldShow=!0,t=window.setTimeout(()=>{e.shouldShow=!1},g))},{fireImmediately:!0});let s;r(()=>{window.clearTimeout(s),e.shouldShow?(e.transitioning=!0,s=window.setTimeout(()=>{e.visible=!0},1)):(e.visible=!1,s=window.setTimeout(()=>{e.transitioning=!1},1e3))})}),n(()=>i.largeMessage&&e.transitioning?o("div",{className:"large-message"+(e.visible?" -visible":""),children:o("div",{className:"large-message__text",children:i.largeMessage})}):null)}
@@ -1,5 +0,0 @@
1
- import './MobileToggleButton.scss';
2
- import React from 'react';
3
- declare function MobileToggleButton(): React.JSX.Element | null;
4
- export default MobileToggleButton;
5
- //# sourceMappingURL=MobileToggleButton.d.ts.map
@@ -1 +0,0 @@
1
- import{jsx as s,jsxs as u}from"react/jsx-runtime";import"./MobileToggleButton.scss";import m from"classnames";import{useObserver as p}from"mobx-react-lite";import{useCallback as c}from"react";import{LANGUAGE_TYPE as S}from"../constants";import t,{searchStore as b}from"../store";import{t as i}from"../utils/i18n";function f(){const o=c(()=>{t.uiState.isOverlayOpen&&t.uiState.overlaySize==="full"?t.uiState.desiredOverlaySize="small":b.openOverlayWithoutInputFocus()},[]);return p(()=>{const a=t.uiState.list.type==="route-planner";if(!(t.uiState.overlayPosition==="bottom"&&(a||!t.uiState.details&&!t.uiState.menu&&t.uiState.list.type!==S&&t.uiState.list.type!=="bookmarks"&&t.uiState.list.type!=="sessions")))return null;const e=!t.uiState.isOverlayOpen||t.uiState.overlaySize!=="full",l=e?i("List"):i("Map"),r=e?"is-list":"is-map",n=e?"icon-list":"icon-map";return u("button",{className:m("efp-mobile-toggle-button",{"is-with-banner":t.uiState.isBannerVisible},r),onClick:o,type:"button","aria-label":e?i("List"):i("Map"),children:[s("i",{className:n}),s("span",{className:"efp-mobile-toggle-button__text",children:l})]})})}export default f;
@@ -1 +0,0 @@
1
- import{Fragment as F,jsx as i,jsxs as d}from"react/jsx-runtime";import"./MultiSelectGroups.scss";import v from"classnames";import{observer as I}from"mobx-react-lite";import M,{useCallback as h,useMemo as P,useState as q}from"react";import{t as N}from"../utils/i18n";import B from"./ShowMoreButton";const R=M.memo(({item:r,isSelected:s,variant:m,showCount:_,count:p,onClick:c,customRenderer:a})=>a?i(F,{children:a(r,s)}):d("button",{type:"button",className:v("multi-select-groups__item",{"is-selected":s,"is-disabled":r.disabled,[`multi-select-groups__item--${m}`]:m}),onClick:()=>!r.disabled&&c(r.id),disabled:r.disabled,"aria-pressed":s,children:[i("div",{className:"multi-select-groups__item-name",children:r.name}),_&&p>0&&i("span",{className:"multi-select-groups__item-count",children:p})]},r.id)),T=({groups:r=[],selectedIds:s=[],showItemCounts:m=!0,showGroupActions:_=!0,variant:p="default",maxItemsVisible:c=20,itemCountProvider:a,customItemRenderer:S,onChange:u})=>{const[G,x]=q(new Set),y=h(e=>{const t=s.includes(e)?s.filter(l=>l!==e):[...s,e];u(t)},[s,u]),A=h(e=>{const l=e.items.filter(n=>n.id&&!n.disabled).map(n=>n.id).filter(n=>!s.includes(n));l.length!==0&&u([...s,...l])},[s,u]),C=h(e=>{const t=new Set(e.items.map(n=>n.id)),l=s.filter(n=>!t.has(n));u(l)},[s,u]),k=h(e=>{x(t=>{const l=new Set(t);return l.has(e)?l.delete(e):l.add(e),l})},[]),j=e=>e.count!==void 0?e.count:e.countProvider?e.countProvider():a?a(e):0,f=P(()=>new Set(s),[s]);return!Array.isArray(r)||!r.length?null:i("div",{className:"multi-select-groups",children:i("div",{className:"multi-select-groups__list",children:r.map(e=>{if(!e?.groupName||!Array.isArray(e.items))return null;const t=e.items.filter(o=>o.id),l=t.filter(o=>f.has(o.id)),n=l.length===t.length&&t.length>0,E=l.length>0&&!n,g=G.has(e.groupName),b=g||t.length<=c?t:t.slice(0,c),w=t.length-b.length>0?t.slice(c).filter(o=>f.has(o.id)).length:0;return d("div",{className:v("multi-select-groups__group",{"multi-select-groups__group--full-width":e.fullWidth},e.customGroupClass),children:[d("div",{className:"multi-select-groups__group-header",children:[i("div",{className:"multi-select-groups__group-title",children:e.groupName}),_&&e.showGroupActions!==!1&&d("div",{className:"multi-select-groups__group-actions",children:[!n&&i("button",{type:"button",className:"multi-select-groups__action-btn",onClick:()=>A(e),children:N("Select all")}),(E||n)&&i("button",{type:"button",className:"multi-select-groups__action-btn",onClick:()=>C(e),children:N("Clear all")})]})]}),i("div",{className:"multi-select-groups__group-items",children:b.map(o=>i(R,{item:o,isSelected:f.has(o.id),variant:p,showCount:m,count:j(o),onClick:y,customRenderer:S},o.id))}),t.length>c&&i(B,{className:"multi-select-groups__show-more",expanded:g,onClick:()=>k(e.groupName),suffix:!g&&w>0&&d("span",{className:"multi-select-groups__show-more-badge",children:[w," ",N("selected")]})})]},e.groupName)})})})};export default I(T);
@@ -1,9 +0,0 @@
1
- import './ShowMoreButton.scss';
2
- import React from 'react';
3
- interface ShowMoreButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'aria-expanded' | 'type'> {
4
- expanded: boolean;
5
- suffix?: React.ReactNode;
6
- }
7
- declare function ShowMoreButton({ expanded, className, suffix, ...props }: ShowMoreButtonProps): React.JSX.Element;
8
- export default ShowMoreButton;
9
- //# sourceMappingURL=ShowMoreButton.d.ts.map
@@ -1 +0,0 @@
1
- import{jsx as s,jsxs as n}from"react/jsx-runtime";import"./ShowMoreButton.scss";import m from"classnames";import{t}from"../utils/i18n";function i({expanded:o,className:r,suffix:e,...a}){return n("button",{...a,type:"button",className:m("show-more-button",{"is-expanded":o},r),"aria-expanded":o,children:[s("i",{className:"icon-chevron-down","aria-hidden":"true"}),s("span",{className:"show-more-button__label",children:o?t("Show less"):t("Show more")}),e]})}export default i;