UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

441 lines (439 loc) • 21.2 kB
function __vite_inject_css__(css, id, forceLightDom){ if (typeof document==='undefined') return; var shadow=!forceLightDom&&typeof window!=='undefined'&&window.__efpShadowDOMStyleParent; var parent=shadow||document.head; var s=document.createElement('style'); s.setAttribute('data-chunk-style', id); s.appendChild(document.createTextNode(css)); parent.appendChild(s); if (shadow) (window.__efpStyleElements||(window.__efpStyleElements=[])).push(s);} (function() { try { var e = typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : {}; e.SENTRY_RELEASE = { id: "3.47.0" }; var t = new e.Error().stack; t && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[t] = "bb099792-ccd2-4dd0-a3fc-dd4b2d82b640", e._sentryDebugIdIdentifier = "sentry-dbid-bb099792-ccd2-4dd0-a3fc-dd4b2d82b640"); } catch {} })(); import { r as e } from "./rolldown-runtime-5rOLGCTp.js"; import { h as t, s as n } from "./i18n-DlquqKCP.js"; import { t as r } from "./react-XuvSZP7j.js"; import { t as i } from "./jsx-runtime-BzLvm2y2.js"; import { t as a } from "./classnames-CQMYVTW5.js"; import { t as o } from "./Button-DyqVe4xL.js"; //#region ../ui/src/shared/interactive.ts var s = /* @__PURE__ */ e(r(), 1), c = "button, input, select, textarea, a, [contenteditable=\"true\"], [draggable=\"false\"]"; function l(e) { return !!(e != null && e.closest(c)); } //#endregion //#region ../ui/src/components/Draggable/Draggable.tsx var u = i(), d = ({ children: e, className: t, style: n }) => { let [r, i] = (0, s.useState)({ x: 0, y: 0 }), [a, o] = (0, s.useState)(!1), [c, d] = (0, s.useState)({ x: 0, y: 0 }), f = (0, s.useRef)(null), p = (e) => { l(e.target) || (o(!0), d({ x: e.clientX - r.x, y: e.clientY - r.y }), e.preventDefault()); }, m = (e) => { if (!a) return; let t = e.clientX - c.x, n = e.clientY - c.y; i({ x: t, y: n }); }, h = () => { y(); }, g = (e) => { if (l(e.target)) return; let t = e.touches[0]; o(!0), d({ x: t.clientX - r.x, y: t.clientY - r.y }); }, _ = (e) => { if (!a) return; let t = e.touches[0], n = t.clientX - c.x, r = t.clientY - c.y; i({ x: n, y: r }); }, v = () => { y(); }, y = () => { if (!f.current) return; let e = f.current.getBoundingClientRect(), t = window.innerWidth, n = window.innerHeight, r = e.width / 4, a = e.height / 4, s = Math.max(0, 0 - e.left), c = Math.max(0, e.right - t), l = Math.max(0, 0 - e.top), u = Math.max(0, e.bottom - n); (s > r || c > r || l > a || u > a) && i({ x: 0, y: 0 }), o(!1); }; return (0, s.useEffect)(() => { if (a) return document.addEventListener("mousemove", m), document.addEventListener("mouseup", h), document.addEventListener("touchmove", _, { passive: !1 }), document.addEventListener("touchend", v), () => { document.removeEventListener("mousemove", m), document.removeEventListener("mouseup", h), document.removeEventListener("touchmove", _), document.removeEventListener("touchend", v); }; }, [a, c]), /* @__PURE__ */ (0, u.jsx)("div", { ref: f, className: t, style: { ...n, transform: `translate(${r.x}px, ${r.y}px)`, cursor: a ? "grabbing" : "grab" }, onMouseDown: p, onTouchStart: g, children: e }); }; //#endregion //#region src/components/Kiosk/SetKiosk/Confirm/ConfirmDialog.tsx function f({ isDisabled: e, content: t, confirmLabel: n, cancelLabel: r, onConfirm: i, onCancel: a, confirmVariant: s, cancelVariant: c }) { return /* @__PURE__ */ (0, u.jsxs)("div", { className: "efp-confirm-dialog", children: [t && /* @__PURE__ */ (0, u.jsx)("div", { className: "efp-confirm-dialog__content", children: t }), /* @__PURE__ */ (0, u.jsxs)("div", { className: "efp-confirm-dialog__controls", children: [/* @__PURE__ */ (0, u.jsx)(o, { size: "md", text: n, onClick: i, disabled: e, variant: s }), a && /* @__PURE__ */ (0, u.jsx)(o, { size: "md", text: r, variant: c, onClick: a, disabled: e })] })] }); } //#endregion //#region src/components/Kiosk/SetKiosk/Message/InfoMessage.tsx function p({ list: e }) { return e != null && e.length ? /* @__PURE__ */ (0, u.jsx)("div", { className: "efp-info-message", children: e.map(({ id: e, image: t, content: n }) => /* @__PURE__ */ (0, u.jsxs)("div", { className: "efp-info-message__item", children: [/* @__PURE__ */ (0, u.jsx)("img", { className: "efp-info-message__img", src: t.src, alt: t.alt, width: "30", height: "30" }), /* @__PURE__ */ (0, u.jsx)("span", { children: n })] }, e)) }) : null; } //#endregion //#region src/components/Kiosk/SetKiosk/FormInput/RangeInput.tsx function m({ value: e, name: t, min: r, max: i, step: a, onChange: o, isDisabled: s, symbol: c }) { let l = () => o(Math.min(e + a, i)), d = () => o(Math.max(e - a, r)), f = 0; i !== r && (f = (e - r) / (i - r) * 100); let p = "-50%"; return f === 0 ? p = "0" : f === 100 && (p = "-100%"), /* @__PURE__ */ (0, u.jsxs)("div", { className: "efp-range-input", children: [/* @__PURE__ */ (0, u.jsxs)("span", { className: "efp-range-input__header", children: [ /* @__PURE__ */ (0, u.jsx)("button", { type: "button", className: "efp-range-input__control", draggable: "false", onClick: d, disabled: s, "aria-label": n("Decrease"), children: /* @__PURE__ */ (0, u.jsx)("i", { className: "icon-minus" }) }), /* @__PURE__ */ (0, u.jsxs)("span", { className: "efp-no-select", children: [ t, " ", /* @__PURE__ */ (0, u.jsxs)("strong", { children: [e, c == null ? "" : c] }) ] }), /* @__PURE__ */ (0, u.jsx)("button", { type: "button", className: "efp-range-input__control", draggable: "false", onClick: l, disabled: s, "aria-label": n("Increase"), children: /* @__PURE__ */ (0, u.jsx)("i", { className: "icon-plus" }) }) ] }), /* @__PURE__ */ (0, u.jsxs)("label", { className: "efp-range-input__input-block", children: [/* @__PURE__ */ (0, u.jsx)("input", { className: "efp-range-input__input", name: t, type: "range", min: r, max: i, step: a, value: e, disabled: s, onChange: (e) => o(Number(e.target.value)) }), /* @__PURE__ */ (0, u.jsxs)("span", { className: "efp-range-input__custom-input", children: [/* @__PURE__ */ (0, u.jsx)("span", { className: "efp-range-input__progress", style: { width: `${f}%` } }), /* @__PURE__ */ (0, u.jsx)("span", { className: "efp-range-input__thumb", style: { insetInlineStart: `${f}%`, transform: `translateX(${p}) translateY(-50%)` } })] })] })] }); } //#endregion //#region src/components/Kiosk/SetKiosk/SetKioskForm.tsx function h({ onSave: e, onDelete: t, isSaveDisabled: r, isDeleteDisabled: i, areControlsDisabled: a, angle: s, onRotateIcon: c, uiScale: l, minUiScale: d, maxUiScale: f, uiScaleStep: p, onUiScaleChange: h, iconSizePercent: g, onChangeIconSizePercent: _ }) { return /* @__PURE__ */ (0, u.jsx)("div", { className: "efp-set-kiosk-form", children: /* @__PURE__ */ (0, u.jsxs)("div", { className: "efp-set-kiosk-form__content", children: [/* @__PURE__ */ (0, u.jsxs)("div", { className: "efp-set-kiosk-form__inputs", children: [ /* @__PURE__ */ (0, u.jsx)(m, { value: s, name: n("Icon rotation"), min: 0, max: 360, step: 1, symbol: "°", isDisabled: a, onChange: c }), /* @__PURE__ */ (0, u.jsx)(m, { value: g, name: n("Icon size"), min: 100, max: 300, step: 1, symbol: "%", isDisabled: a, onChange: _ }), /* @__PURE__ */ (0, u.jsx)(m, { value: Math.round(l * 100), name: n("UI scale"), min: d * 100, max: f * 100, step: p * 100, symbol: "%", isDisabled: a, onChange: (e) => h(e / 100) }) ] }), /* @__PURE__ */ (0, u.jsxs)("div", { className: "efp-set-kiosk-form__controls", children: [/* @__PURE__ */ (0, u.jsx)(o, { size: "md", variant: "gray", text: n("Delete kiosk"), onClick: t, disabled: i }), /* @__PURE__ */ (0, u.jsx)(o, { size: "md", variant: "primary", text: n("Save"), onClick: e, disabled: r })] })] }) }); } //#endregion //#region src/components/Kiosk/SetKiosk/SetKioskStatusMessages.tsx var g = /* @__PURE__ */ e(a(), 1); function _({ messages: e }) { return e != null && e.length ? /* @__PURE__ */ (0, u.jsx)("div", { className: "efp-status-messages", children: e.map(({ id: e, variant: t, title: n }) => { let r = t === "success", i = t === "error"; return /* @__PURE__ */ (0, u.jsxs)("div", { className: (0, g.default)("efp-status-messages__message", { "efp-status-messages__message--success": r, "efp-status-messages__message--error": i }), children: [ r ? /* @__PURE__ */ (0, u.jsx)("i", { className: "icon-checkmark" }) : null, i ? /* @__PURE__ */ (0, u.jsx)("i", { className: "icon-warning-solid" }) : null, n ] }, e); }) }) : null; } //#endregion //#region src/components/Kiosk/SetKiosk/SetKioskComponent.tsx function v({ isSaveDisabled: e, isDeleteDisabled: r, areControlsDisabled: i, confirmOnClose: a, angle: o, uiScale: c, minUiScale: l, maxUiScale: m, uiScaleStep: g, iconSizePercent: v, isInfoVisible: y, statusMessages: b, onClose: x, onDelete: S, onSave: C, onChange: w }) { let [T, E] = (0, s.useState)(null); return /* @__PURE__ */ (0, u.jsx)("div", { className: "efp-set-kiosk-mode-anchor", children: /* @__PURE__ */ (0, u.jsxs)(d, { className: "efp-set-kiosk-mode", children: [ /* @__PURE__ */ (0, u.jsxs)("div", { className: "efp-set-kiosk-mode__header", children: [ /* @__PURE__ */ (0, u.jsx)("img", { src: `${t}icons/dragdrop-solid.svg`, alt: n("Drag and Drop Icon"), width: "24", height: "24" }), /* @__PURE__ */ (0, u.jsx)("span", { className: "efp-no-select", children: T ? T.title : n("Set Kiosk") }), /* @__PURE__ */ (0, u.jsx)("button", { type: "button", draggable: "false", className: "efp-set-kiosk-mode__close", "aria-label": n("Close"), onClick: () => { let e = () => { E(null); }, t = () => { x == null || x(), E(null); }; T ? e() : a ? E({ title: n("Leave without saving?"), content: /* @__PURE__ */ (0, u.jsxs)("span", { children: [n("You have changes that "), /* @__PURE__ */ (0, u.jsx)("strong", { children: n("haven't been saved.") })] }), confirmLabel: n("Keep editing"), cancelLabel: n("Leave"), onCancel: t, onConfirm: e, confirmVariant: "primary", cancelVariant: "danger" }) : t(); }, children: /* @__PURE__ */ (0, u.jsx)("i", { className: "icon-close" }) }) ] }), !T && /* @__PURE__ */ (0, u.jsx)(_, { messages: b }), y ? /* @__PURE__ */ (0, u.jsx)(p, { list: [{ id: "1", image: { src: `${t}icons/tap.svg`, alt: n("Tap to set or move kiosk.") }, content: /* @__PURE__ */ (0, u.jsxs)("span", { children: [ n("Tap to "), /* @__PURE__ */ (0, u.jsx)("strong", { children: n("set or move") }), n(" kiosk.") ] }) }, { id: "2", image: { src: `${t}icons/rotate.svg`, alt: n("Zoom and rotate the map before saving.") }, content: /* @__PURE__ */ (0, u.jsxs)("span", { children: [/* @__PURE__ */ (0, u.jsx)("strong", { children: n("Zoom and rotate") }), n(" the map before saving.")] }) }] }) : /* @__PURE__ */ (0, u.jsx)(u.Fragment, { children: T ? /* @__PURE__ */ (0, u.jsx)(f, { ...T }) : /* @__PURE__ */ (0, u.jsx)(h, { isSaveDisabled: e, isDeleteDisabled: r, areControlsDisabled: i, onSave: () => { C == null || C(), E(null); }, onDelete: () => { E({ title: n("Delete kiosk?"), content: /* @__PURE__ */ (0, u.jsxs)("span", { children: [n("Are you sure you want to "), /* @__PURE__ */ (0, u.jsx)("strong", { children: n("delete this kiosk?") })] }), confirmLabel: n("Cancel"), cancelLabel: n("Delete"), onConfirm: () => { E(null); }, onCancel: () => { S == null || S(), E(null); }, confirmVariant: "gray", cancelVariant: "danger" }); }, angle: o, onRotateIcon: (e) => w == null ? void 0 : w({ angle: e }), uiScale: c, minUiScale: l, maxUiScale: m, uiScaleStep: g, onUiScaleChange: (e) => w == null ? void 0 : w({ scale: e }), iconSizePercent: v, onChangeIconSizePercent: (e) => w == null ? void 0 : w({ percent: e }) }) }) ] }) }); } //#endregion //#region src/components/Kiosk/SetKiosk/constants.ts var y = "expofp-kiosk", b = "expofp-kiosk-stats-id", x = "interactive-kiosk", S = "Your Location", C = "kiosk_"; //#endregion //#region src/components/Kiosk/SetKiosk/storage.ts async function w(e) { localStorage.setItem(y, JSON.stringify(e)); } async function T() { localStorage.removeItem(y); } function E() { let e = localStorage.getItem(y); if (e) try { return JSON.parse(e); } catch (e) { console.warn(e); return; } } //#endregion //#region src/components/Kiosk/kioskApi.ts var D = { "Content-Type": "application/json" }; function O(e, t) { let n = new URL(e, t); return n.searchParams.set("expoKey", window.__efpEvent), n.toString(); } async function k(e, t) { try { var n; let r = await fetch(O("/api/kiosks", t), { method: "POST", headers: D, body: JSON.stringify(e) }); return r.ok ? (n = (await r.json()).key) == null ? null : n : (console.error("createKiosk", r.status, r.statusText), null); } catch (e) { return console.error("createKiosk", e), null; } } async function A(e, t) { let n = localStorage.getItem(b); if (n) try { let r = await fetch(O("/api/kiosks", t), { method: "POST", headers: D, body: JSON.stringify({ ...e, key: n }) }); r.ok || console.error("updateKiosk", r.status, r.statusText); } catch (e) { console.error("updateKiosk", e); } } //#endregion export { w as a, b as c, v as d, l as f, T as i, y as l, A as n, S as o, E as r, x as s, k as t, C as u }; ;/* vite-per-chunk-css */ __vite_inject_css__(".efp-set-kiosk-mode-anchor{bottom:calc(1.25rem * var(--ui-scale));z-index:9999;pointer-events:none;position:fixed;left:50%;transform:translate(-50%)}.efp-set-kiosk-mode{width:calc(23.75rem * var(--ui-scale));background:var(--color-primary);border-radius:var(--border-radius-xl);box-shadow:var(--shadow-md);pointer-events:auto;line-height:1;display:grid}.efp-set-kiosk-mode__header{padding:calc(.625rem * var(--ui-scale)) calc(1rem * var(--ui-scale));font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);color:var(--color-white);text-align:center;grid-template-columns:auto 1fr auto;place-items:center;display:grid}.efp-set-kiosk-mode__header i{font-size:var(--icon-size-xl)}.efp-set-kiosk-mode__header img{width:var(--icon-size-xl);height:var(--icon-size-xl)}.efp-set-kiosk-mode__close{box-shadow:none;cursor:pointer;background:0 0;border:0;margin:0;padding:0}.efp-confirm-dialog{background:var(--color-white);box-shadow:var(--shadow-md);border-radius:var(--border-radius-xl);padding:calc(1rem * var(--ui-scale)) calc(1.125rem * var(--ui-scale));gap:calc(1rem * var(--ui-scale));display:grid;position:relative}.efp-confirm-dialog__content{font-size:var(--font-size-xl);font-weight:var(--font-weight-normal)}.efp-confirm-dialog__content strong{font-weight:var(--font-weight-medium)}.efp-confirm-dialog__controls{gap:calc(.625rem * var(--ui-scale));grid-template-columns:1fr 1fr;display:grid}.efp-info-message{border-radius:var(--border-radius-xl);padding:calc(1rem * var(--ui-scale)) calc(1.125rem * var(--ui-scale));background:var(--color-white);gap:calc(.5rem * var(--ui-scale));display:grid;position:relative}.efp-info-message__item{gap:calc(.625rem * var(--ui-scale));font-size:var(--font-size-xl);font-weight:var(--font-weight-normal);grid-auto-flow:column;place-content:flex-start;place-items:center;line-height:1;display:grid}.efp-info-message__item strong{font-weight:var(--font-weight-bold)}.efp-info-message__img{width:calc(1.875rem * var(--ui-scale));height:calc(1.875rem * var(--ui-scale))}.efp-set-kiosk-form{border-radius:var(--border-radius-xl);background:var(--color-white);padding:calc(1rem * var(--ui-scale)) calc(1.125rem * var(--ui-scale));display:grid;position:relative}.efp-set-kiosk-form__content{gap:calc(1rem * var(--ui-scale));display:grid}.efp-set-kiosk-form__inputs{gap:calc(.625rem * var(--ui-scale));display:grid}.efp-set-kiosk-form__controls{gap:calc(.625rem * var(--ui-scale));grid-template-columns:1fr 2fr;display:grid}.efp-range-input{gap:calc(.3125rem * var(--ui-scale));width:100%;font-size:var(--font-size-lg);display:grid}.efp-range-input__header{text-align:center;color:var(--color-black);font-size:var(--font-size-lg);font-weight:var(--font-weight-normal);grid-template-columns:auto 1fr auto;place-items:center;display:grid}.efp-range-input__header strong{font-weight:var(--font-weight-medium)}.efp-range-input__control{width:calc(1.25rem * var(--ui-scale));height:calc(1.25rem * var(--ui-scale));box-shadow:none;cursor:pointer;border:0;outline:none;place-content:center;place-items:center;margin:0;padding:0;display:grid}.efp-range-input__control i{font-size:var(--icon-size-xxs)}.efp-range-input__input-block{width:100%;height:calc(1.375rem * var(--ui-scale));place-items:center;display:grid;position:relative}.efp-range-input__input{opacity:0;z-index:2;width:100%;height:100%;position:absolute;top:0;bottom:0;left:0;right:0}.efp-range-input__custom-input{height:calc(.375rem * var(--ui-scale));background:var(--color-gray-400);border-radius:calc(.1875rem * var(--ui-scale));pointer-events:none;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.efp-range-input__progress{background:var(--color-primary);border-radius:inherit;height:100%;position:absolute;top:0}.efp-range-input__progress:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}.efp-range-input__progress:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}.efp-range-input__progress:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}.efp-range-input__progress:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}.efp-range-input__thumb{width:calc(1.375rem * var(--ui-scale));height:calc(1.375rem * var(--ui-scale));background:var(--color-white);border:calc(.1875rem * var(--ui-scale)) solid var(--color-primary-dark);pointer-events:none;box-shadow:var(--shadow-sm);border-radius:50%;position:absolute;top:50%}.efp-range-input__thumb:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}.efp-range-input__thumb:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}.efp-range-input__thumb:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}.efp-range-input__thumb:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}.efp-status-messages{height:calc(calc(2.75rem * var(--ui-scale)) + var(--border-radius-2xl));border-radius:var(--border-radius-xl);grid-template-rows:1fr;display:grid;position:absolute;top:0;left:0;right:0;overflow:hidden}.efp-status-messages__message{gap:calc(.375rem * var(--ui-scale));color:var(--color-white);font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);padding-bottom:var(--border-radius-2xl);grid-auto-flow:column;place-content:center;place-items:center;display:grid}.efp-status-messages__message i{font-size:var(--icon-size-md)}.efp-status-messages__message--success{background:var(--color-green)}.efp-status-messages__message--error{background:var(--color-red)}\n/*$vite$:1*/", "kioskApi.css", false);