@expofp/floorplan 0.0.0-experimental.2d6c681
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/browser/Button-DT-Jfwrb.js +64 -0
- package/dist/browser/CookieConsent-BIsWzAiP.js +38 -0
- package/dist/browser/Debug-B5mmo0ZX.js +53 -0
- package/dist/browser/DebugTools-Y0aycjKM.js +1931 -0
- package/dist/browser/Demo-B2klxORi.js +71 -0
- package/dist/browser/Free-suULW-LU.js +69 -0
- package/dist/browser/GalleryContainer-BGBNGRKU.js +3355 -0
- package/dist/browser/GpsLoader-Idv0kq5D.js +154 -0
- package/dist/browser/KioskStore-Dg9jaX5d.js +250 -0
- package/dist/browser/LayerStore-CK6wLW56.js +24105 -0
- package/dist/browser/MaplibreAdapter-uZUhZfFW.js +36770 -0
- package/dist/browser/ModalContainer-DWm8vEaI.js +148 -0
- package/dist/browser/PermissionNotice-DaqnuHln.js +54 -0
- package/dist/browser/RouteStore-NE2I9tiF.js +3715 -0
- package/dist/browser/SetKioskMode-Dwlf5w7q.js +49 -0
- package/dist/browser/ShowKiosk-Cr-QmIUT.js +82 -0
- package/dist/browser/ViewerMenuPanel-CTAjGsq2.js +133 -0
- package/dist/browser/add-debug-secret-listener-BECnIMzo.js +55 -0
- package/dist/browser/adopt-global-settings-U-KbyxMd.js +185 -0
- package/dist/browser/boolean-editor-CYMx87em.js +149 -0
- package/dist/browser/bootIntercom-BqQsnxII.js +37 -0
- package/dist/browser/bundle.json +422 -0
- package/dist/browser/camera-events-DSCuSH25.js +18 -0
- package/dist/browser/classnames-YcGXWNfg.js +39 -0
- package/dist/browser/client-BcPpS_Gj.js +7402 -0
- package/dist/browser/compat-helper.js +6 -0
- package/dist/browser/components-BjEhhgf2.js +7393 -0
- package/dist/browser/create-live-plan-BaEGBhGA.js +4046 -0
- package/dist/browser/debounce-raMZ2DqK.js +2102 -0
- package/dist/browser/debug-context-CNBgUWR8.js +24315 -0
- package/dist/browser/debug-overlay-B__pFwQg.js +1455 -0
- package/dist/browser/debug-ui-BaE8MZQX.js +86 -0
- package/dist/browser/dist-C1NaWqk4.js +2611 -0
- package/dist/browser/dist-Cx8u0gjK.js +21 -0
- package/dist/browser/dist-wOC6gYFh.js +205 -0
- package/dist/browser/efp-debug-init-CozbueIl.js +245 -0
- package/dist/browser/enum-editor-CkiQPgZv.js +34 -0
- package/dist/browser/es5-B__Ovz45.js +1712 -0
- package/dist/browser/event-head-C_inMpbD.js +56 -0
- package/dist/browser/event-not-found-Z2mJBZE3.js +31 -0
- package/dist/browser/expofp-overlay.png +0 -0
- package/dist/browser/expofpUrl-jBUlvkwz.js +19 -0
- package/dist/browser/exports-CvUYw1h6.js +1525 -0
- package/dist/browser/favicon-BkDrYTmU.js +12 -0
- package/dist/browser/fetch-retry.umd-2B2pCUIS.js +78 -0
- package/dist/browser/flex-3lSivw8z.js +823 -0
- package/dist/browser/floorplan.loader-CGzIMplb.js +3282 -0
- package/dist/browser/floorplan.ready-r96zV9bP.js +1448 -0
- package/dist/browser/fonts/efp-symbols.woff +0 -0
- package/dist/browser/fonts/inter-400.woff2 +0 -0
- package/dist/browser/fonts/inter-500.woff2 +0 -0
- package/dist/browser/fonts/inter-600.woff2 +0 -0
- package/dist/browser/fonts/oswald-v17-cyrillic_latin-300.woff +0 -0
- package/dist/browser/fonts/oswald-v17-cyrillic_latin-500.woff +0 -0
- package/dist/browser/freeBanner-CnrBc9Tl.js +22 -0
- package/dist/browser/fuse-B7V1lkoA.js +1177 -0
- package/dist/browser/i18n-BgFBhYOU.js +7205 -0
- package/dist/browser/icons/accessible.svg +5 -0
- package/dist/browser/icons/arrow-down.svg +3 -0
- package/dist/browser/icons/bus-white.svg +3 -0
- package/dist/browser/icons/check.svg +3 -0
- package/dist/browser/icons/clear.svg +4 -0
- package/dist/browser/icons/departure.svg +5 -0
- package/dist/browser/icons/departure_inactive.svg +5 -0
- package/dist/browser/icons/destination.svg +5 -0
- package/dist/browser/icons/direction.svg +54 -0
- package/dist/browser/icons/dots.svg +4 -0
- package/dist/browser/icons/dragdrop-solid.svg +11 -0
- package/dist/browser/icons/facebook.svg +4 -0
- package/dist/browser/icons/from.svg +4 -0
- package/dist/browser/icons/kiosk.svg +1 -0
- package/dist/browser/icons/linkedin.svg +3 -0
- package/dist/browser/icons/rotate.svg +5 -0
- package/dist/browser/icons/tap.svg +5 -0
- package/dist/browser/icons/to.svg +4 -0
- package/dist/browser/icons/transition.svg +7 -0
- package/dist/browser/icons/transition_down.svg +15 -0
- package/dist/browser/icons/transition_up.svg +15 -0
- package/dist/browser/icons/twitter.svg +3 -0
- package/dist/browser/icons/yah.svg +17 -0
- package/dist/browser/index.html +139 -0
- package/dist/browser/index.js +254 -0
- package/dist/browser/index.module-kJmnWg5B.js +153 -0
- package/dist/browser/integrateKiosk-D45vYRsm.js +35 -0
- package/dist/browser/is-debug-BRHdrnKr.js +197 -0
- package/dist/browser/is-own-domain-DNvxb9Ph.js +26 -0
- package/dist/browser/is-webview-cTH4yz8f.js +12 -0
- package/dist/browser/journey-plan-DtL28HMP.js +1865 -0
- package/dist/browser/jsx-runtime-DQgnuS-I.js +30 -0
- package/dist/browser/kiosk-mode-DfkGlDkT.js +28 -0
- package/dist/browser/kiosk-record-JAEq8SV6.js +18 -0
- package/dist/browser/kioskUrlParam-CnYhnC_7.js +141 -0
- package/dist/browser/lib--J2yQXt6.js +1910 -0
- package/dist/browser/loadImage-DzSnRAxX.js +30 -0
- package/dist/browser/locales/ar.json +228 -0
- package/dist/browser/locales/da.json +229 -0
- package/dist/browser/locales/de.json +228 -0
- package/dist/browser/locales/es.json +228 -0
- package/dist/browser/locales/fr.json +228 -0
- package/dist/browser/locales/he.json +228 -0
- package/dist/browser/locales/it.json +228 -0
- package/dist/browser/locales/kk.json +228 -0
- package/dist/browser/locales/ko.json +228 -0
- package/dist/browser/locales/mn.json +228 -0
- package/dist/browser/locales/nl.json +228 -0
- package/dist/browser/locales/pl.json +228 -0
- package/dist/browser/locales/pt.json +228 -0
- package/dist/browser/locales/ru.json +228 -0
- package/dist/browser/locales/sv.json +228 -0
- package/dist/browser/locales/th.json +228 -0
- package/dist/browser/locales/tr.json +228 -0
- package/dist/browser/locales/uk.json +228 -0
- package/dist/browser/locales/vi.json +228 -0
- package/dist/browser/locales/zh.json +228 -0
- package/dist/browser/logDeviceInfo-BTqyv9Xe.js +58 -0
- package/dist/browser/mobx-C-kcS0zI.js +43 -0
- package/dist/browser/mobx.module-BOCLFB5I.js +2064 -0
- package/dist/browser/optional-boolean-editor-ZncW2HBw.js +20 -0
- package/dist/browser/optional-enum-editor-Dkzs9jDN.js +34 -0
- package/dist/browser/optional-string-editor-DC9PMUWB.js +30 -0
- package/dist/browser/particles.min-eC5xdOrB.js +133 -0
- package/dist/browser/react-DqPP-mkq.js +301 -0
- package/dist/browser/react-dom-BkVzoZWO.js +139 -0
- package/dist/browser/rolldown-runtime-DUb2xvRc.js +28 -0
- package/dist/browser/scheduler-NBuuaWIe.js +212 -0
- package/dist/browser/select-Cxf-YiNA.js +1367 -0
- package/dist/browser/settings-D74eG9h8.js +9 -0
- package/dist/browser/settings-item-DUUbKec_.js +76 -0
- package/dist/browser/store-q_CTsixH.js +58 -0
- package/dist/browser/string-editor-CINOmY_C.js +30 -0
- package/dist/browser/text-field-DORaOVht.js +88 -0
- package/dist/browser/theme-DyFm9MGz.js +2803 -0
- package/dist/browser/ui-DsCU3FV6.js +43 -0
- package/dist/browser/useRenderTarget-RFckzUJM.js +57 -0
- package/dist/browser/vendor/perfect-scrollbar/css/perfect-scrollbar.css +1 -0
- package/dist/browser/vendor/sanitize-css/sanitize.css +1 -0
- package/dist/browser/venue-public-BA3x-n4N.js +296 -0
- package/dist/browser/venues-DKpIy-87.js +447 -0
- package/dist/browser/viewport-B7plho3P.js +48 -0
- package/dist/browser/warning.png +0 -0
- package/dist/esm/_misc_to_move/initHtmlHead.d.ts +2 -0
- package/dist/esm/_misc_to_move/initHtmlHead.js +34 -0
- package/dist/esm/_misc_to_move/logBuildInfo.d.ts +2 -0
- package/dist/esm/_misc_to_move/logBuildInfo.js +35 -0
- package/dist/esm/_misc_to_move/logDeviceInfo.d.ts +10 -0
- package/dist/esm/_misc_to_move/logDeviceInfo.js +84 -0
- package/dist/esm/components/AlertContainer.d.ts +4 -0
- package/dist/esm/components/AlertContainer.js +8 -0
- package/dist/esm/components/AutocompleteContainer.d.ts +4 -0
- package/dist/esm/components/AutocompleteContainer.js +14 -0
- package/dist/esm/components/BaseFilterModal.d.ts +11 -0
- package/dist/esm/components/BaseFilterModal.js +73 -0
- package/dist/esm/components/Bookmarks.d.ts +3 -0
- package/dist/esm/components/Bookmarks.js +26 -0
- package/dist/esm/components/Booth/Booth.d.ts +5 -0
- package/dist/esm/components/Booth/Booth.js +135 -0
- package/dist/esm/components/Booth/BoothOnHold.d.ts +13 -0
- package/dist/esm/components/Booth/BoothOnHold.js +11 -0
- package/dist/esm/components/Booth/BoothReserved.d.ts +3 -0
- package/dist/esm/components/Booth/BoothReserved.js +7 -0
- package/dist/esm/components/Booth/BoothSpecial.d.ts +8 -0
- package/dist/esm/components/Booth/BoothSpecial.js +4 -0
- package/dist/esm/components/Booth/BoothWithoutExhibitor.d.ts +13 -0
- package/dist/esm/components/Booth/BoothWithoutExhibitor.js +29 -0
- package/dist/esm/components/Category.d.ts +5 -0
- package/dist/esm/components/Category.js +25 -0
- package/dist/esm/components/CategoryFilterModal.d.ts +3 -0
- package/dist/esm/components/CategoryFilterModal.js +63 -0
- package/dist/esm/components/CookieConsent.d.ts +9 -0
- package/dist/esm/components/CookieConsent.js +9 -0
- package/dist/esm/components/Debug.d.ts +5 -0
- package/dist/esm/components/Debug.js +15 -0
- package/dist/esm/components/Demo.d.ts +4 -0
- package/dist/esm/components/Demo.js +37 -0
- package/dist/esm/components/DownloadListContainer.d.ts +5 -0
- package/dist/esm/components/DownloadListContainer.js +8 -0
- package/dist/esm/components/EntityItemContainer.d.ts +28 -0
- package/dist/esm/components/EntityItemContainer.js +36 -0
- package/dist/esm/components/EntityList.d.ts +9 -0
- package/dist/esm/components/EntityList.js +144 -0
- package/dist/esm/components/EntityListRow.d.ts +13 -0
- package/dist/esm/components/EntityListRow.js +78 -0
- package/dist/esm/components/ErrorBoundary.d.ts +15 -0
- package/dist/esm/components/ErrorBoundary.js +29 -0
- package/dist/esm/components/Event.d.ts +5 -0
- package/dist/esm/components/Event.js +167 -0
- package/dist/esm/components/EventBadgeContainer.d.ts +8 -0
- package/dist/esm/components/EventBadgeContainer.js +29 -0
- package/dist/esm/components/Exhibitor.d.ts +5 -0
- package/dist/esm/components/Exhibitor.js +299 -0
- package/dist/esm/components/Filter.d.ts +4 -0
- package/dist/esm/components/Filter.js +24 -0
- package/dist/esm/components/Free.d.ts +4 -0
- package/dist/esm/components/Free.js +31 -0
- package/dist/esm/components/GalleryContainer.d.ts +6 -0
- package/dist/esm/components/GalleryContainer.js +55 -0
- package/dist/esm/components/GlobalErrorMessage.d.ts +4 -0
- package/dist/esm/components/GlobalErrorMessage.js +9 -0
- package/dist/esm/components/GpsLoader.d.ts +5 -0
- package/dist/esm/components/GpsLoader.js +29 -0
- package/dist/esm/components/HeatmapLegendContainer.d.ts +5 -0
- package/dist/esm/components/HeatmapLegendContainer.js +13 -0
- package/dist/esm/components/HighlightTextContainer.d.ts +6 -0
- package/dist/esm/components/HighlightTextContainer.js +10 -0
- package/dist/esm/components/IntercomLauncher.d.ts +5 -0
- package/dist/esm/components/IntercomLauncher.js +20 -0
- package/dist/esm/components/JourneyPanel.d.ts +35 -0
- package/dist/esm/components/JourneyPanel.js +68 -0
- package/dist/esm/components/Kiosk/KioskStore.d.ts +60 -0
- package/dist/esm/components/Kiosk/KioskStore.js +411 -0
- package/dist/esm/components/Kiosk/SetKiosk/Confirm/ConfirmDialog.d.ts +5 -0
- package/dist/esm/components/Kiosk/SetKiosk/Confirm/ConfirmDialog.js +8 -0
- package/dist/esm/components/Kiosk/SetKiosk/FormInput/RangeInput.d.ts +5 -0
- package/dist/esm/components/Kiosk/SetKiosk/FormInput/RangeInput.js +24 -0
- package/dist/esm/components/Kiosk/SetKiosk/Message/InfoMessage.d.ts +5 -0
- package/dist/esm/components/Kiosk/SetKiosk/Message/InfoMessage.js +7 -0
- package/dist/esm/components/Kiosk/SetKiosk/SetKioskComponent.d.ts +5 -0
- package/dist/esm/components/Kiosk/SetKiosk/SetKioskComponent.js +78 -0
- package/dist/esm/components/Kiosk/SetKiosk/SetKioskForm.d.ts +5 -0
- package/dist/esm/components/Kiosk/SetKiosk/SetKioskForm.js +10 -0
- package/dist/esm/components/Kiosk/SetKiosk/SetKioskStatusMessages.d.ts +5 -0
- package/dist/esm/components/Kiosk/SetKiosk/SetKioskStatusMessages.js +15 -0
- package/dist/esm/components/Kiosk/SetKiosk/constants.d.ts +6 -0
- package/dist/esm/components/Kiosk/SetKiosk/constants.js +6 -0
- package/dist/esm/components/Kiosk/SetKiosk/getKioskUrlParamKey.d.ts +2 -0
- package/dist/esm/components/Kiosk/SetKiosk/getKioskUrlParamKey.js +4 -0
- package/dist/esm/components/Kiosk/SetKiosk/getName.d.ts +2 -0
- package/dist/esm/components/Kiosk/SetKiosk/getName.js +2 -0
- package/dist/esm/components/Kiosk/SetKiosk/getSlug.d.ts +2 -0
- package/dist/esm/components/Kiosk/SetKiosk/getSlug.js +2 -0
- package/dist/esm/components/Kiosk/SetKiosk/index.d.ts +7 -0
- package/dist/esm/components/Kiosk/SetKiosk/index.js +6 -0
- package/dist/esm/components/Kiosk/SetKiosk/storage.d.ts +5 -0
- package/dist/esm/components/Kiosk/SetKiosk/storage.js +21 -0
- package/dist/esm/components/Kiosk/SetKiosk/types.d.ts +109 -0
- package/dist/esm/components/Kiosk/SetKiosk/types.js +1 -0
- package/dist/esm/components/Kiosk/SetKioskMode.d.ts +3 -0
- package/dist/esm/components/Kiosk/SetKioskMode.js +35 -0
- package/dist/esm/components/Kiosk/ShowKiosk.d.ts +3 -0
- package/dist/esm/components/Kiosk/ShowKiosk.js +72 -0
- package/dist/esm/components/Kiosk/integrateKiosk.d.ts +10 -0
- package/dist/esm/components/Kiosk/integrateKiosk.js +68 -0
- package/dist/esm/components/Kiosk/kiosk-mode.d.ts +26 -0
- package/dist/esm/components/Kiosk/kiosk-mode.js +56 -0
- package/dist/esm/components/Kiosk/kiosk-record.d.ts +23 -0
- package/dist/esm/components/Kiosk/kiosk-record.js +29 -0
- package/dist/esm/components/Kiosk/kioskApi.d.ts +4 -0
- package/dist/esm/components/Kiosk/kioskApi.js +47 -0
- package/dist/esm/components/Kiosk/kioskUrlParam.d.ts +8 -0
- package/dist/esm/components/Kiosk/kioskUrlParam.js +46 -0
- package/dist/esm/components/Kiosk/recoverKioskFromUrlPrams.d.ts +2 -0
- package/dist/esm/components/Kiosk/recoverKioskFromUrlPrams.js +9 -0
- package/dist/esm/components/Language.d.ts +4 -0
- package/dist/esm/components/Language.js +15 -0
- package/dist/esm/components/LanguageRowContainer.d.ts +7 -0
- package/dist/esm/components/LanguageRowContainer.js +9 -0
- package/dist/esm/components/Layout.d.ts +11 -0
- package/dist/esm/components/Layout.js +160 -0
- package/dist/esm/components/LevelBadgeContainer.d.ts +6 -0
- package/dist/esm/components/LevelBadgeContainer.js +10 -0
- package/dist/esm/components/List.d.ts +9 -0
- package/dist/esm/components/List.js +77 -0
- package/dist/esm/components/LogoOverlay.d.ts +3 -0
- package/dist/esm/components/LogoOverlay.js +78 -0
- package/dist/esm/components/Map/Map.d.ts +2 -0
- package/dist/esm/components/Map/Map.js +242 -0
- package/dist/esm/components/Map/MapCamera.d.ts +17 -0
- package/dist/esm/components/Map/MapCamera.js +194 -0
- package/dist/esm/components/Map/MapCursorCoords.d.ts +13 -0
- package/dist/esm/components/Map/MapCursorCoords.js +61 -0
- package/dist/esm/components/Map/MapViewport.d.ts +12 -0
- package/dist/esm/components/Map/MapViewport.js +29 -0
- package/dist/esm/components/Map/booth-by-xy.d.ts +14 -0
- package/dist/esm/components/Map/booth-by-xy.js +128 -0
- package/dist/esm/components/Map/camera-events.d.ts +19 -0
- package/dist/esm/components/Map/camera-events.js +26 -0
- package/dist/esm/components/Map/camera.d.ts +48 -0
- package/dist/esm/components/Map/camera.js +43 -0
- package/dist/esm/components/Map/drawing/config/BoothDrawerBase.d.ts +8 -0
- package/dist/esm/components/Map/drawing/config/BoothDrawerBase.js +8 -0
- package/dist/esm/components/Map/drawing/config/BoothShape.d.ts +7 -0
- package/dist/esm/components/Map/drawing/config/BoothShape.js +76 -0
- package/dist/esm/components/Map/drawing/config/TextFitter.d.ts +11 -0
- package/dist/esm/components/Map/drawing/config/TextFitter.js +174 -0
- package/dist/esm/components/Map/drawing/config/booth-badge-anchor.d.ts +130 -0
- package/dist/esm/components/Map/drawing/config/booth-badge-anchor.js +306 -0
- package/dist/esm/components/Map/drawing/config/booth-logos.d.ts +38 -0
- package/dist/esm/components/Map/drawing/config/booth-logos.js +94 -0
- package/dist/esm/components/Map/drawing/config/canvases.d.ts +96 -0
- package/dist/esm/components/Map/drawing/config/canvases.js +434 -0
- package/dist/esm/components/Map/drawing/config/config-all.d.ts +6 -0
- package/dist/esm/components/Map/drawing/config/config-all.js +92 -0
- package/dist/esm/components/Map/drawing/config/config-bg.d.ts +8 -0
- package/dist/esm/components/Map/drawing/config/config-bg.js +54 -0
- package/dist/esm/components/Map/drawing/config/config-booth-badge-eligibility.d.ts +28 -0
- package/dist/esm/components/Map/drawing/config/config-booth-badge-eligibility.js +7 -0
- package/dist/esm/components/Map/drawing/config/config-booth-badge-scale.d.ts +20 -0
- package/dist/esm/components/Map/drawing/config/config-booth-badge-scale.js +11 -0
- package/dist/esm/components/Map/drawing/config/config-booth-badge-visibility.d.ts +37 -0
- package/dist/esm/components/Map/drawing/config/config-booth-badge-visibility.js +3 -0
- package/dist/esm/components/Map/drawing/config/config-booth-badge.d.ts +90 -0
- package/dist/esm/components/Map/drawing/config/config-booth-badge.js +326 -0
- package/dist/esm/components/Map/drawing/config/config-booth-bg.d.ts +33 -0
- package/dist/esm/components/Map/drawing/config/config-booth-bg.js +240 -0
- package/dist/esm/components/Map/drawing/config/config-booth-bookmark.d.ts +24 -0
- package/dist/esm/components/Map/drawing/config/config-booth-bookmark.js +65 -0
- package/dist/esm/components/Map/drawing/config/config-booth-border.d.ts +12 -0
- package/dist/esm/components/Map/drawing/config/config-booth-border.js +92 -0
- package/dist/esm/components/Map/drawing/config/config-booth-labels-special.d.ts +28 -0
- package/dist/esm/components/Map/drawing/config/config-booth-labels-special.js +147 -0
- package/dist/esm/components/Map/drawing/config/config-booth-labels.d.ts +63 -0
- package/dist/esm/components/Map/drawing/config/config-booth-labels.js +380 -0
- package/dist/esm/components/Map/drawing/config/config-booths.d.ts +5 -0
- package/dist/esm/components/Map/drawing/config/config-booths.js +152 -0
- package/dist/esm/components/Map/drawing/config/config-load-layer.d.ts +4 -0
- package/dist/esm/components/Map/drawing/config/config-load-layer.js +119 -0
- package/dist/esm/components/Map/drawing/config/config-markers.d.ts +42 -0
- package/dist/esm/components/Map/drawing/config/config-markers.js +278 -0
- package/dist/esm/components/Map/drawing/config/config-outdoor-poi.d.ts +19 -0
- package/dist/esm/components/Map/drawing/config/config-outdoor-poi.js +96 -0
- package/dist/esm/components/Map/drawing/config/config-pins.d.ts +40 -0
- package/dist/esm/components/Map/drawing/config/config-pins.js +533 -0
- package/dist/esm/components/Map/drawing/config/label-inset.d.ts +26 -0
- package/dist/esm/components/Map/drawing/config/label-inset.js +26 -0
- package/dist/esm/components/Map/drawing/config/layer-images.d.ts +24 -0
- package/dist/esm/components/Map/drawing/config/layer-images.js +32 -0
- package/dist/esm/components/Map/drawing/config/layer-models.d.ts +31 -0
- package/dist/esm/components/Map/drawing/config/layer-models.js +38 -0
- package/dist/esm/components/Map/drawing/config/loadBoothsImages.d.ts +45 -0
- package/dist/esm/components/Map/drawing/config/loadBoothsImages.js +99 -0
- package/dist/esm/components/Map/drawing/config/pin-geometry.d.ts +65 -0
- package/dist/esm/components/Map/drawing/config/pin-geometry.js +75 -0
- package/dist/esm/components/Map/drawing/config/poi-pin-shape.d.ts +100 -0
- package/dist/esm/components/Map/drawing/config/poi-pin-shape.js +51 -0
- package/dist/esm/components/Map/drawing/config/poi-pin.d.ts +10 -0
- package/dist/esm/components/Map/drawing/config/poi-pin.js +88 -0
- package/dist/esm/components/Map/drawing/config/selection-style.d.ts +12 -0
- package/dist/esm/components/Map/drawing/config/selection-style.js +18 -0
- package/dist/esm/components/Map/framing-rect.d.ts +16 -0
- package/dist/esm/components/Map/framing-rect.js +24 -0
- package/dist/esm/components/Map/pointer.d.ts +79 -0
- package/dist/esm/components/Map/pointer.js +181 -0
- package/dist/esm/components/Map/scene.d.ts +20 -0
- package/dist/esm/components/Map/scene.js +24 -0
- package/dist/esm/components/Map/traffic/UpdateQueue.d.ts +13 -0
- package/dist/esm/components/Map/traffic/UpdateQueue.js +82 -0
- package/dist/esm/components/Map/traffic/trafficLayers.d.ts +12 -0
- package/dist/esm/components/Map/traffic/trafficLayers.js +29 -0
- package/dist/esm/components/Map/traffic/useBuildRoute.d.ts +9 -0
- package/dist/esm/components/Map/traffic/useBuildRoute.js +359 -0
- package/dist/esm/components/Map/traffic/useManageTraffic.d.ts +10 -0
- package/dist/esm/components/Map/traffic/useManageTraffic.js +643 -0
- package/dist/esm/components/Map/viewport.d.ts +63 -0
- package/dist/esm/components/Map/viewport.js +82 -0
- package/dist/esm/components/Map/with-kiosk.d.ts +11 -0
- package/dist/esm/components/Map/with-kiosk.js +25 -0
- package/dist/esm/components/MapControlsContainer.d.ts +3 -0
- package/dist/esm/components/MapControlsContainer.js +58 -0
- package/dist/esm/components/Maplibre/CollapsedAttributionControl.d.ts +12 -0
- package/dist/esm/components/Maplibre/CollapsedAttributionControl.js +19 -0
- package/dist/esm/components/Maplibre/ExpofpLogoControl.d.ts +20 -0
- package/dist/esm/components/Maplibre/ExpofpLogoControl.js +39 -0
- package/dist/esm/components/Maplibre/MaplibreAdapter.d.ts +18 -0
- package/dist/esm/components/Maplibre/MaplibreAdapter.js +354 -0
- package/dist/esm/components/Maplibre/MaplibreWrapper.d.ts +111 -0
- package/dist/esm/components/Maplibre/MaplibreWrapper.js +310 -0
- package/dist/esm/components/Maplibre/maplibre-recovery.d.ts +4 -0
- package/dist/esm/components/Maplibre/maplibre-recovery.js +4 -0
- package/dist/esm/components/Maplibre/styles/mapbox-streets-bright.d.ts +3 -0
- package/dist/esm/components/Maplibre/styles/mapbox-streets-bright.js +7048 -0
- package/dist/esm/components/Maplibre/styles/mapbox-streets.d.ts +3 -0
- package/dist/esm/components/Maplibre/styles/mapbox-streets.js +6132 -0
- package/dist/esm/components/Maplibre/useCameraReactions.d.ts +14 -0
- package/dist/esm/components/Maplibre/useCameraReactions.js +256 -0
- package/dist/esm/components/Maplibre/useDimming.d.ts +25 -0
- package/dist/esm/components/Maplibre/useDimming.js +61 -0
- package/dist/esm/components/Maplibre/useJourneyConnector.d.ts +16 -0
- package/dist/esm/components/Maplibre/useJourneyConnector.js +175 -0
- package/dist/esm/components/Maplibre/useKioskCameraEvents.d.ts +20 -0
- package/dist/esm/components/Maplibre/useKioskCameraEvents.js +52 -0
- package/dist/esm/components/Maplibre/useLayerVisibilitySync.d.ts +25 -0
- package/dist/esm/components/Maplibre/useLayerVisibilitySync.js +85 -0
- package/dist/esm/components/Maplibre/usePoiMarkers.d.ts +25 -0
- package/dist/esm/components/Maplibre/usePoiMarkers.js +368 -0
- package/dist/esm/components/Maplibre/useVenueCameraTracking.d.ts +6 -0
- package/dist/esm/components/Maplibre/useVenueCameraTracking.js +115 -0
- package/dist/esm/components/Maplibre/useVenueLayers.d.ts +15 -0
- package/dist/esm/components/Maplibre/useVenueLayers.js +463 -0
- package/dist/esm/components/Maplibre/useWayfindingAndMarkers.d.ts +11 -0
- package/dist/esm/components/Maplibre/useWayfindingAndMarkers.js +23 -0
- package/dist/esm/components/Maplibre/utils/basemap-palette.d.ts +19 -0
- package/dist/esm/components/Maplibre/utils/basemap-palette.js +125 -0
- package/dist/esm/components/Maplibre/utils/geo-config.d.ts +92 -0
- package/dist/esm/components/Maplibre/utils/geo-config.js +305 -0
- package/dist/esm/components/Maplibre/utils/hit-test-registry.d.ts +18 -0
- package/dist/esm/components/Maplibre/utils/hit-test-registry.js +17 -0
- package/dist/esm/components/Maplibre/utils/layer-defs.d.ts +9 -0
- package/dist/esm/components/Maplibre/utils/layer-defs.js +19 -0
- package/dist/esm/components/Maplibre/utils/local-viewport.d.ts +13 -0
- package/dist/esm/components/Maplibre/utils/local-viewport.js +31 -0
- package/dist/esm/components/Maplibre/utils/map-helpers.d.ts +21 -0
- package/dist/esm/components/Maplibre/utils/map-helpers.js +85 -0
- package/dist/esm/components/Maplibre/utils/map-theme.d.ts +20 -0
- package/dist/esm/components/Maplibre/utils/map-theme.js +44 -0
- package/dist/esm/components/Maplibre/utils/marker-layer-order.d.ts +22 -0
- package/dist/esm/components/Maplibre/utils/marker-layer-order.js +20 -0
- package/dist/esm/components/Maplibre/utils/pmtiles-range-fallback.d.ts +53 -0
- package/dist/esm/components/Maplibre/utils/pmtiles-range-fallback.js +110 -0
- package/dist/esm/components/Maplibre/utils/poi-marker-hit-test.d.ts +8 -0
- package/dist/esm/components/Maplibre/utils/poi-marker-hit-test.js +8 -0
- package/dist/esm/components/Maplibre/utils/resolve-map-style.d.ts +19 -0
- package/dist/esm/components/Maplibre/utils/resolve-map-style.js +73 -0
- package/dist/esm/components/Maplibre/utils/solver.d.ts +23 -0
- package/dist/esm/components/Maplibre/utils/solver.js +238 -0
- package/dist/esm/components/Maplibre/utils/style-fonts.d.ts +10 -0
- package/dist/esm/components/Maplibre/utils/style-fonts.js +24 -0
- package/dist/esm/components/Maplibre/utils/venue-calibration-console.d.ts +10 -0
- package/dist/esm/components/Maplibre/utils/venue-calibration-console.js +130 -0
- package/dist/esm/components/Maplibre/utils/venue-calibration.d.ts +127 -0
- package/dist/esm/components/Maplibre/utils/venue-calibration.js +144 -0
- package/dist/esm/components/Maplibre/utils/venue-camera-target.d.ts +15 -0
- package/dist/esm/components/Maplibre/utils/venue-camera-target.js +19 -0
- package/dist/esm/components/Maplibre/utils/venue-contour.d.ts +50 -0
- package/dist/esm/components/Maplibre/utils/venue-contour.fixture.d.ts +18 -0
- package/dist/esm/components/Maplibre/utils/venue-contour.fixture.js +69 -0
- package/dist/esm/components/Maplibre/utils/venue-contour.js +188 -0
- package/dist/esm/components/Maplibre/utils/venue-focus.d.ts +26 -0
- package/dist/esm/components/Maplibre/utils/venue-focus.js +106 -0
- package/dist/esm/components/Maplibre/utils/venue-legibility.d.ts +30 -0
- package/dist/esm/components/Maplibre/utils/venue-legibility.js +52 -0
- package/dist/esm/components/Maplibre/utils/venue-pin-rasterize.d.ts +88 -0
- package/dist/esm/components/Maplibre/utils/venue-pin-rasterize.js +220 -0
- package/dist/esm/components/Maplibre/utils/venue-projection.d.ts +37 -0
- package/dist/esm/components/Maplibre/utils/venue-projection.js +88 -0
- package/dist/esm/components/Maplibre/utils/venue-tap-hit-test.d.ts +9 -0
- package/dist/esm/components/Maplibre/utils/venue-tap-hit-test.js +9 -0
- package/dist/esm/components/Maplibre/utils/venue-viewport-detail.d.ts +19 -0
- package/dist/esm/components/Maplibre/utils/venue-viewport-detail.js +24 -0
- package/dist/esm/components/Maplibre/utils/venue-zoom.d.ts +23 -0
- package/dist/esm/components/Maplibre/utils/venue-zoom.js +62 -0
- package/dist/esm/components/Menu.d.ts +11 -0
- package/dist/esm/components/Menu.js +94 -0
- package/dist/esm/components/MobileToggleButtonContainer.d.ts +3 -0
- package/dist/esm/components/MobileToggleButtonContainer.js +24 -0
- package/dist/esm/components/ModalContainer.d.ts +41 -0
- package/dist/esm/components/ModalContainer.js +10 -0
- package/dist/esm/components/MultiSelectGroupsContainer.d.ts +5 -0
- package/dist/esm/components/MultiSelectGroupsContainer.js +8 -0
- package/dist/esm/components/OverlayContainer.d.ts +8 -0
- package/dist/esm/components/OverlayContainer.js +82 -0
- package/dist/esm/components/OverlayGripContainer.d.ts +4 -0
- package/dist/esm/components/OverlayGripContainer.js +11 -0
- package/dist/esm/components/OverlayParticles.d.ts +5 -0
- package/dist/esm/components/OverlayParticles.js +54 -0
- package/dist/esm/components/PlanSelectorContainer.d.ts +3 -0
- package/dist/esm/components/PlanSelectorContainer.js +79 -0
- package/dist/esm/components/RebookingNotesContainer.d.ts +4 -0
- package/dist/esm/components/RebookingNotesContainer.js +8 -0
- package/dist/esm/components/RebookingRadioGroupContainer.d.ts +6 -0
- package/dist/esm/components/RebookingRadioGroupContainer.js +23 -0
- package/dist/esm/components/RoutePlanner/RoutePlanner.d.ts +5 -0
- package/dist/esm/components/RoutePlanner/RoutePlanner.js +25 -0
- package/dist/esm/components/RoutePlanner/RoutePlannerHeader.d.ts +4 -0
- package/dist/esm/components/RoutePlanner/RoutePlannerHeader.js +11 -0
- package/dist/esm/components/RoutePlanner/RoutePlannerStartPoint.d.ts +9 -0
- package/dist/esm/components/RoutePlanner/RoutePlannerStartPoint.js +21 -0
- package/dist/esm/components/RoutePlanner/RoutePlannerStopItem.d.ts +9 -0
- package/dist/esm/components/RoutePlanner/RoutePlannerStopItem.js +41 -0
- package/dist/esm/components/RouteQR.d.ts +12 -0
- package/dist/esm/components/RouteQR.js +10 -0
- package/dist/esm/components/Schedule.d.ts +13 -0
- package/dist/esm/components/Schedule.js +109 -0
- package/dist/esm/components/ScrollableRowContainer.d.ts +6 -0
- package/dist/esm/components/ScrollableRowContainer.js +11 -0
- package/dist/esm/components/Search.d.ts +5 -0
- package/dist/esm/components/Search.js +45 -0
- package/dist/esm/components/SearchBox.d.ts +7 -0
- package/dist/esm/components/SearchBox.js +171 -0
- package/dist/esm/components/SearchButtons/SearchButton.d.ts +20 -0
- package/dist/esm/components/SearchButtons/SearchButton.js +30 -0
- package/dist/esm/components/SearchButtons/SearchButtons.d.ts +4 -0
- package/dist/esm/components/SearchButtons/SearchButtons.js +25 -0
- package/dist/esm/components/SearchButtons/SearchSubButton.d.ts +14 -0
- package/dist/esm/components/SearchButtons/SearchSubButton.js +12 -0
- package/dist/esm/components/SearchButtons/SearchSubButtons.d.ts +5 -0
- package/dist/esm/components/SearchButtons/SearchSubButtons.js +43 -0
- package/dist/esm/components/SearchButtons/index.d.ts +7 -0
- package/dist/esm/components/SearchButtons/index.js +5 -0
- package/dist/esm/components/Sessions.d.ts +8 -0
- package/dist/esm/components/Sessions.js +128 -0
- package/dist/esm/components/SessionsFiltersModal.d.ts +11 -0
- package/dist/esm/components/SessionsFiltersModal.js +105 -0
- package/dist/esm/components/SessionsList.d.ts +12 -0
- package/dist/esm/components/SessionsList.js +212 -0
- package/dist/esm/components/ShareContainer.d.ts +7 -0
- package/dist/esm/components/ShareContainer.js +29 -0
- package/dist/esm/components/Shortcuts/ShortcutButton.d.ts +9 -0
- package/dist/esm/components/Shortcuts/ShortcutButton.js +25 -0
- package/dist/esm/components/Shortcuts/ShortcutsFiltersButton.d.ts +9 -0
- package/dist/esm/components/Shortcuts/ShortcutsFiltersButton.js +41 -0
- package/dist/esm/components/Shortcuts/ShortcutsToolbar.d.ts +10 -0
- package/dist/esm/components/Shortcuts/ShortcutsToolbar.js +22 -0
- package/dist/esm/components/Shortcuts/index.d.ts +4 -0
- package/dist/esm/components/Shortcuts/index.js +4 -0
- package/dist/esm/components/ShowMoreButtonContainer.d.ts +5 -0
- package/dist/esm/components/ShowMoreButtonContainer.js +8 -0
- package/dist/esm/components/SidebarActionsContainer.d.ts +5 -0
- package/dist/esm/components/SidebarActionsContainer.js +8 -0
- package/dist/esm/components/SimpleRowContainer.d.ts +8 -0
- package/dist/esm/components/SimpleRowContainer.js +8 -0
- package/dist/esm/components/Speaker.d.ts +5 -0
- package/dist/esm/components/Speaker.js +72 -0
- package/dist/esm/components/Speakers.d.ts +8 -0
- package/dist/esm/components/Speakers.js +63 -0
- package/dist/esm/components/SpeakersFiltersModal.d.ts +11 -0
- package/dist/esm/components/SpeakersFiltersModal.js +77 -0
- package/dist/esm/components/TourPoints.d.ts +4 -0
- package/dist/esm/components/TourPoints.js +20 -0
- package/dist/esm/components/Tours.d.ts +7 -0
- package/dist/esm/components/Tours.js +54 -0
- package/dist/esm/components/ToursList.d.ts +10 -0
- package/dist/esm/components/ToursList.js +22 -0
- package/dist/esm/components/ViewerMenuPanel.d.ts +5 -0
- package/dist/esm/components/ViewerMenuPanel.js +61 -0
- package/dist/esm/components/Visited.d.ts +4 -0
- package/dist/esm/components/Visited.js +13 -0
- package/dist/esm/components/WayInformation.d.ts +14 -0
- package/dist/esm/components/WayInformation.js +8 -0
- package/dist/esm/components/Wayfinding.d.ts +4 -0
- package/dist/esm/components/Wayfinding.js +285 -0
- package/dist/esm/components/WayfindingFloorSelectorContainer.d.ts +5 -0
- package/dist/esm/components/WayfindingFloorSelectorContainer.js +12 -0
- package/dist/esm/components/WayfindingTemplate.d.ts +66 -0
- package/dist/esm/components/WayfindingTemplate.js +14 -0
- package/dist/esm/components/Ws.d.ts +5 -0
- package/dist/esm/components/Ws.js +131 -0
- package/dist/esm/components/YahRow.d.ts +8 -0
- package/dist/esm/components/YahRow.js +25 -0
- package/dist/esm/components/gps/GpsManager.d.ts +13 -0
- package/dist/esm/components/gps/GpsManager.js +60 -0
- package/dist/esm/components/gps/GpsPermissionRequest.d.ts +8 -0
- package/dist/esm/components/gps/GpsPermissionRequest.js +10 -0
- package/dist/esm/components/gps/index.d.ts +5 -0
- package/dist/esm/components/gps/index.js +3 -0
- package/dist/esm/components/gps/types.d.ts +7 -0
- package/dist/esm/components/gps/types.js +1 -0
- package/dist/esm/components/gps/useUserLocationAndHeading.d.ts +8 -0
- package/dist/esm/components/gps/useUserLocationAndHeading.js +122 -0
- package/dist/esm/components/gps/utils.d.ts +5 -0
- package/dist/esm/components/gps/utils.js +11 -0
- package/dist/esm/components/heatmap-legend-ticks.d.ts +11 -0
- package/dist/esm/components/heatmap-legend-ticks.js +18 -0
- package/dist/esm/components/index.d.ts +114 -0
- package/dist/esm/components/index.js +76 -0
- package/dist/esm/components/utils/entity-venue-grouping.d.ts +32 -0
- package/dist/esm/components/utils/entity-venue-grouping.js +43 -0
- package/dist/esm/components/utils/getDescription.d.ts +19 -0
- package/dist/esm/components/utils/getDescription.js +35 -0
- package/dist/esm/constants.d.ts +44 -0
- package/dist/esm/constants.js +66 -0
- package/dist/esm/data/fp-payloads.d.ts +27 -0
- package/dist/esm/data/fp-payloads.js +53 -0
- package/dist/esm/data/fpGeo.d.ts +45 -0
- package/dist/esm/data/fpGeo.js +9 -0
- package/dist/esm/data/index.d.ts +15 -0
- package/dist/esm/data/index.js +15 -0
- package/dist/esm/data/layer-viewbox.d.ts +10 -0
- package/dist/esm/data/layer-viewbox.js +20 -0
- package/dist/esm/data/svg.d.ts +43 -0
- package/dist/esm/data/svg.js +210 -0
- package/dist/esm/data/tours.json +280 -0
- package/dist/esm/data/venue-scene-preload.d.ts +34 -0
- package/dist/esm/data/venue-scene-preload.js +205 -0
- package/dist/esm/data/venues.d.ts +145 -0
- package/dist/esm/data/venues.js +955 -0
- package/dist/esm/engine/defs.d.ts +38 -0
- package/dist/esm/engine/defs.js +85 -0
- package/dist/esm/engine/fonts.d.ts +9 -0
- package/dist/esm/engine/fonts.js +12 -0
- package/dist/esm/engine/update-def.d.ts +55 -0
- package/dist/esm/engine/update-def.js +127 -0
- package/dist/esm/engine/utils/rotation.d.ts +13 -0
- package/dist/esm/engine/utils/rotation.js +73 -0
- package/dist/esm/floorplan.loader.d.ts +164 -0
- package/dist/esm/floorplan.loader.js +540 -0
- package/dist/esm/floorplan.ready.d.ts +149 -0
- package/dist/esm/floorplan.ready.js +1083 -0
- package/dist/esm/hooks/useURLFilters.d.ts +15 -0
- package/dist/esm/hooks/useURLFilters.js +44 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/intercom/bootIntercom.d.ts +3 -0
- package/dist/esm/intercom/bootIntercom.js +47 -0
- package/dist/esm/intercom/index.d.ts +3 -0
- package/dist/esm/intercom/index.js +1 -0
- package/dist/esm/intercom/shouldLoad.d.ts +4 -0
- package/dist/esm/intercom/shouldLoad.js +74 -0
- package/dist/esm/intercom/types.d.ts +6 -0
- package/dist/esm/intercom/types.js +1 -0
- package/dist/esm/internal-settings.d.ts +13 -0
- package/dist/esm/internal-settings.js +6 -0
- package/dist/esm/journey/external-navigation.d.ts +30 -0
- package/dist/esm/journey/external-navigation.js +38 -0
- package/dist/esm/journey/format-distance.d.ts +14 -0
- package/dist/esm/journey/format-distance.js +38 -0
- package/dist/esm/journey/index.d.ts +16 -0
- package/dist/esm/journey/index.js +15 -0
- package/dist/esm/journey/journey-context.d.ts +140 -0
- package/dist/esm/journey/journey-context.js +137 -0
- package/dist/esm/journey/journey-link.d.ts +49 -0
- package/dist/esm/journey/journey-link.js +35 -0
- package/dist/esm/journey/journey-stage.d.ts +35 -0
- package/dist/esm/journey/journey-stage.js +28 -0
- package/dist/esm/journey/maps-provider.d.ts +36 -0
- package/dist/esm/journey/maps-provider.js +58 -0
- package/dist/esm/journey/plan-journey.d.ts +37 -0
- package/dist/esm/journey/plan-journey.js +176 -0
- package/dist/esm/journey/types.d.ts +294 -0
- package/dist/esm/journey/types.js +1 -0
- package/dist/esm/load-dev.d.ts +44 -0
- package/dist/esm/load-dev.js +60 -0
- package/dist/esm/load.d.ts +17 -0
- package/dist/esm/load.js +244 -0
- package/dist/esm/locales.d.ts +25 -0
- package/dist/esm/locales.js +23 -0
- package/dist/esm/offline/constants.d.ts +5 -0
- package/dist/esm/offline/constants.js +4 -0
- package/dist/esm/offline/offlineManager.d.ts +2 -0
- package/dist/esm/offline/offlineManager.js +78 -0
- package/dist/esm/plan-lifecycle.d.ts +65 -0
- package/dist/esm/plan-lifecycle.js +97 -0
- package/dist/esm/schemas/sdk.schemas.d.ts +25 -0
- package/dist/esm/schemas/sdk.schemas.js +24 -0
- package/dist/esm/services/URLFilterManager.d.ts +39 -0
- package/dist/esm/services/URLFilterManager.js +379 -0
- package/dist/esm/services/multi-slug.d.ts +20 -0
- package/dist/esm/services/multi-slug.js +30 -0
- package/dist/esm/services/url-dispatch.d.ts +22 -0
- package/dist/esm/services/url-dispatch.js +707 -0
- package/dist/esm/services/url-sync.d.ts +40 -0
- package/dist/esm/services/url-sync.js +185 -0
- package/dist/esm/store/BaseFilterStore.d.ts +17 -0
- package/dist/esm/store/BaseFilterStore.js +63 -0
- package/dist/esm/store/BookmarksStore.d.ts +9 -0
- package/dist/esm/store/BookmarksStore.js +28 -0
- package/dist/esm/store/BoothStore.d.ts +105 -0
- package/dist/esm/store/BoothStore.js +194 -0
- package/dist/esm/store/CategoryFilterStore.d.ts +13 -0
- package/dist/esm/store/CategoryFilterStore.js +60 -0
- package/dist/esm/store/CategoryStore.d.ts +21 -0
- package/dist/esm/store/CategoryStore.js +30 -0
- package/dist/esm/store/EventStore.d.ts +56 -0
- package/dist/esm/store/EventStore.js +188 -0
- package/dist/esm/store/ExhibitorStore.d.ts +86 -0
- package/dist/esm/store/ExhibitorStore.js +175 -0
- package/dist/esm/store/FuzzySearchEngineStore.d.ts +15 -0
- package/dist/esm/store/FuzzySearchEngineStore.js +45 -0
- package/dist/esm/store/HeatmapStore.d.ts +51 -0
- package/dist/esm/store/HeatmapStore.js +100 -0
- package/dist/esm/store/IntercomStore.d.ts +7 -0
- package/dist/esm/store/IntercomStore.js +26 -0
- package/dist/esm/store/LayerStore.d.ts +70 -0
- package/dist/esm/store/LayerStore.js +399 -0
- package/dist/esm/store/MaplibreStore.d.ts +71 -0
- package/dist/esm/store/MaplibreStore.js +137 -0
- package/dist/esm/store/OverlayStore.d.ts +32 -0
- package/dist/esm/store/OverlayStore.js +68 -0
- package/dist/esm/store/PoiMarkerStore.d.ts +76 -0
- package/dist/esm/store/PoiMarkerStore.js +97 -0
- package/dist/esm/store/PoiTypeStore.d.ts +8 -0
- package/dist/esm/store/PoiTypeStore.js +6 -0
- package/dist/esm/store/RootStore.d.ts +118 -0
- package/dist/esm/store/RootStore.js +666 -0
- package/dist/esm/store/RoutePlannerStore.d.ts +56 -0
- package/dist/esm/store/RoutePlannerStore.js +322 -0
- package/dist/esm/store/RouteStore.d.ts +138 -0
- package/dist/esm/store/RouteStore.js +692 -0
- package/dist/esm/store/SearchButtonsStore.d.ts +2 -0
- package/dist/esm/store/SearchButtonsStore.js +2 -0
- package/dist/esm/store/SearchStore.d.ts +81 -0
- package/dist/esm/store/SearchStore.js +612 -0
- package/dist/esm/store/SessionsFilterStore.d.ts +53 -0
- package/dist/esm/store/SessionsFilterStore.js +169 -0
- package/dist/esm/store/ShortcutProvider.d.ts +26 -0
- package/dist/esm/store/ShortcutProvider.js +5 -0
- package/dist/esm/store/ShortcutRegistry.d.ts +33 -0
- package/dist/esm/store/ShortcutRegistry.js +130 -0
- package/dist/esm/store/SpeakerFilterStore.d.ts +39 -0
- package/dist/esm/store/SpeakerFilterStore.js +152 -0
- package/dist/esm/store/SpeakerStore.d.ts +45 -0
- package/dist/esm/store/SpeakerStore.js +142 -0
- package/dist/esm/store/SubButtonProvider.d.ts +16 -0
- package/dist/esm/store/SubButtonProvider.js +6 -0
- package/dist/esm/store/SubButtonRegistry.d.ts +16 -0
- package/dist/esm/store/SubButtonRegistry.js +58 -0
- package/dist/esm/store/ToursStore.d.ts +30 -0
- package/dist/esm/store/ToursStore.js +184 -0
- package/dist/esm/store/UIState.d.ts +329 -0
- package/dist/esm/store/UIState.js +2138 -0
- package/dist/esm/store/VenueStore.d.ts +254 -0
- package/dist/esm/store/VenueStore.js +650 -0
- package/dist/esm/store/create-live-plan.d.ts +13 -0
- package/dist/esm/store/create-live-plan.js +25 -0
- package/dist/esm/store/details-events.d.ts +11 -0
- package/dist/esm/store/details-events.js +76 -0
- package/dist/esm/store/floor-activated-notifier.d.ts +18 -0
- package/dist/esm/store/floor-activated-notifier.js +22 -0
- package/dist/esm/store/index.d.ts +3 -0
- package/dist/esm/store/index.js +14 -0
- package/dist/esm/store/init/index.d.ts +3 -0
- package/dist/esm/store/init/index.js +20 -0
- package/dist/esm/store/init/init-booths.d.ts +6 -0
- package/dist/esm/store/init/init-booths.js +306 -0
- package/dist/esm/store/init/init-categories.d.ts +3 -0
- package/dist/esm/store/init/init-categories.js +28 -0
- package/dist/esm/store/init/init-events.d.ts +3 -0
- package/dist/esm/store/init/init-events.js +45 -0
- package/dist/esm/store/init/init-exhibitors.d.ts +3 -0
- package/dist/esm/store/init/init-exhibitors.js +71 -0
- package/dist/esm/store/init/init-heatmap.d.ts +3 -0
- package/dist/esm/store/init/init-heatmap.js +37 -0
- package/dist/esm/store/init/init-layers.d.ts +8 -0
- package/dist/esm/store/init/init-layers.js +151 -0
- package/dist/esm/store/init/init-poiTypes.d.ts +3 -0
- package/dist/esm/store/init/init-poiTypes.js +6 -0
- package/dist/esm/store/init/init-speakers.d.ts +3 -0
- package/dist/esm/store/init/init-speakers.js +20 -0
- package/dist/esm/store/init/init-ui.d.ts +13 -0
- package/dist/esm/store/init/init-ui.js +155 -0
- package/dist/esm/store/journey-plan.d.ts +89 -0
- package/dist/esm/store/journey-plan.js +291 -0
- package/dist/esm/store/live-store.d.ts +19 -0
- package/dist/esm/store/live-store.js +26 -0
- package/dist/esm/store/outdoor-poi-filter.d.ts +21 -0
- package/dist/esm/store/outdoor-poi-filter.js +33 -0
- package/dist/esm/store/providers/SearchShortcutProvider.d.ts +13 -0
- package/dist/esm/store/providers/SearchShortcutProvider.js +59 -0
- package/dist/esm/store/providers/SessionsShortcutProvider.d.ts +17 -0
- package/dist/esm/store/providers/SessionsShortcutProvider.js +221 -0
- package/dist/esm/store/providers/SessionsSubButtonProvider.d.ts +33 -0
- package/dist/esm/store/providers/SessionsSubButtonProvider.js +100 -0
- package/dist/esm/store/providers/SpeakerShortcutProvider.d.ts +12 -0
- package/dist/esm/store/providers/SpeakerShortcutProvider.js +73 -0
- package/dist/esm/store/reveal-layer.d.ts +29 -0
- package/dist/esm/store/reveal-layer.js +25 -0
- package/dist/esm/store/search-buttons/SearchButtonsActions.d.ts +55 -0
- package/dist/esm/store/search-buttons/SearchButtonsActions.js +363 -0
- package/dist/esm/store/search-buttons/SearchButtonsFactory.d.ts +37 -0
- package/dist/esm/store/search-buttons/SearchButtonsFactory.js +291 -0
- package/dist/esm/store/search-buttons/SearchButtonsFilters.d.ts +20 -0
- package/dist/esm/store/search-buttons/SearchButtonsFilters.js +157 -0
- package/dist/esm/store/search-buttons/SearchButtonsState.d.ts +24 -0
- package/dist/esm/store/search-buttons/SearchButtonsState.js +125 -0
- package/dist/esm/store/search-buttons/SearchButtonsStore.d.ts +73 -0
- package/dist/esm/store/search-buttons/SearchButtonsStore.js +364 -0
- package/dist/esm/store/search-buttons/constants.d.ts +24 -0
- package/dist/esm/store/search-buttons/constants.js +24 -0
- package/dist/esm/store/search-buttons/index.d.ts +8 -0
- package/dist/esm/store/search-buttons/index.js +7 -0
- package/dist/esm/store/search-buttons/utils.d.ts +6 -0
- package/dist/esm/store/search-buttons/utils.js +34 -0
- package/dist/esm/store/types.d.ts +213 -0
- package/dist/esm/store/types.js +1 -0
- package/dist/esm/store/venue-public.d.ts +10 -0
- package/dist/esm/store/venue-public.js +14 -0
- package/dist/esm/store/venue-selection.d.ts +45 -0
- package/dist/esm/store/venue-selection.js +101 -0
- package/dist/esm/test/store-harness.d.ts +32 -0
- package/dist/esm/test/store-harness.js +116 -0
- package/dist/esm/tools/base-runtime-url.d.ts +3 -0
- package/dist/esm/tools/base-runtime-url.js +23 -0
- package/dist/esm/tools/debounce.d.ts +2 -0
- package/dist/esm/tools/debounce.js +10 -0
- package/dist/esm/tools/debugCanvases.d.ts +3 -0
- package/dist/esm/tools/debugCanvases.js +3 -0
- package/dist/esm/tools/event-not-found.d.ts +18 -0
- package/dist/esm/tools/event-not-found.js +50 -0
- package/dist/esm/tools/event-scoped-cache.d.ts +13 -0
- package/dist/esm/tools/event-scoped-cache.js +47 -0
- package/dist/esm/tools/expofpUrl.d.ts +7 -0
- package/dist/esm/tools/expofpUrl.js +10 -0
- package/dist/esm/tools/freeBanner.d.ts +5 -0
- package/dist/esm/tools/freeBanner.js +11 -0
- package/dist/esm/tools/gtag.d.ts +66 -0
- package/dist/esm/tools/gtag.js +287 -0
- package/dist/esm/tools/handleDebugMode.d.ts +19 -0
- package/dist/esm/tools/handleDebugMode.js +61 -0
- package/dist/esm/tools/has-html-tags.d.ts +2 -0
- package/dist/esm/tools/has-html-tags.js +3 -0
- package/dist/esm/tools/id.d.ts +2 -0
- package/dist/esm/tools/id.js +5 -0
- package/dist/esm/tools/loaders.d.ts +5 -0
- package/dist/esm/tools/loaders.js +67 -0
- package/dist/esm/tools/logger.d.ts +38 -0
- package/dist/esm/tools/logger.js +87 -0
- package/dist/esm/tools/rebooking-config.d.ts +10 -0
- package/dist/esm/tools/rebooking-config.js +19 -0
- package/dist/esm/tools/rebookingUrl.d.ts +11 -0
- package/dist/esm/tools/rebookingUrl.js +27 -0
- package/dist/esm/tools/report-error.d.ts +2 -0
- package/dist/esm/tools/report-error.js +134 -0
- package/dist/esm/tools/reset.d.ts +2 -0
- package/dist/esm/tools/reset.js +35 -0
- package/dist/esm/tools/sentry.d.ts +7 -0
- package/dist/esm/tools/sentry.js +166 -0
- package/dist/esm/tools/settings.d.ts +36 -0
- package/dist/esm/tools/settings.js +110 -0
- package/dist/esm/tools/slug.d.ts +2 -0
- package/dist/esm/tools/slug.js +27 -0
- package/dist/esm/tools/strip-html.d.ts +2 -0
- package/dist/esm/tools/strip-html.js +7 -0
- package/dist/esm/tools/style-registry.d.ts +28 -0
- package/dist/esm/tools/style-registry.js +46 -0
- package/dist/esm/tools/telemetry.d.ts +37 -0
- package/dist/esm/tools/telemetry.js +266 -0
- package/dist/esm/tools/track-event.d.ts +28 -0
- package/dist/esm/tools/track-event.js +196 -0
- package/dist/esm/tools/webgl-logger.d.ts +2 -0
- package/dist/esm/tools/webgl-logger.js +31 -0
- package/dist/esm/types/drawing.types.d.ts +18 -0
- package/dist/esm/types/drawing.types.js +1 -0
- package/dist/esm/types/sdk.types.d.ts +49 -0
- package/dist/esm/types/sdk.types.js +6 -0
- package/dist/esm/types.d.ts +593 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/utils/_OLD_gpu-info.d.ts +6 -0
- package/dist/esm/utils/_OLD_gpu-info.js +23 -0
- package/dist/esm/utils/_OLD_should-use-backdrop.d.ts +3 -0
- package/dist/esm/utils/_OLD_should-use-backdrop.js +4 -0
- package/dist/esm/utils/areLayersEnabled.d.ts +2 -0
- package/dist/esm/utils/areLayersEnabled.js +4 -0
- package/dist/esm/utils/blob-image-size.d.ts +27 -0
- package/dist/esm/utils/blob-image-size.js +37 -0
- package/dist/esm/utils/brand.d.ts +18 -0
- package/dist/esm/utils/brand.js +19 -0
- package/dist/esm/utils/browser.d.ts +4 -0
- package/dist/esm/utils/browser.js +4 -0
- package/dist/esm/utils/calcSpeed.d.ts +2 -0
- package/dist/esm/utils/calcSpeed.js +5 -0
- package/dist/esm/utils/calcTravelTime.d.ts +2 -0
- package/dist/esm/utils/calcTravelTime.js +3 -0
- package/dist/esm/utils/camera-map-settings.d.ts +26 -0
- package/dist/esm/utils/camera-map-settings.js +86 -0
- package/dist/esm/utils/color-gradient.d.ts +2 -0
- package/dist/esm/utils/color-gradient.js +14 -0
- package/dist/esm/utils/customCommands.d.ts +2 -0
- package/dist/esm/utils/customCommands.js +33 -0
- package/dist/esm/utils/detectLimitedModeViaImage.d.ts +2 -0
- package/dist/esm/utils/detectLimitedModeViaImage.js +33 -0
- package/dist/esm/utils/dimming.d.ts +27 -0
- package/dist/esm/utils/dimming.js +88 -0
- package/dist/esm/utils/entity-storage.d.ts +14 -0
- package/dist/esm/utils/entity-storage.js +122 -0
- package/dist/esm/utils/event-head.d.ts +38 -0
- package/dist/esm/utils/event-head.js +90 -0
- package/dist/esm/utils/event-now.d.ts +11 -0
- package/dist/esm/utils/event-now.js +40 -0
- package/dist/esm/utils/event-title.d.ts +19 -0
- package/dist/esm/utils/event-title.js +20 -0
- package/dist/esm/utils/eventFullBadge.d.ts +3 -0
- package/dist/esm/utils/eventFullBadge.js +7 -0
- package/dist/esm/utils/eventTime.d.ts +15 -0
- package/dist/esm/utils/eventTime.js +82 -0
- package/dist/esm/utils/extractMetaFromString.d.ts +5 -0
- package/dist/esm/utils/extractMetaFromString.js +16 -0
- package/dist/esm/utils/geo-anchors.d.ts +10 -0
- package/dist/esm/utils/geo-anchors.js +12 -0
- package/dist/esm/utils/geometry.d.ts +2 -0
- package/dist/esm/utils/geometry.js +12 -0
- package/dist/esm/utils/getContrastTextColor.d.ts +2 -0
- package/dist/esm/utils/getContrastTextColor.js +26 -0
- package/dist/esm/utils/getLogoUrl.d.ts +9 -0
- package/dist/esm/utils/getLogoUrl.js +26 -0
- package/dist/esm/utils/getMostFrequent.d.ts +2 -0
- package/dist/esm/utils/getMostFrequent.js +14 -0
- package/dist/esm/utils/getRenderTargetFromRoot.d.ts +2 -0
- package/dist/esm/utils/getRenderTargetFromRoot.js +19 -0
- package/dist/esm/utils/gps.d.ts +40 -0
- package/dist/esm/utils/gps.js +66 -0
- package/dist/esm/utils/heatmap-enabled.d.ts +13 -0
- package/dist/esm/utils/heatmap-enabled.js +13 -0
- package/dist/esm/utils/i18n.d.ts +18 -0
- package/dist/esm/utils/i18n.js +117 -0
- package/dist/esm/utils/index.d.ts +10 -0
- package/dist/esm/utils/index.js +60 -0
- package/dist/esm/utils/is-debug.d.ts +3 -0
- package/dist/esm/utils/is-debug.js +9 -0
- package/dist/esm/utils/is-from-designer.d.ts +3 -0
- package/dist/esm/utils/is-from-designer.js +4 -0
- package/dist/esm/utils/is-iframe.d.ts +3 -0
- package/dist/esm/utils/is-iframe.js +13 -0
- package/dist/esm/utils/is-localhost.d.ts +3 -0
- package/dist/esm/utils/is-localhost.js +11 -0
- package/dist/esm/utils/is-mac.d.ts +3 -0
- package/dist/esm/utils/is-mac.js +2 -0
- package/dist/esm/utils/is-mobile.d.ts +3 -0
- package/dist/esm/utils/is-mobile.js +2 -0
- package/dist/esm/utils/is-own-domain.d.ts +12 -0
- package/dist/esm/utils/is-own-domain.js +23 -0
- package/dist/esm/utils/is-pathway-layer.d.ts +2 -0
- package/dist/esm/utils/is-pathway-layer.js +4 -0
- package/dist/esm/utils/is-phone.d.ts +9 -0
- package/dist/esm/utils/is-phone.js +17 -0
- package/dist/esm/utils/is-scroll-ugly.d.ts +3 -0
- package/dist/esm/utils/is-scroll-ugly.js +13 -0
- package/dist/esm/utils/is-webview.d.ts +3 -0
- package/dist/esm/utils/is-webview.js +2 -0
- package/dist/esm/utils/isNumericLevel.d.ts +2 -0
- package/dist/esm/utils/isNumericLevel.js +3 -0
- package/dist/esm/utils/lazy-qr-code.d.ts +5 -0
- package/dist/esm/utils/lazy-qr-code.js +6 -0
- package/dist/esm/utils/legacy-storage-keys.d.ts +16 -0
- package/dist/esm/utils/legacy-storage-keys.js +38 -0
- package/dist/esm/utils/loadBlob.d.ts +16 -0
- package/dist/esm/utils/loadBlob.js +40 -0
- package/dist/esm/utils/loadCustomCss.d.ts +3 -0
- package/dist/esm/utils/loadCustomCss.js +19 -0
- package/dist/esm/utils/loadIcons.d.ts +3 -0
- package/dist/esm/utils/loadIcons.js +24 -0
- package/dist/esm/utils/loadImage.d.ts +2 -0
- package/dist/esm/utils/loadImage.js +11 -0
- package/dist/esm/utils/loadImagesInBatches.d.ts +22 -0
- package/dist/esm/utils/loadImagesInBatches.js +82 -0
- package/dist/esm/utils/loadLayerImages.d.ts +41 -0
- package/dist/esm/utils/loadLayerImages.js +107 -0
- package/dist/esm/utils/localStorage.d.ts +2 -0
- package/dist/esm/utils/localStorage.js +11 -0
- package/dist/esm/utils/lz-utils.d.ts +8 -0
- package/dist/esm/utils/lz-utils.js +16 -0
- package/dist/esm/utils/mapEntity.d.ts +3 -0
- package/dist/esm/utils/mapEntity.js +82 -0
- package/dist/esm/utils/math.d.ts +6 -0
- package/dist/esm/utils/math.js +7 -0
- package/dist/esm/utils/mobx.d.ts +35 -0
- package/dist/esm/utils/mobx.js +74 -0
- package/dist/esm/utils/outdoor-poi.d.ts +32 -0
- package/dist/esm/utils/outdoor-poi.js +28 -0
- package/dist/esm/utils/plan-reactions.d.ts +20 -0
- package/dist/esm/utils/plan-reactions.js +26 -0
- package/dist/esm/utils/planBearing.d.ts +14 -0
- package/dist/esm/utils/planBearing.js +15 -0
- package/dist/esm/utils/preview-exhibitor.d.ts +11 -0
- package/dist/esm/utils/preview-exhibitor.js +19 -0
- package/dist/esm/utils/rasterize-svg.d.ts +32 -0
- package/dist/esm/utils/rasterize-svg.js +78 -0
- package/dist/esm/utils/responsiveClass.d.ts +2 -0
- package/dist/esm/utils/responsiveClass.js +25 -0
- package/dist/esm/utils/rtl.d.ts +2 -0
- package/dist/esm/utils/rtl.js +4 -0
- package/dist/esm/utils/sanitizeHtml.d.ts +3 -0
- package/dist/esm/utils/sanitizeHtml.js +21 -0
- package/dist/esm/utils/sanitizeText.d.ts +9 -0
- package/dist/esm/utils/sanitizeText.js +19 -0
- package/dist/esm/utils/scene-bounds.d.ts +64 -0
- package/dist/esm/utils/scene-bounds.js +127 -0
- package/dist/esm/utils/shortenName.d.ts +2 -0
- package/dist/esm/utils/shortenName.js +19 -0
- package/dist/esm/utils/silence-mobx-react-lite-warning.d.ts +2 -0
- package/dist/esm/utils/silence-mobx-react-lite-warning.js +24 -0
- package/dist/esm/utils/strEqual.d.ts +2 -0
- package/dist/esm/utils/strEqual.js +3 -0
- package/dist/esm/utils/swappable-proxy.d.ts +28 -0
- package/dist/esm/utils/swappable-proxy.js +71 -0
- package/dist/esm/utils/trackingParams.d.ts +3 -0
- package/dist/esm/utils/trackingParams.js +24 -0
- package/dist/esm/utils/urlEncoding.d.ts +7 -0
- package/dist/esm/utils/urlEncoding.js +62 -0
- package/dist/esm/utils/use-shadow.d.ts +3 -0
- package/dist/esm/utils/use-shadow.js +10 -0
- package/dist/esm/utils/useHeatmapData.d.ts +10 -0
- package/dist/esm/utils/useHeatmapData.js +8 -0
- package/dist/esm/utils/useHeatmapOverlay.d.ts +9 -0
- package/dist/esm/utils/useHeatmapOverlay.js +56 -0
- package/dist/esm/utils/useRenderTarget.d.ts +2 -0
- package/dist/esm/utils/useRenderTarget.js +35 -0
- package/dist/esm/utils/yah_icon.d.ts +6 -0
- package/dist/esm/utils/yah_icon.js +457 -0
- package/dist/esm/wayfinding/adapters/arbitraryPoint.d.ts +32 -0
- package/dist/esm/wayfinding/adapters/arbitraryPoint.js +25 -0
- package/dist/esm/wayfinding/adapters/boothToEndpoint.d.ts +19 -0
- package/dist/esm/wayfinding/adapters/boothToEndpoint.js +32 -0
- package/dist/esm/wayfinding/adapters/campusEndpoints.d.ts +13 -0
- package/dist/esm/wayfinding/adapters/campusEndpoints.js +25 -0
- package/dist/esm/wayfinding/adapters/canvasIconProvider.d.ts +20 -0
- package/dist/esm/wayfinding/adapters/canvasIconProvider.js +73 -0
- package/dist/esm/wayfinding/adapters/floorContext.d.ts +20 -0
- package/dist/esm/wayfinding/adapters/floorContext.js +43 -0
- package/dist/esm/wayfinding/adapters/graphDataSource.d.ts +49 -0
- package/dist/esm/wayfinding/adapters/graphDataSource.js +87 -0
- package/dist/esm/wayfinding/adapters/index.d.ts +10 -0
- package/dist/esm/wayfinding/adapters/index.js +8 -0
- package/dist/esm/wayfinding/adapters/kioskCanvas.d.ts +7 -0
- package/dist/esm/wayfinding/adapters/kioskCanvas.js +22 -0
- package/dist/esm/wayfinding/adapters/positionInput.d.ts +12 -0
- package/dist/esm/wayfinding/adapters/positionInput.js +16 -0
- package/dist/esm/wayfinding/bindMobxReactions.d.ts +28 -0
- package/dist/esm/wayfinding/bindMobxReactions.js +171 -0
- package/dist/esm/wayfinding/createWayfinding.d.ts +34 -0
- package/dist/esm/wayfinding/createWayfinding.js +184 -0
- package/dist/esm/wayfinding/handlers/kioskHandler.d.ts +26 -0
- package/dist/esm/wayfinding/handlers/kioskHandler.js +52 -0
- package/dist/esm/wayfinding/handlers/yahHandler.d.ts +21 -0
- package/dist/esm/wayfinding/handlers/yahHandler.js +42 -0
- package/dist/esm/wayfinding/index.d.ts +12 -0
- package/dist/esm/wayfinding/index.js +9 -0
- package/dist/esm/wayfinding/routeSteps.d.ts +15 -0
- package/dist/esm/wayfinding/routeSteps.js +29 -0
- package/dist/esm/wayfinding/storePorts.d.ts +67 -0
- package/dist/esm/wayfinding/storePorts.js +1 -0
- package/package.json +146 -0
|
@@ -0,0 +1,955 @@
|
|
|
1
|
+
import { Box, convexHull, polygonCentroid, rectCorners } from '@expofp/geometry';
|
|
2
|
+
const ID_PATTERN = /^[a-z0-9_-]+$/;
|
|
3
|
+
const RENDER_MODES = ['scene', 'marker'];
|
|
4
|
+
/** Contract defaults for the size axis (§4). Re-exported by `venue-legibility`. */
|
|
5
|
+
export const DEFAULT_MARKER_MAX_SIZE_PX = 60;
|
|
6
|
+
export const DEFAULT_DETAIL_MIN_SIZE_PX = 240;
|
|
7
|
+
/**
|
|
8
|
+
* Floor for an authored `detailMinSizePx`, and the reason it is not simply 60:
|
|
9
|
+
*
|
|
10
|
+
* 66 is the **marker/scene sticky enter edge** for the contract's defaults —
|
|
11
|
+
* `stickyEnterSizePx(60)`, where the `× 1.1` is the ±10% size hysteresis
|
|
12
|
+
* (`SIZE_HYSTERESIS_RATIO` in `venue-legibility.ts`) — the size at which a
|
|
13
|
+
* venue climbing out of the marker band actually enters the scene band.
|
|
14
|
+
* Clamping here keeps floor detail from beginning before the scene band has
|
|
15
|
+
* been entered.
|
|
16
|
+
*
|
|
17
|
+
* **A literal, never derived** (contract §4, App. C). The contract states the
|
|
18
|
+
* floor to authors as the number 66, and every implementation must hold that
|
|
19
|
+
* number exactly: an author who writes `detailMinSizePx: 66` clears the
|
|
20
|
+
* producer's export gate and must not then be clamped at runtime. Derived, the
|
|
21
|
+
* floor is a float expression the contract cannot promise equals 66 — it does
|
|
22
|
+
* for these two operands, and would stop the moment either the ceiling or the
|
|
23
|
+
* ratio moved, silently invalidating the documented value. So it is written as
|
|
24
|
+
* 66 here and in every other implementation, with the relationship above
|
|
25
|
+
* documented rather than computed.
|
|
26
|
+
*
|
|
27
|
+
* Nor can the relationship be expressed in code: `venue-legibility.ts` imports
|
|
28
|
+
* the band defaults from this module, so the dependency is one-way and
|
|
29
|
+
* `stickyEnterSizePx` is not importable here.
|
|
30
|
+
*
|
|
31
|
+
* It is deliberately NOT "the smallest value above 60" (that would be 61):
|
|
32
|
+
* 61 clears the impossible-range guard below — which needs only
|
|
33
|
+
* `resolvedDetailMinSizePx > resolvedMin`, and a defaulted scene aux resolves
|
|
34
|
+
* `minSizePx` to 60 — but leaves a ~1px-wide scene band wedged between the
|
|
35
|
+
* two sticky edges, which flickers rather than hands off. Do not "simplify"
|
|
36
|
+
* this to `DEFAULT_MARKER_MAX_SIZE_PX + 1`; it silently breaks the handoff.
|
|
37
|
+
*
|
|
38
|
+
* This is the floor for the **default** ceiling. A venue that authors its own
|
|
39
|
+
* `markerMaxSizePx` (Revision 5) gets its floor from {@link detailMinSizeFloor}.
|
|
40
|
+
*/
|
|
41
|
+
export const MIN_DETAIL_MIN_SIZE_PX = 66;
|
|
42
|
+
/** `detailMinSizePx × 10 ≥ markerMaxSizePx × 11` (§4, Revision 5), as its two integer factors. */
|
|
43
|
+
const DETAIL_FLOOR_NUMERATOR = 11;
|
|
44
|
+
const DETAIL_FLOOR_DENOMINATOR = 10;
|
|
45
|
+
/**
|
|
46
|
+
* Whether a detail edge leaves room above a marker edge for the hysteresis
|
|
47
|
+
* band (§4, Revision 5). Stated as the contract's integer comparison rather
|
|
48
|
+
* than `× 1.1`, so every implementation agrees on the boundary exactly.
|
|
49
|
+
*/
|
|
50
|
+
export function detailEdgeClearsMarkerEdge(detailMinSizePx, markerMaxSizePx) {
|
|
51
|
+
return detailMinSizePx * DETAIL_FLOOR_DENOMINATOR >= markerMaxSizePx * DETAIL_FLOOR_NUMERATOR;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The smallest `detailMinSizePx` a venue with this marker edge may carry: the
|
|
55
|
+
* least value satisfying {@link detailEdgeClearsMarkerEdge}. For the default
|
|
56
|
+
* ceiling it is the literal {@link MIN_DETAIL_MIN_SIZE_PX}, so the number §4
|
|
57
|
+
* has always stated to authors cannot drift.
|
|
58
|
+
*/
|
|
59
|
+
export function detailMinSizeFloor(markerMaxSizePx) {
|
|
60
|
+
if (markerMaxSizePx === DEFAULT_MARKER_MAX_SIZE_PX)
|
|
61
|
+
return MIN_DETAIL_MIN_SIZE_PX;
|
|
62
|
+
return Math.ceil((markerMaxSizePx * DETAIL_FLOOR_NUMERATOR) / DETAIL_FLOOR_DENOMINATOR);
|
|
63
|
+
}
|
|
64
|
+
const VENUE_KEYS = new Set([
|
|
65
|
+
'id',
|
|
66
|
+
'name',
|
|
67
|
+
'order',
|
|
68
|
+
'levels',
|
|
69
|
+
'contour',
|
|
70
|
+
'markerPoint',
|
|
71
|
+
'detailMinSizePx',
|
|
72
|
+
'markerMaxSizePx',
|
|
73
|
+
'layers',
|
|
74
|
+
'entrances',
|
|
75
|
+
'campusViewbox',
|
|
76
|
+
]);
|
|
77
|
+
const LEVEL_KEYS = new Set(['layer', 'ordinal', 'name', 'initial']);
|
|
78
|
+
const ENTRANCE_KEYS = new Set(['layer', 'point', 'name']);
|
|
79
|
+
const AUX_KEYS = new Set([
|
|
80
|
+
'layer',
|
|
81
|
+
'render',
|
|
82
|
+
'replacesDefault',
|
|
83
|
+
'suppressesLabel',
|
|
84
|
+
'minSizePx',
|
|
85
|
+
'maxSizePx',
|
|
86
|
+
]);
|
|
87
|
+
/**
|
|
88
|
+
* Codepoint order for venue `id`s — the contract's "alphabetically by `id`"
|
|
89
|
+
* (§9), pinned to one answer every implementation of this contract can
|
|
90
|
+
* reproduce. `localeCompare` cannot: it is ICU-collated, so `hall-1`, `hall_a`
|
|
91
|
+
* and `halla` sort differently across runtimes, and a layer-ownership winner
|
|
92
|
+
* that depends on the reader is exactly what §10 keys off `id` to avoid.
|
|
93
|
+
*/
|
|
94
|
+
export const compareIds = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
95
|
+
const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
96
|
+
const isFiniteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
97
|
+
const isNonEmptyString = (value) => typeof value === 'string' && value.length > 0;
|
|
98
|
+
const isFinitePoint = (value) => isObject(value) && isFiniteNumber(value.x) && isFiniteNumber(value.y);
|
|
99
|
+
const isCampusViewbox = (value) => isObject(value) &&
|
|
100
|
+
isFiniteNumber(value.x) &&
|
|
101
|
+
isFiniteNumber(value.y) &&
|
|
102
|
+
isFiniteNumber(value.width) &&
|
|
103
|
+
isFiniteNumber(value.height) &&
|
|
104
|
+
value.width > 0 &&
|
|
105
|
+
value.height > 0;
|
|
106
|
+
function describe(value) {
|
|
107
|
+
try {
|
|
108
|
+
const serialized = JSON.stringify(value);
|
|
109
|
+
return serialized === undefined ? String(value) : serialized;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return String(value);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function emitDiagnostics(diagnostics) {
|
|
116
|
+
for (const diagnostic of diagnostics) {
|
|
117
|
+
try {
|
|
118
|
+
console.warn('parseVenues:', `${diagnostic.code} (${diagnostic.effect}) ${diagnostic.path || '(root)'}: ${diagnostic.message}; ${diagnostic.consequence}`);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Diagnostics remain available in the result even if a host console is broken.
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function complete(venues, diagnostics, quarantinedLayerNames, campusViewbox = null) {
|
|
126
|
+
emitDiagnostics(diagnostics);
|
|
127
|
+
return { venues, diagnostics, quarantinedLayerNames, campusViewbox };
|
|
128
|
+
}
|
|
129
|
+
function segmentsIntersect(p1, p2, p3, p4) {
|
|
130
|
+
const direction = (a, b, c) => (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
|
|
131
|
+
const d1 = direction(p3, p4, p1);
|
|
132
|
+
const d2 = direction(p3, p4, p2);
|
|
133
|
+
const d3 = direction(p1, p2, p3);
|
|
134
|
+
const d4 = direction(p1, p2, p4);
|
|
135
|
+
if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
const onSegment = (a, b, c) => Math.min(a.x, b.x) <= c.x &&
|
|
139
|
+
c.x <= Math.max(a.x, b.x) &&
|
|
140
|
+
Math.min(a.y, b.y) <= c.y &&
|
|
141
|
+
c.y <= Math.max(a.y, b.y);
|
|
142
|
+
return ((d1 === 0 && onSegment(p3, p4, p1)) ||
|
|
143
|
+
(d2 === 0 && onSegment(p3, p4, p2)) ||
|
|
144
|
+
(d3 === 0 && onSegment(p1, p2, p3)) ||
|
|
145
|
+
(d4 === 0 && onSegment(p1, p2, p4)));
|
|
146
|
+
}
|
|
147
|
+
function validateRing(value) {
|
|
148
|
+
if (!Array.isArray(value))
|
|
149
|
+
return { issue: 'is not an array' };
|
|
150
|
+
if (value.length < 3) {
|
|
151
|
+
return { issue: `has ${value.length} point(s); a ring needs at least 3` };
|
|
152
|
+
}
|
|
153
|
+
if (!value.every(isFinitePoint)) {
|
|
154
|
+
return { issue: 'contains a non-finite or malformed point' };
|
|
155
|
+
}
|
|
156
|
+
const ring = value.map((point) => ({ x: point.x, y: point.y }));
|
|
157
|
+
const first = ring[0];
|
|
158
|
+
const last = ring[ring.length - 1];
|
|
159
|
+
if (first.x === last.x && first.y === last.y)
|
|
160
|
+
ring.pop();
|
|
161
|
+
if (ring.length < 3)
|
|
162
|
+
return { issue: `has ${ring.length} point(s); a ring needs at least 3` };
|
|
163
|
+
const { width, height } = Box.fromPoints(ring).size;
|
|
164
|
+
if (width === 0 || height === 0) {
|
|
165
|
+
return { issue: 'is degenerate (zero width or height)' };
|
|
166
|
+
}
|
|
167
|
+
for (let i = 0; i < ring.length; i++) {
|
|
168
|
+
const a1 = ring[i];
|
|
169
|
+
const a2 = ring[(i + 1) % ring.length];
|
|
170
|
+
for (let j = i + 1; j < ring.length; j++) {
|
|
171
|
+
if (j === i || (j + 1) % ring.length === i || (i + 1) % ring.length === j)
|
|
172
|
+
continue;
|
|
173
|
+
if (segmentsIntersect(a1, a2, ring[j], ring[(j + 1) % ring.length])) {
|
|
174
|
+
return {
|
|
175
|
+
issue: 'is self-intersecting; v1 accepts one simple ring only (no holes, no multi-part)',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
let twiceArea = 0;
|
|
181
|
+
for (let i = 0; i < ring.length; i++) {
|
|
182
|
+
const current = ring[i];
|
|
183
|
+
const next = ring[(i + 1) % ring.length];
|
|
184
|
+
twiceArea += current.x * next.y - next.x * current.y;
|
|
185
|
+
}
|
|
186
|
+
return twiceArea === 0 ? { issue: 'is degenerate (zero area)' } : { ring };
|
|
187
|
+
}
|
|
188
|
+
function deriveLevelHull(levels, geometries) {
|
|
189
|
+
const corners = [];
|
|
190
|
+
for (const candidate of levels) {
|
|
191
|
+
if (!candidate.surviving)
|
|
192
|
+
continue;
|
|
193
|
+
const geometry = geometries.get(candidate.value.layer);
|
|
194
|
+
const bounds = geometry?.rect ?? geometry?.viewbox;
|
|
195
|
+
if (!bounds || bounds.area <= 0)
|
|
196
|
+
continue;
|
|
197
|
+
corners.push(...rectCorners(bounds).map((corner) => ({ x: corner.x, y: corner.y })));
|
|
198
|
+
}
|
|
199
|
+
return convexHull(corners);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Parses a complete venue payload. Candidate entries are validated before any
|
|
203
|
+
* ownership is committed; all surviving levels claim globally before aux refs.
|
|
204
|
+
*/
|
|
205
|
+
export function parseVenues(payload, geometries, sceneCandidates = []) {
|
|
206
|
+
try {
|
|
207
|
+
return parseVenuesInternal(payload, geometries, sceneCandidates);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
const diagnostics = [
|
|
211
|
+
{
|
|
212
|
+
code: 'venues-payload-invalid',
|
|
213
|
+
path: 'venues',
|
|
214
|
+
message: 'could not be parsed',
|
|
215
|
+
consequence: 'plan loads as single-venue',
|
|
216
|
+
effect: 'dropped',
|
|
217
|
+
},
|
|
218
|
+
];
|
|
219
|
+
return complete([], diagnostics, []);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function parseVenuesInternal(payload, geometries, sceneCandidates) {
|
|
223
|
+
const diagnostics = [];
|
|
224
|
+
// One emitter per `effect` (§11), so every site states what the SDK did with
|
|
225
|
+
// the authored value. `code` is the parity key against
|
|
226
|
+
// `docs/specs/validate-venues.mjs`; `message` and `consequence` are prose and
|
|
227
|
+
// are deliberately not compared across implementations.
|
|
228
|
+
const emit = (effect) => (code, path, message, consequence) => diagnostics.push({ code, path, message, consequence, effect });
|
|
229
|
+
const dropped = emit('dropped');
|
|
230
|
+
const fallback = emit('fallback');
|
|
231
|
+
const clamped = emit('clamped');
|
|
232
|
+
const advisory = emit('advisory');
|
|
233
|
+
const reportUnknownKeys = (at, value, knownKeys) => {
|
|
234
|
+
for (const key of Object.keys(value)) {
|
|
235
|
+
if (!knownKeys.has(key)) {
|
|
236
|
+
advisory('unknown-key', `${at}.${key}`, 'is not a contract field', 'ignored by the SDK');
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
/** Runs a probe pass, discarding whatever diagnostics it emitted. */
|
|
241
|
+
const speculative = (probe) => {
|
|
242
|
+
const mark = diagnostics.length;
|
|
243
|
+
try {
|
|
244
|
+
return probe();
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
diagnostics.length = mark;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
const sceneCandidateLayerNames = new Set();
|
|
251
|
+
for (const candidates of sceneCandidates) {
|
|
252
|
+
for (const candidate of candidates)
|
|
253
|
+
sceneCandidateLayerNames.add(candidate.layer);
|
|
254
|
+
}
|
|
255
|
+
if (payload === undefined || payload === null)
|
|
256
|
+
return complete([], diagnostics, []);
|
|
257
|
+
if (!isObject(payload)) {
|
|
258
|
+
dropped('venues-payload-invalid', '', 'payload is not an object', 'nothing to parse');
|
|
259
|
+
return complete([], diagnostics, []);
|
|
260
|
+
}
|
|
261
|
+
const venuesValue = payload.venues;
|
|
262
|
+
if (venuesValue === undefined)
|
|
263
|
+
return complete([], diagnostics, []);
|
|
264
|
+
// An absent `venuesVersion` is read as v1 and reported by nothing here: the
|
|
265
|
+
// config layer supplies `venuesVersion: 1` as a default before venue parsing
|
|
266
|
+
// runs, so absence is indistinguishable from an authored 1 by this point.
|
|
267
|
+
// The field is contractually required (§15) — the requirement lives on the
|
|
268
|
+
// producer's export gate, which the reference validator implements.
|
|
269
|
+
if (payload.venuesVersion !== undefined && payload.venuesVersion !== 1) {
|
|
270
|
+
dropped('venues-version-unsupported', 'venuesVersion', `payload version ${describe(payload.venuesVersion)} is unsupported; SDK supports version 1`, 'whole venues array ignored; plan loads as single-venue');
|
|
271
|
+
return complete([], diagnostics, []);
|
|
272
|
+
}
|
|
273
|
+
if (!Array.isArray(venuesValue)) {
|
|
274
|
+
dropped('venues-payload-invalid', 'venues', 'is not an array', 'plan loads as single-venue');
|
|
275
|
+
return complete([], diagnostics, []);
|
|
276
|
+
}
|
|
277
|
+
const seenIds = new Map();
|
|
278
|
+
const nameOwners = new Map();
|
|
279
|
+
const duplicateNames = new Map();
|
|
280
|
+
venuesValue.forEach((value, index) => {
|
|
281
|
+
if (!isObject(value) || !isNonEmptyString(value.name))
|
|
282
|
+
return;
|
|
283
|
+
const at = `venues[${index}]`;
|
|
284
|
+
const normalized = value.name.toLowerCase();
|
|
285
|
+
const owner = nameOwners.get(normalized);
|
|
286
|
+
if (owner)
|
|
287
|
+
duplicateNames.set(at, owner);
|
|
288
|
+
else
|
|
289
|
+
nameOwners.set(normalized, at);
|
|
290
|
+
});
|
|
291
|
+
const states = venuesValue.map((value, index) => {
|
|
292
|
+
const at = `venues[${index}]`;
|
|
293
|
+
if (!isObject(value)) {
|
|
294
|
+
dropped('venue-identity-invalid', at, 'is not an object', 'venue dropped');
|
|
295
|
+
return {
|
|
296
|
+
at,
|
|
297
|
+
label: at,
|
|
298
|
+
claimable: false,
|
|
299
|
+
order: index,
|
|
300
|
+
levels: [],
|
|
301
|
+
aux: [],
|
|
302
|
+
entrances: [],
|
|
303
|
+
expectedSceneLayers: [],
|
|
304
|
+
referencedLayers: [],
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
reportUnknownKeys(at, value, VENUE_KEYS);
|
|
308
|
+
let claimable = true;
|
|
309
|
+
const id = value.id;
|
|
310
|
+
if (!isNonEmptyString(id)) {
|
|
311
|
+
dropped('venue-identity-invalid', `${at}.id`, 'is missing or not a non-empty string', 'venue dropped');
|
|
312
|
+
claimable = false;
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
if (!ID_PATTERN.test(id)) {
|
|
316
|
+
dropped('venue-identity-invalid', `${at}.id`, `"${id}" must match ${ID_PATTERN} (lowercase alphanumerics, hyphen, underscore)`, 'id is used as a MapLibre feature id, a style-image id and a ?camera[venue]= deep-link value');
|
|
317
|
+
claimable = false;
|
|
318
|
+
}
|
|
319
|
+
if (seenIds.has(id)) {
|
|
320
|
+
dropped('venue-id-duplicate', `${at}.id`, `"${id}" duplicates ${seenIds.get(id)}`, 'this venue dropped');
|
|
321
|
+
claimable = false;
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
seenIds.set(id, at);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const label = isNonEmptyString(id) ? `"${id}"` : at;
|
|
328
|
+
const name = value.name;
|
|
329
|
+
if (!isNonEmptyString(name)) {
|
|
330
|
+
dropped('venue-identity-invalid', `${at}.name`, 'is missing or not a non-empty string', 'venue dropped');
|
|
331
|
+
claimable = false;
|
|
332
|
+
}
|
|
333
|
+
else if (duplicateNames.has(at)) {
|
|
334
|
+
// Advisory since Revision 4 (§9): lookup resolves an `id` only, so a
|
|
335
|
+
// shared display name is an authoring smell — two identical rows in the
|
|
336
|
+
// venue switch — never a reason to delete a building.
|
|
337
|
+
advisory('venue-name-duplicate', `${at}.name`, `"${name}" duplicates the name of ${duplicateNames.get(at)} (case-insensitive)`, 'nothing dropped — two identical rows in the venue switch, ambiguous search results');
|
|
338
|
+
}
|
|
339
|
+
// `order` is contractually required (§9): the venue is never dropped for
|
|
340
|
+
// it, but the fallback to array position is reported so a producer's gate
|
|
341
|
+
// — and Guard 4's preview — can see that the export should have failed.
|
|
342
|
+
let order = index;
|
|
343
|
+
if (Number.isInteger(value.order)) {
|
|
344
|
+
order = value.order;
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
fallback('venue-order-invalid', `${at}.order`, value.order === undefined ? 'is missing' : 'is not an integer', 'falls back to array position; order is contractually required (§9)');
|
|
348
|
+
}
|
|
349
|
+
const referencedLayers = [];
|
|
350
|
+
const rememberReference = (layer, exists = false) => {
|
|
351
|
+
if (isNonEmptyString(layer) &&
|
|
352
|
+
!layer.startsWith('WF') &&
|
|
353
|
+
exists &&
|
|
354
|
+
!referencedLayers.includes(layer)) {
|
|
355
|
+
referencedLayers.push(layer);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
const levelCandidates = [];
|
|
359
|
+
if (!Array.isArray(value.levels) || value.levels.length === 0) {
|
|
360
|
+
dropped('venue-levels-missing', `${at}.levels`, 'is missing or empty', 'venue dropped');
|
|
361
|
+
claimable = false;
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
value.levels.forEach((level, levelIndex) => {
|
|
365
|
+
const levelAt = `${at}.levels[${levelIndex}]`;
|
|
366
|
+
if (!isObject(level)) {
|
|
367
|
+
dropped('level-entry-invalid', levelAt, 'is not an object', 'level dropped');
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
reportUnknownKeys(levelAt, level, LEVEL_KEYS);
|
|
371
|
+
rememberReference(level.layer, geometries.has(level.layer));
|
|
372
|
+
let ok = true;
|
|
373
|
+
if (!isNonEmptyString(level.layer)) {
|
|
374
|
+
dropped('level-layer-invalid', `${levelAt}.layer`, 'is missing or not a non-empty string', 'level dropped');
|
|
375
|
+
ok = false;
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
if (!geometries.has(level.layer)) {
|
|
379
|
+
dropped('level-layer-unknown', `${levelAt}.layer`, `"${level.layer}" does not exist in the plan`, `level dropped; venue ${label} loses this floor (check for a rename or typo)`);
|
|
380
|
+
ok = false;
|
|
381
|
+
}
|
|
382
|
+
if (level.layer.startsWith('WF')) {
|
|
383
|
+
dropped('level-layer-wayfinding', `${levelAt}.layer`, `"${level.layer}" is a wayfinding layer`, 'WF* layers are excluded before the venue model sees them — level dropped');
|
|
384
|
+
ok = false;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (!Number.isInteger(level.ordinal)) {
|
|
388
|
+
dropped('level-ordinal-invalid', `${levelAt}.ordinal`, 'is missing or not an integer', 'level dropped; ordinal is required (0 = ground, -1 = basement)');
|
|
389
|
+
ok = false;
|
|
390
|
+
}
|
|
391
|
+
if (level.name !== undefined && !isNonEmptyString(level.name)) {
|
|
392
|
+
fallback('level-field-invalid', `${levelAt}.name`, 'is not a non-empty string', "falls back to the layer's description");
|
|
393
|
+
}
|
|
394
|
+
if (level.initial !== undefined && typeof level.initial !== 'boolean') {
|
|
395
|
+
fallback('level-field-invalid', `${levelAt}.initial`, 'is not a boolean', 'ignored');
|
|
396
|
+
}
|
|
397
|
+
levelCandidates.push({
|
|
398
|
+
value: {
|
|
399
|
+
layer: isNonEmptyString(level.layer) ? level.layer : '',
|
|
400
|
+
ordinal: Number.isInteger(level.ordinal) ? level.ordinal : 0,
|
|
401
|
+
name: isNonEmptyString(level.name) ? level.name : undefined,
|
|
402
|
+
initial: typeof level.initial === 'boolean' ? level.initial : undefined,
|
|
403
|
+
},
|
|
404
|
+
at: levelAt,
|
|
405
|
+
ok,
|
|
406
|
+
surviving: false,
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
const ordinals = new Map();
|
|
410
|
+
for (const candidate of levelCandidates) {
|
|
411
|
+
if (!candidate.ok)
|
|
412
|
+
continue;
|
|
413
|
+
const ordinal = candidate.value.ordinal;
|
|
414
|
+
const owner = ordinals.get(ordinal);
|
|
415
|
+
if (owner) {
|
|
416
|
+
dropped('level-ordinal-duplicate', `${candidate.at}.ordinal`, `${ordinal} duplicates ${owner}`, 'level dropped; ordinals are unique within a venue');
|
|
417
|
+
candidate.ok = false;
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
ordinals.set(ordinal, candidate.at);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
let contour;
|
|
425
|
+
if (value.contour !== undefined) {
|
|
426
|
+
const result = validateRing(value.contour);
|
|
427
|
+
if (result.issue) {
|
|
428
|
+
fallback('contour-invalid', `${at}.contour`, result.issue, "falls back to the scene layer's geometry, then to the hull of level rects");
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
contour = result.ring;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
let markerPoint;
|
|
435
|
+
if (value.markerPoint !== undefined) {
|
|
436
|
+
if (isFinitePoint(value.markerPoint)) {
|
|
437
|
+
markerPoint = { x: value.markerPoint.x, y: value.markerPoint.y };
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
fallback('venue-marker-point-invalid', `${at}.markerPoint`, 'is not a finite {x, y} point', 'falls back to the contour centroid');
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
// The two edges of the size band resolve together (§4): the detail edge is
|
|
444
|
+
// checked for usability first, the marker edge is then judged against it,
|
|
445
|
+
// and only then is the detail edge clamped above whichever marker edge won.
|
|
446
|
+
let detailMinSizePx;
|
|
447
|
+
if (value.detailMinSizePx !== undefined) {
|
|
448
|
+
if (!isFiniteNumber(value.detailMinSizePx) || value.detailMinSizePx <= 0) {
|
|
449
|
+
fallback('detail-min-size-invalid', `${at}.detailMinSizePx`, 'is not a positive finite number', 'default 240 used');
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
detailMinSizePx = value.detailMinSizePx;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
let markerMaxSizePx;
|
|
456
|
+
if (value.markerMaxSizePx !== undefined) {
|
|
457
|
+
// Judged against the detail edge as the default ceiling would leave it:
|
|
458
|
+
// the marker edge is what is in question, so it cannot be its own yardstick.
|
|
459
|
+
const detailBeforeClamp = detailMinSizePx === undefined
|
|
460
|
+
? DEFAULT_DETAIL_MIN_SIZE_PX
|
|
461
|
+
: Math.max(MIN_DETAIL_MIN_SIZE_PX, detailMinSizePx);
|
|
462
|
+
if (!isFiniteNumber(value.markerMaxSizePx) || value.markerMaxSizePx <= 0) {
|
|
463
|
+
fallback('marker-max-size-invalid', `${at}.markerMaxSizePx`, 'is not a positive finite number', `default ${DEFAULT_MARKER_MAX_SIZE_PX} used`);
|
|
464
|
+
}
|
|
465
|
+
else if (value.markerMaxSizePx >= detailBeforeClamp) {
|
|
466
|
+
fallback('marker-max-size-inverted', `${at}.markerMaxSizePx`, `${value.markerMaxSizePx} is at or above the venue's resolved detailMinSizePx of ${detailBeforeClamp}`, `default ${DEFAULT_MARKER_MAX_SIZE_PX} used, then the detail-edge clamp applies`);
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
markerMaxSizePx = value.markerMaxSizePx;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
const resolvedMarkerMaxSizePx = markerMaxSizePx ?? DEFAULT_MARKER_MAX_SIZE_PX;
|
|
473
|
+
if (detailMinSizePx !== undefined &&
|
|
474
|
+
!detailEdgeClearsMarkerEdge(detailMinSizePx, resolvedMarkerMaxSizePx)) {
|
|
475
|
+
const floor = detailMinSizeFloor(resolvedMarkerMaxSizePx);
|
|
476
|
+
clamped('detail-min-size-clamped', `${at}.detailMinSizePx`, `${detailMinSizePx} is below the ${floor}px marker/scene sticky enter edge`, `clamped to ${floor}`);
|
|
477
|
+
detailMinSizePx = floor;
|
|
478
|
+
}
|
|
479
|
+
const resolvedDetailMinSizePx = detailMinSizePx ?? DEFAULT_DETAIL_MIN_SIZE_PX;
|
|
480
|
+
const auxCandidates = [];
|
|
481
|
+
const expectedSceneLayers = [];
|
|
482
|
+
if (value.layers !== undefined) {
|
|
483
|
+
if (!Array.isArray(value.layers)) {
|
|
484
|
+
fallback('aux-layers-invalid', `${at}.layers`, 'is not an array', 'ignored; procedural appearance used');
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
value.layers.forEach((aux, auxIndex) => {
|
|
488
|
+
const auxAt = `${at}.layers[${auxIndex}]`;
|
|
489
|
+
if (!isObject(aux)) {
|
|
490
|
+
dropped('aux-entry-invalid', auxAt, 'is not an object', 'entry dropped');
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
reportUnknownKeys(auxAt, aux, AUX_KEYS);
|
|
494
|
+
if (isNonEmptyString(aux.layer) &&
|
|
495
|
+
aux.render === 'scene' &&
|
|
496
|
+
(aux.replacesDefault === undefined || aux.replacesDefault === true)) {
|
|
497
|
+
expectedSceneLayers.push(aux.layer);
|
|
498
|
+
}
|
|
499
|
+
const layerExists = isNonEmptyString(aux.layer) &&
|
|
500
|
+
(geometries.has(aux.layer) || sceneCandidateLayerNames.has(aux.layer));
|
|
501
|
+
rememberReference(aux.layer, layerExists);
|
|
502
|
+
let ok = true;
|
|
503
|
+
if (!isNonEmptyString(aux.layer)) {
|
|
504
|
+
dropped('aux-layer-invalid', `${auxAt}.layer`, 'is missing or not a non-empty string', 'entry dropped');
|
|
505
|
+
ok = false;
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
if (!layerExists) {
|
|
509
|
+
dropped('aux-layer-unknown', `${auxAt}.layer`, `"${aux.layer}" does not exist in the plan`, 'entry dropped; venue falls back to the procedural appearance');
|
|
510
|
+
ok = false;
|
|
511
|
+
}
|
|
512
|
+
if (aux.layer.startsWith('WF')) {
|
|
513
|
+
dropped('aux-layer-wayfinding', `${auxAt}.layer`, `"${aux.layer}" is a wayfinding layer`, 'WF* layers are excluded before the venue model sees them — entry dropped');
|
|
514
|
+
ok = false;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
const renderValid = RENDER_MODES.includes(aux.render);
|
|
518
|
+
if (!renderValid) {
|
|
519
|
+
dropped('aux-entry-invalid', `${auxAt}.render`, `is ${describe(aux.render)}, expected "scene" or "marker"`, 'entry dropped');
|
|
520
|
+
ok = false;
|
|
521
|
+
}
|
|
522
|
+
if (aux.replacesDefault !== undefined && typeof aux.replacesDefault !== 'boolean') {
|
|
523
|
+
dropped('aux-entry-invalid', `${auxAt}.replacesDefault`, 'is not a boolean', 'entry dropped');
|
|
524
|
+
ok = false;
|
|
525
|
+
}
|
|
526
|
+
if (aux.suppressesLabel !== undefined && typeof aux.suppressesLabel !== 'boolean') {
|
|
527
|
+
dropped('aux-entry-invalid', `${auxAt}.suppressesLabel`, 'is not a boolean', 'entry dropped');
|
|
528
|
+
ok = false;
|
|
529
|
+
}
|
|
530
|
+
if (aux.minSizePx !== undefined &&
|
|
531
|
+
(!isFiniteNumber(aux.minSizePx) || aux.minSizePx < 0)) {
|
|
532
|
+
dropped('aux-entry-invalid', `${auxAt}.minSizePx`, 'is not a non-negative finite number', 'entry dropped');
|
|
533
|
+
ok = false;
|
|
534
|
+
}
|
|
535
|
+
if (aux.maxSizePx !== undefined &&
|
|
536
|
+
aux.maxSizePx !== 'detail' &&
|
|
537
|
+
(!isFiniteNumber(aux.maxSizePx) || aux.maxSizePx < 0)) {
|
|
538
|
+
dropped('aux-entry-invalid', `${auxAt}.maxSizePx`, 'is not a non-negative finite number or the literal "detail"', 'entry dropped');
|
|
539
|
+
ok = false;
|
|
540
|
+
}
|
|
541
|
+
if (isFiniteNumber(aux.minSizePx) &&
|
|
542
|
+
isFiniteNumber(aux.maxSizePx) &&
|
|
543
|
+
aux.minSizePx >= 0 &&
|
|
544
|
+
aux.maxSizePx >= 0 &&
|
|
545
|
+
aux.minSizePx > aux.maxSizePx) {
|
|
546
|
+
dropped('aux-range-inverted', auxAt, `minSizePx ${aux.minSizePx} exceeds maxSizePx ${aux.maxSizePx}`, 'entry dropped');
|
|
547
|
+
ok = false;
|
|
548
|
+
}
|
|
549
|
+
const render = renderValid ? aux.render : 'scene';
|
|
550
|
+
const resolvedMin = isFiniteNumber(aux.minSizePx) && aux.minSizePx >= 0
|
|
551
|
+
? aux.minSizePx
|
|
552
|
+
: render === 'marker'
|
|
553
|
+
? 0
|
|
554
|
+
: resolvedMarkerMaxSizePx;
|
|
555
|
+
// Resolved the same way as the minimum: §7's default maxSizePx is
|
|
556
|
+
// "detail" for scene layers and the venue's marker edge for markers
|
|
557
|
+
// (Revision 5; 60 unless authored), so an entry that
|
|
558
|
+
// only authors one bound (the most idiomatic shape) must still be
|
|
559
|
+
// checked against its defaulted other bound — not the authored
|
|
560
|
+
// value alone, which the un-resolved check below used to do.
|
|
561
|
+
const resolvedMax = aux.maxSizePx !== undefined &&
|
|
562
|
+
(aux.maxSizePx === 'detail' || isFiniteNumber(aux.maxSizePx))
|
|
563
|
+
? aux.maxSizePx
|
|
564
|
+
: render === 'scene'
|
|
565
|
+
? 'detail'
|
|
566
|
+
: resolvedMarkerMaxSizePx;
|
|
567
|
+
const impossibleRange = resolvedMax === 'detail'
|
|
568
|
+
? resolvedMin >= resolvedDetailMinSizePx
|
|
569
|
+
: resolvedMin > resolvedMax;
|
|
570
|
+
if (renderValid && impossibleRange) {
|
|
571
|
+
dropped('aux-range-never-visible', auxAt, `resolved range ${resolvedMin}..${resolvedMax} can never render`, 'entry dropped; the procedural fallback for this render mode is restored');
|
|
572
|
+
ok = false;
|
|
573
|
+
}
|
|
574
|
+
if (renderValid && render === 'scene' && isFiniteNumber(aux.maxSizePx)) {
|
|
575
|
+
advisory('aux-max-size-numeric', `${auxAt}.maxSizePx`, `is the hard edge ${aux.maxSizePx} rather than "detail"`, 'a static edge cannot follow the ±10% detail hysteresis — expect flicker and brief overlap with the floor plan');
|
|
576
|
+
}
|
|
577
|
+
auxCandidates.push({
|
|
578
|
+
value: {
|
|
579
|
+
layer: isNonEmptyString(aux.layer) ? aux.layer : '',
|
|
580
|
+
render,
|
|
581
|
+
replacesDefault: typeof aux.replacesDefault === 'boolean' ? aux.replacesDefault : undefined,
|
|
582
|
+
suppressesLabel: typeof aux.suppressesLabel === 'boolean' ? aux.suppressesLabel : undefined,
|
|
583
|
+
minSizePx: isFiniteNumber(aux.minSizePx) ? aux.minSizePx : undefined,
|
|
584
|
+
maxSizePx: aux.maxSizePx === 'detail' || isFiniteNumber(aux.maxSizePx)
|
|
585
|
+
? aux.maxSizePx
|
|
586
|
+
: undefined,
|
|
587
|
+
},
|
|
588
|
+
at: auxAt,
|
|
589
|
+
ok,
|
|
590
|
+
surviving: false,
|
|
591
|
+
});
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
// An entrance stands on a level of its own venue (§6.1), so it is checked
|
|
596
|
+
// against the levels this venue *authored* — not against the plan's layers,
|
|
597
|
+
// and not against the levels that survive. That keeps the answer identical
|
|
598
|
+
// in the export-time validator, which sees no geometry and no claims; a
|
|
599
|
+
// door orphaned by a level that later drops is reported below instead.
|
|
600
|
+
const authoredLevelLayers = new Set((Array.isArray(value.levels) ? value.levels : [])
|
|
601
|
+
.filter(isObject)
|
|
602
|
+
.map((level) => level.layer)
|
|
603
|
+
.filter(isNonEmptyString));
|
|
604
|
+
const entranceCandidates = [];
|
|
605
|
+
if (value.entrances !== undefined) {
|
|
606
|
+
if (!Array.isArray(value.entrances)) {
|
|
607
|
+
fallback('entrances-invalid', `${at}.entrances`, 'is not an array', 'ignored; the venue keeps marker-point targeting');
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
value.entrances.forEach((entrance, entranceIndex) => {
|
|
611
|
+
const entranceAt = `${at}.entrances[${entranceIndex}]`;
|
|
612
|
+
if (!isObject(entrance)) {
|
|
613
|
+
dropped('entrance-entry-invalid', entranceAt, 'is not an object', 'entrance dropped');
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
reportUnknownKeys(entranceAt, entrance, ENTRANCE_KEYS);
|
|
617
|
+
// Unlike a level or an aux entry, a rejected door claims nothing and
|
|
618
|
+
// is never reconsidered, so it is dropped here rather than carried on
|
|
619
|
+
// as a candidate with placeholder geometry.
|
|
620
|
+
let ok = true;
|
|
621
|
+
if (!isNonEmptyString(entrance.layer)) {
|
|
622
|
+
dropped('entrance-layer-invalid', `${entranceAt}.layer`, 'is missing or not a non-empty string', 'entrance dropped');
|
|
623
|
+
ok = false;
|
|
624
|
+
}
|
|
625
|
+
else if (!authoredLevelLayers.has(entrance.layer)) {
|
|
626
|
+
dropped('entrance-layer-foreign', `${entranceAt}.layer`, `"${entrance.layer}" is not a level of venue ${label}`, 'entrance dropped; an entrance stands on one of its own venue’s levels');
|
|
627
|
+
ok = false;
|
|
628
|
+
}
|
|
629
|
+
if (!isFinitePoint(entrance.point)) {
|
|
630
|
+
dropped('entrance-entry-invalid', `${entranceAt}.point`, 'is missing or not a finite {x, y} point', 'entrance dropped; an entrance is a point before it is anything else');
|
|
631
|
+
ok = false;
|
|
632
|
+
}
|
|
633
|
+
if (entrance.name !== undefined && !isNonEmptyString(entrance.name)) {
|
|
634
|
+
fallback('entrance-field-invalid', `${entranceAt}.name`, 'is not a non-empty string', 'falls back to the venue’s own name');
|
|
635
|
+
}
|
|
636
|
+
if (!ok || !isNonEmptyString(entrance.layer) || !isFinitePoint(entrance.point))
|
|
637
|
+
return;
|
|
638
|
+
entranceCandidates.push({
|
|
639
|
+
value: {
|
|
640
|
+
layer: entrance.layer,
|
|
641
|
+
point: { x: entrance.point.x, y: entrance.point.y },
|
|
642
|
+
name: isNonEmptyString(entrance.name) ? entrance.name : undefined,
|
|
643
|
+
},
|
|
644
|
+
at: entranceAt,
|
|
645
|
+
});
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
return {
|
|
650
|
+
at,
|
|
651
|
+
id: isNonEmptyString(id) ? id : undefined,
|
|
652
|
+
name: isNonEmptyString(name) ? name : undefined,
|
|
653
|
+
label,
|
|
654
|
+
claimable,
|
|
655
|
+
order,
|
|
656
|
+
levels: levelCandidates,
|
|
657
|
+
aux: auxCandidates,
|
|
658
|
+
entrances: entranceCandidates,
|
|
659
|
+
expectedSceneLayers,
|
|
660
|
+
contour,
|
|
661
|
+
markerPoint,
|
|
662
|
+
detailMinSizePx,
|
|
663
|
+
markerMaxSizePx,
|
|
664
|
+
referencedLayers,
|
|
665
|
+
campusViewbox: value.campusViewbox,
|
|
666
|
+
};
|
|
667
|
+
});
|
|
668
|
+
const geometryDropped = new Set();
|
|
669
|
+
/**
|
|
670
|
+
* The order competing claims are resolved in (§10): resolved `order`, then
|
|
671
|
+
* `id`. Deliberately NOT array position — a contested layer is a broken
|
|
672
|
+
* authoring state either way, so the property worth having is that the
|
|
673
|
+
* winner survives a re-export that reorders `venues[]`. `sort` is stable, so
|
|
674
|
+
* venues that tie on both keys (only unidentified ones, which never claim)
|
|
675
|
+
* keep their array position.
|
|
676
|
+
*
|
|
677
|
+
* Codepoint comparison, not `localeCompare`: the same payload must resolve
|
|
678
|
+
* identically in this parser, in the reference validator and in whatever
|
|
679
|
+
* runs a producer's export gate, and `localeCompare` orders `-`, `_` and
|
|
680
|
+
* digits by ICU collation rules that vary between runtimes.
|
|
681
|
+
*/
|
|
682
|
+
const claimOrder = [...states].sort((a, b) => a.order - b.order || compareIds(a.id ?? '', b.id ?? ''));
|
|
683
|
+
// The campus viewbox belongs to the plan, not to the venue carrying it (§3):
|
|
684
|
+
// the first carrier in the same order as claims holds it — usable or not —
|
|
685
|
+
// and every later carrier is ignored. It is read from the authored record,
|
|
686
|
+
// so a carrier that is dropped as a venue still frames the campus.
|
|
687
|
+
let campusViewbox = null;
|
|
688
|
+
let campusCarrier;
|
|
689
|
+
for (const state of claimOrder) {
|
|
690
|
+
if (state.campusViewbox === undefined)
|
|
691
|
+
continue;
|
|
692
|
+
const at = `${state.at}.campusViewbox`;
|
|
693
|
+
if (campusCarrier) {
|
|
694
|
+
dropped('campus-viewbox-duplicate', at, `${campusCarrier.at} already carries the campus viewbox`, "this venue's value is ignored; the first carrier by order wins");
|
|
695
|
+
continue;
|
|
696
|
+
}
|
|
697
|
+
campusCarrier = state;
|
|
698
|
+
const value = state.campusViewbox;
|
|
699
|
+
if (isCampusViewbox(value)) {
|
|
700
|
+
campusViewbox = new Box(value.x, value.y, value.width, value.height);
|
|
701
|
+
}
|
|
702
|
+
else {
|
|
703
|
+
fallback('campus-viewbox-invalid', at, 'is not an {x, y, width, height} of finite numbers with a positive width and height', 'the campus is framed by the union of the venue footprints');
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
const assignClaims = () => {
|
|
707
|
+
const claims = new Map();
|
|
708
|
+
for (const state of states) {
|
|
709
|
+
state.parsed = undefined;
|
|
710
|
+
for (const candidate of state.levels)
|
|
711
|
+
candidate.surviving = false;
|
|
712
|
+
for (const candidate of state.aux)
|
|
713
|
+
candidate.surviving = false;
|
|
714
|
+
}
|
|
715
|
+
// KTD3: every valid level receives its claim opportunity before any aux entry.
|
|
716
|
+
for (const state of claimOrder) {
|
|
717
|
+
if (!state.claimable || !state.id || !state.name || geometryDropped.has(state))
|
|
718
|
+
continue;
|
|
719
|
+
for (const candidate of state.levels) {
|
|
720
|
+
if (!candidate.ok)
|
|
721
|
+
continue;
|
|
722
|
+
const layer = candidate.value.layer;
|
|
723
|
+
const claimedBy = claims.get(layer);
|
|
724
|
+
if (claimedBy) {
|
|
725
|
+
dropped('level-layer-claimed', `${candidate.at}.layer`, `"${layer}" is already used by ${claimedBy.label} (${claimedBy.role})`, 'level dropped; a layer belongs to at most one venue and one role');
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
claims.set(layer, { label: state.label, role: 'level' });
|
|
729
|
+
candidate.surviving = true;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
for (const state of claimOrder) {
|
|
733
|
+
if (!state.claimable ||
|
|
734
|
+
!state.id ||
|
|
735
|
+
!state.name ||
|
|
736
|
+
geometryDropped.has(state) ||
|
|
737
|
+
!state.levels.some((candidate) => candidate.surviving)) {
|
|
738
|
+
continue;
|
|
739
|
+
}
|
|
740
|
+
let markerCount = 0;
|
|
741
|
+
for (const candidate of state.aux) {
|
|
742
|
+
if (!candidate.ok)
|
|
743
|
+
continue;
|
|
744
|
+
const aux = candidate.value;
|
|
745
|
+
const claimedBy = claims.get(aux.layer);
|
|
746
|
+
if (claimedBy) {
|
|
747
|
+
dropped('aux-layer-claimed', `${candidate.at}.layer`, `"${aux.layer}" is already used by ${claimedBy.label} (${claimedBy.role})`, 'entry dropped; a layer is a level, an aux layer, or neither — never two');
|
|
748
|
+
continue;
|
|
749
|
+
}
|
|
750
|
+
if (aux.render === 'marker' && markerCount > 0) {
|
|
751
|
+
dropped('aux-marker-duplicate', `${candidate.at}.render`, 'is a second marker layer for this venue', 'at most one per venue; extras dropped, the first wins');
|
|
752
|
+
continue;
|
|
753
|
+
}
|
|
754
|
+
claims.set(aux.layer, { label: state.label, role: 'aux' });
|
|
755
|
+
candidate.surviving = true;
|
|
756
|
+
if (aux.render === 'marker')
|
|
757
|
+
markerCount++;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
return claims;
|
|
761
|
+
};
|
|
762
|
+
const resolveContour = (state) => {
|
|
763
|
+
if (state.contour)
|
|
764
|
+
return state.contour;
|
|
765
|
+
const venueIndex = states.indexOf(state);
|
|
766
|
+
const replacingScenes = state.aux.filter((candidate) => candidate.ok &&
|
|
767
|
+
candidate.value.render === 'scene' &&
|
|
768
|
+
candidate.value.replacesDefault !== false);
|
|
769
|
+
const candidateByLayer = new Map(replacingScenes
|
|
770
|
+
.filter((candidate) => candidate.surviving)
|
|
771
|
+
.map((candidate) => [candidate.value.layer, candidate]));
|
|
772
|
+
const validScenes = [];
|
|
773
|
+
for (const scene of sceneCandidates[venueIndex] ?? []) {
|
|
774
|
+
const candidate = candidateByLayer.get(scene.layer);
|
|
775
|
+
if (!candidate?.surviving)
|
|
776
|
+
continue;
|
|
777
|
+
const unusable = (issue) => fallback('footprint-source-unusable', `${candidate.at}.layer`, `scene layer "${scene.layer}" ${issue}`, 'the next valid replacing scene is tried, then the level-rect hull');
|
|
778
|
+
const { extraction } = scene;
|
|
779
|
+
if (!extraction.ring) {
|
|
780
|
+
// Naming the shapes is the whole point: on an ordinary plan layer only
|
|
781
|
+
// paths are drawn (§6), so an author who outlined the building with a
|
|
782
|
+
// rect sees artwork on screen and cannot otherwise tell why the venue
|
|
783
|
+
// took its footprint from somewhere else.
|
|
784
|
+
unusable(extraction.unusableElementKinds.length > 0
|
|
785
|
+
? `draws no usable <path>; only paths are footprint sources, and it draws ${extraction.unusableElementKinds
|
|
786
|
+
.map((kind) => `<${kind}>`)
|
|
787
|
+
.join(', ')}`
|
|
788
|
+
: 'could not supply a valid contour');
|
|
789
|
+
continue;
|
|
790
|
+
}
|
|
791
|
+
const validation = validateRing(extraction.ring);
|
|
792
|
+
if (!validation.ring) {
|
|
793
|
+
unusable(validation.issue ?? 'could not supply a valid contour');
|
|
794
|
+
continue;
|
|
795
|
+
}
|
|
796
|
+
validScenes.push({
|
|
797
|
+
candidate,
|
|
798
|
+
layer: scene.layer,
|
|
799
|
+
ring: validation.ring,
|
|
800
|
+
boundsFallback: extraction.boundsFallback,
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
if (validScenes.length > 1) {
|
|
804
|
+
advisory('footprint-source-ambiguous', `${state.at}.layers`, `multiple replacing scene layers provide contours: ${validScenes
|
|
805
|
+
.map(({ layer }) => `"${layer}"`)
|
|
806
|
+
.join(', ')}`, `the first in plan-layer order, "${validScenes[0].layer}", wins`);
|
|
807
|
+
}
|
|
808
|
+
const selected = validScenes[0];
|
|
809
|
+
if (selected) {
|
|
810
|
+
if (selected.boundsFallback) {
|
|
811
|
+
fallback('footprint-bounding-box', `${selected.candidate.at}.layer`, `scene layer "${selected.layer}" uses its bounding box for the venue contour`, 'camera, tap target, and size bounds may extend beyond the artwork');
|
|
812
|
+
}
|
|
813
|
+
return selected.ring;
|
|
814
|
+
}
|
|
815
|
+
const hull = deriveLevelHull(state.levels, geometries);
|
|
816
|
+
if (hull.length >= 3 && state.expectedSceneLayers.length > 0) {
|
|
817
|
+
fallback('footprint-source-fallthrough', `${state.at}.contour`, 'replacing scene contour unavailable; using the level-rect hull', 'bounds, camera target, tap target, and the size axis changed source');
|
|
818
|
+
}
|
|
819
|
+
return hull;
|
|
820
|
+
};
|
|
821
|
+
// A geometry-invalid earlier venue must release its claims before later venues
|
|
822
|
+
// are evaluated. Drop one at a time so each retry sees the newly available roles.
|
|
823
|
+
while (true) {
|
|
824
|
+
// Claim assignment and contour resolution are the same code whether or not
|
|
825
|
+
// the pass is final; only their diagnostics differ. Run the probe with the
|
|
826
|
+
// buffer rewound afterwards rather than threading a "stay quiet" flag
|
|
827
|
+
// through every emit site — the claim/survivor mutations still stand.
|
|
828
|
+
const failed = speculative(() => {
|
|
829
|
+
assignClaims();
|
|
830
|
+
// Claim order again, not array position: dropping a venue releases its
|
|
831
|
+
// claims to the others, so which one is examined first is part of the
|
|
832
|
+
// outcome (§10).
|
|
833
|
+
return claimOrder.find((state) => state.claimable &&
|
|
834
|
+
!geometryDropped.has(state) &&
|
|
835
|
+
state.levels.some((candidate) => candidate.surviving) &&
|
|
836
|
+
resolveContour(state).length < 3);
|
|
837
|
+
});
|
|
838
|
+
if (!failed)
|
|
839
|
+
break;
|
|
840
|
+
resolveContour(failed);
|
|
841
|
+
dropped('footprint-underivable', `${failed.at}.contour`, 'no valid polygon can be derived', `venue ${failed.label} dropped entirely`);
|
|
842
|
+
geometryDropped.add(failed);
|
|
843
|
+
}
|
|
844
|
+
const claimedLayers = assignClaims();
|
|
845
|
+
for (const state of states) {
|
|
846
|
+
if (!state.claimable || !state.id || !state.name || geometryDropped.has(state))
|
|
847
|
+
continue;
|
|
848
|
+
const survivingLevels = state.levels.filter((candidate) => candidate.surviving);
|
|
849
|
+
if (survivingLevels.length === 0) {
|
|
850
|
+
dropped('venue-levels-all-dropped', `${state.at}.levels`, 'no level survives validation', `venue ${state.label} dropped entirely`);
|
|
851
|
+
continue;
|
|
852
|
+
}
|
|
853
|
+
const contour = resolveContour(state);
|
|
854
|
+
const authoredInitial = state.levels.filter((candidate) => candidate.value.initial === true);
|
|
855
|
+
const survivingInitial = survivingLevels.filter((candidate) => candidate.value.initial === true);
|
|
856
|
+
if (authoredInitial.some((candidate) => !candidate.surviving)) {
|
|
857
|
+
const lostInitial = authoredInitial.find((candidate) => !candidate.surviving);
|
|
858
|
+
fallback('level-initial-dropped', `${lostInitial.at}.initial`, 'initial level was dropped', 'the lowest surviving ordinal is initial');
|
|
859
|
+
}
|
|
860
|
+
// A dropped ordinal-0 (ground) level is usually both the default
|
|
861
|
+
// `initial` level and the floor carrying the venue↔pathway virtual
|
|
862
|
+
// connection — §11's "drop the level, not the venue" design otherwise
|
|
863
|
+
// leaves the hall booting on an upper floor with cross-venue routing
|
|
864
|
+
// silently broken (§13, undetectable from data.js alone).
|
|
865
|
+
const authoredGround = state.levels.filter((candidate) => candidate.value.ordinal === 0);
|
|
866
|
+
if (authoredGround.length > 0 &&
|
|
867
|
+
!survivingLevels.some((candidate) => candidate.value.ordinal === 0)) {
|
|
868
|
+
advisory('level-ground-dropped', `${state.at}.levels`, 'the ordinal 0 (ground) level was dropped', 'cross-venue routing into this venue is likely broken (§13); the venue also boots on an upper floor');
|
|
869
|
+
}
|
|
870
|
+
if (survivingInitial.length > 1) {
|
|
871
|
+
advisory('level-initial-duplicate', `${state.at}.levels`, `${survivingInitial.length} levels are marked initial`, 'at most one per venue; the SDK takes the first');
|
|
872
|
+
}
|
|
873
|
+
const initial = survivingInitial[0] ??
|
|
874
|
+
survivingLevels.reduce((lowest, candidate) => candidate.value.ordinal < lowest.value.ordinal ? candidate : lowest);
|
|
875
|
+
// A door on a level the venue just lost leads nowhere the SDK can draw or
|
|
876
|
+
// route to, so it goes with the level — and says so, because the venue may
|
|
877
|
+
// be left with fewer doors, or with none and back on its marker point.
|
|
878
|
+
const survivingLevelLayers = new Set(survivingLevels.map((candidate) => candidate.value.layer));
|
|
879
|
+
const entrances = [];
|
|
880
|
+
for (const candidate of state.entrances) {
|
|
881
|
+
if (!survivingLevelLayers.has(candidate.value.layer)) {
|
|
882
|
+
// `dropped`, not `fallback` (ADR-0009): the entrance leaves the model.
|
|
883
|
+
// What the venue does afterwards — its other doors, then its marker
|
|
884
|
+
// point — is the consequence, which is what that field is for.
|
|
885
|
+
dropped('entrance-level-dropped', `${candidate.at}.layer`, `level "${candidate.value.layer}" did not survive validation`, 'entrance dropped; the venue falls back to its remaining doors, then to marker-point targeting');
|
|
886
|
+
continue;
|
|
887
|
+
}
|
|
888
|
+
entrances.push({ ...candidate.value });
|
|
889
|
+
}
|
|
890
|
+
const copiedContour = contour.map((point) => ({ x: point.x, y: point.y }));
|
|
891
|
+
state.parsed = {
|
|
892
|
+
id: state.id,
|
|
893
|
+
name: state.name,
|
|
894
|
+
order: state.order,
|
|
895
|
+
levels: survivingLevels.map((candidate) => ({
|
|
896
|
+
layer: candidate.value.layer,
|
|
897
|
+
ordinal: candidate.value.ordinal,
|
|
898
|
+
name: candidate.value.name,
|
|
899
|
+
initial: candidate === initial,
|
|
900
|
+
})),
|
|
901
|
+
contour: copiedContour,
|
|
902
|
+
markerPoint: state.markerPoint ?? polygonCentroid(copiedContour),
|
|
903
|
+
bounds: Box.fromPoints(copiedContour),
|
|
904
|
+
detailMinSizePx: state.detailMinSizePx,
|
|
905
|
+
markerMaxSizePx: state.markerMaxSizePx,
|
|
906
|
+
entrances,
|
|
907
|
+
auxLayers: state.aux
|
|
908
|
+
.filter((candidate) => candidate.surviving)
|
|
909
|
+
.map(({ value: aux }) => {
|
|
910
|
+
const replacesDefault = aux.replacesDefault ?? true;
|
|
911
|
+
return {
|
|
912
|
+
layer: aux.layer,
|
|
913
|
+
render: aux.render,
|
|
914
|
+
replacesDefault,
|
|
915
|
+
// Artwork that replaces the procedural scene also carries the venue's
|
|
916
|
+
// name, so the SDK's label would double it (§7); a marker never
|
|
917
|
+
// suppresses the label unless the author says so (§4, R14).
|
|
918
|
+
suppressesLabel: aux.suppressesLabel ?? (aux.render === 'scene' && replacesDefault),
|
|
919
|
+
minSizePx: aux.minSizePx,
|
|
920
|
+
maxSizePx: aux.maxSizePx,
|
|
921
|
+
};
|
|
922
|
+
}),
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
const quarantineCandidates = [];
|
|
926
|
+
for (const state of states) {
|
|
927
|
+
if (state.parsed)
|
|
928
|
+
continue;
|
|
929
|
+
for (const layer of state.referencedLayers) {
|
|
930
|
+
if (!quarantineCandidates.includes(layer))
|
|
931
|
+
quarantineCandidates.push(layer);
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
const parsedVenues = [];
|
|
935
|
+
for (const state of states) {
|
|
936
|
+
if (state.parsed)
|
|
937
|
+
parsedVenues.push(state.parsed);
|
|
938
|
+
}
|
|
939
|
+
// Every venue failed validation: nothing claims a layer, so every
|
|
940
|
+
// referenced layer would otherwise become a quarantine candidate and the
|
|
941
|
+
// whole plan would render blank — inverting §11's "a broken venue must not
|
|
942
|
+
// take an event offline" promise. Degrade to single-venue instead, the
|
|
943
|
+
// same precedent already used for an unsupported venuesVersion above.
|
|
944
|
+
if (venuesValue.length > 0 && parsedVenues.length === 0) {
|
|
945
|
+
dropped('venues-all-dropped', 'venues', 'no venue survived validation', 'plan loads as single-venue');
|
|
946
|
+
return complete([], diagnostics, []);
|
|
947
|
+
}
|
|
948
|
+
const quarantinedLayerNames = quarantineCandidates.filter((layer) => !claimedLayers.has(layer));
|
|
949
|
+
if (quarantinedLayerNames.length > 0) {
|
|
950
|
+
dropped('plan-layers-quarantined', 'venues', `quarantined unclaimed layer${quarantinedLayerNames.length === 1 ? '' : 's'}: ${quarantinedLayerNames
|
|
951
|
+
.map((layer) => `"${layer}"`)
|
|
952
|
+
.join(', ')}`, 'hidden from venue and ordinary layer rendering');
|
|
953
|
+
}
|
|
954
|
+
return complete(parsedVenues, diagnostics, quarantinedLayerNames, campusViewbox);
|
|
955
|
+
}
|