Embed SDK

The viewer runs inside an iframe and the SDK proxies every method over postMessage. Method names, options and events mirror ExpoFP's FloorPlan API so existing integrations port with a find-and-replace.

Install

<!-- Script tag (global Tessera) -->
<script src="https://YOUR-HOST/sdk/tessera.js"></script>

<!-- or as an ES module -->
<script type="module">
  import { load, FloorPlan } from "https://YOUR-HOST/sdk/tessera.esm.js";
  const fp = await load({ $ref: "https://YOUR-HOST/e/grip-connect-2026" });
</script>

<!-- or declaratively -->
<div data-tessera-event="grip-connect-2026" data-base-url="https://YOUR-HOST" style="height:600px"></div>

Options

OptionMeaning
elementContainer element or selector. Defaults to #floorplan, else a full-screen div.
eventIdEvent slug or id.
baseUrlOrigin of the Tessera server (defaults to where the SDK was loaded from).
paramsInitial ViewerParams: booth, exhibitor, category, level, route, from/to/accessible, search, lang, kiosk, plan, position, view, theme, hide, tab…
noOverlay / offHistory / ignoreQueryMap only; don't touch history; don't read the host URL.
kiosk, language, consent, themeKiosk mode, UI language, analytics consent ('ask' | 'granted' | 'denied'), theme.
onInit(fp)API is live. Equivalent of ExpoFP's onInit / onFpConfigured.
on<Event>(payload)One handler per event: onInit, onReady, onFpConfigured, onBoothClick, onExhibitorClick, onDetails, onDirection, onRouteCleared, onBookmarkClick, onBookmarksChanged, onVisitedClick, onCategoryClick, onFloorActivated, onCurrentPositionChanged, onMarkerClick, onExhibitorCustomButtonClick, onGetCoordsClick, onSearch, onShare, onReserveClick, onError, onLeaveEvent, onSessionClick, onCameraChanged, onStateChanged.
onEvent(name, payload)Catch-all.

Methods

Every method returns a Promise. Calls made before ready are queued.

MethodDescription
selectBooth()Select booth(s) by label, id or externalId (string or array). Empty string clears.
selectExhibitor()Select exhibitor(s) by id, slug or externalId.
selectRoute()selectRoute(from, to, accessible?) or selectRoute([a, b, c]) with up to 8 waypoints.
clearRoute()Clear the current route (alias deselectRoute).
getOptimizedRoutes()Best visiting order through the given booth labels.
selectCurrentPosition()Place the blue dot at plan coordinates (metres) and optionally centre.
clearCurrentPosition()
setBookmarks()Replace bookmarked exhibitor/booth ids.
getBookmarks()
setMarkers()Draw custom markers [{ id, x, y, levelId?, label?, color?, icon? }].
clearMarkers()
updateLayerVisibility()Show/hide a layer: booths, labels, pois, zones, walls, paths, basemap.
getCenterCoordinates()
applyParameters()Apply a ViewerParams object or a query string (deep links).
exhibitorsList()
boothsList()
categoriesList()
sessionsList()
selectCategory()
clearCategory()
getVisibility()Chrome visibility flags.
setVisibility(){ controls, levels, header, overlay, searchButtons }.
findLocation()Centre on the user's GPS position (georeferenced plans).
zoomIn()
zoomOut()
switchView()
fitBounds()Frame the whole level (or given bounds).
getBoothRect()Plan-space rectangle + centre of a booth.
convertToGeo()Plan (x, y) → [lng, lat].
convertFromGeo()[lng, lat] → plan (x, y).
highlightExhibitors()Highlight exhibitors' booths.
highlightBooths()Highlight booths by label without selecting.
clearHighlights()
search()Run the fuzzy search; returns ranked results.
getFloors()Levels.
activateFloor()Switch level by id, short name or index.
showSearch()
hideSearch()
setLanguage()Switch UI language (alias changeLanguage).
getLanguage()
setKiosk()Toggle kiosk mode.
getState()Selection, route, level, filters, bookmarks.
getVersion()
flyTo()
setTheme()light | dark.
openExhibitor()
closePanel()
select()Open whatever matches: booth → exhibitor → category → session.
selectAccessibleRoute()Same as selectRoute restricted to accessible edges and lifts.
deselectRoute()
openPlanner()Open the multi-stop planner, optionally pre-filled.
showList()Open a panel: bookmarks | exhibitors | sessions | categories | language | visited.
deselectCurrentPosition()Remove the blue dot.
isGpsTrackingEnabled()
setGpsTrackingEnabled()Toggle continuous GPS tracking.
setEntitiesBookmarks()Typed bookmark seeding ({ type, id|name|externalId, bookmarked }).
setEntitiesVisited()Mark exhibitors/sessions visited.
selectMarker()
drawCircles()Draw circles [{ x, y, radius, color? }].
clearCircles()
setCamera(){ x, y | lat, lng, levelId, zoom, bearing, pitch, durationMs }.
getCamera()Current camera.
zoomTo()Fit the camera to booths/exhibitors without selecting.
getBounds()
getGeoConfig()Georeference of the current level.
changeLanguage()
reset()Clear selection/route/filters and refit.
getBoothsGeometry()All booth polygons per level (like ExpoFP's booths.json).
getRoute()Current route (RouteResult) or null.

Events

init, ready, fpConfigured, boothClick, exhibitorClick, details, direction, routeCleared, bookmarkClick, bookmarksChanged, visitedClick, categoryClick, floorActivated, currentPositionChanged, markerClick, exhibitorCustomButtonClick, getCoordsClick, search, share, reserveClick, error, leaveEvent, sessionClick, cameraChanged, stateChanged

Payloads: boothClick → { booth, exhibitors }; details → { type, id, name, externalId, boothLabels }; direction → RouteResult or null; floorActivated → level; currentPositionChanged → { x, y, levelId, lngLat }; exhibitorCustomButtonClick → { exhibitor, url }.

Deep links

/e/{slug}?booth=A101
/e/{slug}?exhibitor=nimbus-cloud
/e/{slug}?route=A101,T05&accessible=1
/e/{slug}?category=<id>&level=L2&lang=de
/e/{slug}?kiosk=1&position=90,105        (kiosk with a fixed "you are here")
/e/{slug}?hide=header,controls&noOverlay=1&embed=1
/e/{slug}/book   or   /e/{slug}?mode=booking   (exhibitor booking view: availability, prices, Reserve / Buy)
/e/{slug}?preview=1                       (organisers only: the unpublished draft, with an attendee / booking switch)

Playground

Events and results appear here.