@expofp/floorplan 3.11.4 → 3.11.6

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 (91) hide show
  1. package/dist/browser/{Button-D0XJdrdn.js → Button-C4TekVbB.js} +5 -5
  2. package/dist/browser/{CookieConsent-Brv_nq6h.js → CookieConsent-BzEB8FPo.js} +7 -7
  3. package/dist/browser/{Debug-D6iorzRx.js → Debug-C1sX6PDM.js} +10 -10
  4. package/dist/browser/{Demo-BFkds3sz.js → Demo-BeI4-hed.js} +10 -10
  5. package/dist/browser/{Free-8fhoLZq3.js → Free-BzqU5rKM.js} +13 -13
  6. package/dist/browser/{Gallery-Bkw7PTuD.js → Gallery-CBnlf-Od.js} +9 -9
  7. package/dist/browser/{GpsLoader-D3NOEBX_.js → GpsLoader-Ba_jq_Ba.js} +25 -25
  8. package/dist/browser/{KioskStore-D-IdJNsm.js → KioskStore-BKmf156R.js} +27 -27
  9. package/dist/browser/{MaplibreAdapter-DViLEEg2.js → MaplibreAdapter-Di-gMQJP.js} +109 -109
  10. package/dist/browser/{ModalContainer-BmK6b4Xr.js → ModalContainer-Cs9y23JB.js} +10 -10
  11. package/dist/browser/{PermissionNotice-DaW22nFB.js → PermissionNotice-D8saxp-R.js} +6 -6
  12. package/dist/browser/{SetKioskMode-DoLxTCwk.js → SetKioskMode-C9WRvtDD.js} +11 -11
  13. package/dist/browser/ShowKiosk-B7begX4p.js +28 -0
  14. package/dist/browser/{TouchHand-DiZEj4E3.js → TouchHand-D1axiGZ6.js} +4 -4
  15. package/dist/browser/{ViewerMenuPanel-jpttuaTR.js → ViewerMenuPanel-CxBM4m8w.js} +15 -15
  16. package/dist/browser/{add-debug-secret-listener-kC3f6MJ4.js → add-debug-secret-listener-CJeHgdfW.js} +1 -1
  17. package/dist/browser/{boolean-editor-CcDvjf4v.js → boolean-editor-CjSC9p0B.js} +9 -9
  18. package/dist/browser/{bootIntercom-Oi72XwL8.js → bootIntercom-DWlTlV0R.js} +3 -3
  19. package/dist/browser/{booth-by-xy-C1XUefrn.js → booth-by-xy-DKeCEL7A.js} +318 -318
  20. package/dist/browser/{browser-D6THuWbT.js → browser-EfZSN0rK.js} +2 -2
  21. package/dist/browser/bundle.json +61 -61
  22. package/dist/browser/{classnames-xSzwyH3V.js → classnames-Cr6SJhPc.js} +2 -2
  23. package/dist/browser/{client-Ckc8k_0v.js → client-9Y2UavjH.js} +4 -4
  24. package/dist/browser/{components-BH4RkY32.js → components-CVstTVoq.js} +1708 -1700
  25. package/dist/browser/{debug-overlay-DxrSUZXf.js → debug-overlay-D5IZ_-Cr.js} +10 -10
  26. package/dist/browser/{debug-ui-C4ae5PSV.js → debug-ui-F95gKsBd.js} +6 -6
  27. package/dist/browser/{dist-Rqo1w8-Y.js → dist-C8hxSVat.js} +3 -3
  28. package/dist/browser/{dist-BPmrgSEF.js → dist-CjzqlTJz.js} +5 -5
  29. package/dist/browser/{dist-Zfy5CL23.js → dist-ex0iDM-d.js} +6 -6
  30. package/dist/browser/{efp-debug-init-Ce7Sn5D4.js → efp-debug-init-DFqSOFD_.js} +2 -2
  31. package/dist/browser/{enum-editor-BN11d-BF.js → enum-editor-DP7zyvP9.js} +11 -11
  32. package/dist/browser/{es5-CPPzUHwL.js → es5-BFquAXIW.js} +2 -2
  33. package/dist/browser/{event-not-found-BFguhOuR.js → event-not-found-ZMe_wgBj.js} +1 -1
  34. package/dist/browser/{exports-D18J9L9n.js → exports-BDkI5lWQ.js} +1 -1
  35. package/dist/browser/{favicon-B5pSo60G.js → favicon-_YFToZrV.js} +1 -1
  36. package/dist/browser/{fetch-retry.umd-B7px5cGu.js → fetch-retry.umd-BHf8gzO2.js} +2 -2
  37. package/dist/browser/{flex-Bt8j36Vj.js → flex-Bt5hw-S-.js} +5 -5
  38. package/dist/browser/{floorplan.loader-BbTBsOJs.js → floorplan.loader-D_ZQPVzb.js} +11 -11
  39. package/dist/browser/{floorplan.ready-HD3RoMwn.js → floorplan.ready-B1RxKmtA.js} +274 -274
  40. package/dist/browser/{fuse-z3xXFeAa.js → fuse-Dh9Lor5E.js} +2 -2
  41. package/dist/browser/{i18n-YLuQJ6Oc.js → i18n-CZDKjEly.js} +4 -4
  42. package/dist/browser/index.js +12 -12
  43. package/dist/browser/{index.module-5tkOFEgw.js → index.module-CF83A38F.js} +4 -4
  44. package/dist/browser/{is-webview-BYkrL6pb.js → is-webview-3ABH_nvB.js} +1 -1
  45. package/dist/browser/{jsx-runtime-DGPL0ZjM.js → jsx-runtime-BufsDnE9.js} +2 -2
  46. package/dist/browser/{lib-Lwuwua_0.js → lib-B7a5469H.js} +4 -4
  47. package/dist/browser/{loadImage-DOyxmnsK.js → loadImage-CxI2VLEi.js} +4 -4
  48. package/dist/browser/{logDeviceInfo-BURl3UW3.js → logDeviceInfo-_7rB93l_.js} +9 -9
  49. package/dist/browser/{main-BP4cmOJh.js → main-CpfRlHz8.js} +1 -1
  50. package/dist/browser/{mobx-CUylMOL2.js → mobx-Bf63zk6M.js} +4 -4
  51. package/dist/browser/{particles.min-CriF9e2a.js → particles.min-CSg78gQP.js} +2 -2
  52. package/dist/browser/{prop-types-SLyJ9TBN.js → prop-types-DEbvvuOO.js} +2 -2
  53. package/dist/browser/{react-BF089r1n.js → react-CWqHw-7C.js} +2 -2
  54. package/dist/browser/{react-dom-CLSBRd0z.js → react-dom-DrR1Sp9W.js} +3 -3
  55. package/dist/browser/{reset-all-settings-XZdnhflG.js → reset-all-settings-DDqxAFPs.js} +7 -7
  56. package/dist/browser/{rolldown-runtime-BUvkcmtZ.js → rolldown-runtime-DVuHL5PY.js} +1 -1
  57. package/dist/browser/{settings-nBI2GMKk.js → settings-DRWP0xZI.js} +2 -2
  58. package/dist/browser/{settings-item-BOe_N5Wb.js → settings-item-Bya4FmKQ.js} +6 -6
  59. package/dist/browser/{store-DHs037e2.js → store-KyDB92ZL.js} +154 -105
  60. package/dist/browser/{string-editor-vL9bltq7.js → string-editor-CTclv67P.js} +7 -7
  61. package/dist/browser/{theme-CVNVmWhY.js → theme-BeAy9-27.js} +8 -8
  62. package/dist/browser/{ui-D8JhIh0k.js → ui-CsHNbkLa.js} +8 -8
  63. package/dist/browser/{useRenderTarget-CSwKYS8S.js → useRenderTarget-Dbh67fkW.js} +5 -5
  64. package/dist/esm/components/HeatmapLegendContainer.d.ts +3 -4
  65. package/dist/esm/components/HeatmapLegendContainer.js +1 -1
  66. package/dist/esm/components/Layout.js +1 -1
  67. package/dist/esm/components/heatmap-legend-ticks.d.ts +11 -0
  68. package/dist/esm/components/heatmap-legend-ticks.js +1 -0
  69. package/dist/esm/ui/EventBadge/EventBadge.d.ts +2 -2
  70. package/dist/esm/ui/EventBadge/index.d.ts +1 -1
  71. package/dist/esm/ui/HeatmapLegend/HeatmapLegend.d.ts +6 -4
  72. package/dist/esm/ui/HeatmapLegend/HeatmapLegend.js +1 -1
  73. package/dist/esm/ui/HeatmapLegend/index.d.ts +1 -1
  74. package/dist/esm/wayfinding/createWayfinding.d.ts +1 -1
  75. package/dist/esm/wayfinding/createWayfinding.js +1 -1
  76. package/dist/esm/wayfinding/renderer/createWayfindingRenderer.d.ts +5 -6
  77. package/dist/esm/wayfinding/renderer/createWayfindingRenderer.js +1 -1
  78. package/dist/esm/wayfinding/renderer/iconManager.d.ts +18 -12
  79. package/dist/esm/wayfinding/renderer/iconManager.js +1 -1
  80. package/dist/esm/wayfinding/renderer/index.d.ts +1 -1
  81. package/dist/esm/wayfinding/renderer/layerManager.d.ts +6 -7
  82. package/dist/esm/wayfinding/renderer/layerManager.js +1 -1
  83. package/dist/esm/{renderer/engine-core/animation.d.ts → wayfinding/renderer/lineAnimation.d.ts} +2 -2
  84. package/dist/esm/wayfinding/renderer/routeLineManager.d.ts +2 -3
  85. package/dist/esm/wayfinding/renderer/routeLineManager.js +1 -1
  86. package/dist/esm/wayfinding/renderer/trailManager.d.ts +11 -8
  87. package/dist/esm/wayfinding/renderer/trailManager.js +1 -1
  88. package/dist/esm/wayfinding/renderer/types.d.ts +53 -86
  89. package/package.json +4 -4
  90. package/dist/browser/ShowKiosk-ahrRZBEM.js +0 -28
  91. /package/dist/esm/{renderer/engine-core/animation.js → wayfinding/renderer/lineAnimation.js} +0 -0
