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 @latest dist-tag; a separate @stable dist-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.js now 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 noLabels booths with exhibitors, respect hideExhibitorBoothNumber, 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