UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

69 lines (62 loc) • 3.78 kB
import"./utils/silence-mobx-react-lite-warning";import{applyIntents as f,loadConfig as p,setConfig as m}from"@expofp/config";import{safeLocalStorage as u}from"@expofp/utils";import d from"debug";import{initHtmlHead as h}from"./_misc_to_move/initHtmlHead";import{logBuildInfo as y}from"./_misc_to_move/logBuildInfo";import v from"./floorplan.loader";import{brand as g}from"./utils/brand";import{applyEventHead as w,buildEventHead as S}from"./utils/event-head";import{formatEventTitle as k}from"./utils/event-title";import E from"./utils/is-own-domain";import{migrateLegacyStorageKeys as b}from"./utils/legacy-storage-keys";const s=d("efp:load");export async function load(i,t={}){h(),y(),d("efp:device").enabled&&import("./_misc_to_move/logDeviceInfo").then(e=>e.logDeviceInfo()).catch(()=>{});const a=t.element;let o;if(typeof a=="string"){const e=document.querySelector(a);if(!e)throw new Error(`Element not found for selector: ${a}`);o=e}else a?o=a:(o=document.getElementById("floorplan"),o||(o=document.createElement("div"),_(o),document.body.appendChild(o)));x(),o.setAttribute("data-efp-floorplan-defaults",""),document.documentElement.style.overscrollBehavior||="none",document.body.style.overscrollBehavior||="none",requestAnimationFrame(()=>{o.style.backgroundColor="#ebebeb"}),b();let n;try{if(n=await p(i,t,window.location.search,u()??void 0),!n.fpSvgJsRef)throw new Error("No floor plan drawing: the manifest must set `legacyDataUrlBase` (live event) or `fpSvgJsRef` (offline copy)")}catch(e){const{showEventNotFound:c}=await import("./tools/event-not-found");throw c(o),e}if(s("config",n),m(n),E){const e=k(n,g);e&&(document.title=e),w(document,S(n),`${window.location.origin}/`)}const r=new v(t,o),l=window.___fpResolve;return window.___fp=r,l&&(r.ready.then(()=>l(r)).catch(e=>s("placeholder resolve skipped:",e)),delete window.___fpResolve),r.ready.then(()=>{const e=new CustomEvent("expofp:ready",{detail:{floorplan:r}});window.__expofpReady=e,window.dispatchEvent(e)}).catch(e=>s("ready event skipped:",e)),r.ready.then(()=>f(r,n.intents)).catch(e=>s("config intents skipped:",e)),r}function x(){const i="efp-floorplan-defaults";if(document.getElementById(i))return;const t=document.createElement("style");t.id=i,t.textContent=` [data-efp-floorplan-defaults] { position: fixed; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; touch-action: none; overscroll-behavior: none; background: #fff; transition: background-color 2s ease; }`,document.head.prepend(t)}function _(i){if(!document.adoptedStyleSheets)return;const t="efp-runtime-loader-spinner",a=` .${t} { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); opacity: 0; z-index: 5; display: flex; align-items: center; justify-content: center; pointer-events: none; transition: all 1s ease; } .${t} > svg { width: 60px; transform-origin: center; animation: ${t}-rotate 2s linear infinite; } .${t} > svg > circle { fill: none; stroke: var(--color-primary, #2382f4); stroke-dasharray: 1, 200; stroke-dashoffset: 0; stroke-linecap: round; stroke-width: 2; animation: ${t}-dash 1.5s ease-in-out infinite; } @keyframes ${t}-rotate { 100% { transform: rotate(360deg); } } @keyframes ${t}-dash { 0% { stroke-dasharray: 1, 200; stroke-dashoffset: 0; } 50% { stroke-dasharray: 90, 200; stroke-dashoffset: -35px; } 100% { stroke-dashoffset: -125px; } }`,o=new CSSStyleSheet;o.replaceSync(a),document.adoptedStyleSheets=[...document.adoptedStyleSheets,o],i.innerHTML=`<div class="${t}"> <svg viewBox="25 25 50 50"> <circle r="20" cy="50" cx="50"></circle> </svg> </div>`,requestAnimationFrame(()=>{i.querySelector(`.${t}`)?.style.setProperty("opacity","1")})}