@@ -1,13 +1,15 @@
1
1
  import './HeatmapLegend.scss';
2
2
  import React from 'react';
3
+ export interface HeatmapLegendTick {
4
+ value: number;
5
+ color: string;
6
+ }
3
7
  export interface HeatmapLegendProps {
4
- min: number;
5
- max: number;
6
- palette: string[];
8
+ ticks: HeatmapLegendTick[];
7
9
  ariaLabel: string;
8
10
  className?: string;
9
11
  style?: React.CSSProperties;
10
12
  }
11
- declare const HeatmapLegend: ({ min, max, palette, ariaLabel, className, style }: HeatmapLegendProps) => React.JSX.Element;
13
+ declare const HeatmapLegend: ({ ticks, ariaLabel, className, style }: HeatmapLegendProps) => React.JSX.Element | null;
12
14
  export default HeatmapLegend;
13
15
  //# sourceMappingURL=HeatmapLegend.d.ts.map
@@ -1 +1 @@
1
- import{jsx as n,jsxs as g}from"react/jsx-runtime";import"./HeatmapLegend.scss";import h from"classnames";import{getColorFromGradient as f}from"../../utils/color-gradient";const _=(e,r)=>{const t=r-e;return t<=0?2:Math.min(t+1,5)},j=({min:e,max:r,palette:t,ariaLabel:c,className:d,style:m})=>{const s=_(e,r),i=Array.from({length:s},(a,o)=>{const u=o/(s-1),l=Math.round(e+(r-e)*u);return{value:l,color:f(l,e,r,t)}}),p=`linear-gradient(to right, ${i.map(a=>a.color).join(", ")})`;return g("div",{className:h("efp-heatmap-legend",d),style:m,role:"img","aria-label":c,children:[n("div",{className:"efp-heatmap-legend__colors",style:{background:p},"aria-hidden":"true"}),n("div",{className:"efp-heatmap-legend__values",children:i.map(({value:a},o)=>n("span",{"aria-hidden":"true",children:a},o))})]})};export default j;
1
+ import{jsx as l,jsxs as d}from"react/jsx-runtime";import"./HeatmapLegend.scss";import m from"classnames";const p=({ticks:e,ariaLabel:s,className:n,style:t})=>{if(e.length===0)return null;const a=e.map(r=>r.color),o=a.length===1?a[0]:`linear-gradient(to right, ${a.join(", ")})`;return d("div",{className:m("efp-heatmap-legend",n),style:t,role:"img","aria-label":s,children:[l("div",{className:"efp-heatmap-legend__colors",style:{background:o},"aria-hidden":"true"}),l("div",{className:"efp-heatmap-legend__values",children:e.map(({value:r},i)=>l("span",{"aria-hidden":"true",children:r},i))})]})};export default p;
@@ -1,3 +1,3 @@
1
1
  export { default } from './HeatmapLegend';
