Changelog
3.19.0 (2026-08-09)
🚀 Features
- Add experimental outdoor POI markers to the MapLibre map: booths on an
Outdoordesigner layer render as fixed-size native markers with clustering, instead of as plan shapes. Off by default — setenableExperimentalOutdoorMarkersto turn it on. While it is off,Outdoorlayers render exactly as before.
3.18.1 (2026-08-05)
🩹 Fixes
- Booth number badges (shown over exhibitor logos when the label is hidden) now reposition to the correct corner and stay upright as the map is rotated.
3.18.0 (2026-08-04)
🚀 Features
- Kiosk mode on the MapLibre map now returns to its saved home view after the idle timeout, and panning or zooming the map keeps the kiosk awake.
3.17.0 (2026-08-04)
🚀 Features
- The MapLibre map view is now available on kiosk displays. Kiosks running a map-enabled plan open in map mode like any other device, instead of always falling back to the flat floor plan.
3.16.2 (2026-08-03)
🩹 Fixes
- Fix a rare horizontal scrollbar appearing at the bottom of the exhibitor/booth details panel
3.16.1 (2026-08-03)
🩹 Fixes
- Offline floor plan copies now ship a basemap that matches the online light theme.
3.16.0 (2026-08-03)
🚀 Features
- Plans authored for the map in the Designer now open on the MapLibre basemap automatically — no flag needed. Setting
enableExperimentalMaplibreto false still keeps such a plan on the plain floor plan.
3.15.0 (2026-07-30)
🚀 Features
- New
searchButtonselement in thevisibilitynode: keep the search-filter buttons visible while the overlay panel is hidden — clicking a button opens the overlay on demand and closing it returns to the buttons-only view. Enable it with?noOverlay=true&visibility[searchButtons]=true(or the canonical?visibility[overlay]=false&visibility[searchButtons]=true), from the manifest'svisibilitynode, or at runtime viaFloorPlan.setVisibility({ overlay: false, searchButtons: true }). Omitted,searchButtonskeeps followingoverlay, so existingnoOverlay/?hide=overlaylinks behave exactly as before.
3.14.0 (2026-07-30)
🚀 Features
- Add a dark basemap to the map view. The palette follows the drawing: a plan authored for a dark surround gets the dark basemap, one authored light gets the light one. Plans that do not declare a palette fall back to their background color. A custom
maplibre.style/maplibre.styleUrlis unaffected.
🩹 Fixes
- Fix the free-plan promo banner overlapping the exhibitor logo strip instead of sitting below it
- Fixed the route planner's starting point search sometimes showing the same location duplicated (or missing) when a booth had more than one exhibitor listing.
3.13.4 (2026-07-28)
🩹 Fixes
- Fixed an intermittent issue where the search panel could fail to open after tapping the search icon in Safari.
3.13.3 (2026-07-28)
🩹 Fixes
- URL map settings (
?bearing=,?zoomtime=,?center=,?centerxy=,?z=,?roll=and the?camera[…]=form) officially apply only to the load that carries them: the in-tab session persistence — a parameter-less reload re-applying settings from earlier in the browser-tab session — is removed from the code and the docs. In practice nothing changes at runtime: that persistence had been broken since a December 2025 regression and never saved anything. Kiosk devices are unaffected — the kiosk stores and restores its own position and camera itself.FloorPlan.setCamera()likewise no longer persists the camera into the tab session. - The
?zoom=query parameter is removed from the documentation and the SDK types. It has had no effect since the map renderer was replaced — the value was parsed and discarded, never applied to the camera. Nothing changes at runtime: use the map controls, or?camera[bearing]=/?camera[x]=/?camera[y]=andFloorPlan.setCamera()to frame the plan on load.?zoomtime=is unaffected and keeps working.
3.13.2 (2026-07-27)
🩹 Fixes
Fix the ESM build throwing
[mobx] The provided value could not be converted into an observableon import. It affected bundlers that resolve theimportexport condition instead ofbrowser— SSR and node-target builds — where it made the floor plan's stores unusable. Browser builds were never affected.Update the SDK build toolchain and dependencies. No changes to the public API.
3.13.1 (2026-07-23)
🩹 Fixes
- Avoid unnecessary floor changes for same-floor wayfinding routes while preserving intentional cross-floor virtual transitions.
3.13.0 (2026-07-22)
🚀 Features
The
onDirectionevent now returns routelinesin walking order (source→destination); earlier releases returned them reversed (target→source, withp0/p1swapped).Fix a route-line segment disappearing at a floor transition while a live position is active.
3.12.3 (2026-07-21)
🩹 Fixes
- Heatmap colors now apply to complex booths and booth borders, and render in grayscale when monochrome mode is enabled
3.12.2 (2026-07-21)
🩹 Fixes
- Internal: error reports now tag their source as
main.
3.12.1 (2026-07-17)
🩹 Fixes
- Booth labels and bookmarks now stay upright and readable when the floor plan is rotated.
3.12.0 (2026-07-15)
🚀 Features
Event data now loads through a single typed config: the legacy
data.jsondocument is merged into the effective config with every asset URL (logos, galleries, speaker photos, drawing images) resolved up front, the drawing (fp.svg.js), per-layer files and the wayfinding graph load through config-managed refs, and rebooking state is merged during config load. Live events start faster — the drawing and wayfinding graph download in parallel with the event data. Offline copies store all legacy data as resolved JSON documents (no scripts), address them with relative refs so a copy serves correctly from any directory, and inline the merged event data in the copy's manifest. Offline generation is strict: a build fails instead of silently shipping an incomplete copy (the wayfinding graph and pre-scaled logo variants remain optional), and custom CSS fonts are bundled too.The config gains an
intentsfield — imperative actions (selectBooth,selectExhibitor,changeLanguage) that run automatically once the floor plan is ready. Intents can also arrive via the page URL query (?intents[0][name]=selectBooth&intents[0][args][0]=A1), enabling deep links into a selected booth, exhibitor, or language.The new
consentsetting replaces the tri-stateallowConsentboolean:'granted'/'denied'apply a pre-made cookie-consent decision, while'ask'(the default) leaves it to the visitor — GDPR visitors get the consent prompt again and analytics are no longer disabled by default. Set it fromload()options, event data, or the?consent=URL parameter;allowConsentstays accepted everywhere as a deprecated alias, andignoreQuerynow isolates the consent decision from the page URL. Invalid URL settings no longer break loading — they are ignored.New FloorPlan.setCamera({x,y,lat,lng,floor,bearing,zoomTime}) and getCamera() methods to control and read the camera; setCamera is also available as an intent from the URL.
URL deep links and the FloorPlan API now share one foundation. Every intent gains a typable URL shortcut (?select=biogreen-ag, ?showList=bookmarks, ?selectTour=t-1, ?startBuildRoute), alongside the existing ?selectBooth= and ?changeLanguage= forms. New FloorPlan methods: select() resolves any slug or external id the way deep links do, plus showList(), selectTour(), openPlanner() and startBuildRoute(). Presentation toggles (noOverlay, monochrome, hideHeaderLogo, hideLogoInBooth, disableFeatured, disableBookmarked, disableGps) are regular config fields now, settable from the manifest and options as well as the URL. All legacy URL forms keep working; the browser back button no longer collects duplicate history entries from URL rewrites.
Floor plan URLs now accept intent shortcuts — the intent name as a query key (
?selectBooth=A-12,?changeLanguage=fr), alongside the canonical bracketedintents[…]form. Shortcuts play after bracketed intents, in query-param order; an invalid value is ignored rather than breaking the load.Schema validation of expo event data is now an opt-in diagnostic: enable it with ?validateSchema=1 in the URL or efp-validateSchema in localStorage to validate the manifest and referenced documents during load. It is off by default, removing the validation cost from every floor plan load.
New config.kiosk node — the kiosk anchor (position, floor, camera framing, per-device UI scale) is settable from the manifest, embed options or the ?kiosk[x]=… URL form; a kiosk saved on the device and the legacy kiosk_* params keep working unchanged. The undocumented dead parameters (sw, zoom, yah, agenda, k, forceKioskShowDetails) left the reference.
New intents selectRoute (plus the accessible variant selectAccessibleRoute), showPathway and selectCurrentPosition — build routes, highlight pathways and place the visitor position straight from a link, the manifest or the embed options.
New config.visibility node with the ?visibility[header]=false URL form and a setVisibility intent — control the map chrome (controls, levels, header, overlay) from any config layer; the legacy ?hide= link keeps working as an alias.
The initial camera is now a config node: set it from the manifest, the options object, or the URL as ?camera[x]=…&camera[y]=…&camera[bearing]=180 — the same schema-typed shape as FloorPlan.setCamera(). The legacy center/centerxy/z/bearing/zoomtime URL params keep working as aliases, and a deep link can now combine an entity slug with camera params in one URL.
🩹 Fixes
- Offline copies now load per-layer drawing images correctly. A layer drawing's
<image>assets (the svg-images/*.webp files) were addressed with a doubled path and failed with a 404; every referenced-document asset now resolves against the page, wherever the copy is mounted. - Boolean and numeric intent arguments in the URL are now coerced to their schema types: ?openPlanner[fromBookmarks]=true works both as a shortcut and in the bracketed intents[...] form
- The legacy URL query grammar is now internally frozen: new URL capabilities land as config keys or intent shortcuts instead of new legacy parameters. No behavior changes — every existing URL keeps working exactly as before.
- Offline archives now inline @import'ed stylesheets (e.g. Google Fonts) into the custom CSS and bundle the font files they reference, so custom fonts load when a copy is served locally or without network.
- Internal: opt-in timing diagnostics for schema validation during config load, logged (throttled, cumulative) on the efp:config:validate debug namespace. No functional or public SDK API changes.
- Fix floor plans and offline copies failing to load for events whose drawing comes from the V2 converter, which encodes mesh geometry as 3-component [x, y, z] vertices — these are now accepted during config validation (previously rejected, breaking both live loads and offline copy generation).
- Fix floor plans failing to load for events whose search/filter button config omits the visible flag on one or more buttons.
- Offline archives now render custom fonts correctly when a plan's Custom CSS pulls the font in with
@import url(<font-file>)(a common authoring shortcut) alongside its @font-face rule. Previously the exported copy inlined the font file's raw bytes into the stylesheet, corrupting it so no custom font applied offline — while the same plan rendered fine online. Such an @import is now recognized as a non-stylesheet and dropped (matching browser behavior); the font still loads offline from the @font-face's own bundled URL. - Floor plans generated by newer converters no longer lose their SVG layers: layer files that carry only suffixed drawing globals (
__fpBooth,__fpPathsBooth) now render — previously every non-default layer (booths, elements, background) disappeared from the plan. Event-data schemas also gained the boothstatus('onhold' | 'reserved'), boothholdColor, and exhibitorlogoInBoothfields the runtime reads. - Deep links that combine an exhibitor slug with configuration or intent parameters (e.g.
?my-exhibitor&allowConsent=false) select the exhibitor again instead of opening the search panel with its display name as search text. True multi-slug share links (?exh1&exh2, also in the%26-encoded form) keep showing readable exhibitor names. - Embedded floor plans with
ignoreQuerynow honor the manifest/options camera, visibility, presentation flags and heatmap mode (previously dropped together with the URL handling).applyParameters()now applies the full canonical query —camera[…],visibility[…],consentand intents (bothintents[…]and shortcut keys likeselectBooth) — and a query consisting only of config/intent keys no longer closes the open panel. Switching between the 2D and 3D views no longer re-applies the boot camera or replays the boot URL over the visitor's current state. The in-app back button no longer leaves orphan entries in the browser history. - More resilient deep links and embeds: a malformed percent-escape in the URL (e.g.
?100%booth) no longer breaks startup or permanently stops URL synchronization, and?debug=1under frozen URL writes (offHistory embeds, heatmap mode) no longer triggers an endless reload loop. - More resilient URL handling and startup: a blank numeric URL parameter (e.g.
?camera[bearing]=) is ignored instead of becoming 0, a failing deep-link intent is logged and skipped instead of breaking the page, a config without a floor plan drawing now shows the event-not-found screen instead of an endless spinner, and legacy event data with null booth/exhibitor/category lists loads with empty lists. - Hardened startup: a transient network failure while fetching event data no longer sticks until reload, floor plans load again on Chrome 66-72 WebViews, embeds boot without localStorage access (e.g. cookie-blocked iframes), and a malformed bracketed URL index can no longer hang the page.
- Heatmap mode is now a config node: use ?heatmap[variant]=yah&heatmap[kiosk]=true (or heatmap in the manifest) to engage it; the legacy ?heatmap=true&type=yah&subtype=kiosk links keep working unchanged.
- Internal cleanup of direct URL readers with provenance notes; the previously undocumented ?layer= query parameter (initial floor by its floor-selector short label) is now documented in the query-parameters reference.
- The floor plan's back button now uses the browser's real history: pressing it is the same as the browser's own back button, and browser back/forward stay consistent with in-app navigation.
- Category, POI-type and exhibitors filters can now be set from any config layer via the filters node and the ?filters[…] URL form; the legacy categories=/poiType(s)= links keep working.
- Viewer-mode, preview-mode and UI-scale preferences seeded from the URL (?viewermode=, ?previewMode=, ?uiscale=) are now stored as schema-typed efp-* localStorage settings (efp-viewerMode, efp-previewMode, efp-uiScale); existing ___* values keep working and migrate automatically at load.
- Fixed a load failure on URLs that use the same query key in both scalar and bracketed form (e.g. ?consent=granted&consent[x]=1): the malformed key is now tolerated and dropped like any other invalid URL input instead of breaking the floor plan boot.
3.11.12 (2026-07-15)
🩹 Fixes
- Fix wayfinding lint compatibility with type-aware ESLint.
- Internal: extracted the framework-neutral wayfinding engine, runtime, and scene renderer into a new
@expofp/wayfindingpackage behind a singlecreateWayfinding()entry point. No functional or public SDK API changes. - Restore custom fonts and
customCssstyles when the floor plan renders inside a shadow root:@font-faceand:rootcustom properties (e.g.--expofp-font-face) are now injected at the document level so custom fonts load again.
3.11.11 (2026-07-06)
🩹 Fixes
- Internal tooling: repair ESLint config so type-aware linting actually runs, and apply the resulting type-safety cleanups. No functional/API changes to the SDK.
3.11.10 (2026-07-02)
🩹 Fixes
- Update the floor plan rendering engine to 3.2.5.
3.11.9 (2026-07-02)
🩹 Fixes
- Hide the viewer event selector when no leave-event handler is configured.
3.11.8 (2026-07-01)
🩹 Fixes
- Track clicks on advertised exhibitor logos in the banner.
3.11.7 (2026-06-30)
🩹 Fixes
- Update URL for PDF API
3.11.6 (2026-06-30)
🩹 Fixes
- Internal: refactor the event badge and heatmap legend into self-contained presentational UI components, decoupled from floorplan internals. No SDK-facing or runtime changes.
3.11.5 (2026-06-29)
🩹 Fixes
- Internal wayfinding refactor: the renderer layer no longer depends on the floorplan-local renderer module — scale/roll/click are driven from the app via a small injected renderer port, and route-line animation moved into wayfinding. No functional or API changes.
3.11.4 (2026-06-29)
🩹 Fixes
- Fix passed route segments rendering as active after switching to an already-passed floor on a multi-floor route.
- Improve keyboard navigation and screen-reader support for the mobile map/list toggle button, and stop a dismissed banner from briefly reappearing. Ship complete TypeScript type declarations for the lazy-loaded QR code component.
3.11.3 (2026-06-29)
🩹 Fixes
- Fix browser tab freeze when navigating away from a page while a route animation is running.
3.11.2 (2026-06-29)
🩹 Fixes
- Accessibility and keyboard-navigation improvements: Escape now dismisses the map layers panel, the level selector has better keyboard navigation and screen-reader labels, and sidebar buttons announce their state correctly. No public API changes.
3.11.1 (2026-06-29)
🩹 Fixes
- Booths rotated to arbitrary angles now respond to hover and clicks across their true rotated outline. Previously only right-angle rotations (multiples of 90°) were handled — at any other angle a booth rendered rotated but reacted across its unrotated, upright footprint. When booths overlap, a hidden booth no longer intercepts hover or clicks meant for a visible booth beneath it.
3.11.0 (2026-06-29)
🚀 Features
- Add a
hideBoothBadgesflag to hide booth number badges. Booth number badges also render again on booths that display an exhibitor logo.
3.10.2 (2026-06-26)
🩹 Fixes
- Improve MapLibre map rendering and camera behavior for large, rotated, and slightly inconsistent floor plans. The map view now fits and pans more reliably, keeps venues at their intended orientation, avoids squashing from imperfect geo anchors, keeps booth labels scaled and upright, and uses a Mapbox Streets-like no-key basemap theme for online and generated offline maps.
3.10.1 (2026-06-24)
🩹 Fixes
- The wayfinding route engine is now built once per floorplan and shared, instead of being rebuilt on every route check. As a result,
checkRoutes()now requires the floorplan to be initialized first: if it is called before wayfinding is ready, it logs a warning and skips the check instead of building routes on its own. - Internal wayfinding code-quality cleanup (stricter type-checking and linting); no functional or API changes.
3.10.0 (2026-06-24)
🚀 Features
- Add a
busRoutesflag to opt in to live bus/transport routing. Bus routing is now off by default, so plans without transit routes no longer make an extra network request on load.
3.9.0 (2026-06-24)
🚀 Features
- Built-in search filter buttons (Bookmarks, Visited, Categories, Sessions, Exhibitors, Guided Tours) now follow the viewer's selected language instead of always showing in English, and the filter bar's scroll controls gained translated accessibility labels. Organizer-named buttons (POI types, links, custom labels) stay as authored, with no missing-translation console warnings.
3.8.0 (2026-06-23)
🚀 Features
- Introduce the @expofp/geometry package — a shared geometry toolkit with point/line/box/rect/polygon/mesh primitives and helpers (point-on-segment projection, bounding box from a point set, polygon area & point-in-polygon, segment intersection, angle normalization, convex-ring polygons) plus a geographic (geo) module for haversine distance, bearing, destination point, and local↔GPS projection. @expofp/floorplan and @expofp/offline now consolidate their internal geometry onto it; their public APIs are unchanged.
3.7.17 (2026-06-23)
🩹 Fixes
- Fixed wayfinding so a route between two locations on the same floor no longer detours through another floor.
3.7.16 (2026-06-22)
🩹 Fixes
- Refactor the Modal into a presentation/container architecture with improved accessibility (required dialog name, focus trap, scroll-lock restore). No changes to the public SDK API.
3.7.15 (2026-06-22)
🩹 Fixes
- Improve link sharing and localization: copying the floor plan link now works on older Android WebViews, and Facebook/X/LinkedIn share links stay intact when the floor plan URL carries its own query parameters. Event, language, and rebooking labels update immediately on language switch, and rebooking selection and notes are preserved reliably. Remaining changes are an internal refactor of presentational UI components with no API changes.
3.7.14 (2026-06-22)
🩹 Fixes
- Fix Storybook component tests failing to run under Babel 8 (legacy decorators option).
- Internal: refactor the search Autocomplete into a reusable, fully-controlled UI component with improved keyboard and screen-reader support — no SDK-facing changes.
3.7.13 (2026-06-22)
🩹 Fixes
- Restore Storybook browser test builds under Babel 8 (CI no longer hangs)
3.7.12 (2026-06-22)
🩹 Fixes
- Load device diagnostics lazily so they no longer add to the entry bundle.
3.7.11 (2026-06-22)
🩹 Fixes
- Remove the window.efpEnv global.
3.7.10 (2026-06-22)
🩹 Fixes
- Log a one-line device and environment summary (OS and version, browser, device model, viewport, language) to the console and expose it on window.efpEnv, so end users can copy it and send it to support when reporting issues.
3.7.9 (2026-06-22)
🩹 Fixes
- Fixed the kiosk icon appearing too large. Kiosk mode now restores the camera to its configured position reliably, even when a reset is triggered several times in quick succession. Analytics events fired outside kiosk mode no longer carry a stale kiosk ID.
3.7.8 (2026-06-18)
🩹 Fixes
- Viewer mode: the search box home button now uses a solid icon with a highlighted style.
- Maintenance: upgrade the build and test toolchain (Nx 23, Vitest 4, TypeScript 6, Babel 8) and switch to Vite's native tsconfig path resolution. No changes to the public API or runtime behavior.
3.7.7 (2026-06-17)
🩹 Fixes
- Standardize type-only imports to inline
import { type X }syntax. Internal code-style change with no impact on runtime behavior or the published API.
3.7.6 (2026-06-17)
🩹 Fixes
- Fix maps misrouting when opened via links carrying analytics parameters (Google Analytics gl/_ga, ad-click ids, utm*).
3.7.5 (2026-06-17)
🩹 Fixes
- Fix wayfinding animation by updating the underlying rendering engine to its latest release.
3.7.4 (2026-06-16)
🩹 Fixes
- Fix rebooking links sometimes opening as a regular floor plan instead of rebooking mode. The floor plan state could initialize more than once and corrupt exhibitor data through a race condition; state now initializes exactly once after data loads, so rebooking mode activates reliably.
3.7.3 (2026-06-16)
🩹 Fixes
- Fix kiosk coordinates not being saved to the database when an existing kiosk is edited. Editing a kiosk's position, heading, scale, or camera now updates the stored record instead of only saving locally.
3.7.2 (2026-06-16)
🩹 Fixes
- Category search buttons now display the correct exhibitor count and highlight matching booths on the floor plan when selected.
3.7.1 (2026-06-15)
🩹 Fixes
- Fix kiosk mode so the map can be zoomed and clicked again — the kiosk panel overlay no longer blocks interaction with the map underneath it.
3.7.0 (2026-06-15)
🚀 Features
- Add getGeoConfig() to read the map's geographic configuration: its bearing (degrees clockwise from north; 0 when the map is north-aligned) and the GPS anchor points (p0, p1, p2) used to georeference the plan. Returns null when the plan has no GPS configuration.
3.6.8 (2026-06-12)
🩹 Fixes
- Fix icons in bus routes by updating the rendering engine.
3.6.7 (2026-06-11)
🩹 Fixes
- Update the rendering engine to its newest release.
3.6.6 (2026-06-11)
🩹 Fixes
- Update the rendering engine to the latest version.
3.6.5 (2026-06-11)
🩹 Fixes
- Allow swapping the route start and end points in wayfinding even when one of them has not been chosen yet.
3.6.4 (2026-06-10)
🩹 Fixes
- Fix multibooth wayfinding to route from the selected exhibitor instead of the first one listed alphabetically; minor booth-color and detail-panel UI refinements.
3.6.3 (2026-06-10)
🩹 Fixes
- Open the debug panel with 7 quick taps in a screen corner — works on kiosks and touch devices without a keyboard
3.6.2 (2026-06-10)
🩹 Fixes
- Update bundled Sentry error-monitoring dependency to 10.57
3.6.1 (2026-06-10)
🩹 Fixes
- Maintenance: internal build and lint tooling updates. No changes to published package behavior.
3.6.0 (2026-06-09)
🚀 Features
- Wayfinding routes can now start from or end at any point on the map, not only booths.
3.5.2 (2026-06-09)
🩹 Fixes
- Keep booth labels oriented correctly when rotating MapLibre maps.
3.5.1 (2026-06-08)
🩹 Fixes
- Expose a window.__expofpReady latch alongside the expofp:ready event so listeners that attach after the plan is ready can still detect readiness.
3.5.0 (2026-06-08)
🚀 Features
- Add data.flags.customSetKiosk to override the kiosk-mode trigger command; improve search to match mid-string fuzzy hits and handle HTML tags and casing in description fallback.
3.4.5 (2026-06-05)
🩹 Fixes
- Improve the debug settings panel layout so each setting's control sits beside its label, with text inputs filling the available width, and the controls and action buttons reflow onto their own lines on narrow screens.
3.4.4 (2026-06-05)
🩹 Fixes
- Fix the maplibre debug override setting.
3.4.3 (2026-06-05)
🩹 Fixes
- Fix the floor plan appearing blank in some Android WebView embeds, where the map could collapse to zero size.
3.4.2 (2026-06-05)
🩹 Fixes
- Fix the on-screen debug console not opening on Android and other touch devices: the activation shortcut is now recognized from soft-keyboard (IME) input, not only physical keyboards.
3.4.1 (2026-06-04)
🩹 Fixes
- Sort the debug settings panel alphabetically so options are easier to find.
- Add a debug settings override to force the experimental Maplibre map on or off (or inherit the default), independent of event data.
- Improve accessibility across floor plan UI components and fix minor rendering issues in speaker and entity lists.
3.4.0 (2026-06-04)
🚀 Features
- Add Maplibre-based map rendering with offline tile support and related floorplan integration updates.
3.3.8 (2026-06-04)
🩹 Fixes
- Sync with upstream main: refactor internal UI components into a presentation/container architecture. No public API changes.
3.3.7 (2026-06-03)
🩹 Fixes
- Update bundled and peer dependencies (Sentry error reporting and React) to their latest patch releases for stability and bug fixes.
3.3.6 (2026-06-03)
🩹 Fixes
- Improve rebooking-mode UX (exhibitors panel alignment, close button, and reset behavior), focus the blue dot when targeting a position via URL parameter, and rename the kiosk location label to "Your Location".
3.3.5 (2026-06-03)
🩹 Fixes
- Internal: add Storybook dev setup with CI smoke tests — no SDK-facing changes.
3.3.4 (2026-06-02)
🩹 Fixes
- Fix map rendering so guided-tour pathway layers stay visible above booth badges
3.3.3 (2026-06-02)
🩹 Fixes
- The Intercom support chat no longer appears on kiosk displays.
3.3.2 (2026-05-31)
🩹 Fixes
- Debug overlay now displays as a translucent, blurred panel over the floor plan instead of a solid black screen, keeping the floor plan visible underneath while debugging.
3.3.1 (2026-05-29)
🩹 Fixes
- Show an "Event not found" message when an event's data cannot be loaded, instead of leaving a blank or broken floor plan.
3.3.0 (2026-05-29)
🚀 Features
- Danish (
da) is now available as a UI language for the floor plan viewer.
3.2.16 (2026-05-28)
🩹 Fixes
- Removed an unused
jspdfruntime dependency, fixing installation failures for SDK consumers on pnpm 11. Workspace tooling also upgraded to pnpm 11.
3.2.15 (2026-05-28)
🩹 Fixes
- Update internal dependencies and build tooling to their latest compatible versions.
- Sync with upstream main: tour launch on mobile collapses overlay to medium.
3.2.14 (2026-05-20)
🩹 Fixes
- Internal refactor: extract pure UI primitives (Alert, Badge, Button, etc.) into separate modules — no functional changes for SDK consumers.
3.2.13 (2026-05-19)
🩹 Fixes
- Add a per-event
flagsbag ondata.flags(typed viaFloorPlanFlags).enableExperimentalReroutingnow reads fromdata.flags.enableExperimentalRerouting, falling back to the legacyfpGeo.properties.config.enableExperimentalReroutingso existing events keep working.
3.2.12 (2026-05-19)
🩹 Fixes
- Floor plan host elements no longer receive the auto-applied
expofp-floorplan-defaultclass. The class was an internal marker (debug overlay) and was never part of the documented public API. If your CSS targeted.expofp-floorplan-default, switch to a selector you control on the container element (e.g. an#idor your own class).
3.2.11 (2026-05-19)
🩹 Fixes
- Embedding the floor plan in a custom container no longer requires
!importantin your CSS. Default layout styles (position,inset,width,height) are now applied via a low-specificity stylesheet, so any#floorplan { ... }rule in your page beats the SDK's defaults naturally. Useful for in-flow embeds.
3.2.10 (2026-05-15)
🩹 Fixes
- Visible-area calculation now respects camera rotation; previously a rotated map could over-report which booths were on-screen.
3.2.9 (2026-05-13)
🩹 Fixes
- Restore booth polygon-bounds in wayfinding graph candidate search; refine free-license banner typography.
3.2.8 (2026-05-12)
🩹 Fixes
- Fix map overlay visible-rect recalc and wayfinding transition selection; remove legacy
?yah=URL parameter (Kiosk default still supported).
3.2.7 (2026-05-11)
🩹 Fixes
- Fix: Isolate the Intercom launcher in a shadow DOM to prevent floor-plan styles from leaking into the chat widget.
3.2.6 (2026-05-07)
🩹 Fixes
- Fix: passing
focus=falsewhen reporting current position no longer triggers camera refocus or reroute.
3.2.5 (2026-05-07)
🩹 Fixes
- Fix multi-floor bookmark/visited highlight and camera fit, blue-dot pan when GPS is outside the area map, and make wayfinding rerouting opt-in via
fpGeo.
3.2.4 (2026-05-06)
🩹 Fixes
- Floorplan now fills the dynamic viewport on mobile (no jump as the browser chrome collapses) and disables the page-level pull-to-refresh gesture so it cannot interrupt floorplan interactions on iOS Safari.
3.2.3 (2026-05-06)
🩹 Fixes
- Silence a benign React 19 dev warning from
mobx-react-liteat the SDK entry.
3.2.2 (2026-05-06)
🩹 Fixes
- Avoid a stray React dev warning when entering kiosk edit mode.
3.2.1 (2026-05-06)
🩹 Fixes
- Internal QR code refactor (no behavior change).
3.2.0 (2026-05-06)
🚀 Features
- Add
selectAccessibleRoute()to restrict wayfinding to accessible-only segments.
3.1.16 (2026-05-06)
🩹 Fixes
- Debug panel: custom-setting registration moved from
window.efpDebug.settings[key] = schematowindow.efpDebugUi[key] = schema. Thelabeloption has been removed — the setting's key is now used as the heading text in the panel. - Fix the floor plan failing to load on Safari 14 due to a
SyntaxErrorin the JSON import helper. The loader now detects browsers without dynamic-import attribute support and falls back tofetch.
3.1.15 (2026-05-06)
🩹 Fixes
- Bump
@expofp/rendererto 3.1.6
3.1.14 (2026-05-05)
🩹 Fixes
- Debug mode now uses the namespaced
efp:debuglocalStorage key withtrue/falsevalues (previouslydebugwith1/0). The toggle is registered with thewindow.efpDebug.settingsregistry for the debug panel.
3.1.13 (2026-05-05)
🩹 Fixes
- Debug panel: register custom settings from any code via
window.efpDebug.settings— no@expofp/debugimport required.
3.1.12 (2026-05-05)
🩹 Fixes
- Cookie consent banner: restore bottom-left placement on desktop
3.1.11 (2026-05-05)
🩹 Fixes
- Viewer mode: refined Search and Menu styling, smoother overlay animation
3.1.10 (2026-05-05)
🩹 Fixes
- Fix: Log tab now correctly captures
debugnpm output in production browser bundles. (The bundler had been inlining the console-wrap install module so the wraps applied afterdebugnpm captured its console references; now the wrap install is forced into its own chunk that evaluates first.)
3.1.9 (2026-05-05)
🩹 Fixes
- Debug panel:
- New Log tab captures
console.log/debug/info/warn/erroroutput with%ccolor formatting preserved, including styled output from thedebugnpm library. Capped at 5000 entries (oldest evicted first). - New "Debug namespaces" text input accepts wildcards like
efp:*and applies them immediately without reload.
- New Log tab captures
3.1.8 (2026-05-04)
🩹 Fixes
- Map: keep booth logos within bounds when the floor plan is rotated.
3.1.7 (2026-05-04)
🩹 Fixes
- Traffic: silently ignore
204/ non-OK responses from/v1/routeswhen there are no bus routes for the plan.
3.1.6 (2026-05-04)
🩹 Fixes
- Update bundled
@expofp/rendererto 3.1.4.
3.1.5 (2026-05-04)
🩹 Fixes
- Restore debug overlay styling when Shadow DOM is enabled
3.1.4 (2026-04-30)
🩹 Fixes
- Simplify search placeholder, refresh translations, and improve language switcher accessibility
3.1.3 (2026-04-30)
🩹 Fixes
- Lazy-load Intercom messenger and gate it to ExpoFP-hosted floor plans (skipped offline). Heatmap mode now displays markers.
3.1.2 (2026-04-29)
🩹 Fixes
- Pin ESLint plugins to versions compatible with
@nx/eslint(ESLint 9) - Update all dependencies to their latest compatible versions, including build tooling.
3.1.1 (2026-04-29)
🩹 Fixes
- Link
@expofppackages on npm to the developer docs site, and add a quickstart README to@expofp/floorplan.
3.1.0 (2026-04-29)
🚀 Features
- Add Intercom messenger integration with subscription-based gating; refresh free banner ribbon and cookie consent UX
3.0.4 (2026-04-28)
🩹 Fixes
- Fix locales not loading when SDK is imported from a redirecting CDN URL (e.g.
unpkg.com/@expofp/floorplan@VERSION)
3.0.3 (2026-04-28)
🩹 Fixes
- Redo upstream main merge to fix runtime regressions (e.g., Menu rendering as blank screen on events with register links).
3.0.2 (2026-04-28)
🩹 Fixes
- Fix traffic visualization crash before renderer init and adjust overlay sizing on booth selection.
3.0.1 (2026-04-24)
🩹 Fixes
- Fuzzy search: tighter match threshold and position-aware scoring for more relevant results
3.0.0 (2026-04-24)
🩹 Fixes
- Adopted a two-channel release model: regular releases ship to the
@latestdist-tag; a separate@stabledist-tag will be maintained as a soak-delayed pointer for production-critical installs (moved manually after a bake period).
3.0.0-alpha.22 (2026-04-24)
🩹 Fixes
- Docs: grammar polish across guides; fixed malformed bookmarks tables in the query-parameters reference; clarified the search example to avoid clashing with
?b=bookmarks. - Docs: clearer v2 → v3 migration guide with side-by-side before/after; examples and guide snippets now import
@expofp/floorplandirectly (no more@nextdist-tag).
3.0.0-alpha.21 (2026-04-23)
🩹 Fixes
- Browser bundle's
index.jsnow contains the main module directly instead of re-exporting from an intermediate chunk, reducing one HTTP request on direct browser loads
3.0.0-alpha.20 (2026-04-23)
🩹 Fixes
- Booth badges now support
noLabelsbooths with exhibitors, respecthideExhibitorBoothNumber, render above plan layers, and keep consistent size on retina displays; search matches non-consecutive query terms within a field
3.0.0-alpha.19 (2026-04-15)
🩹 Fixes
- feat(telemetry): respect Retry-After on throttling, plus attribution and overflow fixes
- Telemetry: Retry-After handling — The SDK now pauses outbound telemetry when the collector responds with HTTP 429 or 503 and a
Retry-Afterheader, honoring both seconds and HTTP-date formats (capped at 5 minutes). Traffic automatically backs off when the telemetry endpoint is throttled or degraded instead of retrying in a tight loop. - Telemetry: event storage cap — Failed batches merged back into pending storage are now capped at 1,000 events, preventing unbounded
localStoragegrowth if the telemetry endpoint stays unreachable for an extended period. - Telemetry: cross-session attribution fix — Events persisted in
localStoragefrom a previous event/expo are now re-attributed to the current expo on send, so switching between expos on the same device no longer mixes analytics across events. - Telemetry: large-batch delivery fix — Large accumulated batches no longer silently fail to send; the
keepaliverequest flag is omitted for payloads above ~63KB, and payload size is measured in bytes (viaTextEncoder) so multi-byte characters are counted correctly. - Kiosk: zoom stability — Fixes a
NaNzoom level when a kiosk configuration specifiesmapPtScaleof zero; zoom is now left unchanged in that case instead of producing an invalid value.
- Telemetry: Retry-After handling — The SDK now pauses outbound telemetry when the collector responds with HTTP 429 or 503 and a
3.0.0-alpha.18 (2026-04-15)
🩹 Fixes
- fix: favicon link in floor plan HTML and custom CSS with Shadow DOM
- Favicon —
index.htmlincludes the favicon link in the correct place for the dev entry. - Custom CSS with Shadow DOM —
loadCustomCssresolves the style root when the map runs inside a shadow root.
- Favicon —
3.0.0-alpha.17 (2026-04-14)
🩹 Fixes
- feat: virtual line distance in routing cost and completed reactive i18n
- Virtual line distance in routing cost — When a virtual line has a
virtualLengthvalue configured per-line in the designer, the pathfinder uses that as the edge cost instead of treating virtual links as free (cost 0). Multi-floor routes now prefer staying on the same floor when virtual lengths are set, producing more natural directions. Explicit0is still honored. - Reactive i18n refactor completed — The
LanguageStorehas been removed; locale state now lives in a single source of truth inutils/i18n. RTL direction updates reactively whenchangeLanguage()is called, without any re-render hacks in the overlay. - Legacy language key auto-migration — Users with a locale saved under the old
languagelocalStorage key are read once on startup and migrated to the newefp-localekey, so existing installs retain the user's previous selection. - Public type rename:
FloorPlanLanguage→Language— The language entity type exported fromFloorPlanEntityhas been renamed and narrowed to{ readonly id: string; readonly name: string; readonly entity: { readonly type: "language" } }. Integrators that destructure language entities from search results or entity lists may need to adjust type imports. - Wayfinding module refactor — Wayfinding is now a self-contained module (
src/wayfinding/) with a hexagonal (ports/adapters) architecture. Public API is unchanged; the refactor isolates pathfinding, routing, position tracking, and rendering behind clean interfaces so future extensions land without touching call sites. - Wayfinding stability fixes — Hotfix for an infinite loop on certain route configurations; event-specific rerouting disabled for the CloudNext26 layout where heuristic-based rerouting produced poor transitions.
- New
mathutility — Shared helpers (toRadians,decreaseByPercentage) now live inutils/math.ts, replacing the removedutils/toRadians.ts. Not part of the public API.
- Virtual line distance in routing cost — When a virtual line has a
3.0.0-alpha.16 (2026-04-09)
🩹 Fixes
- feat: viewer app mode, event metadata panel, reactive translations, and route planner v2
- Viewer app mode — New
viewerModeoption opens a full-screen menu with an event metadata panel;onLeaveEventcallback fires when the user exits, and the menu icon becomes a home icon while viewer mode is active - Event metadata panel — Shows event title, venue, and date range from data; displays a "Now" badge when the event is currently live and an "Ongoing" label when start/end dates are missing
- Reactive translations —
t()now re-renders UI automatically whenchangeLanguage()is called, so language switching updates every label without a manual refresh expofp:readyDOM event — Dispatched onwindowwhen the floor plan finishes initializing (detail contains the floorplan instance), so integrators can listen instead of pollingwindow.___fp- Route planner v2 — Multi-floor routes now show a floor selector; stop items display booth name plus a level badge; non-routable bookmarks no longer surface the route planner entry
- Custom floor indexing — Honors
floorIndexfrom data so events can define a custom floor ordering instead of relying on declaration order - Bookmarks: share button — Moved from the search box into the bookmarks panel, where sharing a saved set of booths makes more sense
FloorPlanBooth.title— Exposed as an optional field on search results so integrators can surface richer booth titlesreset()now fits bounds — Callingreset()re-centers the map on the full floor; in kiosk mode with a configuredresetCameraFn, the kiosk camera hook runs instead- TouchHand indicator — Only shown in kiosk mode (previously appeared in all modes)
- Wayfinding stability — Hotfix for an infinite loop on certain routes; fixes for floor-switching collisions and selector click issues
- Floor index fix — Corrects floor index resolution for multi-floor plans
- Blue dot layering — Current-position marker now resolves to the correct layer when the position specifies an explicit
z - Modal rendering in Shadow DOM — Modal portal container now resolves correctly whether the floor plan is mounted inside a shadow root or the regular DOM
- Route tracking deduplication — Stops firing duplicate analytics events on automatic route recalculation; events only fire on explicit user-initiated route resets
- Viewer app mode — New
3.0.0-alpha.15 (2026-04-08)
🩹 Fixes
- Publish Sentry source maps and release tags so integrator error reports resolve to original source and group by SDK release
- Fix pathfinding failure that broke route calculation
3.0.0-alpha.14 (2026-04-01)
🩹 Fixes
- Add native SDK compatibility helper for WKWebView bridge timing
- Offline ZIP archives now nest all files under the expo name directory
3.0.0-alpha.12 (2026-03-31)
🩹 Fixes
- Fix offline runtime entry path resolution for relative imports (7e188dfd)
- Camera reset now fits map to visible bounds, route planner button in sidebar actions, and updated tour data (fa7486eb)
3.0.0-alpha.11 (2026-03-22)
🩹 Fixes
- fix: remove ./ prefix from zip entry paths (9d0c0ef6)
- Rename public API exports for clarity: niceFetch → fetchWithRetry, importJsonModule → importJson, importRuntimeJsonModule → importRuntimeJson, sha256Base62Truncated → shortHash, slugifyFilesystemUnique → safeSlugify (5c61e5be)
3.0.0-alpha.10 (2026-03-17)
🩹 Fixes
- feat: route planner, optimized routing, lazy QR code, and pathfinding improvements (2efdcd3d)
- Route Planner — Plan multi-stop routes from bookmarks or custom selections, with automatic start-point detection and drag-to-reorder stops
- Optimized Multi-Stop Routing —
getOptimizedRoutes()SDK method uses nearest-neighbor + 2-opt heuristic to minimize total travel distance across waypoints - Lazy QR Code Loading — QR code component is now lazy-loaded, reducing initial bundle size
- Pathfinding Improvements — Virtual (non-physical) route segments are now penalized in pathfinding to prefer real walkable paths