@expofp/floorplan
Version:
Interactive floor plan library for expos and events
69 lines (62 loc) • 2.97 kB
JavaScript
import"./utils/silence-mobx-react-lite-warning";import{resolve as d}from"@expofp/resolve";import m from"debug";import{initHtmlHead as p}from"./_misc_to_move/initHtmlHead";import{logBuildInfo as u}from"./_misc_to_move/logBuildInfo";import y from"./floorplan.loader";const c=m("efp:load");export async function load(n,e){p(),u();const o={...await d(n),...e},a=o.element;let t;if(typeof a=="string"){const r=document.querySelector(a);if(!r)throw new Error(`Element not found for selector: ${a}`);t=r}else a?t=a:(t=document.getElementById("floorplan"),t||(t=document.createElement("div"),v(t),document.body.appendChild(t)));h(),t.setAttribute("data-efp-floorplan-defaults",""),document.documentElement.style.overscrollBehavior||="none",document.body.style.overscrollBehavior||="none",requestAnimationFrame(()=>{t.style.backgroundColor="#ebebeb"});const f=o.legacyDataUrlBase;if(c("legacyDataUrlBase",f),o.legacyDataVersion)try{const{version:r}=await d(o.legacyDataVersion);globalThis.__fpDataVersion=r}catch{c("Could not resolve version")}const s=new y({...o,element:t}),l=window.___fpResolve;return window.___fp=s,l&&(s.ready.then(()=>l(s)),delete window.___fpResolve),s.ready.then(()=>{const r=new CustomEvent("expofp:ready",{detail:{floorplan:s}});window.__expofpReady=r,window.dispatchEvent(r)}),s}function h(){const n="efp-floorplan-defaults";if(document.getElementById(n))return;const e=document.createElement("style");e.id=n,e.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(e)}function v(n){if(!document.adoptedStyleSheets)return;const e="efp-runtime-loader-spinner",i=`
.${e} {
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;
}
.${e} > svg {
width: 60px;
transform-origin: center;
animation: ${e}-rotate 2s linear infinite;
}
.${e} > svg > circle {
fill: none;
stroke: var(--color-primary, #2382f4);
stroke-dasharray: 1, 200;
stroke-dashoffset: 0;
stroke-linecap: round;
stroke-width: 2;
animation: ${e}-dash 1.5s ease-in-out infinite;
}
@keyframes ${e}-rotate {
100% {
transform: rotate(360deg);
}
}
@keyframes ${e}-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(i),document.adoptedStyleSheets=[...document.adoptedStyleSheets,o],n.innerHTML=`<div class="${e}">
<svg viewBox="25 25 50 50">
<circle r="20" cy="50" cx="50"></circle>
</svg>
</div>`,requestAnimationFrame(()=>{n.querySelector(`.${e}`)?.style.setProperty("opacity","1")})}