2
- export type { HeatmapLegendProps } from './HeatmapLegend';
2
+ export type { HeatmapLegendProps, HeatmapLegendTick } from './HeatmapLegend';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { RendererService } from '../renderer';
1
+ import { type RendererService } from '../renderer';
2
2
  import type RootStore from '../store/RootStore';
3
3
  import { type Route, type RouteEndpoint } from './core';
4
4
  /** Whether `createWayfinding` has run and not yet been disposed. */
@@ -1 +1 @@
1
- import{fpGeo as c}from"../data/fpGeo";import{createCanvasIconProvider as E,createFloorContext as _,createGraphDataSource as A}from"./adapters";import{bindMobxReactions as T}from"./bindMobxReactions";import{createWayfindingEngine as W,getThresholdFromMetersToSvg as M,getThresholdSafe as N,resolveRerouteThresholdSvg as v,SNAP_THRESHOLD_METERS as x}from"./core";import{createKioskHandler as L}from"./handlers/kioskHandler";import{createYahHandler as I}from"./handlers/yahHandler";import{WF_CURRENT_POSITION_LAYER_NAME as P,WF_LINES_ANIMATED_LAYER_NAME as b,WF_LINES_LAYER_NAME as F,WF_POINTS_LAYER_NAME as k,WF_TRAIL_LAYER_NAME as C}from"./layers";import{createWayfindingRenderer as H}from"./renderer";import{createWayfindingRuntime as Y}from"./runtime/createWayfindingRuntime";let t=null;export function isWayfindingReady(){return t!==null}function w(){if(!t)throw new Error("Wayfinding is not initialized \u2014 call createWayfinding() first.");return t}export function buildRoute(n,e,i){return w().engine.buildRoute(n,e,i)}export function createWayfinding(n,e){const i=A(),s=W(i),p=E({iconMap:e.fp.icons,pixelRatio:devicePixelRatio}),r=H(n),l=_(e.layerStore,e.routeStore),a={points:k,trail:C,lines:F,linesAnimated:b,currentPosition:P},R=N(c?.properties?.config?.snapThreshold)||x,S=M({thresholdInMeters:R,gpsConfig:c?.properties?.config}),u=Y({engine:s,renderer:r,iconProvider:p,floorContext:l,layers:a,snapThreshold:S,onTransitionClick:o=>{o.role==="exit"&&e.layerStore.updateVisibility(o.targetLayer,!0)},onRouteUpdate:(o,d)=>{e.routeStore.updateRoute(o),d.isEmpty()||(e.uiState.moveToRect=d)},onRouteDistance:o=>e.routeStore.updateRouteDistance(o)}),g=L({renderer:r,kioskIconMap:e.fp.icons,layer:a.points}),m=I({renderer:r,iconMap:e.fp.icons,pixelRatio:devicePixelRatio,floorContext:l,layer:a.points}),y=v(c?.properties?.config),h=T({runtime:u,kioskHandler:g,yahHandler:m,stores:{routeStore:e.routeStore,uiState:e.uiState,layerStore:e.layerStore},rerouteThresholdSvg:y});e.routeStore.showAccessible=i.getLines().some(o=>o.unaccessible);const f={engine:s};return t=f,r.flush(),()=>{t===f&&(t=null,e.routeStore.showAccessible=!1),h(),u.destroy()}}
1
+ import{fpGeo as l}from"../data/fpGeo";import{createImageDef as M,createLineDef as W,getRotation as P,rectToRenderer as I}from"../renderer";import{pickDefaultScene as g}from"../renderer/engine-core/defs";import{createCanvasIconProvider as N,createFloorContext as k,createGraphDataSource as w}from"./adapters";import{bindMobxReactions as x}from"./bindMobxReactions";import{createWayfindingEngine as C,getThresholdFromMetersToSvg as D,getThresholdSafe as b,resolveRerouteThresholdSvg as F,SNAP_THRESHOLD_METERS as H}from"./core";import{createKioskHandler as Y}from"./handlers/kioskHandler";import{createYahHandler as O}from"./handlers/yahHandler";import{WF_CURRENT_POSITION_LAYER_NAME as G,WF_LINES_ANIMATED_LAYER_NAME as U,WF_LINES_LAYER_NAME as q,WF_POINTS_LAYER_NAME as z,WF_TRAIL_LAYER_NAME as K}from"./layers";import{createWayfindingRenderer as V}from"./renderer";import{createWayfindingRuntime as j}from"./runtime/createWayfindingRuntime";let a=null;export function isWayfindingReady(){return a!==null}function B(){if(!a)throw new Error("Wayfinding is not initialized \u2014 call createWayfinding() first.");return a}export function buildRoute(n,t,s){return B().engine.buildRoute(n,t,s)}export function createWayfinding(n,t){const s=w(),d=C(s),h=N({iconMap:t.fp.icons,pixelRatio:devicePixelRatio}),r=V({createImageDef:M,createLineDef:W,getRotation:P,rectToRenderer:I,getScale:()=>n.scale,getLayers:()=>{const e=n.scene;if(!e)throw new Error("renderer: rendererService.scene is null \u2014 start RendererService first");return e.rootLayer.children},update:(...e)=>n.update(...e)}),f=k(t.layerStore,t.routeStore),c={points:z,trail:K,lines:q,linesAnimated:U,currentPosition:G},y=b(l?.properties?.config?.snapThreshold)||H,S=D({thresholdInMeters:y,gpsConfig:l?.properties?.config}),p=j({engine:d,renderer:r,iconProvider:h,floorContext:f,layers:c,snapThreshold:S,onTransitionClick:e=>{e.role==="exit"&&t.layerStore.updateVisibility(e.targetLayer,!0)},onRouteUpdate:(e,o)=>{t.routeStore.updateRoute(e),o.isEmpty()||(t.uiState.moveToRect=o)},onRouteDistance:e=>t.routeStore.updateRouteDistance(e)}),E=Y({renderer:r,kioskIconMap:t.fp.icons,layer:c.points}),v=O({renderer:r,iconMap:t.fp.icons,pixelRatio:devicePixelRatio,floorContext:f,layer:c.points}),_=F(l?.properties?.config),L=x({runtime:p,kioskHandler:E,yahHandler:v,stores:{routeStore:t.routeStore,uiState:t.uiState,layerStore:t.layerStore},rerouteThresholdSvg:_}),i=n.renderer;if(!i)throw new Error("renderer: rendererService.renderer is null \u2014 start RendererService first");const A=n.onPtScale("wayfinding",e=>{const o=r.applyScale(e);o.length&&n.update(...o)}),T=n.onRoll("wayfinding",e=>{const o=r.applyRoll(e);o.length&&n.update(...o)}),u=e=>r.handleClick(g(e.data).defs),m=e=>{i.canvas.style.cursor=r.handleHover(g(e.data).defs)?"pointer":""};i.events.addEventListener("pointer:click",u),i.events.addEventListener("pointer:move",m),t.routeStore.showAccessible=s.getLines().some(e=>e.unaccessible);const R={engine:d};return a=R,r.flush(),()=>{i.events.removeEventListener("pointer:click",u),i.events.removeEventListener("pointer:move",m),a===R&&(a=null,A(),T(),t.routeStore.showAccessible=!1),L(),p.destroy()}}
@@ -1,14 +1,13 @@
1
- import type { RendererService } from '../../renderer';
2
- import type { WayfindingRenderer, WayfindingRendererConfig } from './types';
1
+ import type { RendererPort, WayfindingRenderer, WayfindingRendererConfig } from './types';
3
2
  /**
4
3
  * Create a {@link WayfindingRenderer} — the composition root that wires
5
4
  * together {@link LayerManager}, {@link IconManager}, {@link TrailManager},
6
5
  * and {@link RouteLineManager}.
7
6
  *
8
- * Registers `pointer:click` and `pointer:move` listeners on the renderer
9
- * canvas for icon interaction. Call `destroy()` to unregister them.
7
+ * Exposes `applyScale`/`applyRoll`/`handleClick`/`handleHover` for the app glue
8
+ * to drive from engine events.
10
9
  *
11
- * @throws If `rendererService.scene` or `rendererService.renderer` is null.
10
+ * @throws If `rendererPort.getLayers()` throws (e.g. the scene is not started).
12
11
  */
13
- export declare function createWayfindingRenderer(rendererService: RendererService, config?: WayfindingRendererConfig): WayfindingRenderer;
12
+ export declare function createWayfindingRenderer(rendererPort: RendererPort, config?: WayfindingRendererConfig): WayfindingRenderer;
14
13
  //# sourceMappingURL=createWayfindingRenderer.d.ts.map
@@ -1 +1 @@
1
- import{createIconManager as d}from"./iconManager";import{createLayerManager as m}from"./layerManager";import{createRouteLineManager as f}from"./routeLineManager";import{createTrailManager as u}from"./trailManager";const v={passed:"#B5B7BC",remaining:"#A4CCE2",active:"#0794EA"};export function createWayfindingRenderer(r,i={}){const l={...v,...i.colors},n=m(r),e=d(n,r),t=u(n,r),o=f(n,r,l),a=r.renderer;if(!a)throw new Error("renderer: rendererService.renderer is null \u2014 start RendererService before constructing renderer");a.events.addEventListener("pointer:click",e.handleClick),a.events.addEventListener("pointer:move",e.handleHover);const c={setIcon:e.setIcon,clearIcons:e.clearIcons,setTrail:t.setTrail,setRouteLines:o.setRouteLines,clearRoute(){o.clearLines(),t.destroy(),e.hideAll()},flush:n.flush,destroy(){c.clearRoute();const s=r.renderer;s&&(s.events.removeEventListener("pointer:click",e.handleClick),s.events.removeEventListener("pointer:move",e.handleHover)),e.destroy(),t.destroy(),o.destroy(),n.destroy()}};return c}
1
+ import{createIconManager as i}from"./iconManager";import{createLayerManager as p}from"./layerManager";import{createRouteLineManager as y}from"./routeLineManager";import{createTrailManager as d}from"./trailManager";const g={passed:"#B5B7BC",remaining:"#A4CCE2",active:"#0794EA"};export function createWayfindingRenderer(r,c={}){const s={...g,...c.colors},o=p(r),e=i(o,r),n=d(o,r),t=y(o,s,r),l={setIcon:e.setIcon,clearIcons:e.clearIcons,setTrail:n.setTrail,setRouteLines:t.setRouteLines,applyScale:a=>[...e.applyScale(a),...n.applyScale(a)],applyRoll:a=>e.applyRoll(a),handleClick:a=>e.handleClick(a),handleHover:a=>e.handleHover(a),clearRoute(){t.clearLines(),n.destroy(),e.hideAll()},flush:o.flush,destroy(){l.clearRoute(),e.destroy(),n.destroy(),t.destroy(),o.destroy()}};return l}
@@ -1,13 +1,15 @@
1
- import type { MouseEventData } from '@expofp/renderer';
2
- import { type RendererService } from '../../renderer';
1
+ import type { RenderableDef } from '@expofp/renderer';
3
2
  import type { LayerManager } from './layerManager';
4
- import type { IconConfig } from './types';
3
+ import type { IconConfig, RendererPort } from './types';
5
4
  /**
6
5
  * Manages `ImageDef` icons in the scene graph.
7
6
  *
8
- * Icons are keyed by `(name, key?)`. First `setIcon` creates the `ImageDef`
9
- * and registers scale/roll handlers; subsequent calls mutate in place.
10
- * Pass `config: null` to hide an icon without destroying it.
7
+ * Icons are keyed by `(name, key?)`. First `setIcon` creates the `ImageDef`;
8
+ * subsequent calls mutate in place. Pass `config: null` to hide an icon
9
+ * without destroying it.
10
+ *
11
+ * Exposes pure `applyScale`/`applyRoll`/`handleClick`/`handleHover` that the
12
+ * app glue drives from engine events.
11
13
  */
12
14
  export interface IconManager {
13
15
  /** Place, update, or hide an icon. See {@link WayfindingRenderer.setIcon}. */
@@ -16,16 +18,20 @@ export interface IconManager {
16
18
  clearIcons(names: string | readonly string[]): void;
17
19
  /** Hide every managed icon (used by `clearRoute`). */
18
20
  hideAll(): void;
19
- /** Unregister all scale/roll handlers and clear internal state. */
21
+ /** Clear internal state. */
20
22
  destroy(): void;
21
- /** Pointer click handler — fires the first matching icon's `onClick`. */
22
- handleClick(event: MouseEventData): void;
23
- /** Pointer move handler — sets cursor to "pointer" when hovering a clickable icon. */
24
- handleHover(event: MouseEventData): void;
23
+ /** Recompute bounds of all visible icons for `scale`; returns changed defs. */
24
+ applyScale(scale: number): RenderableDef[];
25
+ /** Apply camera roll to cardinal-snap icons; returns changed defs. */
26
+ applyRoll(cameraAngle: number): RenderableDef[];
27
+ /** Fire the first hit clickable icon's `onClick` from already-picked defs. */
28
+ handleClick(defs: readonly RenderableDef[]): void;
29
+ /** Whether a clickable icon is under the already-picked defs. */
30
+ handleHover(defs: readonly RenderableDef[]): boolean;
25
31
  }
26
32
  /**
27
33
  * Create an {@link IconManager} that places `ImageDef` icons into layers
28
34
  * managed by the given {@link LayerManager}.
29
35
  */
30
- export declare function createIconManager(layerManager: LayerManager, rendererService: RendererService): IconManager;
36
+ export declare function createIconManager(layerManager: LayerManager, rendererPort: RendererPort): IconManager;
31
37
  //# sourceMappingURL=iconManager.d.ts.map
@@ -1 +1 @@
1
- import{createImageDef as L,getBounds as m,getRotation as v,rectToRenderer as D}from"../../renderer";import{pickDefaultScene as g}from"../../renderer/engine-core/defs";export function createIconManager(u,r){const l=new Map,d=new Map,f=new Map;function b(e,a){return a===void 0?e:`${e}#${a}`}function k(e,a){let t=d.get(e);t||(t=new Set,d.set(e,t)),t.add(a),f.set(a,e)}function p(e){const a=f.get(e);if(!a)return;const t=d.get(a);t&&t.delete(e),f.delete(e)}function h(e,a,t){const n=u.touchLayer(t.layer),i=L(t.canvas,m(t.x,t.y,t.canvas.width,t.canvas.height,r.scale,t.rotation),{hidden:t.hidden??!1,dim:t.dimmed??!1,origin:t.origin});n.children.push(i),r.onPtScale(e,c=>{const s=l.get(e);if(!(!s||s.imageDef.hidden))return s.imageDef.bounds=D(m(s.imageDef.bounds.center.x,s.imageDef.bounds.center.y,s.imageDef.source.width,s.imageDef.source.height,c,s.imageDef.bounds.rotation)),s.imageDef}),t.cardinalSnap&&r.onRoll(e,c=>{const s=l.get(e);if(!s)return;const y=v(c,s.imageDef.bounds.rotation);if(y!==void 0)return s.imageDef.bounds.rotation+=y,s.imageDef});const o={imageDef:i,layerName:t.layer,callback:t.onClick??null};return l.set(e,o),k(a,e),o}function N(e,a,t,n){const i=u.resolveLayer(t.layerName),o=i.children,c=o.indexOf(t.imageDef);c>=0&&o.splice(c,1),u.touchedLayers.set(t.layerName,i),r.ptScaleRegistry.unregisterByName(e),r.rollRegistry.unregisterByName(e),l.delete(e),p(e),h(e,a,n)}function w(e,a,t,n){if(t.layerName!==n.layer)throw new Error(`renderer: icon "${e}" cannot move between layers (was "${t.layerName}", got "${n.layer}")`);if(t.imageDef.source!==n.canvas){N(e,a,t,n);return}t.imageDef.bounds=D(m(n.x,n.y,n.canvas.width,n.canvas.height,r.scale,n.rotation)),t.imageDef.hidden=n.hidden??!1,t.imageDef.dim=n.dimmed??!1,t.callback=n.onClick??null,u.touchLayer(n.layer)}return{setIcon(e,a,t){const n=b(e,t);if(a===null){const o=l.get(n);o&&(o.imageDef.hidden=!0,o.callback=null,u.touchLayer(o.layerName));return}const i=l.get(n);i?w(n,e,i,a):h(n,e,a)},clearIcons(e){const a=typeof e=="string"?[e]:e;for(const t of a){const n=d.get(t);if(n)for(const i of n){const o=l.get(i);o&&(o.imageDef.hidden=!0,o.callback=null,u.touchLayer(o.layerName))}}},hideAll(){for(const e of l.values())e.imageDef.hidden=!0,e.callback=null,u.touchedLayers.set(e.layerName,u.resolveLayer(e.layerName))},destroy(){for(const e of l.keys())r.ptScaleRegistry.unregisterByName(e),r.rollRegistry.unregisterByName(e);l.clear(),d.clear(),f.clear()},handleClick({data:e}){const{defs:a}=g(e);for(const t of l.values())if(t.callback&&!t.imageDef.hidden&&a.includes(t.imageDef)){t.callback();return}},handleHover({data:e}){const a=r.renderer;if(!a)return;const{defs:t}=g(e);let n=!1;for(const i of l.values())if(i.callback&&!i.imageDef.hidden&&t.includes(i.imageDef)){n=!0;break}a.canvas.style.cursor=n?"pointer":""}}}
1
+ import{Rect as f}from"@expofp/geometry";export function createIconManager(s,c){const l=new Map,r=new Map,u=new Map;function h(n,t){return t===void 0?n:`${n}#${t}`}function y(n,t){let e=r.get(n);e||(e=new Set,r.set(n,e)),e.add(t),u.set(t,n)}function D(n){const t=u.get(n);if(!t)return;const e=r.get(t);e&&e.delete(n),u.delete(n)}function m(n,t,e){const a=s.touchLayer(e.layer),o=c.getScale(),i=c.createImageDef(e.canvas,new f({x:e.x,y:e.y},{x:e.canvas.width*o,y:e.canvas.height*o},e.rotation),{hidden:e.hidden??!1,dim:e.dimmed??!1,origin:e.origin});a.children.push(i);const d={imageDef:i,layerName:e.layer,cardinalSnap:e.cardinalSnap??!1,callback:e.onClick??null};return l.set(n,d),y(t,n),d}function p(n,t,e,a){const o=s.resolveLayer(e.layerName),i=o.children,d=i.indexOf(e.imageDef);d>=0&&i.splice(d,1),s.touchedLayers.set(e.layerName,o),l.delete(n),D(n),m(n,t,a)}function v(n,t,e,a){if(e.layerName!==a.layer)throw new Error(`renderer: icon "${n}" cannot move between layers (was "${e.layerName}", got "${a.layer}")`);if(e.imageDef.source!==a.canvas){p(n,t,e,a);return}const o=c.getScale();e.imageDef.bounds=c.rectToRenderer(new f({x:a.x,y:a.y},{x:a.canvas.width*o,y:a.canvas.height*o},a.rotation)),e.imageDef.hidden=a.hidden??!1,e.imageDef.dim=a.dimmed??!1,e.callback=a.onClick??null,s.touchLayer(a.layer)}return{setIcon(n,t,e){const a=h(n,e);if(t===null){const i=l.get(a);i&&(i.imageDef.hidden=!0,i.callback=null,s.touchLayer(i.layerName));return}const o=l.get(a);o?v(a,n,o,t):m(a,n,t)},clearIcons(n){const t=typeof n=="string"?[n]:n;for(const e of t){const a=r.get(e);if(a)for(const o of a){const i=l.get(o);i&&(i.imageDef.hidden=!0,i.callback=null,s.touchLayer(i.layerName))}}},hideAll(){for(const n of l.values())n.imageDef.hidden=!0,n.callback=null,s.touchedLayers.set(n.layerName,s.resolveLayer(n.layerName))},destroy(){l.clear(),r.clear(),u.clear()},applyScale(n){const t=[];for(const e of l.values()){if(e.imageDef.hidden)continue;const{center:a,rotation:o}=e.imageDef.bounds;e.imageDef.bounds=c.rectToRenderer(new f({x:a.x,y:a.y},{x:e.imageDef.source.width*n,y:e.imageDef.source.height*n},o)),t.push(e.imageDef)}return t},applyRoll(n){const t=[];for(const e of l.values()){if(!e.cardinalSnap)continue;const a=c.getRotation(n,e.imageDef.bounds.rotation);a!==void 0&&(e.imageDef.bounds.rotation+=a,t.push(e.imageDef))}return t},handleClick(n){for(const t of l.values())if(t.callback&&!t.imageDef.hidden&&n.includes(t.imageDef)){t.callback();return}},handleHover(n){for(const t of l.values())if(t.callback&&!t.imageDef.hidden&&n.includes(t.imageDef))return!0;return!1}}}
@@ -1,3 +1,3 @@
1
1
  export { createWayfindingRenderer } from './createWayfindingRenderer';
2
- export type { IconConfig, WayfindingRenderer } from './types';
2
+ export type { IconConfig, RendererPort, WayfindingRenderer } from './types';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expofp/floorplan",
3
- "version": "3.11.4",
3
+ "version": "3.11.6",
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/geometry": "3.11.4",
76
- "@expofp/resolve": "3.11.4",
77
- "@expofp/debug": "3.11.4"
75
+ "@expofp/debug": "3.11.6",
76
+ "@expofp/geometry": "3.11.6",
77
+ "@expofp/resolve": "3.11.6"
78
78
  },
79
79
  "devDependencies": {
80
80
  "@babel/plugin-proposal-decorators": "^8.0.2",
@@ -1,28 +0,0 @@
1
- (function() {
2
- try {
3
- var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {};
4
- e.SENTRY_RELEASE = { id: "3.11.4" };
5
- var t = new e.Error().stack;
6
- t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "f0872d79-ba3b-4378-b3e9-e495e3839fde", e._sentryDebugIdIdentifier = "sentry-dbid-f0872d79-ba3b-4378-b3e9-e495e3839fde");
7
- } catch {}
8
- })();
9
- import "./rolldown-runtime-BUvkcmtZ.js";
10
- import { t as e } from "./react-BF089r1n.js";
11
- import { t } from "./jsx-runtime-DGPL0ZjM.js";
12
- import "./i18n-YLuQJ6Oc.js";
13
- import { t as n } from "./index.module-5tkOFEgw.js";
14
- import { X as r, Z as i, o as a } from "./store-DHs037e2.js";
15
- import { n as o } from "./mobx-CUylMOL2.js";
16
- import { t as s } from "./KioskStore-D-IdJNsm.js";
17
- import { t as c } from "./TouchHand-DiZEj4E3.js";
18
- e();
19
- var l = t(), u = n(() => (o(() => {
20
- if (localStorage.getItem("kiosk") === "0") return;
21
- s.restoreData();
22
- let e = s.kiosk;
23
- if (e) return r(e, !0), i(e), s.resetCamera(), a.setResetCameraFn(() => s.resetCamera()), () => {
24
- a.uiState.setKioskData(null), a.uiState.resetMapSettings();
25
- };
26
- }), a.uiState.kiosk && a.uiState.inIdle ? /* @__PURE__ */ (0, l.jsx)(c, {}) : null));
27
- //#endregion
28
- export { u as default };