@eyeon/map 2.0.28 → 2.0.36

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.
Files changed (36) hide show
  1. package/dist/assets/index.css +1 -1
  2. package/dist/chunks/MapViewer.js +1397 -1375
  3. package/dist/chunks/MapViewer.js.map +1 -1
  4. package/dist/chunks/responsive.js +1532 -1400
  5. package/dist/chunks/responsive.js.map +1 -1
  6. package/dist/chunks/wheelZoom.js +32 -32
  7. package/dist/core/index.d.ts +1 -0
  8. package/dist/core/index.d.ts.map +1 -1
  9. package/dist/core/index.js +213 -202
  10. package/dist/core/routing/pathfinding.d.ts.map +1 -1
  11. package/dist/core/routing/routeCurve.d.ts +52 -0
  12. package/dist/core/routing/routeCurve.d.ts.map +1 -0
  13. package/dist/core/types.d.ts +14 -0
  14. package/dist/core/types.d.ts.map +1 -1
  15. package/dist/editor/MapEditor.d.ts.map +1 -1
  16. package/dist/editor/canvas/EditorCanvas.d.ts +5 -1
  17. package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
  18. package/dist/editor/canvas/editorFill.d.ts +4 -1
  19. package/dist/editor/canvas/editorFill.d.ts.map +1 -1
  20. package/dist/editor/canvas/editorHover.d.ts +11 -2
  21. package/dist/editor/canvas/editorHover.d.ts.map +1 -1
  22. package/dist/editor/draftOps.d.ts.map +1 -1
  23. package/dist/editor/index.css +3 -3
  24. package/dist/editor/index.js +4716 -4432
  25. package/dist/editor/index.js.map +1 -1
  26. package/dist/editor/routeStubs.d.ts +11 -6
  27. package/dist/editor/routeStubs.d.ts.map +1 -1
  28. package/dist/editor/tools.d.ts +8 -0
  29. package/dist/editor/tools.d.ts.map +1 -1
  30. package/dist/viewer/MapViewer.d.ts.map +1 -1
  31. package/dist/viewer/components/RouteLine.d.ts +1 -1
  32. package/dist/viewer/components/RouteLine.d.ts.map +1 -1
  33. package/dist/viewer/index.js +2 -2
  34. package/dist/viewer/routeFloorChanges.d.ts +8 -1
  35. package/dist/viewer/routeFloorChanges.d.ts.map +1 -1
  36. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MapViewer.js","sources":["../../src/viewer/ui/MapControls.tsx","../../src/fonts/mapFont.ts","../../../threejs-map/src/helpers/svgIcons.helper.ts","../../../threejs-map/src/helpers/amenities.helper.ts","../../../threejs-map/src/amenities.ts","../../src/specialIcons.ts","../../src/fonts/Montserrat-Regular.woff?url","../../src/fonts/mapFontUrl.ts","../../src/ui/selectSearch.ts","../../src/ui/ModernSelect.tsx","../../src/viewer/components/openingGeometry.ts","../../src/viewer/components/OpeningWell.tsx","../../src/viewer/pointer.ts","../../src/viewer/components/LevelMeshes.tsx","../../src/viewer/routeFloorChanges.ts","../../src/viewer/components/RouteLine.tsx","../../../../node_modules/three/examples/jsm/loaders/SVGLoader.js","../../src/viewer/components/SvgVectorLayer.tsx","../../src/viewer/camera.ts","../../src/viewer/components/CameraRig.tsx","../../src/viewer/orbitWheelZoom.ts","../../src/viewer/components/MapScene.tsx","../../src/viewer/ui/RuntimeChrome.tsx","../../src/viewer/ui/WebsiteInfoModal.tsx","../../src/viewer/ui/HoverTooltip.tsx","../../src/viewer/fetchWebsiteRetailers.ts","../../src/viewer/MapViewer.tsx"],"sourcesContent":["import React from 'react';\nimport type { StackLevel } from '../../core';\nimport {\n floorSwitcherDisplayLevels,\n hasBuildingFloors,\n hasOutdoorLevel,\n shouldShowFloorSwitcher,\n} from '../../core';\n\nexport interface MapControlLevel {\n id: number;\n name: string;\n}\n\nexport interface MapControlsProps {\n levels: Array<MapControlLevel & Partial<StackLevel>>;\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onReset: () => void;\n showFloors?: boolean;\n showZoomReset?: boolean;\n /** Override the viewer building-floor list (e.g. Edit Map + Outdoor). */\n floorOptions?: MapControlLevel[];\n /** Show the floor list even when there is only one floor. */\n alwaysShowFloors?: boolean;\n}\n\nexport function MapControls({\n levels,\n activeLevelId,\n onActiveLevelChange,\n onZoomIn,\n onZoomOut,\n onReset,\n showFloors = true,\n showZoomReset = true,\n floorOptions,\n alwaysShowFloors = false,\n}: MapControlsProps) {\n const stackLevels = levels.filter(\n (level): level is MapControlLevel & StackLevel =>\n level.kind != null &&\n level.ordering != null &&\n level.levelIndex != null,\n );\n const switcher = floorOptions ?? floorSwitcherDisplayLevels(stackLevels);\n const showFloorList =\n showFloors &&\n (alwaysShowFloors\n ? switcher.length > 0\n : shouldShowFloorSwitcher(stackLevels));\n const showZoom =\n showZoomReset &&\n (hasBuildingFloors(stackLevels) || hasOutdoorLevel(stackLevels));\n if (!showFloorList && !showZoom) return null;\n\n return (\n <div className=\"eyeon-map-controls\">\n <div className=\"eyeon-map-controls__stack\">\n {showFloorList && (\n <div className=\"eyeon-map-controls__floors\" role=\"tablist\" aria-label=\"Floors\">\n {switcher.map((level) => {\n const active = level.id === activeLevelId;\n return (\n <button\n key={level.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n className={\n active\n ? 'eyeon-map-controls__floor is-active'\n : 'eyeon-map-controls__floor'\n }\n onClick={() => onActiveLevelChange(level.id)}\n >\n {level.name}\n </button>\n );\n })}\n </div>\n )}\n\n {showZoom && (\n <>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__reset\"\n onClick={onReset}\n aria-label=\"Reset map\"\n >\n Reset\n </button>\n\n <div className=\"eyeon-map-controls__zoom\">\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomOut}\n aria-label=\"Zoom out\"\n >\n −\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomIn}\n aria-label=\"Zoom in\"\n >\n +\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","/** CSS family — same Montserrat as admin-portal / Edit Map chrome. */\nexport const MAP_FONT_FAMILY = 'Montserrat, sans-serif';\n\n/** Shared by Edit Map SVG tspans and default-map troika `<Text>`. */\nexport const MAP_LABEL_LINE_HEIGHT = 1.15;\n","const SVGIcons = {\n Entrance: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke=\"#444444\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 3.75h8.25A3.5 3.5 0 0 1 20 7.25v9.5a3.5 3.5 0 0 1-3.5 3.5H8.25\"/>\n <path fill=\"none\" stroke=\"#444444\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.5 12h12.35M12.2 7.85 16.4 12l-4.2 4.15\"/>\n </svg>`,\n\n Kiosk: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 443.83 787.21\">\n <path fill=\"#444444\" d=\"M451,587.7V8.14H7.14V589.5H111.43V730.89H71.27L38.59,763.58v31.78H416.36V764.93l-34.05-34H345.78V587.7ZM396.91,71.23v452.7H59.85V71.23Z\" transform=\"translate(-7.14 -8.14)\" />\n </svg>`,\n\n Escalator: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n </svg>`,\n\n EscalatorUp: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n <path fill=\"#444444\" d=\"M165.81,131.14l-56.28-74.94c-1.74-2.31-5.21-2.31-6.95,0l-56.28,74.94c-2.15,2.87-.1,6.97,3.49,6.95l41.87-.17v129.17c0,2.4,1.94,4.34,4.34,4.34h20.1c2.4,0,4.34-1.94,4.34-4.34v-129.17l41.87.17c3.59.01,5.64-4.08,3.49-6.95Z\"/>\n </svg>`,\n\n EscalatorDown: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n <path fill=\"#444444\" d=\"M165.81,194.77l-56.28,74.94c-1.74,2.31-5.21,2.31-6.95,0l-56.28-74.94c-2.15-2.87-.1-6.97,3.49-6.95l41.87.17V58.81c0-2.4,1.94-4.34,4.34-4.34h20.1c2.4,0,4.34,1.94,4.34,4.34v129.17l41.87-.17c3.59-.01,5.64,4.08,3.49,6.95Z\"/>\n </svg>`,\n\n ATM: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 577.8 577\">\n <path fill=\"#444444\" d=\"M388.7,314c-3.7-10.3-10.3-19.8-17.7-27.2c-7.4-7.4-17.7-14-29.5-19.1c-6.6-2.9-19.2-6.6-39.1-11.8V144.2 c13.3,2.2,22.8,8.1,30.2,16.2c7.4,8.1,11.8,19.9,14,35.3l39.8-5.9c-2.9-24.3-13.3-44.1-30.2-58.1c-13.3-11-31-17.7-53.8-19.8V93.4 h-24.3v18.4c-25.8,2.2-45,9.6-58.2,21.3c-19.9,17.7-29.5,39.7-29.5,67.6c0,15.5,3.7,29.4,10.3,41.9s16.2,22,28.7,28.7 c17,9.6,33.2,16.2,49.4,20.6v121.3c-14.8-1.5-28-8.8-39.1-22.8c-7.4-9.6-13.3-25-16.2-46.3l-39.1,7.4c1.5,20.6,6.6,37.5,15.5,51.5 s19.9,23.5,31.7,30.1c12.5,6.6,28,11,47.9,13.2v39v-0.1V483h22.1v-39c28-0.7,50.1-11,67.1-28.7c17-18.4,25.8-40.4,25.8-67.6 C394.6,336,392.4,324.3,388.7,314z M278.9,145.1v107.2c-17.7-5.2-30.2-11.8-37.6-20.6s-11.1-19.8-11.1-33.1c0-14,4.4-25.7,13.3-35.3 C252.2,153.9,263.7,147.4,278.9,145.1V145h0.7C279.3,145,279.1,145,278.9,145.1z M340,394.2c-9.6,11-22.1,18.4-37.6,19.8l0,0V297.9 c20.6,5.2,34.6,11.8,42,20.6c6.6,8.1,10.3,19.8,10.3,33.8C354.8,369.2,349.6,383.1,340,394.2z\" />\n <path fill=\"#444444\" d=\"M289.8,2.5c-158.7,0-288,128-288,287.2c0,158.3,129.3,287.2,288,287.2s288-128.9,288-287.2S448.6,2.5,289.8,2.5z M289.9,533.9C155,533.9,45.2,424.3,45.2,289.8C45.2,154.5,155,45.7,289.9,45.7s244.7,109.5,244.7,244.1S424.8,533.9,289.9,533.9z\" />\n </svg>`,\n\n Management: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 414.6\">\n <path fill=\"#444444\" d=\"M371.6,180.4c66.8,0,101,58.5,121.4,121.9l16.4,50.4c2.7,8.8-7.5,16.3-16.4,16.3h-56.6l-7.5-27.2 c-17.7-53.1-45-106.2-94.8-125.9c13-8.8,23.9-21.1,30.7-35.4C366.1,180.4,368.8,180.4,371.6,180.4z M441.2,145.7 c64.8,2,98.2,59.2,118.7,121.9l15.7,49.7c2.7,8.8-7.5,17.7-16.4,17.7h-35.5l-12.3-38.1c-16.4-53.1-44.3-106.2-94.8-125.9 C426.2,162.7,434.3,155.2,441.2,145.7z M51.6,334.3H16.8c-9.6,0-19.1-8.2-16.4-17.7l15.7-49.7C35.9,204.2,70.1,147.1,134.9,145 c6.1,9.5,15,18.4,24.6,24.5c-49.8,19.7-77.8,72.8-94.8,125.9L51.6,334.3L51.6,334.3z M437.7,0c35.5,0,64.8,28.6,64.8,64.7 c0,31.3-22.5,57.2-52.5,62.6c3.4-8.8,5.5-18.4,5.5-27.9c0-39.5-27.3-71.5-62.8-81C403.6,6.8,419.3,0,437.7,0L437.7,0z M137.6,0 c17.7,0,34.1,6.8,45,18.4c-35.5,9.5-62.8,41.5-62.8,81c0,9.5,2.1,19.1,5.5,27.9C96,121.9,72.8,96,72.8,64.7 C73.5,28.6,102.1,0,137.6,0L137.6,0z M287.7,0c19.8,0,37.5,8.8,49.8,22.5c-15.7,6.8-29.3,19.1-38.2,34l-3.4,5.5c-2.7,0-5.5,0-7.5,0 c-2,0-6.1,0-8.9,0l-3.4-5.5c-9.6-15-22.5-27.2-38.2-34C250.2,8.9,267.9,0,287.7,0L287.7,0z M287.7,226c66.8,0,101,58.5,122.1,121.9 l15.7,50.4c2.7,8.8-8.2,16.3-16.4,16.3H166.2c-9.6,0-19.8-8.2-16.4-16.3l15.7-50.4C186,284.6,220.8,226,287.7,226z M287.7,81 c35.5,0,64.8,28.6,64.8,64.7s-28.7,64.7-64.8,64.7c-35.5,0-64.8-28.6-64.8-64.7S252.2,81,287.7,81z M138.3,369H82.3 c-9.6,0-19.1-8.2-16.4-16.3l15.7-50.4c21.1-63.3,55.3-121.9,122.1-121.9c2.7,0,5.5,0,7.5,0c6.1,15,17.7,27.2,30.7,35.4 c-49.8,19.7-78.5,72.8-94.8,125.9C147.1,341.8,138.3,369,138.3,369z M203.8,34.7c23.9,0,44.3,12.9,55.9,31.3 c-32.1,12.2-55.9,42.9-55.9,79c0,6.1,0.7,12.2,2.1,18.4h-2.1c-35.5,0-64.8-28.6-64.8-64.7S168.3,34.7,203.8,34.7z M371.6,34.7 c35.5,0,64.8,28.6,64.8,64.7s-29.3,64-64.8,64h-2.7c2.1-6.1,2.7-12.2,2.7-18.4c0-36.8-23.9-66.7-55.9-79 C327.2,47.7,347,34.7,371.6,34.7z\" />\n </svg>`,\n\n PlayArea: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 537.9\">\n <path fill=\"#444444\" d=\"M384.3,137c38,0,68.8-30.7,68.8-68.5S422.3,0,384.3,0s-68.8,30.7-68.8,68.5S346.4,137,384.3,137z\" />\n <path fill=\"#444444\" d=\"M283.3,96c20,26.3,35.9,53.3,67.6,64.4c31.2,11.1,60.5,11.1,83.5-5.3c22.9-16.4,34.7-46.8,54.1-87.2 c18.8-40.4,34.1-48,57-48c23.5,0,31.2,28.1,30.6,39.8s-10.6,31-40,52.7c-49.4,36.3-57.6,108.3-59.4,127.7 c-1.8,19.3-2.9,50.4,17.6,169.2c20.6,118.9-20,125.9-25.3,127.1c-5.3,0.6-21.2,8.2-31.1-16.4c-10-24.6-11.8-91.3-14.1-120 c-2.9-28.7-6.5-70.9-35.9-79c-30-8.2-40.6,39.8-51.7,76.1c-10.6,36.9-40,71.4-72.3,59.1s-29.4-50.4-10-78.5 c19.4-27.5,61.7-57.4,67.6-124.1c5.9-66.8-11.8-69.1-68.2-90.8c-55.8-22.3-60.5-33.4-67.6-48.6s7.6-46.8,31.1-52.7 C239.2,55.1,259.1,63.9,283.3,96L283.3,96z\" />\n <path fill=\"#444444\" d=\"M134.7,251.7c26.9,0,48.8-21.8,48.8-48.6s-21.8-48.6-48.8-48.6s-48.8,21.8-48.8,48.6S107.7,251.7,134.7,251.7z\" />\n <path fill=\"#444444\" d=\"M204,227.8c-15.3,17.6-28.2,35.7-51.1,41.6c-22.9,6.4-43.5,4.7-58.8-8.2c-15.3-12.9-21.7-35.1-32.9-64.4S40,161,23.5,159.8 C7.1,158.7,0,178,0,186.2c-0.6,8.2,5.9,22.3,25.3,39.2C58.2,253.5,60,305.1,60,318.5c0.6,13.5-0.6,35.7-21.7,118.3 s7.1,89.6,10.6,90.8s14.7,7,22.9-10s12.9-63.8,16.5-83.7c3.5-19.9,8.2-49.8,29.4-53.9s26.5,30.4,32.3,56.8 c5.9,26.3,24.7,52.7,47.6,45.7c22.9-7,23.5-34,11.2-54.4c-12.3-20.5-40-43.9-40.6-90.8c-0.6-47.4,12.3-48,52.9-60.3 c40.6-12.3,44.7-20.5,50.5-30.4c5.9-10-2.9-33.4-18.8-38.6C237.5,201.4,222.8,206.7,204,227.8L204,227.8z\" />\n </svg>`,\n\n RestRoom: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 533.9\">\n <path fill=\"#444444\" d=\"M282.3,533.9h9.2V0h-9.2V533.9z\" />\n <path fill=\"#444444\" d=\"M118.2,97.1c25.4-4.6,41.6-30.1,34.7-55.5C146,16.2,122.9,2.3,97.4,6.9S58.1,39.3,62.8,62.4S95.1,104,118.2,97.1z\" />\n <path fill=\"#444444\" d=\"M159.8,145.6h4.6c0,0,2.3,0,2.3,2.3L183,270.4c2.3,9.2,9.2,16.2,18.5,16.2c11.6,0,18.5-9.2,18.5-20.8l-18.5-129.4 c-2.3-13.9-13.9-23.1-27.7-23.1H44.3c-13.9,0-25.4,9.2-27.7,23.1L0.4,265.8c-2.3,11.6,6.9,20.8,18.5,20.8c9.2,0,16.2-6.9,18.5-16.2 l16.2-122.5c0,0,0-2.3,2.3-2.3h4.6c0,0,2.3,0,2.3,2.3L30.4,390.6c0,0,0,2.3,2.3,2.3h37c0,0,2.3,0,2.3,2.3v117.9 c0,9.2,6.9,16.2,16.2,16.2s16.2-6.9,16.2-16.2V393c0,0,0-2.3,2.3-2.3h11.6c0,0,2.3,0,2.3,2.3v117.9c0,9.2,6.9,16.2,16.2,16.2 c9.2,0,16.2-6.9,16.2-16.2V393c0,0,0-2.3,2.3-2.3h30.1c0,0,2.3,0,2.3-2.3l-27.7-242.7l0,0l0,0L159.8,145.6z\" />\n <path fill=\"#444444\" d=\"M497.3,76.3c13.9-23.1,4.6-50.9-16.2-62.4s-50.9-6.9-64.7,16.2c-13.9,23.1-4.6,50.9,16.2,62.4 C455.7,106.3,483.5,99.4,497.3,76.3z\" />\n <path fill=\"#444444\" d=\"M545.9,113.3h-178c-13.9,0-25.4,9.2-27.7,23.1v129.4c0,11.6,9.2,20.8,20.8,20.8s18.5-9.2,18.5-20.8V159.5c0,0,0-2.3,2.3-2.3 h2.3c0,0,2.3,0,2.3,2.3l25.4,161.8v187.2c0,11.6,9.2,20.8,20.8,20.8l0,0c11.6,0,20.8-9.2,20.8-20.8V323.6c0,0,0-2.3,2.3-2.3h6.9 c0,0,2.3,0,2.3,2.3v184.9c0,11.6,9.2,20.8,20.8,20.8l0,0c11.6,0,20.8-9.2,20.8-20.8V321.3l25.4-161.8c0,0,0-2.3,2.3-2.3h-2.3 c0,0,2.3,0,2.3,2.3v106.3c0,11.6,9.2,20.8,20.8,20.8s20.8-9.2,20.8-20.8V136.4C571.4,122.5,559.8,113.3,545.9,113.3L545.9,113.3 L545.9,113.3z\" />\n </svg>`,\n\n FamilyRestRoom: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 522.5\">\n <path fill=\"#444444\" d=\"M119.8,91.5c25-5.9,40.5-30.8,34.6-55.7c-5.9-24.9-30.9-40.4-55.9-34.5S58,32,63.9,56.9S94.8,97.3,119.8,91.5z\" />\n <path fill=\"#444444\" d=\"M160.6,139.1h4.5c0.6,0,1.3,0.6,1.3,1.3l15.3,123.1c1.3,8.9,8.9,15.9,17.8,15.9c10.8,0,19.1-9.5,17.8-20.3l-15.9-128.9 c-1.9-13.3-13.4-24.1-27.4-24.1H43.4c-14,0-25.5,10.2-27.4,24.1L0.1,259.1c-1.3,10.8,7,20.3,17.8,20.3c8.9,0,16.5-7,17.8-15.9 l15.3-123.8c0-0.6,0.6-1.3,1.3-1.3h4.5c0.6,0,1.3,0.6,1.3,1.3L29.4,384.1c0,0.6,0.6,1.3,1.3,1.3H67c0.6,0,1.3,0.6,1.3,1.3v118.1 c0,9.5,7.6,16.5,16.5,16.5c9.5,0,16.5-7.6,16.5-16.5V387.3c0-0.6,0.6-1.3,1.3-1.3h10.8c0.6,0,1.3,0.6,1.3,1.3v118.1 c0,9.5,7.6,16.5,16.5,16.5c9.5,0,16.5-7.6,16.5-16.5V387.3c0-0.6,0.6-1.3,1.3-1.3h36.3c0.6,0,1.3-0.6,1.3-1.3L158,140.3 C159.3,139.7,159.9,139.1,160.6,139.1L160.6,139.1z\" />\n <path fill=\"#444444\" d=\"M498.9,69.8c12.9-22.1,5.4-50.5-16.8-63.4c-22.2-12.9-50.6-5.4-63.6,16.7c-12.9,22.1-5.4,50.5,16.8,63.4 C457.5,99.4,486,91.9,498.9,69.8z\" />\n <path fill=\"#444444\" d=\"M547.9,106.1H369.6c-14,0-25.5,10.2-27.4,24.1v128.9c0,10.8,8.9,19.7,19.7,19.7s19.7-8.9,19.7-19.7v-106 c0-0.6,0.6-1.3,1.3-1.3h2.5c0.6,0,1.3,0.6,1.3,1.3l25.5,162.5v187.3c0,10.8,8.9,19.7,19.7,19.7h0.6c10.8,0,19.7-8.9,19.7-19.7v-186 c0-0.6,0.6-1.3,1.3-1.3h10.8c0.6,0,1.3,0.6,1.3,1.3v186c0,10.8,8.9,19.7,19.7,19.7h0.6c10.8,0,19.7-8.9,19.7-19.7V315.6l25.5-162.5 c0-0.6,0.6-1.3,1.3-1.3h2.6c0.6,0,1.3,0.6,1.3,1.3v106c0,10.8,8.9,19.7,19.7,19.7s19.7-8.9,19.7-19.7V130.2 C573.4,116.2,562,106.1,547.9,106.1L547.9,106.1z\" />\n <path fill=\"#444444\" d=\"M259.6,480l19.7-19.7L251.9,433L229,455.8c-7.6,7.6-5.7,20.3,1.3,27.3l32.5,33.6c12.7,12.7,29.3-5.1,17.2-17.1L259.6,480 L259.6,480z M288.9,347.9c19.1,0,34.4-15.2,34.4-34.3s-15.3-34.3-34.4-34.3s-34.4,15.2-34.4,34.3S269.7,347.9,288.9,347.9z M369.7,405.7l-46.5-46.3c-3.8-3.8-8.3-6.3-14.7-6.3h-41.4c-6.4,0-10.8,2.5-14,6.3l-45.9,45.7c-12.7,12.7,4.5,28.6,17.2,15.9 l28-27.9v26h72.6v-26l28.6,28.6C364.6,433.6,381.8,417.1,369.7,405.7L369.7,405.7z M324.5,433l-27.4,27.3l19.7,19.7l-20.4,20.3 c-12.1,12.1,4.5,29.2,17.2,17.1l32.5-33.6c7-7,8.9-20.3,1.3-27.3C347.4,455.9,324.5,433,324.5,433z\" />\n </svg>`,\n\n Elevator: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 576\">\n <path fill=\"#444444\" d=\"M576,145.2v268.6c-0.1,1.6-0.3,3.1-0.3,4.7c-0.3,33.3-0.6,66.6-0.8,99.9c-0.1,21.1-9.7,37.2-26.7,49 c-7.7,5.4-15.9,9.3-25.9,8c-3.8-0.5-7.7-0.1-11.5-0.1c-115.3,0.1-230.6,0.2-345.9,0.3c-1.1,0-2.2,0.2-3.3,0.3h-16.9 c-1.2-0.1-2.4-0.3-3.6-0.3c-30.2-0.3-60.4-0.6-90.7-0.8c-11.1-0.1-20.7-4.1-29.1-11.2c-8.7-7.4-15.5-16.7-19.9-27.3l-0.2-0.5 c-0.7-1.6-1.1-3.4-1.2-5.4v0C0,492.8,0,455.1,0,417.4c0-124.1,0-248.1,0-372.2c0-0.2,0-0.3,0-0.5c0-1.5,0.3-2.9,0.7-4.2l0,0.1 C8.3,22.5,20.5,8.9,38.7,1c1.2-0.5,2.6-0.9,4-0.9h0c162.8,0,325.6,0,488.4,0c1.5,0,2.8,0.4,4.1,0.9l-0.1,0c3.4,1.4,6.1,2.7,8.8,4.2 l-0.4-0.2c19.7,11.2,30.9,27.8,31.3,50.8c0.4,28.2,0.6,56.3,0.8,84.5C575.7,141.8,575.8,143.5,576,145.2L576,145.2z M536.4,288.6 h0.3c0-56.7,0-113.4,0-170c0-18.2-0.4-36.4-0.7-54.6c-0.1-8-8.4-19.8-15.9-22.7c-1-0.4-2.1-0.6-3.2-0.7h0c-3.2-0.3-6.4-0.6-9.5-0.6 c-25.5-0.4-51-0.9-76.6-1c-96.4-0.2-192.7-0.4-289.1-0.4c-22.9,0-45.8,0.1-68.7,0.3c-3.4,0-6.8,0.1-10,0.9 c-9.9,2.3-17.1,8.3-21.7,17.3c-1,1.9-2,3.9-2.1,5.9c-0.1,149.8-0.1,299.6-0.1,449.4c0,0.9-0.1,2,0.3,2.7c2.7,4.2,5.1,8.6,8.3,12.3 c5.6,6.3,13.2,8.4,21.6,8.4c23.7,0.1,47.5,0.6,71.2,0.6c123.5,0,247,0,370.5,0c0.1,0,0.2,0,0.3,0c1.1,0,2.1-0.2,3-0.6l-0.1,0 c8.3-3.5,15.4-8.4,20.2-16.3c1.2-1.8,2-4.1,2-6.5l0,0C536.4,438.2,536.4,363.4,536.4,288.6L536.4,288.6z\" />\n <path fill=\"#444444\" d=\"M307,277.5l75.9,68.4l0.9-0.2V150.9h49.7v194.8l1,0.3l78.2-67.4c0.1,1,0.2,1.7,0.3,2.4c0.3,19.9,0.6,39.8,0.8,59.7 c0,0,0,0,0,0.1c0,1.4-0.5,2.6-1.4,3.6l0,0c-34.1,32.7-68.2,65.3-102.3,97.9c-0.3,0.3-0.6,0.5-1,0.9c-0.6-0.5-1.3-1-1.9-1.5 c-32.7-30.7-65.5-61.4-98.2-92c-1.4-1.2-2.3-3-2.3-5c0-0.1,0-0.3,0-0.4v0c0.2-20.9,0.3-41.9,0.4-62.8C307,280.5,307,279.4,307,277.5 L307,277.5z\" />\n <path fill=\"#444444\" d=\"M142.2,234.5L67,301.8c-0.1-1.2-0.3-1.9-0.3-2.7c-0.3-20.7-0.7-41.5-1-62.2c0-1.3,0.5-2.5,1.3-3.4l0,0 c33.3-31.4,66.7-62.8,100.1-94.1c0.3-0.3,0.6-0.5,1-0.8c5.9,5.7,11.8,11.3,17.7,16.9c28.1,26.9,56.2,53.9,84.3,80.9 c0.9,0.8,1.4,2,1.5,3.3v0c-0.5,20.2-1.1,40.3-1.6,60.5c0,0.3-0.1,0.7-0.2,1.7l-77.4-67.1l-0.9,0.1v193.9h-48.3v-194L142.2,234.5z\" />\n </svg>`,\n\n Security: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 597.6\">\n <path fill=\"#444444\" d=\"M554,80.7L298.5,1.5c-6.6-2-13.2-2-19.9,0L23.2,80.7C9.3,84.7,0,97.9,0,112.4c0,352.5,178.7,436.4,274,481.9 c4.6,2,9.3,3.3,13.9,3.3c4.6,0,9.9-1.3,13.9-3.3c96-45.5,274-129.4,274-481.9C577.2,97.9,567.9,85.3,554,80.7z M288.6,527.6 C197.2,484.1,73.5,411.4,66.2,136.2l222.4-68.6L511,136.8C503.7,412.1,379.3,484.1,288.6,527.6z\" />\n <path fill=\"#444444\" d=\"M278.7,152l-26.5,87.1l-90.7-2.6c-4.6,0-8.6,2.6-9.9,7.3c-1.3,4.6,0,9.2,4,11.9l74.8,51.5L200.6,393c-1.3,4.6,0,9.2,4,11.9 c4,2.6,8.6,2.6,12.6,0l72.1-54.8l72.1,54.8c4,2.6,8.6,2.6,12.6,0c4-2.6,5.3-7.3,4-11.9l-29.8-85.8l74.8-51.5c4-2.6,5.3-7.3,4-11.9 c-1.3-4.6-5.3-7.3-9.9-7.3l-90.7,2l-26.5-87.1c-1.3-4.6-5.3-7.3-9.9-7.3C283.9,144.1,280,147.4,278.7,152L278.7,152z\" />\n </svg>`,\n\n ChildStroller: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 432 370.06\">\n <path fill=\"#444444\" d=\"M130.29,178.61l-42.67,34L33.24,254.13c-15.48,12.09-28.32-2.64-28.32-2.64-12.08-15.86,1.89-26.06,1.89-26.06l68-53.24s7.55-7.93,26.81-2.26l28.7,8.68\"/>\n <path fill=\"#444444\" d=\"M210,111A38.52,38.52,0,1,1,248.48,72.5,38.68,38.68,0,0,1,210,111\"/>\n <path fill=\"#444444\" d=\"M390.84,0a42.88,42.88,0,0,0-24.92,8.31L80.44,235.63a43.71,43.71,0,0,0-13.59,22.28,40.67,40.67,0,0,0,1.89,23.41,47.9,47.9,0,0,0-22.28,41.16A47.58,47.58,0,1,0,94,274.9,41.43,41.43,0,0,0,84.22,276a22.77,22.77,0,0,1-1.51-14.35,25.82,25.82,0,0,1,8.68-13.59l17.37-14,88,29.08a33.54,33.54,0,0,0,42.67-21.53l1.51-4.91,18.88,45.32a47.09,47.09,0,0,0-22.28,40.4,47.58,47.58,0,1,0,47.58-47.58,41.43,41.43,0,0,0-9.82,1.13l-26.43-62.68,43.8-126.12,83.08-66.08a23.7,23.7,0,0,1,15.1-5.29,25.3,25.3,0,0,1,25.3,25.3,25.72,25.72,0,0,1-10.2,20.39,8,8,0,0,0,10.58,12.08A41.37,41.37,0,0,0,390.84,0ZM93.66,301.33A20.77,20.77,0,1,1,72.89,322.1,20.71,20.71,0,0,1,93.66,301.33Zm191.07,0A20.77,20.77,0,1,1,264,322.1,20.71,20.71,0,0,1,284.73,301.33Z\"/>\n </svg>`,\n\n VendingMachine: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 594\">\n <circle fill=\"#444444\" cx=\"324\" cy=\"175.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"175.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"324\" cy=\"243\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"243\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"324\" cy=\"310.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"310.5\" r=\"13.5\"/>\n <path fill=\"#444444\" d=\"M216,94.5H67.5C59.4,94.5,54,99.9,54,108c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,99.9,224.1,94.5,216,94.5z\"/>\n <path fill=\"#444444\" d=\"M216,162H67.5c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,167.4,224.1,162,216,162z\"/>\n <path fill=\"#444444\" d=\"M216,229.5H67.5c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,234.9,224.1,229.5,216,229.5z\"/>\n <path fill=\"#444444\" d=\"M216,297H67.5c-8.1,0-13.5,5.4-13.5,13.5S59.4,324,67.5,324H216c8.1,0,13.5-5.4,13.5-13.5S224.1,297,216,297z\"/>\n <path fill=\"#444444\" d=\"M391.5,0H324c-8.1,0-13.5,5.4-13.5,13.5S315.9,27,324,27h67.5c8.1,0,13.5,5.4,13.5,13.5V567H27V40.5 C27,32.4,32.4,27,40.5,27h216v499.5c0,8.1,5.4,13.5,13.5,13.5s13.5-5.4,13.5-13.5v-513C283.5,5.4,278.1,0,270,0H40.5 C17.5,0,0,17.5,0,40.5v540c0,8.1,5.4,13.5,13.5,13.5h405c8.1,0,13.5-5.4,13.5-13.5v-540C432,17.5,414.5,0,391.5,0z\"/>\n <path fill=\"#444444\" d=\"M364.5,94.5H324c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5h40.5c8.1,0,13.5-5.4,13.5-13.5 C378,99.9,372.6,94.5,364.5,94.5z\"/>\n <path fill=\"#444444\" d=\"M216,432H67.5c-8.1,0-13.5,5.4-13.5,13.5V513c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5v-67.5 C229.5,437.4,224.1,432,216,432z M81,499.5V459h121.5v40.5H81z\"/>\n </svg>`,\n\n Stairs: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 448.5\">\n <path fill=\"#444444\" d=\"M432,243.3h-81.7v33.1h-72.2v33.1h-72.2v33.1h-72.2v33.1H61.5v33.1H0v39.7h101.2v-33.1h72.2v-33.1h72.2v-33.1h72.2v-33.1 h72.2V283H432L432,243.3\"/>\n <path fill=\"#444444\" d=\"M99.9,109.3c12,0,21.8-9.7,21.8-21.8c0-12-9.8-21.8-21.8-21.8c-12,0-21.8,9.7-21.8,21.8C78.1,99.6,87.9,109.3,99.9,109.3\"/>\n <path fill=\"#444444\" d=\"M179.4,299.8l-56.5-47.4l11.7-82.9c12.5,14.8,20.7,33.4,22.7,53.8l17.8-4.8c-0.9-32.2-14.2-61.3-35.3-82.6 c-14.4-14.5-32.9-19.2-45.9-20.6c-0.1,0-0.2,0-0.3,0c-1.6,0-2.9,1.2-3.2,2.7c-6.5,34.7-27.7,64.2-56.9,81.9l9.3,16.1 c15.6-6.6,29.5-16.4,40.9-28.6v177.3H107l10.4-73.7l57.7,33.3L179.4,299.8\"/>\n <path fill=\"#444444\" d=\"M294.1,43.6c12,0,21.8-9.8,21.8-21.8c0-12-9.8-21.8-21.8-21.8c-12,0-21.8,9.8-21.8,21.8C272.3,33.8,282.1,43.6,294.1,43.6\" />\n <path fill=\"#444444\" d=\"M337.2,154.3l-41.8-24.1l3.9-20c1.4-7.5,2.2-15.2,2.2-23.1c0-12-1.8-23.7-5-34.6c-0.4-1.4-1.7-2.4-3.1-2.4c0,0-0.1,0-0.1,0 c-46.7,1.6-84.1,40-84.1,87.1c0,2.3,0.1,4.6,0.3,6.9l18.3,3.2c0-0.5,0-0.9,0-1.4c0-19.5,8.6-36.9,22.3-48.7l-10.5,201.1h23.3 l24.9-128l23,10.7L294.9,240l16.6,16.6l34.6-74.3c1.3-2.8,2-5.9,2-9.2C348.1,165.1,343.8,158,337.2,154.3\"/>\n </svg>`,\n\n ChargingStation: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 627.4\">\n <polygon fill=\"#444444\" points=\"314.4,282.1 133.8,467.8 188.6,334.2 114.9,334.2 225.6,148.6 314.4,148.6 236.7,282.1 \"/>\n <path fill=\"#444444\" d=\"M374.2,0H63.3C28.4,0.1,0.1,28.4,0,63.3v503.6c0,32.8,30.1,60.5,62.6,60.5h309.2c33.3,0,60.3-27,60.3-60.3V374.2l0,0V57.8 C432,25.9,406.1,0,374.2,0z M220.3,600.4c-8.3,0.2-15.2-6.4-15.4-14.7c0-0.2,0-0.5,0-0.7c0.1-8.5,6.9-15.3,15.4-15.4 c8.3-0.2,15.2,6.4,15.4,14.7c0,0.2,0,0.5,0,0.7C235.4,593.8,229.1,600.4,220.3,600.4z M391.1,544.8H44v-465h346.7v294.4l0.4,55 V544.8z\"/>\n </svg>`,\n\n WheelChair: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 492.2\">\n <path fill=\"#444444\" d=\"M134.7,80.1l9.5,103h104.6v33.3H146.6l3.2,30.9h147.4l66.6,157l56.3-23.8l11.9,27l-84,36.4l-69.7-163.3H118.9l-19-221.9 c-3.2-5.5-4.7-11.9-4.7-18.2C95.1,18.2,112.5,0,134.7,0c22.2,0,40.4,18.2,40.4,40.4C175.2,61.8,156.9,80.1,134.7,80.1L134.7,80.1z\" />\n <path fill=\"#444444\" d=\"M306.7,397.1c-25.3,56.3-81.6,95.1-146.6,95.1C72.1,492.2,0,420.9,0,332.1C0,268.7,37.2,214,91.1,187.9l3.2,36.5 c-36.5,22.2-61,61.8-61,107.8c0,69.8,57.1,126.8,126.8,126.8c65,0,118.1-48.3,126-110.2L306.7,397.1\"/>\n </svg>`,\n\n};\n\nexport default SVGIcons;","import SVGIcons from \"./svgIcons.helper\";\n\nexport type MapAmenityID = 'atm' | 'management' | 'playarea' | 'restroom' | 'family-restroom' | 'elevator' | 'escalator' | 'security' | 'dog-poop-station' | 'child-stroller' | 'vending-machine' | 'stairs' | 'charging-station' | 'wheelchair';\n\nexport interface MapAmenity {\n name: string;\n type: MapAmenityID;\n svgCode: string;\n}\n\nexport const AllAmenities: MapAmenity[] = [\n {\n name: \"ATM\",\n type: \"atm\",\n svgCode: SVGIcons.ATM\n },\n {\n name: \"Management\",\n type: \"management\",\n svgCode: SVGIcons.Management\n },\n {\n name: \"Kids Area\",\n type: \"playarea\",\n svgCode: SVGIcons.PlayArea\n },\n {\n name: \"Restroom\",\n type: \"restroom\",\n svgCode: SVGIcons.RestRoom\n },\n {\n name: \"Family Restroom\",\n type: \"family-restroom\",\n svgCode: SVGIcons.FamilyRestRoom\n },\n {\n name: \"Elevator\",\n type: \"elevator\",\n svgCode: SVGIcons.Elevator\n },\n {\n name: \"Security\",\n type: \"security\",\n svgCode: SVGIcons.Security\n },\n {\n name: \"Escalator\",\n type: \"escalator\",\n svgCode: SVGIcons.Escalator\n },\n {\n name: 'Child Stroller',\n type: 'child-stroller',\n svgCode: SVGIcons.ChildStroller\n },\n {\n name: 'Vending Machine',\n type: 'vending-machine',\n svgCode: SVGIcons.VendingMachine\n },\n {\n name: 'Stairs',\n type: 'stairs',\n svgCode: SVGIcons.Stairs\n },\n {\n name: 'Charging Station',\n type: 'charging-station',\n svgCode: SVGIcons.ChargingStation\n },\n {\n name: 'Wheelchair',\n type: 'wheelchair',\n svgCode: SVGIcons.WheelChair\n },\n];\n\n","/**\n * Lightweight amenity + kiosk icon catalog for every EyeOn surface.\n * Import from `@eyeon/threejs-map/amenities` (or `@eyeon/threejs-map`) —\n * do not copy these SVGs into other packages.\n */\nimport SVGIcons from './helpers/svgIcons.helper';\nimport {\n AllAmenities,\n type MapAmenity,\n type MapAmenityID,\n} from './helpers/amenities.helper';\n\nexport { AllAmenities };\nexport type { MapAmenity, MapAmenityID };\n\n/** Elevator / escalator are their own v1 modules, not amenity assignments. */\nconst CONNECTOR_AMENITY_TYPES = new Set<MapAmenityID>([\n 'elevator',\n 'escalator',\n]);\n\nexport const AssignAmenities: MapAmenity[] = AllAmenities.filter(\n (item) => !CONNECTOR_AMENITY_TYPES.has(item.type),\n);\n\nexport const KioskSvg = SVGIcons.Kiosk;\nexport const EntranceSvg = SVGIcons.Entrance;\nexport const EscalatorUpSvg = SVGIcons.EscalatorUp;\nexport const EscalatorDownSvg = SVGIcons.EscalatorDown;\n\nexport function isAssignAmenity(type: string): boolean {\n return AssignAmenities.some((item) => item.type === type);\n}\n\nexport function getAmenityByType(type: string): MapAmenity | undefined {\n return AssignAmenities.find((item) => item.type === type) ??\n AllAmenities.find((item) => item.type === type);\n}\n\nexport function getMapSpecialSvg(id: string): string | undefined {\n if (id === 'kiosk') return KioskSvg;\n if (id === 'entrance') return EntranceSvg;\n if (id === 'escalator-up') return EscalatorUpSvg;\n if (id === 'escalator-down') return EscalatorDownSvg;\n return getAmenityByType(id)?.svgCode;\n}\n\nexport function recolorMapSvg(svg: string, color: string): string {\n const hex = color.startsWith('#') ? color : `#${color}`;\n return svg\n .replace(/fill=\"(?!none\")[^\"]*\"/gi, `fill=\"${hex}\"`)\n .replace(/stroke=\"(?!none\")[^\"]*\"/gi, `stroke=\"${hex}\"`);\n}\n\nexport function mapSpecialSvgToDataUrl(\n svg: string,\n color?: string | null,\n): string {\n const colored = color ? recolorMapSvg(svg, color) : svg;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(colored)}`;\n}\n","/**\n * v2 render helpers for amenity / kiosk icons.\n * SVG markup lives only in `@eyeon/threejs-map/amenities`.\n */\nimport {\n AllAmenities,\n AssignAmenities,\n getAmenityByType,\n getMapSpecialSvg,\n isAssignAmenity,\n mapSpecialSvgToDataUrl,\n recolorMapSvg,\n} from '@eyeon/threejs-map/amenities';\nimport type { CmAmenityCatalogItem, CmShapeAssignment } from './core';\nimport { assignmentSpecialIconId, STATIC_ICON_COLORS } from './core';\n\nexport {\n AllAmenities,\n AssignAmenities,\n getAmenityByType,\n isAssignAmenity,\n getMapSpecialSvg,\n mapSpecialSvgToDataUrl,\n recolorMapSvg,\n};\n\nexport function entranceIconDataUrl(color?: string | null): string | undefined {\n const svg = getMapSpecialSvg('entrance');\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, color);\n}\n\n/** v1 amenity list for the assign dropdown — elevator / escalator are separate modules. */\nexport function amenityAssignOptions(): { value: string; label: string }[] {\n return AssignAmenities.map((item) => ({\n value: item.type,\n label: item.name,\n }));\n}\n\nexport function amenityTypeFromCatalogId(\n amenityId: number | null | undefined,\n amenities: CmAmenityCatalogItem[],\n): string {\n if (amenityId == null) return '';\n return amenities.find((item) => item.id === amenityId)?.code ?? '';\n}\n\nexport function amenityCatalogIdForType(\n type: string,\n amenities: CmAmenityCatalogItem[],\n): number | null {\n const row = amenities.find(\n (item) => item.isActive !== false && item.code === type,\n );\n return row?.id ?? null;\n}\n\nexport function assignmentSpecialIconDataUrl(\n assignment: CmShapeAssignment | null | undefined,\n amenities: Array<{ id: number; code: string }>,\n color?: string | null,\n): string | undefined {\n const id = assignmentSpecialIconId(assignment, amenities);\n if (!id) return undefined;\n const svg = getMapSpecialSvg(id);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, color);\n}\n\nexport type ConnectorSpecialKind = 'escalator' | 'elevator';\nexport type EscalatorTravel = 'up' | 'down';\nexport type ConnectorIconId =\n | ConnectorSpecialKind\n | 'escalator-up'\n | 'escalator-down';\n\nconst ASSIGNED_CONNECTOR_ICON = STATIC_ICON_COLORS.connector;\nconst UNASSIGNED_CONNECTOR_ICON = '#94a3b8';\n\ntype LevelTravelInput = {\n id: number;\n levelIndex?: number;\n ordering?: number;\n anchors?: Array<{ shapeId?: number | null; connectorId?: number | null }>;\n};\n\n/** Compare two floors — higher index / ordering is up. */\nexport function levelTravel(\n from: Pick<LevelTravelInput, 'levelIndex' | 'ordering'>,\n to: Pick<LevelTravelInput, 'levelIndex' | 'ordering'>,\n): EscalatorTravel | null {\n const fromIndex = from.levelIndex ?? from.ordering;\n const toIndex = to.levelIndex ?? to.ordering;\n if (fromIndex == null || toIndex == null || toIndex === fromIndex) {\n const fromOrder = from.ordering ?? from.levelIndex;\n const toOrder = to.ordering ?? to.levelIndex;\n if (fromOrder == null || toOrder == null || toOrder === fromOrder) {\n return null;\n }\n return toOrder > fromOrder ? 'up' : 'down';\n }\n return toIndex > fromIndex ? 'up' : 'down';\n}\n\n/**\n * From this linked landing, which way does the ride go? Used for the\n * EscalatorUp / EscalatorDown overlay. Lists keep the plain Escalator icon.\n */\nexport function escalatorLandingTravel(\n shapeId: number,\n levelId: number,\n levels: readonly LevelTravelInput[],\n): EscalatorTravel | null {\n const here = levels.find((level) => level.id === levelId);\n if (!here) return null;\n const connectorId = here.anchors?.find(\n (anchor) => anchor.shapeId === shapeId && anchor.connectorId != null,\n )?.connectorId;\n if (connectorId == null) return null;\n\n const partner = levels.find((level) => {\n if (level.id === here.id) return false;\n return Boolean(\n level.anchors?.some(\n (anchor) =>\n anchor.connectorId === connectorId &&\n anchor.shapeId != null &&\n anchor.shapeId !== shapeId,\n ),\n );\n });\n if (!partner) return null;\n return levelTravel(here, partner);\n}\n\n/** Linked map overlays use the arrow variants; UI lists pass no travel. */\nexport function escalatorConnectorIconId(\n travel?: EscalatorTravel | null,\n): ConnectorIconId {\n if (travel === 'up') return 'escalator-up';\n if (travel === 'down') return 'escalator-down';\n return 'escalator';\n}\n\n/** Escalator / elevator SVG ids from the floor file (`escalator-5-up-start`). */\nexport function connectorSpecialKind(shape: {\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorSpecialKind | null {\n const raw = (shape.sourceSvgId ?? shape.key)\n .trim()\n .toLowerCase()\n .replace(/_/g, '-');\n if (raw === 'escalator' || raw.startsWith('escalator-')) return 'escalator';\n if (raw === 'elevator' || raw.startsWith('elevator-')) return 'elevator';\n return null;\n}\n\nexport function connectorSpecialIconDataUrl(\n kind: ConnectorIconId,\n assigned: boolean,\n color?: string | null,\n): string | undefined {\n const svg = getMapSpecialSvg(kind);\n if (!svg) return undefined;\n const fill = color?.trim()\n ? color.trim()\n : assigned\n ? ASSIGNED_CONNECTOR_ICON\n : UNASSIGNED_CONNECTOR_ICON;\n return mapSpecialSvgToDataUrl(svg, fill);\n}\n\nexport function connectorMapIconDataUrl(\n kind: ConnectorSpecialKind,\n assigned: boolean,\n color?: string | null,\n travel?: EscalatorTravel | null,\n): string | undefined {\n const iconId = kind === 'escalator' ? escalatorConnectorIconId(travel) : kind;\n return connectorSpecialIconDataUrl(iconId, assigned, color);\n}\n\n/** Landings that belong to a linked escalator ride / elevator shaft. */\nexport function assignedConnectorShapeIds(\n anchors: Array<{ shapeId?: number | null; connectorId?: number | null }>,\n): Set<number> {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.shapeId != null && anchor.connectorId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return ids;\n}\n\n/**\n * Map overlay: only a linked landing gets an icon. Unassigned escalators\n * and elevators stay as empty polygons on PORTAL assign; WEBSITE / DISPLAY_APP\n * hide those polygons entirely.\n */\nexport function connectorMapIconKind(\n shape: {\n id: number;\n key: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | Date | null;\n },\n assignedShapeIds: Set<number>,\n): ConnectorSpecialKind | null {\n if (shape.orphanedAt) return null;\n const kind = connectorSpecialKind(shape);\n if (!kind || !assignedShapeIds.has(shape.id)) return null;\n return kind;\n}\n","export default \"data:font/woff;base64,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\"","import mapFontUrl from './Montserrat-Regular.woff?url';\n\n/**\n * Troika (drei `<Text>`) cannot use CSS `font-family`; it needs a font file.\n * Latin 400 WOFF, same face as `@fontsource/montserrat` / admin-portal.\n */\nexport const MAP_FONT_URL = mapFontUrl;\n\nlet registered = false;\n\n/** Register Montserrat so SVG + canvas measurement match the 3D overlay. */\nexport function ensureMapFont(): void {\n if (registered || typeof document === 'undefined' || !('fonts' in document)) {\n return;\n }\n registered = true;\n const face = new FontFace('Montserrat', `url(${MAP_FONT_URL})`);\n void face.load().then((loaded) => {\n document.fonts.add(loaded);\n });\n}\n\nensureMapFont();\n","export interface ModernSelectOption {\n value: string;\n label: string;\n hint?: string;\n iconUrl?: string;\n iconMuted?: boolean;\n}\n\n/** Show a search field once a list is long enough to scan by eye. */\nexport const MODERN_SELECT_SEARCH_AFTER = 8;\n\nexport function filterModernSelectOptions(\n options: ModernSelectOption[],\n query: string,\n): ModernSelectOption[] {\n const q = query.trim().toLowerCase();\n if (!q) return options;\n return options.filter((o) => {\n const haystack = `${o.label} ${o.hint ?? ''}`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nexport function modernSelectIsSearchable(\n optionCount: number,\n searchable?: boolean,\n): boolean {\n return searchable ?? optionCount >= MODERN_SELECT_SEARCH_AFTER;\n}\n","import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './modern-select.css';\nimport {\n filterModernSelectOptions,\n modernSelectIsSearchable,\n type ModernSelectOption,\n} from './selectSearch';\n\nexport type { ModernSelectOption } from './selectSearch';\nexport { filterModernSelectOptions } from './selectSearch';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ModernSelect({\n value,\n options,\n onChange,\n disabled = false,\n placeholder = 'Select…',\n searchable,\n ariaLabel,\n}: {\n value: string;\n options: ModernSelectOption[];\n onChange: (value: string) => void;\n disabled?: boolean;\n placeholder?: string;\n searchable?: boolean;\n ariaLabel?: string;\n}) {\n const listId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const withSearch = modernSelectIsSearchable(options.length, searchable);\n const selected = options.find((o) => o.value === value);\n const filtered = useMemo(\n () => filterModernSelectOptions(options, withSearch && open ? query : ''),\n [open, options, query, withSearch],\n );\n\n const close = useCallback(() => {\n setOpen(false);\n setQuery('');\n setActiveIndex(0);\n }, []);\n\n const pick = useCallback(\n (next: string) => {\n onChange(next);\n close();\n },\n [close, onChange],\n );\n\n const updateMenuPos = useCallback(() => {\n const el = triggerRef.current ?? buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 160),\n maxHeight,\n });\n }, []);\n\n useEffect(() => {\n if (!open) {\n setMenuPos(null);\n return;\n }\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (rootRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n (withSearch ? searchRef.current : buttonRef.current)?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos, withSearch]);\n\n useEffect(() => {\n if (!open || !withSearch) return;\n requestAnimationFrame(() => searchRef.current?.focus());\n }, [open, withSearch]);\n\n useEffect(() => {\n setActiveIndex(0);\n }, [query, filtered.length]);\n\n const moveActive = (delta: number) => {\n if (filtered.length === 0) return;\n setActiveIndex((i) => (i + delta + filtered.length) % filtered.length);\n };\n\n const onSearchKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (!open) setOpen(true);\n else moveActive(1);\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (!open) setOpen(true);\n else moveActive(-1);\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n const option = filtered[activeIndex];\n if (open && option) pick(option.value);\n else setOpen(true);\n }\n };\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label={ariaLabel}\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {filtered.length === 0 ? (\n <li className=\"eyeon-map-select__empty\">No matches</li>\n ) : (\n filtered.map((option, index) => {\n const active = option.value === value;\n const highlighted = index === activeIndex;\n return (\n <li\n key={option.value}\n id={`${listId}-${option.value}`}\n role=\"option\"\n aria-selected={active}\n >\n <button\n type=\"button\"\n className={[\n 'eyeon-map-select__option',\n active ? 'is-active' : '',\n highlighted ? 'is-highlight' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => pick(option.value)}\n >\n {option.iconUrl ? (\n <img\n className={\n option.iconMuted\n ? 'eyeon-map-select__option-icon is-muted'\n : 'eyeon-map-select__option-icon'\n }\n src={option.iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-select__option-copy\">\n <span>{option.label}</span>\n {option.hint ? (\n <span className=\"eyeon-map-select__option-hint\">\n {option.hint}\n </span>\n ) : null}\n </span>\n </button>\n </li>\n );\n })\n )}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div ref={rootRef} className=\"eyeon-map-select\">\n {withSearch ? (\n <div\n ref={triggerRef}\n className={\n open\n ? 'eyeon-map-select__trigger is-open'\n : 'eyeon-map-select__trigger'\n }\n onMouseDown={(e) => {\n if (disabled) return;\n const target = e.target as HTMLElement;\n if (target.closest('.eyeon-map-select__chevron-btn')) return;\n if (target !== searchRef.current) {\n e.preventDefault();\n searchRef.current?.focus();\n }\n if (!open) setOpen(true);\n }}\n >\n <input\n ref={searchRef}\n className=\"eyeon-map-select__input\"\n type=\"text\"\n role=\"combobox\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && filtered[activeIndex]\n ? `${listId}-${filtered[activeIndex].value}`\n : undefined\n }\n disabled={disabled}\n placeholder={placeholder}\n value={open ? query : (selected?.label ?? '')}\n onChange={(e) => {\n setQuery(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={() => {\n if (!disabled) setOpen(true);\n }}\n onKeyDown={onSearchKeyDown}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-select__chevron-btn\"\n tabIndex={-1}\n aria-hidden\n disabled={disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (disabled) return;\n setOpen((v) => !v);\n }}\n >\n <Chevron />\n </button>\n </div>\n ) : (\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"eyeon-map-select__trigger\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setOpen((v) => !v);\n }}\n >\n <span\n className={\n selected\n ? 'eyeon-map-select__value'\n : 'eyeon-map-select__placeholder'\n }\n >\n {selected?.iconUrl ? (\n <img\n className={\n selected.iconMuted\n ? 'eyeon-map-select__option-icon is-muted'\n : 'eyeon-map-select__option-icon'\n }\n src={selected.iconUrl}\n alt=\"\"\n />\n ) : null}\n {selected?.label ?? placeholder}\n </span>\n <Chevron />\n </button>\n )}\n {menu}\n </div>\n );\n}\n","import * as THREE from 'three';\nimport type { Vec2 } from '../../core';\nimport { holesOverlappingOuter } from '../../core';\n\nexport function polygonToThreeShape(points: Vec2[]): THREE.Shape | null {\n if (points.length < 3) return null;\n const shape = new THREE.Shape();\n shape.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n shape.lineTo(points[i].x, points[i].y);\n }\n shape.closePath();\n return shape;\n}\n\nexport function polygonToThreePath(points: Vec2[]): THREE.Path | null {\n if (points.length < 3) return null;\n const path = new THREE.Path();\n path.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n path.lineTo(points[i].x, points[i].y);\n }\n path.closePath();\n return path;\n}\n\n/** Punch overlapping openings out of a slab polygon. */\nexport function slabShapeWithHoles(\n outer: Vec2[],\n holes: Vec2[][],\n): THREE.Shape | null {\n const shape = polygonToThreeShape(outer);\n if (!shape) return null;\n for (const hole of holesOverlappingOuter(outer, holes)) {\n const path = polygonToThreePath(hole);\n if (path) shape.holes.push(path);\n }\n return shape;\n}\n","import React, { useEffect, useMemo } from 'react';\nimport * as THREE from 'three';\nimport type { Vec2 } from '../../core';\nimport {\n OPENING_VOID_FILL,\n OPENING_VOID_MARK,\n OPENING_VOID_STROKE,\n polygonBBox,\n} from '../../core';\nimport { polygonToThreeShape } from './openingGeometry';\n\nfunction skipRaycast() {}\n\n/** X mark in bbox UV space — ShapeGeometry clips it to the opening. */\nfunction createOpeningMarkTexture(aspect: number): THREE.CanvasTexture {\n const height = 256;\n const width = Math.max(48, Math.round(height * Math.max(aspect, 0.2)));\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return new THREE.CanvasTexture(canvas);\n ctx.clearRect(0, 0, width, height);\n const pad = Math.min(width, height) * 0.14;\n ctx.strokeStyle = OPENING_VOID_MARK;\n ctx.globalAlpha = 0.82;\n ctx.lineWidth = Math.max(5, Math.min(width, height) * 0.045);\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(pad, pad);\n ctx.lineTo(width - pad, height - pad);\n ctx.moveTo(width - pad, pad);\n ctx.lineTo(pad, height - pad);\n ctx.stroke();\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.anisotropy = 4;\n texture.needsUpdate = true;\n return texture;\n}\n\nfunction OpeningVoidMesh({ polygon }: { polygon: Vec2[] }) {\n const shape = useMemo(() => polygonToThreeShape(polygon), [polygon]);\n const box = useMemo(() => polygonBBox(polygon), [polygon]);\n const dash = Math.max(8, openingSpanDash(box));\n const outline = useMemo(() => {\n if (polygon.length < 2) return null;\n const first = polygon[0];\n const points = [\n ...polygon.map((p) => new THREE.Vector3(p.x, p.y, 0.05)),\n new THREE.Vector3(first.x, first.y, 0.05),\n ];\n const geometry = new THREE.BufferGeometry().setFromPoints(points);\n const material = new THREE.LineDashedMaterial({\n color: OPENING_VOID_STROKE,\n dashSize: dash,\n gapSize: dash * 0.65,\n });\n const line = new THREE.Line(geometry, material);\n line.renderOrder = 8;\n line.computeLineDistances();\n line.raycast = skipRaycast;\n return line;\n }, [dash, polygon]);\n\n useEffect(\n () => () => {\n if (!outline) return;\n outline.geometry.dispose();\n const material = outline.material;\n if (Array.isArray(material)) material.forEach((item) => item.dispose());\n else material.dispose();\n },\n [outline],\n );\n const mark = useMemo(() => {\n const width = Math.max(box.maxX - box.minX, 1);\n const height = Math.max(box.maxY - box.minY, 1);\n return createOpeningMarkTexture(width / height);\n }, [box]);\n\n useEffect(() => () => mark.dispose(), [mark]);\n\n if (!shape || !outline) return null;\n\n return (\n <group>\n <mesh\n position={[0, 0, 0.02]}\n renderOrder={6}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n color={OPENING_VOID_FILL}\n side={THREE.DoubleSide}\n depthWrite={false}\n />\n </mesh>\n <mesh position={[0, 0, 0.03]} renderOrder={7} raycast={skipRaycast}>\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n map={mark}\n transparent\n depthWrite={false}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n {outline ? <primitive object={outline} /> : null}\n </group>\n );\n}\n\nfunction openingSpanDash(bbox: {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}): number {\n const span = Math.min(bbox.maxX - bbox.minX, bbox.maxY - bbox.minY);\n return Math.min(18, Math.max(7, span * 0.08));\n}\n\nexport function OpeningWells({\n polygons,\n}: {\n polygons: Vec2[][];\n is3d?: boolean;\n}) {\n if (polygons.length === 0) return null;\n return (\n <group>\n {polygons.map((polygon, index) => (\n <OpeningVoidMesh key={`opening-void-${index}`} polygon={polygon} />\n ))}\n </group>\n );\n}\n","import {\n darkenShapeFill,\n viewerShapeHoverableOnHost,\n type MapViewerHost,\n type PublicServiceShape,\n type ShapeKind,\n} from '../core';\n\n/** Kinds that select (or Shift-add) on the assign / public map. */\nexport const VIEWER_SELECTABLE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'entrance',\n 'parking_zone',\n 'custom',\n];\n\nexport function isViewerSelectableKind(kind: string): boolean {\n return (VIEWER_SELECTABLE_KINDS as readonly string[]).includes(kind);\n}\n\n/** Assign map: any selectable kind. Public hosts: only assigned items. */\nexport function isViewerInteractiveShape(\n kind: string,\n host: MapViewerHost = 'PORTAL_ASSIGN',\n assignment?: PublicServiceShape['assignment'] | null,\n): boolean {\n return (\n isViewerSelectableKind(kind) &&\n viewerShapeHoverableOnHost({ assignment: assignment ?? undefined }, host)\n );\n}\n\n/** Hover and the current selection share the same assign-map highlight. */\nexport function viewerShapeHighlighted(\n shapeId: number,\n hoveredShapeId: number | null,\n selectedShapeIds: readonly number[],\n): boolean {\n return hoveredShapeId === shapeId || selectedShapeIds.includes(shapeId);\n}\n\n/** Map pointer hover wins over a leftover list hover. */\nexport function resolvedViewerHoverId(\n listHoverId: number | null | undefined,\n pointerHoverId: number | null,\n): number | null {\n return pointerHoverId ?? listHoverId ?? null;\n}\n\nexport function viewerHoverCursor(\n kind: string,\n host: MapViewerHost = 'PORTAL_ASSIGN',\n assignment?: PublicServiceShape['assignment'] | null,\n): 'pointer' | '' {\n return isViewerInteractiveShape(kind, host, assignment) ? 'pointer' : '';\n}\n\n/** R3F `eventSource` hosts the cursor — the WebGL canvas has pointer-events: none. */\nexport function applyViewerHoverCursor(\n host: HTMLElement | null | undefined,\n cursor: 'pointer' | '',\n): void {\n if (!host) return;\n host.classList.toggle('is-hover-shape', cursor === 'pointer');\n}\n\n/** Near-invisible fills (legacy amenity 0.01) still need a readable hover. */\nexport function viewerHoverFillOpacity(\n kind: string,\n base: number,\n hovered: boolean,\n): number {\n if (!hovered || !isViewerSelectableKind(kind)) return base;\n if (base < 0.08) return 0.28;\n return base;\n}\n\n/** Hover and the current selection use the same darker shade of this fill. */\nexport function viewerHoverFillColor(fill: string, hovered: boolean): string {\n if (!hovered) return fill;\n return darkenShapeFill(fill);\n}\n\n/** Canvas-host coordinates — MapScene uses `eventPrefix=\"offset\"`. */\nexport function viewerPointerOffset(event: {\n offsetX?: number;\n offsetY?: number;\n nativeEvent?: { offsetX?: number; offsetY?: number };\n}): { x: number; y: number } | null {\n const native = event.nativeEvent;\n const x = typeof event.offsetX === 'number' ? event.offsetX : native?.offsetX;\n const y = typeof event.offsetY === 'number' ? event.offsetY : native?.offsetY;\n if (typeof x !== 'number' || typeof y !== 'number') return null;\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n return { x, y };\n}\n\n/** Pan farther than this and a pointer-up is not a click/tap. */\nexport const VIEWER_CLICK_DRAG_PX = 5;\n\nexport type ViewerPointerGesture = {\n pointerId: number | null;\n x: number;\n y: number;\n maxDist: number;\n active: boolean;\n};\n\nexport function createViewerPointerGesture(): ViewerPointerGesture {\n return { pointerId: null, x: 0, y: 0, maxDist: 0, active: false };\n}\n\nexport function viewerPointerClientXY(e: {\n clientX?: number;\n clientY?: number;\n pointerId?: number;\n}): { x: number; y: number; pointerId: number | null } | null {\n const x = e.clientX;\n const y = e.clientY;\n if (typeof x !== 'number' || typeof y !== 'number' || !Number.isFinite(x) || !Number.isFinite(y)) {\n return null;\n }\n return { x, y, pointerId: e.pointerId ?? null };\n}\n\nexport function beginViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (gesture.active) return;\n gesture.active = true;\n gesture.pointerId = pointerId;\n gesture.x = x;\n gesture.y = y;\n gesture.maxDist = 0;\n}\n\nexport function moveViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (!gesture.active) return;\n if (gesture.pointerId != null && pointerId != null && pointerId !== gesture.pointerId) return;\n const dist = Math.hypot(x - gesture.x, y - gesture.y);\n if (dist > gesture.maxDist) gesture.maxDist = dist;\n}\n\nexport function endViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (!gesture.active) return;\n if (gesture.pointerId != null && pointerId != null && pointerId !== gesture.pointerId) return;\n moveViewerPointerGesture(gesture, x, y, pointerId);\n gesture.active = false;\n gesture.pointerId = null;\n}\n\n/** True when the pointer barely moved — R3F delta alone is unreliable on touch. */\nexport function viewerPointerClickIsTap(maxDist: number, r3fDelta?: number): boolean {\n const delta = Number.isFinite(r3fDelta) ? r3fDelta! : 0;\n return Math.max(maxDist, delta) <= VIEWER_CLICK_DRAG_PX;\n}\n\nexport function pointerMissClearsSelection(\n down: { x: number; y: number } | null,\n up: { x: number; y: number; button?: number },\n): boolean {\n if ((up.button ?? 0) !== 0) return false;\n if (!down) return true;\n const dx = up.x - down.x;\n const dy = up.y - down.y;\n return dx * dx + dy * dy <= VIEWER_CLICK_DRAG_PX * VIEWER_CLICK_DRAG_PX;\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { Html, Text } from '@react-three/drei';\nimport type {\n CmAmenityCatalogItem,\n MapViewerHost,\n PublishedLevel,\n PublishedRetailer,\n ThemeDefaults,\n ShapeKind,\n ViewerHoverTooltipHandler,\n} from '../../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n connectorIconLayout,\n darkenShapeFill,\n DEFAULT_ASSIGNMENT_SIZE,\n DEFAULT_ENTRANCE_SIZE,\n filletPolygon,\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n isEntranceIcon,\n isSlabShapeKind,\n isTransparentColor,\n labelAlignX,\n normalizeLabelAlign,\n resolveFetchUrl,\n resolveLayerStyle,\n resolvedAssignmentIconColor,\n resolvedViewerShapeFill,\n viewerHoverTooltipLabel,\n viewerShapeBaseOpacity,\n viewerShapeVisibleOnHost,\n voidPolygonsOnLevel,\n} from '../../core';\nimport { polygonToThreeShape, slabShapeWithHoles } from './openingGeometry';\nimport { OpeningWells } from './OpeningWell';\nimport { MAP_LABEL_LINE_HEIGHT } from '../../fonts/mapFont';\nimport { MAP_FONT_URL } from '../../fonts/mapFontUrl';\nimport {\n applyViewerHoverCursor,\n isViewerInteractiveShape,\n viewerHoverCursor,\n viewerHoverFillOpacity,\n resolvedViewerHoverId,\n viewerPointerClickIsTap,\n viewerPointerOffset,\n viewerShapeHighlighted,\n type ViewerPointerGesture,\n} from '../pointer';\nimport {\n assignedConnectorShapeIds,\n assignmentSpecialIconDataUrl,\n connectorMapIconDataUrl,\n connectorMapIconKind,\n escalatorLandingTravel,\n entranceIconDataUrl,\n} from '../../specialIcons';\n\nfunction kindColor(\n kind: ShapeKind,\n theme: ThemeDefaults,\n host: MapViewerHost,\n fill?: string,\n assignment?: { bgColor?: string | null } | null,\n): string {\n return resolvedViewerShapeFill(kind, theme, host, fill, assignment);\n}\n\nfunction polygonShape(points: { x: number; y: number }[]): THREE.Shape | null {\n return polygonToThreeShape(points);\n}\n\nexport interface LevelMeshesProps {\n level: PublishedLevel;\n /** All floors — used to pick EscalatorUp / EscalatorDown from the linked landing. */\n levels?: readonly PublishedLevel[];\n theme: ThemeDefaults;\n is3d: boolean;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n /** Assign-map selection — same highlight as hover so staff can see the set. */\n selectedShapeIds?: readonly number[];\n /** Rail / search hover — same darker fill as pointer hover. */\n hoveredShapeId?: number | null;\n /** Host that owns pointer events (and therefore the CSS cursor). */\n eventSource?: React.RefObject<HTMLElement | null>;\n /** Tracks pointer travel so pan-release on a store is not treated as a click. */\n pointerGestureRef?: React.RefObject<ViewerPointerGesture>;\n /**\n * When true (outdoor with live SVG), only interactive shapes are drawn —\n * decoration comes from SvgVectorLayer.\n */\n interactiveOnly?: boolean;\n /** Same media proxy as outdoor SVGs — remote retailer logos only, not data URLs. */\n imageProxyUrl?: string | null;\n /** Published amenity catalog — used to resolve v1 amenity icons by code. */\n amenities?: CmAmenityCatalogItem[];\n /** Live / published retailers — logo-only stores have no label text. */\n retailers?: PublishedRetailer[];\n /** Public hosts hide unassigned amenity / kiosk / elevator / escalator polygons. */\n host?: MapViewerHost;\n /** Assigned kiosk shape currently running this DISPLAY_APP viewer. */\n kioskOriginShapeId?: number | null;\n /** WEBSITE / DISPLAY_APP store and amenity name pop-out. */\n showHoverTooltip?: boolean;\n onHoverTooltip?: ViewerHoverTooltipHandler;\n}\n\nfunction HoverOutline({\n shape,\n extrude,\n color,\n}: {\n shape: THREE.Shape;\n extrude: number;\n color: string;\n}) {\n const sourceGeometry = useMemo(\n () =>\n extrude > 0\n ? new THREE.ExtrudeGeometry(shape, {\n depth: extrude,\n bevelEnabled: false,\n })\n : new THREE.ShapeGeometry(shape),\n [extrude, shape],\n );\n\n useEffect(() => () => sourceGeometry.dispose(), [sourceGeometry]);\n\n return (\n <lineSegments renderOrder={40}>\n <edgesGeometry args={[sourceGeometry]} />\n <lineBasicMaterial color={color} depthTest={false} />\n </lineSegments>\n );\n}\n\nfunction CurrentLocationPulse({\n position,\n}: {\n position: [number, number, number];\n}) {\n return (\n <Html\n position={position}\n center\n zIndexRange={[10, 0]}\n style={{ pointerEvents: 'none' }}\n >\n <span\n className=\"eyeon-map-current-location-marker\"\n aria-hidden=\"true\"\n />\n </Html>\n );\n}\n\nexport function LevelMeshes({\n level,\n levels,\n theme,\n is3d,\n onSelectShape,\n selectedShapeIds = [],\n hoveredShapeId: hoveredShapeIdProp = null,\n eventSource,\n pointerGestureRef,\n interactiveOnly = false,\n imageProxyUrl = null,\n amenities = [],\n retailers = [],\n host = 'PORTAL_ASSIGN',\n kioskOriginShapeId = null,\n showHoverTooltip = false,\n onHoverTooltip,\n}: LevelMeshesProps) {\n const [pointerHoverId, setPointerHoverId] = useState<number | null>(null);\n const hoveredShapeId = resolvedViewerHoverId(\n hoveredShapeIdProp,\n pointerHoverId,\n );\n useEffect(\n () => () => {\n applyViewerHoverCursor(eventSource?.current, '');\n onHoverTooltip?.(null);\n },\n [eventSource, onHoverTooltip],\n );\n const publishHoverTooltip = (\n shape: PublishedLevel['shapes'][number],\n event: {\n buttons?: number;\n offsetX?: number;\n offsetY?: number;\n nativeEvent?: { offsetX?: number; offsetY?: number; buttons?: number };\n },\n ) => {\n if (!showHoverTooltip || !onHoverTooltip) return;\n const buttons = event.buttons ?? event.nativeEvent?.buttons ?? 0;\n if (buttons > 0) {\n onHoverTooltip(null);\n return;\n }\n const offset = viewerPointerOffset(event);\n const text = viewerHoverTooltipLabel(shape, retailers, amenities);\n if (!offset || !text) {\n onHoverTooltip(null, { leavingShapeId: shape.id });\n return;\n }\n onHoverTooltip({ shapeId: shape.id, text, x: offset.x, y: offset.y });\n };\n\n const openings = useMemo(() => voidPolygonsOnLevel(level), [level]);\n const assignedConnectorIds = useMemo(\n () => assignedConnectorShapeIds(level.anchors),\n [level.anchors],\n );\n const visibleShapes = useMemo(\n () =>\n level.shapes.filter((s) =>\n viewerShapeVisibleOnHost(s, host, assignedConnectorIds),\n ),\n [assignedConnectorIds, host, level.shapes],\n );\n const meshes = useMemo(() => {\n return visibleShapes\n .filter((s) => s.kind !== 'void')\n .filter((s) => !(s.kind === 'label' && s.label?.text?.trim()))\n .filter((s) => !isEntranceIcon(s))\n .filter(\n (s) =>\n !interactiveOnly ||\n INTERACTIVE_SHAPE_KINDS.includes(s.kind) ||\n (s.kind === 'label' && Boolean(s.label?.text?.trim())) ||\n (s.kind === 'walkable' && !resolveLayerStyle(s.sourceSvgId)),\n )\n .filter((s) => !s.orphanedAt)\n .map((shape) => {\n const radius = shape.kind === 'unit' ? theme.STORE_RADIUS : 0;\n const punch = isSlabShapeKind(shape.kind) && openings.length > 0;\n const polys = shape.geometry.polygons.map((poly) =>\n radius > 0 ? filletPolygon(poly, radius) : poly,\n );\n const threeShapes = polys\n .map((poly) =>\n punch ? slabShapeWithHoles(poly, openings) : polygonShape(poly),\n )\n .filter((s): s is THREE.Shape => s != null);\n if (threeShapes.length === 0) return null;\n\n const color = kindColor(\n shape.kind,\n theme,\n host,\n shape.style.fill,\n shape.assignment,\n );\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n\n return { shape, threeShapes, color, extrude };\n })\n .filter(Boolean) as Array<{\n shape: (typeof visibleShapes)[number];\n threeShapes: THREE.Shape[];\n color: string;\n extrude: number;\n }>;\n }, [visibleShapes, theme, is3d, interactiveOnly, openings, host]);\n\n const labels = useMemo(\n () =>\n visibleShapes.filter(\n (s) => !s.orphanedAt && s.kind === 'label' && Boolean(s.label?.text?.trim()),\n ),\n [visibleShapes],\n );\n\n const entranceIcons = useMemo(\n () => visibleShapes.filter((s) => !s.orphanedAt && isEntranceIcon(s)),\n [visibleShapes],\n );\n\n const overlays = useMemo(\n () =>\n visibleShapes.filter(\n (s) =>\n !s.orphanedAt &&\n s.kind !== 'label' &&\n !isEntranceIcon(s) &&\n assignmentOverlayVisible(s.assignment, s.label),\n ),\n [visibleShapes],\n );\n\n const connectorOverlays = useMemo(() => {\n return visibleShapes.flatMap((shape) => {\n const kind = connectorMapIconKind(shape, assignedConnectorIds);\n if (!kind) return [];\n const layout = connectorIconLayout(shape);\n const iconColor = resolvedAssignmentIconColor(\n shape.assignment,\n theme,\n layout.iconColor,\n shape.kind,\n );\n const travel =\n kind === 'escalator'\n ? escalatorLandingTravel(shape.id, level.id, levels ?? [level])\n : null;\n const url = connectorMapIconDataUrl(kind, true, iconColor, travel);\n if (!url) return [];\n const box = geometryBBox(shape.geometry);\n return [\n {\n shape,\n url,\n width: layout.size,\n rotation: (layout.rotate * Math.PI) / 180,\n x: (box.minX + box.maxX) / 2 + layout.offsetX,\n y: (box.minY + box.maxY) / 2 + layout.offsetY,\n },\n ];\n });\n }, [assignedConnectorIds, level.id, levels, theme, visibleShapes]);\n\n return (\n <group>\n {labels.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const align = normalizeLabelAlign(shape.label.align);\n const cx = (box.minX + box.maxX) / 2;\n const cy = (box.minY + box.maxY) / 2;\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n return (\n <group\n key={`label-${shape.id}`}\n position={[cx, cy, 0.15]}\n rotation={[0, 0, tilt]}\n >\n <Text\n font={MAP_FONT_URL}\n position={[labelAlignX(box, align) - cx, 0, 0]}\n fontSize={shape.label.size ?? 24}\n color={shape.label.color ?? theme.STORE_TEXT_COLOR}\n anchorX={align}\n anchorY=\"middle\"\n textAlign={align}\n lineHeight={MAP_LABEL_LINE_HEIGHT}\n scale={[1, -1, 1]}\n >\n {shape.label.text}\n </Text>\n </group>\n );\n })}\n {entranceIcons.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const cx = (box.minX + box.maxX) / 2 + (shape.label.offsetX ?? 0);\n const cy = (box.minY + box.maxY) / 2 + (shape.label.offsetY ?? 0);\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n const size = shape.label.size || DEFAULT_ENTRANCE_SIZE;\n const url = entranceIconDataUrl(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n );\n if (!url) return null;\n return (\n <AssignmentImageOverlay\n key={`entrance-${shape.id}`}\n url={url}\n width={size}\n position={[cx, cy, 0.18]}\n rotation={tilt}\n />\n );\n })}\n {overlays.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const cx = (box.minX + box.maxX) / 2 + (shape.label.offsetX ?? 0);\n const cy = (box.minY + box.maxY) / 2 + (shape.label.offsetY ?? 0);\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n const fontSize = shape.label.size || shape.assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n const z = extrude > 0 ? extrude + 0.15 : 0.2;\n const iconColor = resolvedAssignmentIconColor(\n shape.assignment,\n theme,\n shape.label.color,\n shape.kind,\n );\n const imageKey =\n assignmentOverlayImageUrl(shape.assignment, null, shape.label) ??\n assignmentSpecialIconDataUrl(\n shape.assignment,\n amenities,\n iconColor,\n );\n const text = shape.label.text?.trim();\n const align = normalizeLabelAlign(shape.label.align);\n const position: [number, number, number] = [cx, cy, z];\n return (\n <React.Fragment key={`overlay-${shape.id}`}>\n {imageKey ? (\n <AssignmentImageOverlay\n url={imageKey}\n width={assignmentOverlayRenderSize(fontSize, shape.assignment)}\n position={position}\n rotation={tilt}\n imageProxyUrl={imageProxyUrl}\n />\n ) : (\n <Text\n font={MAP_FONT_URL}\n position={position}\n rotation={[0, 0, tilt]}\n fontSize={fontSize}\n color={iconColor}\n anchorX=\"center\"\n anchorY=\"middle\"\n textAlign={align}\n lineHeight={MAP_LABEL_LINE_HEIGHT}\n scale={[1, -1, 1]}\n raycast={skipRaycast}\n >\n {text}\n </Text>\n )}\n {shape.id === kioskOriginShapeId ? (\n <CurrentLocationPulse position={[cx, cy, z + 0.02]} />\n ) : null}\n </React.Fragment>\n );\n })}\n {connectorOverlays.map(({ shape, url, width, rotation, x, y }) => (\n <AssignmentImageOverlay\n key={`connector-icon-${shape.id}`}\n url={url}\n width={width}\n position={[x, y, 0.22]}\n rotation={rotation}\n />\n ))}\n <OpeningWells polygons={openings} />\n {meshes.map(({ shape, threeShapes, color, extrude }) => {\n const selectable = isViewerInteractiveShape(\n shape.kind,\n host,\n shape.assignment,\n );\n const hovered =\n selectable &&\n viewerShapeHighlighted(shape.id, hoveredShapeId, selectedShapeIds);\n const baseOpacity = viewerShapeBaseOpacity(\n shape.kind,\n shape.style.opacity,\n );\n const fillTransparent = isTransparentColor(color);\n const opacity = fillTransparent\n ? hovered\n ? 0.2\n : 0\n : viewerHoverFillOpacity(\n shape.kind,\n baseOpacity,\n hovered,\n );\n const emphasisFill = darkenShapeFill(\n fillTransparent ? theme.STORE_DEFAULT_COLOR : color,\n );\n const fill = hovered\n ? emphasisFill\n : fillTransparent\n ? '#000000'\n : color;\n return (\n <group key={shape.id}>\n {threeShapes.map((geoShape, idx) => (\n <mesh\n key={`${shape.id}-${idx}`}\n position={[0, 0, shape.zIndex * 0.01]}\n onPointerOver={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId(shape.id);\n applyViewerHoverCursor(\n eventSource?.current,\n viewerHoverCursor(shape.kind, host, shape.assignment),\n );\n publishHoverTooltip(shape, e);\n }}\n onPointerMove={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n publishHoverTooltip(shape, e);\n }}\n onPointerOut={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId((id) => (id === shape.id ? null : id));\n applyViewerHoverCursor(eventSource?.current, '');\n if (showHoverTooltip) {\n onHoverTooltip?.(null, { leavingShapeId: shape.id });\n }\n }}\n onPointerDown={(e) => {\n const additive = Boolean(\n e.shiftKey ||\n (e.nativeEvent as MouseEvent | undefined)?.shiftKey,\n );\n if (additive) e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n const maxDist = pointerGestureRef?.current.maxDist ?? 0;\n if (!viewerPointerClickIsTap(maxDist, e.delta)) return;\n if (selectable) {\n onSelectShape?.(shape.id, {\n additive: Boolean(\n e.shiftKey ||\n (e.nativeEvent as MouseEvent | undefined)?.shiftKey,\n ),\n });\n return;\n }\n onSelectShape?.(null);\n }}\n >\n {extrude > 0 ? (\n <extrudeGeometry\n args={[\n geoShape,\n { depth: extrude, bevelEnabled: false },\n ]}\n />\n ) : (\n <shapeGeometry args={[geoShape]} />\n )}\n <meshBasicMaterial\n color={fill}\n transparent={\n shape.style.transparent ||\n shape.kind === 'amenity' ||\n opacity < 1\n }\n opacity={opacity}\n side={THREE.DoubleSide}\n />\n {hovered ? (\n <HoverOutline\n shape={geoShape}\n extrude={extrude}\n color={emphasisFill}\n />\n ) : null}\n </mesh>\n ))}\n </group>\n );\n })}\n </group>\n );\n}\n\nfunction skipRaycast() {}\n\nfunction loadCanvasTexture(\n url: string,\n signal?: AbortSignal,\n): Promise<{ texture: THREE.CanvasTexture; aspect: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const cleanup = () => {\n signal?.removeEventListener('abort', onAbort);\n img.onload = null;\n img.onerror = null;\n };\n const onAbort = () => {\n cleanup();\n img.src = '';\n reject(new DOMException('Image load aborted', 'AbortError'));\n };\n if (signal?.aborted) {\n onAbort();\n return;\n }\n signal?.addEventListener('abort', onAbort, { once: true });\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n cleanup();\n const width = img.naturalWidth || img.width;\n const height = img.naturalHeight || img.height;\n if (!width || !height) {\n reject(new Error('empty image'));\n return;\n }\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('canvas'));\n return;\n }\n ctx.drawImage(img, 0, 0);\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.needsUpdate = true;\n resolve({ texture, aspect: height / width });\n };\n img.onerror = () => {\n cleanup();\n reject(new Error(`Failed to load ${url}`));\n };\n img.src = url;\n });\n}\n\nfunction AssignmentImageOverlay({\n url,\n width,\n position,\n rotation,\n imageProxyUrl,\n}: {\n url: string;\n width: number;\n position: [number, number, number];\n rotation: number;\n imageProxyUrl?: string | null;\n}) {\n const [texture, setTexture] = useState<THREE.CanvasTexture | null>(null);\n const [aspect, setAspect] = useState(1);\n\n useEffect(() => {\n let disposed = false;\n let loaded: THREE.CanvasTexture | null = null;\n const controller = new AbortController();\n setTexture(null);\n const proxied = resolveFetchUrl(url, imageProxyUrl);\n const candidates = proxied === url ? [url] : [proxied, url];\n const load = async () => {\n let lastError: unknown;\n for (const src of candidates) {\n try {\n const next = await loadCanvasTexture(src, controller.signal);\n if (disposed) {\n next.texture.dispose();\n return;\n }\n loaded = next.texture;\n setAspect(next.aspect);\n setTexture(next.texture);\n return;\n } catch (error) {\n if (controller.signal.aborted) return;\n lastError = error;\n }\n }\n if (!disposed) {\n setTexture(null);\n if (lastError) console.warn('Retail logo failed to load', url, lastError);\n }\n };\n void load();\n return () => {\n disposed = true;\n controller.abort();\n loaded?.dispose();\n };\n }, [url, imageProxyUrl]);\n\n if (!texture || width <= 0) return null;\n\n return (\n <mesh\n position={position}\n rotation={[0, 0, rotation]}\n scale={[1, -1, 1]}\n renderOrder={30}\n raycast={skipRaycast}\n >\n <planeGeometry args={[width, width * aspect]} />\n <meshBasicMaterial\n map={texture}\n transparent\n depthTest={false}\n depthWrite={false}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n );\n}\n","import type { PathResult, Vec2 } from '../core';\n\nexport type RouteChangeIntent = 'forward' | 'back';\n\nexport interface RouteLevelChangeMarker {\n x: number;\n y: number;\n displayX: number;\n displayY: number;\n connectorId: number | null;\n targetLevelId: number;\n /** v1 label: To = continue toward the destination, From = go back. */\n direction: 'To' | 'From';\n intent: RouteChangeIntent;\n}\n\nexport const ROUTE_CHANGE_MARKER_GAP = 44;\nexport const ROUTE_CHANGE_MARKER_CLUSTER = 8;\n\nexport function routeOriginLevelId(\n route: PathResult | null | undefined,\n): number | null {\n return route?.points[0]?.levelId ?? null;\n}\n\n/** Pin the camera to the start floor only when the trip itself changes. */\nexport function shouldPinViewToRouteOrigin(\n previousFrom: number | null,\n previousTo: number | null,\n nextFrom: number | null,\n nextTo: number | null,\n): boolean {\n if (nextFrom == null || nextTo == null) return false;\n return previousFrom !== nextFrom || previousTo !== nextTo;\n}\n\nexport function routeVisitedLevelIds(route: PathResult): number[] {\n const ids: number[] = [];\n for (const point of route.points) {\n if (ids[ids.length - 1] !== point.levelId) ids.push(point.levelId);\n }\n return ids;\n}\n\nexport function routeChangeLabel(\n intent: RouteChangeIntent,\n floorName: string,\n): string {\n return intent === 'forward' ? `Continue to ${floorName}` : `Back to ${floorName}`;\n}\n\nexport function routePointsOnLevel(\n route: PathResult,\n levelId: number,\n): Vec2[] {\n return route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => ({ x: point.x, y: point.y }));\n}\n\n/** Contiguous walks on one floor — a later revisit starts a new segment. */\nexport function routeSegmentsForLevel(\n route: PathResult,\n levelId: number,\n): Vec2[][] {\n const segments: Vec2[][] = [];\n let current: Vec2[] = [];\n for (const point of route.points) {\n if (point.levelId === levelId) {\n current.push({ x: point.x, y: point.y });\n continue;\n }\n if (current.length > 0) {\n segments.push(current);\n current = [];\n }\n }\n if (current.length > 0) segments.push(current);\n return segments;\n}\n\nfunction markerDistance(a: Vec2, b: Vec2): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\n\nexport function layoutRouteLevelChangeMarkers<\n T extends { x: number; y: number; intent: RouteChangeIntent },\n>(markers: T[]): Array<T & { displayX: number; displayY: number }> {\n const placed = markers.map((marker) => ({\n ...marker,\n displayX: marker.x,\n displayY: marker.y,\n }));\n const used = new Set<number>();\n\n for (let i = 0; i < placed.length; i += 1) {\n if (used.has(i)) continue;\n const group = [i];\n for (let j = i + 1; j < placed.length; j += 1) {\n if (used.has(j)) continue;\n if (markerDistance(placed[i], placed[j]) <= ROUTE_CHANGE_MARKER_CLUSTER) {\n group.push(j);\n }\n }\n for (const index of group) used.add(index);\n\n if (group.length === 1) continue;\n\n const ordered = [...group].sort((a, b) => {\n const rank = (intent: RouteChangeIntent) => (intent === 'back' ? 0 : 1);\n return rank(placed[a].intent) - rank(placed[b].intent);\n });\n const span = ROUTE_CHANGE_MARKER_GAP * (ordered.length - 1);\n ordered.forEach((index, offset) => {\n placed[index].displayX =\n placed[index].x - span / 2 + offset * ROUTE_CHANGE_MARKER_GAP;\n placed[index].displayY = placed[index].y;\n });\n }\n\n return placed;\n}\n\nexport function routeLevelChangeMarkers(\n route: PathResult,\n levelId: number,\n): RouteLevelChangeMarker[] {\n const raw: Array<Omit<RouteLevelChangeMarker, 'displayX' | 'displayY'>> = [];\n let changeIndex = 0;\n for (let index = 1; index < route.points.length; index += 1) {\n const from = route.points[index - 1];\n const to = route.points[index];\n if (from.levelId === to.levelId) continue;\n const change = route.levelChanges[changeIndex];\n changeIndex += 1;\n if (from.levelId === levelId) {\n raw.push({\n x: from.x,\n y: from.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: to.levelId,\n direction: 'To',\n intent: 'forward',\n });\n } else if (to.levelId === levelId) {\n raw.push({\n x: to.x,\n y: to.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: from.levelId,\n direction: 'From',\n intent: 'back',\n });\n }\n }\n return layoutRouteLevelChangeMarkers(raw);\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { Html } from '@react-three/drei';\nimport * as THREE from 'three';\nimport type { CmConnector, PathResult } from '../../core';\nimport {\n DEFAULT_THEME,\n isTransparentColor,\n isVerticalRouteConnectorKind,\n} from '../../core';\nimport {\n connectorMapIconDataUrl,\n levelTravel,\n} from '../../specialIcons';\nimport {\n routeChangeLabel,\n routeLevelChangeMarkers,\n routePointsOnLevel,\n routeSegmentsForLevel,\n type RouteLevelChangeMarker,\n} from '../routeFloorChanges';\n\nexport const V1_ROUTE_COLOR = '#4ea5ff';\nexport const V1_ROUTE_RADIUS = 6;\nexport const V1_ROUTE_TUBULAR_SEGMENTS = 400;\nexport const V1_ROUTE_RADIAL_SEGMENTS = 8;\nexport const V1_ROUTE_REVEAL_MS = 1000;\nexport const V1_ROUTE_TEXTURE_MS = 2000;\n\nexport {\n routeChangeLabel,\n routeLevelChangeMarkers,\n routeSegmentsForLevel,\n type RouteLevelChangeMarker,\n} from '../routeFloorChanges';\n\nexport function routePointsForLevel(\n route: PathResult,\n levelId: number,\n): THREE.Vector3[] {\n return routePointsOnLevel(route, levelId).map(\n (point) => new THREE.Vector3(point.x, point.y, 0),\n );\n}\n\nexport function resolveRouteColor(color?: string | null): string {\n if (!color || isTransparentColor(color)) return V1_ROUTE_COLOR;\n return color;\n}\n\nexport const ROUTE_CHANGE_RING_COLOR = '#444444';\n\nexport function resolveRouteChangeCircleColor(): string {\n return ROUTE_CHANGE_RING_COLOR;\n}\n\nexport function resolveRouteThickness(thickness?: number | null): number {\n if (thickness == null || !Number.isFinite(thickness) || thickness <= 0) {\n return DEFAULT_THEME.ROUTE_THICKNESS;\n }\n return thickness;\n}\n\nconst _routeScale = new THREE.Vector3();\nconst _routeWorldPoint = new THREE.Vector3();\n\n/**\n * World-space tube radius that keeps `screenRadius` pixels on screen.\n * Orthographic: `1 / zoom` world units per CSS pixel.\n * Perspective: uses vertical fov, camera distance, and viewport height.\n * `worldScale` undoes a parent level transform so the line stays the same\n * after the group scale is applied.\n */\nexport function routeWorldRadiusForView(options: {\n screenRadius: number;\n orthoZoom?: number;\n perspectiveFov?: number;\n perspectiveDistance?: number;\n viewportHeight?: number;\n worldScale?: number;\n}): number {\n const screenRadius = Math.max(options.screenRadius, 0);\n let world = screenRadius;\n const zoom = options.orthoZoom;\n if (zoom != null && Number.isFinite(zoom) && zoom > 0) {\n world = screenRadius / zoom;\n } else if (\n options.perspectiveFov != null &&\n options.perspectiveDistance != null &&\n options.viewportHeight != null &&\n options.perspectiveFov > 0 &&\n options.perspectiveDistance > 0 &&\n options.viewportHeight > 0\n ) {\n const worldHeight =\n 2 *\n Math.tan((options.perspectiveFov * Math.PI) / 360) *\n options.perspectiveDistance;\n world = (screenRadius * worldHeight) / options.viewportHeight;\n }\n const scale = Math.abs(options.worldScale ?? 1);\n return world / Math.max(scale, 1e-6);\n}\n\nexport function routeWorldRadiusForCamera(\n camera: THREE.Camera,\n screenRadius: number,\n viewportHeight: number,\n worldScale: number,\n samplePoint?: THREE.Vector3,\n): number {\n if (camera instanceof THREE.OrthographicCamera) {\n return routeWorldRadiusForView({\n screenRadius,\n orthoZoom: camera.zoom,\n worldScale,\n });\n }\n if (camera instanceof THREE.PerspectiveCamera) {\n const distance = samplePoint\n ? camera.position.distanceTo(samplePoint)\n : camera.position.length();\n return routeWorldRadiusForView({\n screenRadius,\n perspectiveFov: camera.fov,\n perspectiveDistance: Math.max(distance, 1e-6),\n viewportHeight,\n worldScale,\n });\n }\n return routeWorldRadiusForView({ screenRadius, worldScale });\n}\n\n/** Tube vertices sit `baseRadius` along their normals from the path. */\nexport function applyRouteTubeRadius(\n geometry: THREE.BufferGeometry,\n basePositions: ArrayLike<number>,\n baseRadius: number,\n targetRadius: number,\n): void {\n const position = geometry.getAttribute('position');\n const normal = geometry.getAttribute('normal');\n if (!position || !normal) return;\n const delta = targetRadius - baseRadius;\n for (let i = 0; i < position.count; i += 1) {\n const i3 = i * 3;\n position.setXYZ(\n i,\n basePositions[i3] + normal.getX(i) * delta,\n basePositions[i3 + 1] + normal.getY(i) * delta,\n basePositions[i3 + 2] + normal.getZ(i) * delta,\n );\n }\n position.needsUpdate = true;\n}\n\nfunction createRouteTexture(distance: number, color: string): THREE.CanvasTexture {\n const canvas = document.createElement('canvas');\n const width = Math.max(1, Math.floor(distance));\n canvas.width = width;\n canvas.height = 80;\n const context = canvas.getContext('2d');\n\n if (context) {\n context.fillStyle = color;\n context.fillRect(0, 0, width, canvas.height);\n\n const gradientWidth = Math.min(120, Math.max(60, distance * 0.1));\n const gradient = context.createLinearGradient(0, 0, gradientWidth, 0);\n gradient.addColorStop(0, color);\n gradient.addColorStop(0.4, 'white');\n gradient.addColorStop(0.6, 'white');\n gradient.addColorStop(1, color);\n context.fillStyle = gradient;\n context.fillRect(10, 0, gradientWidth, canvas.height);\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.offset.x = 1;\n texture.colorSpace = THREE.SRGBColorSpace;\n return texture;\n}\n\nfunction easeInOutCubic(value: number): number {\n const x = Math.min(1, Math.max(0, value));\n return x < 0.5 ? 4 * x ** 3 : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nfunction RouteTube({\n points,\n color,\n radius,\n}: {\n points: THREE.Vector3[];\n color: string;\n radius: number;\n}) {\n const invalidate = useThree((state) => state.invalidate);\n const camera = useThree((state) => state.camera);\n const viewportHeight = useThree((state) => state.size.height);\n const meshRef = useRef<THREE.Mesh>(null);\n const animationStartedAt = useRef(0);\n const appliedRadius = useRef<number | null>(null);\n const routeShape = useMemo(() => {\n if (points.length < 2) return null;\n const path = new THREE.CurvePath<THREE.Vector3>();\n let distance = 0;\n for (let index = 1; index < points.length; index += 1) {\n path.add(new THREE.LineCurve3(points[index - 1], points[index]));\n distance += points[index - 1].distanceTo(points[index]);\n }\n const geometry = new THREE.TubeGeometry(\n path,\n V1_ROUTE_TUBULAR_SEGMENTS,\n radius,\n V1_ROUTE_RADIAL_SEGMENTS,\n );\n geometry.setDrawRange(0, 0);\n return {\n distance,\n geometry,\n texture: createRouteTexture(distance, color),\n basePositions: new Float32Array(geometry.attributes.position.array),\n baseRadius: radius,\n };\n }, [color, points, radius]);\n\n const syncScreenRadius = () => {\n const mesh = meshRef.current;\n if (!routeShape || !mesh) return;\n const worldScale = Math.abs(mesh.getWorldScale(_routeScale).x);\n _routeWorldPoint.copy(points[0]);\n mesh.localToWorld(_routeWorldPoint);\n const target = routeWorldRadiusForCamera(\n camera,\n radius,\n viewportHeight,\n worldScale,\n _routeWorldPoint,\n );\n if (appliedRadius.current === target) return;\n applyRouteTubeRadius(\n routeShape.geometry,\n routeShape.basePositions,\n routeShape.baseRadius,\n target,\n );\n appliedRadius.current = target;\n };\n\n useLayoutEffect(() => {\n appliedRadius.current = null;\n syncScreenRadius();\n }, [camera, radius, routeShape, viewportHeight]);\n\n useEffect(() => {\n if (!routeShape) return;\n animationStartedAt.current = performance.now();\n routeShape.geometry.setDrawRange(0, 0);\n routeShape.texture.offset.x = 1;\n invalidate();\n return () => {\n routeShape.geometry.dispose();\n routeShape.texture.dispose();\n };\n }, [invalidate, routeShape]);\n\n useFrame(() => {\n if (!routeShape) return;\n syncScreenRadius();\n const elapsed = performance.now() - animationStartedAt.current;\n const indexCount = routeShape.geometry.index?.count ?? 0;\n if (elapsed < V1_ROUTE_REVEAL_MS) {\n const progress = easeInOutCubic(elapsed / V1_ROUTE_REVEAL_MS);\n routeShape.geometry.setDrawRange(0, Math.floor(progress * indexCount));\n } else {\n routeShape.geometry.setDrawRange(0, indexCount);\n const progress = (elapsed / V1_ROUTE_TEXTURE_MS) % 1;\n routeShape.texture.offset.x = 0.1 - 1.1 * easeInOutCubic(progress);\n }\n invalidate();\n });\n\n if (!routeShape) return null;\n return (\n <mesh ref={meshRef} geometry={routeShape.geometry} renderOrder={20}>\n <meshBasicMaterial\n map={routeShape.texture}\n transparent\n side={THREE.DoubleSide}\n depthTest={false}\n depthWrite={false}\n />\n </mesh>\n );\n}\n\nfunction RouteChangeButton({\n change,\n levelId,\n levels,\n connectors,\n color,\n onActiveLevelChange,\n}: {\n change: RouteLevelChangeMarker;\n levelId: number;\n levels?: ReadonlyArray<{\n id: number;\n name: string;\n levelIndex?: number;\n ordering?: number;\n }>;\n connectors?: readonly CmConnector[];\n color: string;\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const connector = connectors?.find((item) => item.id === change.connectorId);\n const iconKind = isVerticalRouteConnectorKind(connector?.kind)\n ? connector.kind\n : null;\n const here = levels?.find((item) => item.id === levelId);\n const there = levels?.find((item) => item.id === change.targetLevelId);\n const travel =\n iconKind === 'escalator' && here && there\n ? levelTravel(here, there)\n : null;\n const icon = iconKind\n ? connectorMapIconDataUrl(iconKind, true, '#ffffff', travel)\n : undefined;\n const targetName =\n levels?.find((level) => level.id === change.targetLevelId)?.name ??\n String(change.targetLevelId);\n const label = routeChangeLabel(change.intent, targetName);\n const ringColor = resolveRouteChangeCircleColor();\n return (\n <Html\n position={[change.displayX, change.displayY, 7]}\n zIndexRange={[30, 20]}\n style={{ pointerEvents: 'none' }}\n >\n <button\n type=\"button\"\n className={`eyeon-map-route-change eyeon-map-route-change--${change.intent}`}\n style={\n {\n backgroundColor: color,\n borderColor: ringColor,\n '--eyeon-route-change-intent': ringColor,\n pointerEvents: 'auto',\n } as React.CSSProperties\n }\n aria-label={label}\n onClick={(event) => {\n event.stopPropagation();\n onActiveLevelChange?.(change.targetLevelId);\n }}\n >\n <span className=\"eyeon-map-route-change__icon\">\n {icon ? <img src={icon} alt=\"\" /> : <span aria-hidden>↕</span>}\n </span>\n <span className=\"eyeon-map-route-change__intent\" aria-hidden>\n {change.intent === 'forward' ? '→' : '←'}\n </span>\n <span className=\"eyeon-map-hover-tooltip eyeon-map-route-change__tooltip\">\n <span className=\"eyeon-map-hover-tooltip__pop\">\n <span className=\"eyeon-map-hover-tooltip__label\">{label}</span>\n <span className=\"eyeon-map-hover-tooltip__arrow\" aria-hidden=\"true\" />\n </span>\n </span>\n </button>\n </Html>\n );\n}\n\nexport function RouteLine({\n route,\n levelId,\n levels,\n connectors,\n color,\n thickness,\n onActiveLevelChange,\n}: {\n route: PathResult;\n levelId: number;\n levels?: ReadonlyArray<{\n id: number;\n name: string;\n levelIndex?: number;\n ordering?: number;\n }>;\n connectors?: readonly CmConnector[];\n color?: string;\n thickness?: number;\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const routeColor = resolveRouteColor(color);\n const routeRadius = resolveRouteThickness(thickness);\n const segments = useMemo(\n () =>\n routeSegmentsForLevel(route, levelId).map((segment) =>\n segment.map((point) => new THREE.Vector3(point.x, point.y, 0)),\n ),\n [levelId, route],\n );\n const levelChanges = useMemo(\n () => routeLevelChangeMarkers(route, levelId),\n [levelId, route],\n );\n\n if (segments.every((segment) => segment.length < 2) && levelChanges.length === 0) {\n return null;\n }\n\n return (\n <>\n {segments.map((points, index) =>\n points.length >= 2 ? (\n <RouteTube\n key={`route-seg-${levelId}-${index}`}\n points={points}\n color={routeColor}\n radius={routeRadius}\n />\n ) : null,\n )}\n {levelChanges.map((change, index) => (\n <RouteChangeButton\n key={`${change.intent}-${change.targetLevelId}-${index}`}\n change={change}\n levelId={levelId}\n levels={levels}\n connectors={connectors}\n color={routeColor}\n onActiveLevelChange={onActiveLevelChange}\n />\n ))}\n </>\n );\n}\n","import {\n\tBox2,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tMatrix3,\n\tPath,\n\tShape,\n\tShapePath,\n\tShapeUtils,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst COLOR_SPACE_SVG = SRGBColorSpace;\n\n/**\n * A loader for the SVG format.\n *\n * Scalable Vector Graphics is an XML-based vector image format for two-dimensional graphics\n * with support for interactivity and animation.\n *\n * ```js\n * const loader = new SVGLoader();\n * const data = await loader.loadAsync( 'data/svgSample.svg' );\n *\n * const paths = data.paths;\n * const group = new THREE.Group();\n *\n * for ( let i = 0; i < paths.length; i ++ ) {\n *\n * \tconst path = paths[ i ];\n * \tconst material = new THREE.MeshBasicMaterial( {\n * \t\tcolor: path.color,\n * \t\tside: THREE.DoubleSide,\n * \t\tdepthWrite: false\n * \t} );\n *\n * \tconst shapes = SVGLoader.createShapes( path );\n *\n * \tfor ( let j = 0; j < shapes.length; j ++ ) {\n *\n * \t\tconst shape = shapes[ j ];\n * \t\tconst geometry = new THREE.ShapeGeometry( shape );\n * \t\tconst mesh = new THREE.Mesh( geometry, material );\n * \t\tgroup.add( mesh );\n *\n * \t}\n *\n * }\n *\n * scene.add( group );\n * ```\n *\n * @augments Loader\n * @three_import import { SVGLoader } from 'three/addons/loaders/SVGLoader.js';\n */\nclass SVGLoader extends Loader {\n\n\t/**\n\t * Constructs a new SVG loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Default dots per inch.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 90\n\t\t */\n\t\tthis.defaultDPI = 90;\n\n\t\t/**\n\t\t * Default unit.\n\t\t *\n\t\t * @type {('mm'|'cm'|'in'|'pt'|'pc'|'px')}\n\t\t * @default 'px'\n\t\t */\n\t\tthis.defaultUnit = 'px';\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded SVG asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({paths:Array<ShapePath>,xml:string})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given SVG data and returns the resulting data.\n\t *\n\t * @param {string} text - The raw SVG data as a string.\n\t * @return {{paths:Array<ShapePath>,xml:string}} An object holding an array of shape paths and the\n\t * SVG XML document.\n\t */\n\tparse( text ) {\n\n\t\tconst scope = this;\n\n\t\tfunction parseNode( node, style ) {\n\n\t\t\tif ( node.nodeType !== 1 ) return;\n\n\t\t\tconst transform = getNodeTransform( node );\n\n\t\t\tlet isDefsNode = false;\n\n\t\t\tlet path = null;\n\n\t\t\tswitch ( node.nodeName ) {\n\n\t\t\t\tcase 'svg':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'style':\n\t\t\t\t\tparseCSSStylesheet( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'g':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'path':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tif ( node.hasAttribute( 'd' ) ) path = parsePathNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rect':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseRectNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polygon':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolygonNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polyline':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolylineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'circle':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseCircleNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ellipse':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseEllipseNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'line':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseLineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'defs':\n\t\t\t\t\tisDefsNode = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'use':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\n\t\t\t\t\tconst href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || '';\n\t\t\t\t\tconst usedNodeId = href.substring( 1 );\n\t\t\t\t\tconst usedNode = node.viewportElement.getElementById( usedNodeId );\n\t\t\t\t\tif ( usedNode ) {\n\n\t\t\t\t\t\tparseNode( usedNode, style );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'SVGLoader: \\'use node\\' references non-existent node id: ' + usedNodeId );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// console.log( node );\n\n\t\t\t}\n\n\t\t\tif ( path ) {\n\n\t\t\t\tif ( style.fill !== undefined && style.fill !== 'none' ) {\n\n\t\t\t\t\tpath.color.setStyle( style.fill, COLOR_SPACE_SVG );\n\n\t\t\t\t}\n\n\t\t\t\ttransformPath( path, currentTransform );\n\n\t\t\t\tpaths.push( path );\n\n\t\t\t\tpath.userData = { node: node, style: style };\n\n\t\t\t}\n\n\t\t\tconst childNodes = node.childNodes;\n\n\t\t\tfor ( let i = 0; i < childNodes.length; i ++ ) {\n\n\t\t\t\tconst node = childNodes[ i ];\n\n\t\t\t\tif ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) {\n\n\t\t\t\t\t// Ignore everything in defs except CSS style definitions\n\t\t\t\t\t// and nested defs, because it is OK by the standard to have\n\t\t\t\t\t// <style/> there.\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tparseNode( node, style );\n\n\t\t\t}\n\n\n\t\t\tif ( transform ) {\n\n\t\t\t\ttransformStack.pop();\n\n\t\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\t\tcurrentTransform.copy( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePathNode( node ) {\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tconst point = new Vector2();\n\t\t\tconst control = new Vector2();\n\n\t\t\tconst firstPoint = new Vector2();\n\t\t\tlet isFirstPoint = true;\n\t\t\tlet doSetFirstPoint = false;\n\n\t\t\tconst d = node.getAttribute( 'd' );\n\n\t\t\tif ( d === '' || d === 'none' ) return null;\n\n\t\t\t// console.log( d );\n\n\t\t\tconst commands = d.match( /[a-df-z][^a-df-z]*/ig );\n\n\t\t\tfor ( let i = 0, l = commands.length; i < l; i ++ ) {\n\n\t\t\t\tconst command = commands[ i ];\n\n\t\t\t\tconst type = command.charAt( 0 );\n\t\t\t\tconst data = command.slice( 1 ).trim();\n\n\t\t\t\tif ( isFirstPoint === true ) {\n\n\t\t\t\t\tdoSetFirstPoint = true;\n\t\t\t\t\tisFirstPoint = false;\n\n\t\t\t\t}\n\n\t\t\t\tlet numbers;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'H':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'V':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 4 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'S':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'T':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if start point == end point\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == point.x && numbers[ j + 6 ] == point.y ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'h':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 4 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = point.y + numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if no displacement\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == 0 && numbers[ j + 6 ] == 0 ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\t\t\t\tif ( path.currentPath.curves.length > 0 ) {\n\n\t\t\t\t\t\t\t// Reset point to beginning of Path\n\t\t\t\t\t\t\tpoint.copy( firstPoint );\n\t\t\t\t\t\t\tpath.currentPath.currentPoint.copy( point );\n\t\t\t\t\t\t\tisFirstPoint = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( command );\n\n\t\t\t\t}\n\n\t\t\t\t// console.log( type, parseFloats( data ), parseFloats( data ).length )\n\n\t\t\t\tdoSetFirstPoint = false;\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCSSStylesheet( node ) {\n\n\t\t\tif ( ! node.sheet || ! node.sheet.cssRules || ! node.sheet.cssRules.length ) return;\n\n\t\t\tfor ( let i = 0; i < node.sheet.cssRules.length; i ++ ) {\n\n\t\t\t\tconst stylesheet = node.sheet.cssRules[ i ];\n\n\t\t\t\tif ( stylesheet.type !== 1 ) continue;\n\n\t\t\t\tconst selectorList = stylesheet.selectorText\n\t\t\t\t\t.split( /,/gm )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let j = 0; j < selectorList.length; j ++ ) {\n\n\t\t\t\t\t// Remove empty rules\n\t\t\t\t\tconst definitions = Object.fromEntries(\n\t\t\t\t\t\tObject.entries( stylesheet.style ).filter( ( [ , v ] ) => v !== '' )\n\t\t\t\t\t);\n\n\t\t\t\t\tstylesheets[ selectorList[ j ] ] = Object.assign(\n\t\t\t\t\t\tstylesheets[ selectorList[ j ] ] || {},\n\t\t\t\t\t\tdefinitions\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n\t\t * https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion\n\t\t * From\n\t\t * rx ry x-axis-rotation large-arc-flag sweep-flag x y\n\t\t * To\n\t\t * aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation\n\t\t */\n\n\t\tfunction parseArcCommand( path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end ) {\n\n\t\t\tif ( rx == 0 || ry == 0 ) {\n\n\t\t\t\t// draw a line if either of the radii == 0\n\t\t\t\tpath.lineTo( end.x, end.y );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tx_axis_rotation = x_axis_rotation * Math.PI / 180;\n\n\t\t\t// Ensure radii are positive\n\t\t\trx = Math.abs( rx );\n\t\t\try = Math.abs( ry );\n\n\t\t\t// Compute (x1', y1')\n\t\t\tconst dx2 = ( start.x - end.x ) / 2.0;\n\t\t\tconst dy2 = ( start.y - end.y ) / 2.0;\n\t\t\tconst x1p = Math.cos( x_axis_rotation ) * dx2 + Math.sin( x_axis_rotation ) * dy2;\n\t\t\tconst y1p = - Math.sin( x_axis_rotation ) * dx2 + Math.cos( x_axis_rotation ) * dy2;\n\n\t\t\t// Compute (cx', cy')\n\t\t\tlet rxs = rx * rx;\n\t\t\tlet rys = ry * ry;\n\t\t\tconst x1ps = x1p * x1p;\n\t\t\tconst y1ps = y1p * y1p;\n\n\t\t\t// Ensure radii are large enough\n\t\t\tconst cr = x1ps / rxs + y1ps / rys;\n\n\t\t\tif ( cr > 1 ) {\n\n\t\t\t\t// scale up rx,ry equally so cr == 1\n\t\t\t\tconst s = Math.sqrt( cr );\n\t\t\t\trx = s * rx;\n\t\t\t\try = s * ry;\n\t\t\t\trxs = rx * rx;\n\t\t\t\trys = ry * ry;\n\n\t\t\t}\n\n\t\t\tconst dq = ( rxs * y1ps + rys * x1ps );\n\t\t\tconst pq = ( rxs * rys - dq ) / dq;\n\t\t\tlet q = Math.sqrt( Math.max( 0, pq ) );\n\t\t\tif ( large_arc_flag === sweep_flag ) q = - q;\n\t\t\tconst cxp = q * rx * y1p / ry;\n\t\t\tconst cyp = - q * ry * x1p / rx;\n\n\t\t\t// Step 3: Compute (cx, cy) from (cx', cy')\n\t\t\tconst cx = Math.cos( x_axis_rotation ) * cxp - Math.sin( x_axis_rotation ) * cyp + ( start.x + end.x ) / 2;\n\t\t\tconst cy = Math.sin( x_axis_rotation ) * cxp + Math.cos( x_axis_rotation ) * cyp + ( start.y + end.y ) / 2;\n\n\t\t\t// Step 4: Compute θ1 and Δθ\n\t\t\tconst theta = svgAngle( 1, 0, ( x1p - cxp ) / rx, ( y1p - cyp ) / ry );\n\t\t\tconst delta = svgAngle( ( x1p - cxp ) / rx, ( y1p - cyp ) / ry, ( - x1p - cxp ) / rx, ( - y1p - cyp ) / ry ) % ( Math.PI * 2 );\n\n\t\t\tpath.currentPath.absellipse( cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation );\n\n\t\t}\n\n\t\tfunction svgAngle( ux, uy, vx, vy ) {\n\n\t\t\tconst dot = ux * vx + uy * vy;\n\t\t\tconst len = Math.sqrt( ux * ux + uy * uy ) * Math.sqrt( vx * vx + vy * vy );\n\t\t\tlet ang = Math.acos( Math.max( - 1, Math.min( 1, dot / len ) ) ); // floating point precision, slightly over values appear\n\t\t\tif ( ( ux * vy - uy * vx ) < 0 ) ang = - ang;\n\t\t\treturn ang;\n\n\t\t}\n\n\t\t/*\n\t\t* According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute\n\t\t* rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough\n\t\t*/\n\n\t\tfunction parseRectNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || node.getAttribute( 'ry' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst w = parseFloatWithUnits( node.getAttribute( 'width' ) );\n\t\t\tconst h = parseFloatWithUnits( node.getAttribute( 'height' ) );\n\n\t\t\t// Ellipse arc to Bezier approximation Coefficient (Inversed). See:\n\t\t\t// https://spencermortensen.com/articles/bezier-circle/\n\t\t\tconst bci = 1 - 0.551915024494;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\t// top left\n\t\t\tpath.moveTo( x + rx, y );\n\n\t\t\t// top right\n\t\t\tpath.lineTo( x + w - rx, y );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry * bci,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom right\n\t\t\tpath.lineTo( x + w, y + h - ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx + w - rx,\n\t\t\t\t\ty + h\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom left\n\t\t\tpath.lineTo( x + rx, y + h );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// back to top left\n\t\t\tpath.lineTo( x, y + ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo( x, y + ry * bci, x + rx * bci, y, x + rx, y );\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolygonNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolylineNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCircleNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst r = parseFloatWithUnits( node.getAttribute( 'r' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absarc( x, y, r, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseEllipseNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseLineNode( node ) {\n\n\t\t\tconst x1 = parseFloatWithUnits( node.getAttribute( 'x1' ) || 0 );\n\t\t\tconst y1 = parseFloatWithUnits( node.getAttribute( 'y1' ) || 0 );\n\t\t\tconst x2 = parseFloatWithUnits( node.getAttribute( 'x2' ) || 0 );\n\t\t\tconst y2 = parseFloatWithUnits( node.getAttribute( 'y2' ) || 0 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.moveTo( x1, y1 );\n\t\t\tpath.lineTo( x2, y2 );\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction parseStyle( node, style ) {\n\n\t\t\tstyle = Object.assign( {}, style ); // clone style\n\n\t\t\tlet stylesheetStyles = {};\n\n\t\t\tif ( node.hasAttribute( 'class' ) ) {\n\n\t\t\t\tconst classSelectors = node.getAttribute( 'class' )\n\t\t\t\t\t.split( /\\s/ )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let i = 0; i < classSelectors.length; i ++ ) {\n\n\t\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'id' ) ) {\n\n\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );\n\n\t\t\t}\n\n\t\t\tfunction addStyle( svgName, jsName, adjustFunction ) {\n\n\t\t\t\tif ( adjustFunction === undefined ) adjustFunction = function copy( v ) {\n\n\t\t\t\t\tif ( v.startsWith( 'url' ) ) console.warn( 'SVGLoader: url access in attributes is not implemented.' );\n\n\t\t\t\t\treturn v;\n\n\t\t\t\t};\n\n\t\t\t\tif ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );\n\t\t\t\tif ( stylesheetStyles[ svgName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ svgName ] );\n\t\t\t\tif ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );\n\n\t\t\t}\n\n\t\t\tfunction clamp( v ) {\n\n\t\t\t\treturn Math.max( 0, Math.min( 1, parseFloatWithUnits( v ) ) );\n\n\t\t\t}\n\n\t\t\tfunction positive( v ) {\n\n\t\t\t\treturn Math.max( 0, parseFloatWithUnits( v ) );\n\n\t\t\t}\n\n\t\t\taddStyle( 'fill', 'fill' );\n\t\t\taddStyle( 'fill-opacity', 'fillOpacity', clamp );\n\t\t\taddStyle( 'fill-rule', 'fillRule' );\n\t\t\taddStyle( 'opacity', 'opacity', clamp );\n\t\t\taddStyle( 'stroke', 'stroke' );\n\t\t\taddStyle( 'stroke-opacity', 'strokeOpacity', clamp );\n\t\t\taddStyle( 'stroke-width', 'strokeWidth', positive );\n\t\t\taddStyle( 'stroke-linejoin', 'strokeLineJoin' );\n\t\t\taddStyle( 'stroke-linecap', 'strokeLineCap' );\n\t\t\taddStyle( 'stroke-miterlimit', 'strokeMiterLimit', positive );\n\t\t\taddStyle( 'visibility', 'visibility' );\n\n\t\t\treturn style;\n\n\t\t}\n\n\t\t// http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes\n\n\t\tfunction getReflection( a, b ) {\n\n\t\t\treturn a - ( b - a );\n\n\t\t}\n\n\t\t// from https://github.com/ppvg/svg-numbers (MIT License)\n\n\t\tfunction parseFloats( input, flags, stride ) {\n\n\t\t\tif ( typeof input !== 'string' ) {\n\n\t\t\t\tthrow new TypeError( 'Invalid input: ' + typeof input );\n\n\t\t\t}\n\n\t\t\t// Character groups\n\t\t\tconst RE = {\n\t\t\t\tSEPARATOR: /[ \\t\\r\\n\\,.\\-+]/,\n\t\t\t\tWHITESPACE: /[ \\t\\r\\n]/,\n\t\t\t\tDIGIT: /[\\d]/,\n\t\t\t\tSIGN: /[-+]/,\n\t\t\t\tPOINT: /\\./,\n\t\t\t\tCOMMA: /,/,\n\t\t\t\tEXP: /e/i,\n\t\t\t\tFLAGS: /[01]/\n\t\t\t};\n\n\t\t\t// States\n\t\t\tconst SEP = 0;\n\t\t\tconst INT = 1;\n\t\t\tconst FLOAT = 2;\n\t\t\tconst EXP = 3;\n\n\t\t\tlet state = SEP;\n\t\t\tlet seenComma = true;\n\t\t\tlet number = '', exponent = '';\n\t\t\tconst result = [];\n\n\t\t\tfunction throwSyntaxError( current, i, partial ) {\n\n\t\t\t\tconst error = new SyntaxError( 'Unexpected character \"' + current + '\" at index ' + i + '.' );\n\t\t\t\terror.partial = partial;\n\t\t\t\tthrow error;\n\n\t\t\t}\n\n\t\t\tfunction newNumber() {\n\n\t\t\t\tif ( number !== '' ) {\n\n\t\t\t\t\tif ( exponent === '' ) result.push( Number( number ) );\n\t\t\t\t\telse result.push( Number( number ) * Math.pow( 10, Number( exponent ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tnumber = '';\n\t\t\t\texponent = '';\n\n\t\t\t}\n\n\t\t\tlet current;\n\t\t\tconst length = input.length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tcurrent = input[ i ];\n\n\t\t\t\t// check for flags\n\t\t\t\tif ( Array.isArray( flags ) && flags.includes( result.length % stride ) && RE.FLAGS.test( current ) ) {\n\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// parse until next number\n\t\t\t\tif ( state === SEP ) {\n\n\t\t\t\t\t// eat whitespace\n\t\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// start new number\n\t\t\t\t\tif ( RE.DIGIT.test( current ) || RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tstate = INT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double commas (e.g. \"1, , 2\")\n\t\t\t\t\tif ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\t\tif ( seenComma ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tseenComma = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse integer part\n\t\t\t\tif ( state === INT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double signs (\"-+1\"), but not on sign as separator (\"-1-2\")\n\t\t\t\t\tif ( RE.SIGN.test( current )\n\t\t\t\t\t\t\t&& number.length === 1\n\t\t\t\t\t\t\t&& RE.SIGN.test( number[ 0 ] ) ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse decimal part\n\t\t\t\tif ( state === FLOAT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double decimal points (e.g. \"1..2\")\n\t\t\t\t\tif ( RE.POINT.test( current ) && number[ number.length - 1 ] === '.' ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse exponent part\n\t\t\t\tif ( state === EXP ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tif ( exponent === '' ) {\n\n\t\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( exponent.length === 1 && RE.SIGN.test( exponent ) ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// end of number\n\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = false;\n\n\t\t\t\t} else if ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = true;\n\n\t\t\t\t} else if ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else if ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add the last number found (if any)\n\t\t\tnewNumber();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// Units\n\n\t\tconst units = [ 'mm', 'cm', 'in', 'pt', 'pc', 'px' ];\n\n\t\t// Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)\n\t\tconst unitConversion = {\n\n\t\t\t'mm': {\n\t\t\t\t'mm': 1,\n\t\t\t\t'cm': 0.1,\n\t\t\t\t'in': 1 / 25.4,\n\t\t\t\t'pt': 72 / 25.4,\n\t\t\t\t'pc': 6 / 25.4,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'cm': {\n\t\t\t\t'mm': 10,\n\t\t\t\t'cm': 1,\n\t\t\t\t'in': 1 / 2.54,\n\t\t\t\t'pt': 72 / 2.54,\n\t\t\t\t'pc': 6 / 2.54,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'in': {\n\t\t\t\t'mm': 25.4,\n\t\t\t\t'cm': 2.54,\n\t\t\t\t'in': 1,\n\t\t\t\t'pt': 72,\n\t\t\t\t'pc': 6,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pt': {\n\t\t\t\t'mm': 25.4 / 72,\n\t\t\t\t'cm': 2.54 / 72,\n\t\t\t\t'in': 1 / 72,\n\t\t\t\t'pt': 1,\n\t\t\t\t'pc': 6 / 72,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pc': {\n\t\t\t\t'mm': 25.4 / 6,\n\t\t\t\t'cm': 2.54 / 6,\n\t\t\t\t'in': 1 / 6,\n\t\t\t\t'pt': 72 / 6,\n\t\t\t\t'pc': 1,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'px': {\n\t\t\t\t'px': 1\n\t\t\t}\n\n\t\t};\n\n\t\tfunction parseFloatWithUnits( string ) {\n\n\t\t\tlet theUnit = 'px';\n\n\t\t\tif ( typeof string === 'string' || string instanceof String ) {\n\n\t\t\t\tfor ( let i = 0, n = units.length; i < n; i ++ ) {\n\n\t\t\t\t\tconst u = units[ i ];\n\n\t\t\t\t\tif ( string.endsWith( u ) ) {\n\n\t\t\t\t\t\ttheUnit = u;\n\t\t\t\t\t\tstring = string.substring( 0, string.length - u.length );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet scale = undefined;\n\n\t\t\tif ( theUnit === 'px' && scope.defaultUnit !== 'px' ) {\n\n\t\t\t\t// Conversion scale from pixels to inches, then to default units\n\n\t\t\t\tscale = unitConversion[ 'in' ][ scope.defaultUnit ] / scope.defaultDPI;\n\n\t\t\t} else {\n\n\t\t\t\tscale = unitConversion[ theUnit ][ scope.defaultUnit ];\n\n\t\t\t\tif ( scale < 0 ) {\n\n\t\t\t\t\t// Conversion scale to pixels\n\n\t\t\t\t\tscale = unitConversion[ theUnit ][ 'in' ] * scope.defaultDPI;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn scale * parseFloat( string );\n\n\t\t}\n\n\t\t// Transforms\n\n\t\tfunction getNodeTransform( node ) {\n\n\t\t\tif ( ! ( node.hasAttribute( 'transform' ) || ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) ) ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst transform = parseNodeTransform( node );\n\n\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\ttransform.premultiply( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tcurrentTransform.copy( transform );\n\t\t\ttransformStack.push( transform );\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction parseNodeTransform( node ) {\n\n\t\t\tconst transform = new Matrix3();\n\t\t\tconst currentTransform = tempTransform0;\n\n\t\t\tif ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) {\n\n\t\t\t\tconst tx = parseFloatWithUnits( node.getAttribute( 'x' ) );\n\t\t\t\tconst ty = parseFloatWithUnits( node.getAttribute( 'y' ) );\n\n\t\t\t\ttransform.translate( tx, ty );\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'transform' ) ) {\n\n\t\t\t\tconst transformsTexts = node.getAttribute( 'transform' ).split( ')' );\n\n\t\t\t\tfor ( let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex -- ) {\n\n\t\t\t\t\tconst transformText = transformsTexts[ tIndex ].trim();\n\n\t\t\t\t\tif ( transformText === '' ) continue;\n\n\t\t\t\t\tconst openParPos = transformText.indexOf( '(' );\n\t\t\t\t\tconst closeParPos = transformText.length;\n\n\t\t\t\t\tif ( openParPos > 0 && openParPos < closeParPos ) {\n\n\t\t\t\t\t\tconst transformType = transformText.slice( 0, openParPos );\n\n\t\t\t\t\t\tconst array = parseFloats( transformText.slice( openParPos + 1 ) );\n\n\t\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t\t\tswitch ( transformType ) {\n\n\t\t\t\t\t\t\tcase 'translate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst tx = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet ty = 0;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tty = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.translate( tx, ty );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'rotate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tlet angle = 0;\n\t\t\t\t\t\t\t\t\tlet cx = 0;\n\t\t\t\t\t\t\t\t\tlet cy = 0;\n\n\t\t\t\t\t\t\t\t\t// Angle\n\t\t\t\t\t\t\t\t\tangle = array[ 0 ] * Math.PI / 180;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 3 ) {\n\n\t\t\t\t\t\t\t\t\t\t// Center x, y\n\t\t\t\t\t\t\t\t\t\tcx = array[ 1 ];\n\t\t\t\t\t\t\t\t\t\tcy = array[ 2 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Rotate around center (cx, cy)\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( - cx, - cy );\n\t\t\t\t\t\t\t\t\ttempTransform2.makeRotation( angle );\n\t\t\t\t\t\t\t\t\ttempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( cx, cy );\n\t\t\t\t\t\t\t\t\tcurrentTransform.multiplyMatrices( tempTransform1, tempTransform3 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'scale':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst scaleX = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet scaleY = scaleX;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tscaleY = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.scale( scaleX, scaleY );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewX':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0,\n\t\t\t\t\t\t\t\t\t\t0, 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewY':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, 0, 0,\n\t\t\t\t\t\t\t\t\t\tMath.tan( array[ 0 ] * Math.PI / 180 ), 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'matrix':\n\n\t\t\t\t\t\t\t\tif ( array.length === 6 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\tarray[ 0 ], array[ 2 ], array[ 4 ],\n\t\t\t\t\t\t\t\t\t\tarray[ 1 ], array[ 3 ], array[ 5 ],\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttransform.premultiply( currentTransform );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction transformPath( path, m ) {\n\n\t\t\tfunction transfVec2( v2 ) {\n\n\t\t\t\ttempV3.set( v2.x, v2.y, 1 ).applyMatrix3( m );\n\n\t\t\t\tv2.set( tempV3.x, tempV3.y );\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseGeneric( curve ) {\n\n\t\t\t\t// For math description see:\n\t\t\t\t// https://math.stackexchange.com/questions/4544164\n\n\t\t\t\tconst a = curve.xRadius;\n\t\t\t\tconst b = curve.yRadius;\n\n\t\t\t\tconst cosTheta = Math.cos( curve.aRotation );\n\t\t\t\tconst sinTheta = Math.sin( curve.aRotation );\n\n\t\t\t\tconst v1 = new Vector3( a * cosTheta, a * sinTheta, 0 );\n\t\t\t\tconst v2 = new Vector3( - b * sinTheta, b * cosTheta, 0 );\n\n\t\t\t\tconst f1 = v1.applyMatrix3( m );\n\t\t\t\tconst f2 = v2.applyMatrix3( m );\n\n\t\t\t\tconst mF = tempTransform0.set(\n\t\t\t\t\tf1.x, f2.x, 0,\n\t\t\t\t\tf1.y, f2.y, 0,\n\t\t\t\t\t0, 0, 1,\n\t\t\t\t);\n\n\t\t\t\tconst mFInv = tempTransform1.copy( mF ).invert();\n\t\t\t\tconst mFInvT = tempTransform2.copy( mFInv ).transpose();\n\t\t\t\tconst mQ = mFInvT.multiply( mFInv );\n\t\t\t\tconst mQe = mQ.elements;\n\n\t\t\t\tconst ed = eigenDecomposition( mQe[ 0 ], mQe[ 1 ], mQe[ 4 ] );\n\t\t\t\tconst rt1sqrt = Math.sqrt( ed.rt1 );\n\t\t\t\tconst rt2sqrt = Math.sqrt( ed.rt2 );\n\n\t\t\t\tcurve.xRadius = 1 / rt1sqrt;\n\t\t\t\tcurve.yRadius = 1 / rt2sqrt;\n\t\t\t\tcurve.aRotation = Math.atan2( ed.sn, ed.cs );\n\n\t\t\t\tconst isFullEllipse =\n\t\t\t\t\t( curve.aEndAngle - curve.aStartAngle ) % ( 2 * Math.PI ) < Number.EPSILON;\n\n\t\t\t\t// Do not touch angles of a full ellipse because after transformation they\n\t\t\t\t// would converge to a single value effectively removing the whole curve\n\n\t\t\t\tif ( ! isFullEllipse ) {\n\n\t\t\t\t\tconst mDsqrt = tempTransform1.set(\n\t\t\t\t\t\trt1sqrt, 0, 0,\n\t\t\t\t\t\t0, rt2sqrt, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mRT = tempTransform2.set(\n\t\t\t\t\t\ted.cs, ed.sn, 0,\n\t\t\t\t\t\t- ed.sn, ed.cs, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mDRF = mDsqrt.multiply( mRT ).multiply( mF );\n\n\t\t\t\t\tconst transformAngle = phi => {\n\n\t\t\t\t\t\tconst { x: cosR, y: sinR } =\n\t\t\t\t\t\t\tnew Vector3( Math.cos( phi ), Math.sin( phi ), 0 ).applyMatrix3( mDRF );\n\n\t\t\t\t\t\treturn Math.atan2( sinR, cosR );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tcurve.aStartAngle = transformAngle( curve.aStartAngle );\n\t\t\t\t\tcurve.aEndAngle = transformAngle( curve.aEndAngle );\n\n\t\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseNoSkew( curve ) {\n\n\t\t\t\t// Faster shortcut if no skew is applied\n\t\t\t\t// (e.g, a euclidean transform of a group containing the ellipse)\n\n\t\t\t\tconst sx = getTransformScaleX( m );\n\t\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\t\tcurve.xRadius *= sx;\n\t\t\t\tcurve.yRadius *= sy;\n\n\t\t\t\t// Extract rotation angle from the matrix of form:\n\t\t\t\t//\n\t\t\t\t// | cosθ sx -sinθ sy |\n\t\t\t\t// | sinθ sx cosθ sy |\n\t\t\t\t//\n\t\t\t\t// Remembering that tanθ = sinθ / cosθ; and that\n\t\t\t\t// `sx`, `sy`, or both might be zero.\n\t\t\t\tconst theta =\n\t\t\t\t\tsx > Number.EPSILON\n\t\t\t\t\t\t? Math.atan2( m.elements[ 1 ], m.elements[ 0 ] )\n\t\t\t\t\t\t: Math.atan2( - m.elements[ 3 ], m.elements[ 4 ] );\n\n\t\t\t\tcurve.aRotation += theta;\n\n\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\tcurve.aStartAngle *= - 1;\n\t\t\t\t\tcurve.aEndAngle *= - 1;\n\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst subPaths = path.subPaths;\n\n\t\t\tfor ( let i = 0, n = subPaths.length; i < n; i ++ ) {\n\n\t\t\t\tconst subPath = subPaths[ i ];\n\t\t\t\tconst curves = subPath.curves;\n\n\t\t\t\tfor ( let j = 0; j < curves.length; j ++ ) {\n\n\t\t\t\t\tconst curve = curves[ j ];\n\n\t\t\t\t\tif ( curve.isLineCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isCubicBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\t\t\t\t\t\ttransfVec2( curve.v3 );\n\n\t\t\t\t\t} else if ( curve.isQuadraticBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isEllipseCurve ) {\n\n\t\t\t\t\t\t// Transform ellipse center point\n\n\t\t\t\t\t\ttempV2.set( curve.aX, curve.aY );\n\t\t\t\t\t\ttransfVec2( tempV2 );\n\t\t\t\t\t\tcurve.aX = tempV2.x;\n\t\t\t\t\t\tcurve.aY = tempV2.y;\n\n\t\t\t\t\t\t// Transform ellipse shape parameters\n\n\t\t\t\t\t\tif ( isTransformSkewed( m ) ) {\n\n\t\t\t\t\t\t\ttransfEllipseGeneric( curve );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttransfEllipseNoSkew( curve );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction isTransformFlipped( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn te[ 0 ] * te[ 4 ] - te[ 1 ] * te[ 3 ] < 0;\n\n\t\t}\n\n\t\tfunction isTransformSkewed( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\tconst basisDot = te[ 0 ] * te[ 3 ] + te[ 1 ] * te[ 4 ];\n\n\t\t\t// Shortcut for trivial rotations and transformations\n\t\t\tif ( basisDot === 0 ) return false;\n\n\t\t\tconst sx = getTransformScaleX( m );\n\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\treturn Math.abs( basisDot / ( sx * sy ) ) > Number.EPSILON;\n\n\t\t}\n\n\t\tfunction getTransformScaleX( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] );\n\n\t\t}\n\n\t\tfunction getTransformScaleY( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 3 ] * te[ 3 ] + te[ 4 ] * te[ 4 ] );\n\n\t\t}\n\n\t\t// Calculates the eigensystem of a real symmetric 2x2 matrix\n\t\t// [ A B ]\n\t\t// [ B C ]\n\t\t// in the form\n\t\t// [ A B ] = [ cs -sn ] [ rt1 0 ] [ cs sn ]\n\t\t// [ B C ] [ sn cs ] [ 0 rt2 ] [ -sn cs ]\n\t\t// where rt1 >= rt2.\n\t\t//\n\t\t// Adapted from: https://www.mpi-hd.mpg.de/personalhomes/globes/3x3/index.html\n\t\t// -> Algorithms for real symmetric matrices -> Analytical (2x2 symmetric)\n\t\tfunction eigenDecomposition( A, B, C ) {\n\n\t\t\tlet rt1, rt2, cs, sn, t;\n\t\t\tconst sm = A + C;\n\t\t\tconst df = A - C;\n\t\t\tconst rt = Math.sqrt( df * df + 4 * B * B );\n\n\t\t\tif ( sm > 0 ) {\n\n\t\t\t\trt1 = 0.5 * ( sm + rt );\n\t\t\t\tt = 1 / rt1;\n\t\t\t\trt2 = A * t * C - B * t * B;\n\n\t\t\t} else if ( sm < 0 ) {\n\n\t\t\t\trt2 = 0.5 * ( sm - rt );\n\n\t\t\t} else {\n\n\t\t\t\t// This case needs to be treated separately to avoid div by 0\n\n\t\t\t\trt1 = 0.5 * rt;\n\t\t\t\trt2 = - 0.5 * rt;\n\n\t\t\t}\n\n\t\t\t// Calculate eigenvectors\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tcs = df + rt;\n\n\t\t\t} else {\n\n\t\t\t\tcs = df - rt;\n\n\t\t\t}\n\n\t\t\tif ( Math.abs( cs ) > 2 * Math.abs( B ) ) {\n\n\t\t\t\tt = - 2 * B / cs;\n\t\t\t\tsn = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tcs = t * sn;\n\n\t\t\t} else if ( Math.abs( B ) === 0 ) {\n\n\t\t\t\tcs = 1;\n\t\t\t\tsn = 0;\n\n\t\t\t} else {\n\n\t\t\t\tt = - 0.5 * cs / B;\n\t\t\t\tcs = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tsn = t * cs;\n\n\t\t\t}\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tt = cs;\n\t\t\t\tcs = - sn;\n\t\t\t\tsn = t;\n\n\t\t\t}\n\n\t\t\treturn { rt1, rt2, cs, sn };\n\n\t\t}\n\n\t\t//\n\n\t\tconst paths = [];\n\t\tconst stylesheets = {};\n\n\t\tconst transformStack = [];\n\n\t\tconst tempTransform0 = new Matrix3();\n\t\tconst tempTransform1 = new Matrix3();\n\t\tconst tempTransform2 = new Matrix3();\n\t\tconst tempTransform3 = new Matrix3();\n\t\tconst tempV2 = new Vector2();\n\t\tconst tempV3 = new Vector3();\n\n\t\tconst currentTransform = new Matrix3();\n\n\t\tconst xml = new DOMParser().parseFromString( text, 'image/svg+xml' ); // application/xml\n\n\t\tparseNode( xml.documentElement, {\n\t\t\tfill: '#000',\n\t\t\tfillOpacity: 1,\n\t\t\tstrokeOpacity: 1,\n\t\t\tstrokeWidth: 1,\n\t\t\tstrokeLineJoin: 'miter',\n\t\t\tstrokeLineCap: 'butt',\n\t\t\tstrokeMiterLimit: 4\n\t\t} );\n\n\t\tconst data = { paths: paths, xml: xml.documentElement };\n\n\t\t// console.log( paths );\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Creates from the given shape path and array of shapes.\n\t *\n\t * @param {ShapePath} shapePath - The shape path.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\tstatic createShapes( shapePath ) {\n\n\t\tconst BIGNUMBER = 999999999;\n\n\t\tconst IntersectionLocationType = {\n\t\t\tORIGIN: 0,\n\t\t\tDESTINATION: 1,\n\t\t\tBETWEEN: 2,\n\t\t\tLEFT: 3,\n\t\t\tRIGHT: 4,\n\t\t\tBEHIND: 5,\n\t\t\tBEYOND: 6\n\t\t};\n\n\t\tconst classifyResult = {\n\t\t\tloc: IntersectionLocationType.ORIGIN,\n\t\t\tt: 0\n\t\t};\n\n\t\tfunction findEdgeIntersection( a0, a1, b0, b1 ) {\n\n\t\t\tconst x1 = a0.x;\n\t\t\tconst x2 = a1.x;\n\t\t\tconst x3 = b0.x;\n\t\t\tconst x4 = b1.x;\n\t\t\tconst y1 = a0.y;\n\t\t\tconst y2 = a1.y;\n\t\t\tconst y3 = b0.y;\n\t\t\tconst y4 = b1.y;\n\t\t\tconst nom1 = ( x4 - x3 ) * ( y1 - y3 ) - ( y4 - y3 ) * ( x1 - x3 );\n\t\t\tconst nom2 = ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 );\n\t\t\tconst denom = ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 );\n\t\t\tconst t1 = nom1 / denom;\n\t\t\tconst t2 = nom2 / denom;\n\n\t\t\tif ( ( ( denom === 0 ) && ( nom1 !== 0 ) ) || ( t1 <= 0 ) || ( t1 >= 1 ) || ( t2 < 0 ) || ( t2 > 1 ) ) {\n\n\t\t\t\t//1. lines are parallel or edges don't intersect\n\n\t\t\t\treturn null;\n\n\t\t\t} else if ( ( nom1 === 0 ) && ( denom === 0 ) ) {\n\n\t\t\t\t//2. lines are colinear\n\n\t\t\t\t//check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\t\t\t\t\t//find position of this endpoints relatively to edge1\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t} else if ( classifyResult.loc == IntersectionLocationType.BETWEEN ) {\n\n\t\t\t\t\t\tconst x = + ( ( x1 + classifyResult.t * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\tconst y = + ( ( y1 + classifyResult.t * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\treturn { x: x, y: y, t: classifyResult.t, };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t} else {\n\n\t\t\t\t//3. edges intersect\n\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst x = + ( ( x1 + t1 * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\tconst y = + ( ( y1 + t1 * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\treturn { x: x, y: y, t: t1 };\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction classifyPoint( p, edgeStart, edgeEnd ) {\n\n\t\t\tconst ax = edgeEnd.x - edgeStart.x;\n\t\t\tconst ay = edgeEnd.y - edgeStart.y;\n\t\t\tconst bx = p.x - edgeStart.x;\n\t\t\tconst by = p.y - edgeStart.y;\n\t\t\tconst sa = ax * by - bx * ay;\n\n\t\t\tif ( ( p.x === edgeStart.x ) && ( p.y === edgeStart.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.ORIGIN;\n\t\t\t\tclassifyResult.t = 0;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( p.x === edgeEnd.x ) && ( p.y === edgeEnd.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.DESTINATION;\n\t\t\t\tclassifyResult.t = 1;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa < - Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.LEFT;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa > Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.RIGHT;\n\t\t\t\treturn;\n\n\n\t\t\t}\n\n\t\t\tif ( ( ( ax * bx ) < 0 ) || ( ( ay * by ) < 0 ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEHIND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( Math.sqrt( ax * ax + ay * ay ) ) < ( Math.sqrt( bx * bx + by * by ) ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEYOND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet t;\n\n\t\t\tif ( ax !== 0 ) {\n\n\t\t\t\tt = bx / ax;\n\n\t\t\t} else {\n\n\t\t\t\tt = by / ay;\n\n\t\t\t}\n\n\t\t\tclassifyResult.loc = IntersectionLocationType.BETWEEN;\n\t\t\tclassifyResult.t = t;\n\n\t\t}\n\n\t\tfunction getIntersections( path1, path2 ) {\n\n\t\t\tconst intersectionsRaw = [];\n\t\t\tconst intersections = [];\n\n\t\t\tfor ( let index = 1; index < path1.length; index ++ ) {\n\n\t\t\t\tconst path1EdgeStart = path1[ index - 1 ];\n\t\t\t\tconst path1EdgeEnd = path1[ index ];\n\n\t\t\t\tfor ( let index2 = 1; index2 < path2.length; index2 ++ ) {\n\n\t\t\t\t\tconst path2EdgeStart = path2[ index2 - 1 ];\n\t\t\t\t\tconst path2EdgeEnd = path2[ index2 ];\n\n\t\t\t\t\tconst intersection = findEdgeIntersection( path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd );\n\n\t\t\t\t\tif ( intersection !== null && intersectionsRaw.find( i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON ) === undefined ) {\n\n\t\t\t\t\t\tintersectionsRaw.push( intersection );\n\t\t\t\t\t\tintersections.push( new Vector2( intersection.x, intersection.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn intersections;\n\n\t\t}\n\n\t\tfunction getScanlineIntersections( scanline, boundingBox, paths ) {\n\n\t\t\tconst center = new Vector2();\n\t\t\tboundingBox.getCenter( center );\n\n\t\t\tconst allIntersections = [];\n\n\t\t\tpaths.forEach( path => {\n\n\t\t\t\t// check if the center of the bounding box is in the bounding box of the paths.\n\t\t\t\t// this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.\n\t\t\t\t// if a path envelops another path. The center of that other path, has to be inside the bounding box of the enveloping path.\n\t\t\t\tif ( path.boundingBox.containsPoint( center ) ) {\n\n\t\t\t\t\tconst intersections = getIntersections( scanline, path.points );\n\n\t\t\t\t\tintersections.forEach( p => {\n\n\t\t\t\t\t\tallIntersections.push( { identifier: path.identifier, isCW: path.isCW, point: p } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tallIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\treturn allIntersections;\n\n\t\t}\n\n\t\tfunction isHoleTo( simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule ) {\n\n\t\t\tif ( _fillRule === null || _fillRule === undefined || _fillRule === '' ) {\n\n\t\t\t\t_fillRule = 'nonzero';\n\n\t\t\t}\n\n\t\t\tconst centerBoundingBox = new Vector2();\n\t\t\tsimplePath.boundingBox.getCenter( centerBoundingBox );\n\n\t\t\tconst scanline = [ new Vector2( scanlineMinX, centerBoundingBox.y ), new Vector2( scanlineMaxX, centerBoundingBox.y ) ];\n\n\t\t\tconst scanlineIntersections = getScanlineIntersections( scanline, simplePath.boundingBox, allPaths );\n\n\t\t\tscanlineIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\tconst baseIntersections = [];\n\t\t\tconst otherIntersections = [];\n\n\t\t\tscanlineIntersections.forEach( i => {\n\n\t\t\t\tif ( i.identifier === simplePath.identifier ) {\n\n\t\t\t\t\tbaseIntersections.push( i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\totherIntersections.push( i );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst firstXOfPath = baseIntersections[ 0 ].point.x;\n\n\t\t\t// build up the path hierarchy\n\t\t\tconst stack = [];\n\t\t\tlet i = 0;\n\n\t\t\twhile ( i < otherIntersections.length && otherIntersections[ i ].point.x < firstXOfPath ) {\n\n\t\t\t\tif ( stack.length > 0 && stack[ stack.length - 1 ] === otherIntersections[ i ].identifier ) {\n\n\t\t\t\t\tstack.pop();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstack.push( otherIntersections[ i ].identifier );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\tstack.push( simplePath.identifier );\n\n\t\t\tif ( _fillRule === 'evenodd' ) {\n\n\t\t\t\tconst isHole = stack.length % 2 === 0 ? true : false;\n\t\t\t\tconst isHoleFor = stack[ stack.length - 2 ];\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else if ( _fillRule === 'nonzero' ) {\n\n\t\t\t\t// check if path is a hole by counting the amount of paths with alternating rotations it has to cross.\n\t\t\t\tlet isHole = true;\n\t\t\t\tlet isHoleFor = null;\n\t\t\t\tlet lastCWValue = null;\n\n\t\t\t\tfor ( let i = 0; i < stack.length; i ++ ) {\n\n\t\t\t\t\tconst identifier = stack[ i ];\n\t\t\t\t\tif ( isHole ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = false;\n\t\t\t\t\t\tisHoleFor = identifier;\n\n\t\t\t\t\t} else if ( lastCWValue !== allPaths[ identifier ].isCW ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'fill-rule: \"' + _fillRule + '\" is currently not implemented.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check for self intersecting paths\n\t\t// TODO\n\n\t\t// check intersecting paths\n\t\t// TODO\n\n\t\t// prepare paths for hole detection\n\t\tlet scanlineMinX = BIGNUMBER;\n\t\tlet scanlineMaxX = - BIGNUMBER;\n\n\t\tlet simplePaths = shapePath.subPaths.map( p => {\n\n\t\t\tconst points = p.getPoints();\n\t\t\tlet maxY = - BIGNUMBER;\n\t\t\tlet minY = BIGNUMBER;\n\t\t\tlet maxX = - BIGNUMBER;\n\t\t\tlet minX = BIGNUMBER;\n\n\t \t//points.forEach(p => p.y *= -1);\n\n\t\t\tfor ( let i = 0; i < points.length; i ++ ) {\n\n\t\t\t\tconst p = points[ i ];\n\n\t\t\t\tif ( p.y > maxY ) {\n\n\t\t\t\t\tmaxY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.y < minY ) {\n\n\t\t\t\t\tminY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x > maxX ) {\n\n\t\t\t\t\tmaxX = p.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x < minX ) {\n\n\t\t\t\t\tminX = p.x;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scanlineMaxX <= maxX ) {\n\n\t\t\t\tscanlineMaxX = maxX + 1;\n\n\t\t\t}\n\n\t\t\tif ( scanlineMinX >= minX ) {\n\n\t\t\t\tscanlineMinX = minX - 1;\n\n\t\t\t}\n\n\t\t\treturn { curves: p.curves, points: points, isCW: ShapeUtils.isClockWise( points ), identifier: - 1, boundingBox: new Box2( new Vector2( minX, minY ), new Vector2( maxX, maxY ) ) };\n\n\t\t} );\n\n\t\tsimplePaths = simplePaths.filter( sp => sp.points.length > 1 );\n\n\t\tfor ( let identifier = 0; identifier < simplePaths.length; identifier ++ ) {\n\n\t\t\tsimplePaths[ identifier ].identifier = identifier;\n\n\t\t}\n\n\t\t// check if path is solid or a hole\n\t\tconst isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, ( shapePath.userData ? shapePath.userData.style.fillRule : undefined ) ) );\n\n\n\t\tconst shapesToReturn = [];\n\t\tsimplePaths.forEach( p => {\n\n\t\t\tconst amIAHole = isAHole[ p.identifier ];\n\n\t\t\tif ( ! amIAHole.isHole ) {\n\n\t\t\t\tconst shape = new Shape();\n\t\t\t\tshape.curves = p.curves;\n\t\t\t\tconst holes = isAHole.filter( h => h.isHole && h.for === p.identifier );\n\t\t\t\tholes.forEach( h => {\n\n\t\t\t\t\tconst hole = simplePaths[ h.identifier ];\n\t\t\t\t\tconst path = new Path();\n\t\t\t\t\tpath.curves = hole.curves;\n\t\t\t\t\tshape.holes.push( path );\n\n\t\t\t\t} );\n\t\t\t\tshapesToReturn.push( shape );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn shapesToReturn;\n\n\t}\n\n\t/**\n\t * Returns a stroke style object from the given parameters.\n\t *\n\t * @param {number} [width=1] - The stroke width.\n\t * @param {string} [color='#000'] - The stroke color, as returned by {@link Color#getStyle}.\n\t * @param {'round'|'bevel'|'miter'|'miter-limit'} [lineJoin='miter'] - The line join style.\n\t * @param {'round'|'square'|'butt'} [lineCap='butt'] - The line cap style.\n\t * @param {number} [miterLimit=4] - Maximum join length, in multiples of the `width` parameter (join is truncated if it exceeds that distance).\n\t * @return {Object} The style object.\n\t */\n\tstatic getStrokeStyle( width, color, lineJoin, lineCap, miterLimit ) {\n\n\t\twidth = width !== undefined ? width : 1;\n\t\tcolor = color !== undefined ? color : '#000';\n\t\tlineJoin = lineJoin !== undefined ? lineJoin : 'miter';\n\t\tlineCap = lineCap !== undefined ? lineCap : 'butt';\n\t\tmiterLimit = miterLimit !== undefined ? miterLimit : 4;\n\n\t\treturn {\n\t\t\tstrokeColor: color,\n\t\t\tstrokeWidth: width,\n\t\t\tstrokeLineJoin: lineJoin,\n\t\t\tstrokeLineCap: lineCap,\n\t\t\tstrokeMiterLimit: miterLimit\n\t\t};\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points. The path can be open or closed (last point equals to first point).\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @return {?BufferGeometry} The stroke geometry. UV coordinates are generated ('u' along path. 'v' across it, from left to right).\n\t * Returns `null` if not geometry was generated.\n\t */\n\tstatic pointsToStroke( points, style, arcDivisions, minDistance ) {\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tif ( SVGLoader.pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs ) === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\treturn geometry;\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points.\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @param {Array<number>} vertices - An array holding vertices.\n\t * @param {Array<number>} normals - An array holding normals.\n\t * @param {Array<number>} uvs - An array holding uvs.\n\t * @param {number} [vertexOffset=0] - The vertex offset.\n\t * @return {number} The number of vertices.\n\t */\n\tstatic pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset ) {\n\n\t\t// This function can be called to update existing arrays or buffers.\n\t\t// Accepts same parameters as pointsToStroke, plus the buffers and optional offset.\n\t\t// Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)\n\t\t// Returns number of written vertices / normals / uvs pairs\n\t\t// if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)\n\t\t// 'normals' and 'uvs' buffers are optional\n\n\t\tconst tempV2_1 = new Vector2();\n\t\tconst tempV2_2 = new Vector2();\n\t\tconst tempV2_3 = new Vector2();\n\t\tconst tempV2_4 = new Vector2();\n\t\tconst tempV2_5 = new Vector2();\n\t\tconst tempV2_6 = new Vector2();\n\t\tconst tempV2_7 = new Vector2();\n\t\tconst lastPointL = new Vector2();\n\t\tconst lastPointR = new Vector2();\n\t\tconst point0L = new Vector2();\n\t\tconst point0R = new Vector2();\n\t\tconst currentPointL = new Vector2();\n\t\tconst currentPointR = new Vector2();\n\t\tconst nextPointL = new Vector2();\n\t\tconst nextPointR = new Vector2();\n\t\tconst innerPoint = new Vector2();\n\t\tconst outerPoint = new Vector2();\n\n\t\tarcDivisions = arcDivisions !== undefined ? arcDivisions : 12;\n\t\tminDistance = minDistance !== undefined ? minDistance : 0.001;\n\t\tvertexOffset = vertexOffset !== undefined ? vertexOffset : 0;\n\n\t\t// First ensure there are no duplicated points\n\t\tpoints = removeDuplicatedPoints( points );\n\n\t\tconst numPoints = points.length;\n\n\t\tif ( numPoints < 2 ) return 0;\n\n\t\tconst isClosed = points[ 0 ].equals( points[ numPoints - 1 ] );\n\n\t\tlet currentPoint;\n\t\tlet previousPoint = points[ 0 ];\n\t\tlet nextPoint;\n\n\t\tconst strokeWidth2 = style.strokeWidth / 2;\n\n\t\tconst deltaU = 1 / ( numPoints - 1 );\n\t\tlet u0 = 0, u1;\n\n\t\tlet innerSideModified;\n\t\tlet joinIsOnLeftSide;\n\t\tlet isMiter;\n\t\tlet initialJoinIsOnLeftSide = false;\n\n\t\tlet numVertices = 0;\n\t\tlet currentCoordinate = vertexOffset * 3;\n\t\tlet currentCoordinateUV = vertexOffset * 2;\n\n\t\t// Get initial left and right stroke points\n\t\tgetNormal( points[ 0 ], points[ 1 ], tempV2_1 ).multiplyScalar( strokeWidth2 );\n\t\tlastPointL.copy( points[ 0 ] ).sub( tempV2_1 );\n\t\tlastPointR.copy( points[ 0 ] ).add( tempV2_1 );\n\t\tpoint0L.copy( lastPointL );\n\t\tpoint0R.copy( lastPointR );\n\n\t\tfor ( let iPoint = 1; iPoint < numPoints; iPoint ++ ) {\n\n\t\t\tcurrentPoint = points[ iPoint ];\n\n\t\t\t// Get next point\n\t\t\tif ( iPoint === numPoints - 1 ) {\n\n\t\t\t\tif ( isClosed ) {\n\n\t\t\t\t\t// Skip duplicated initial point\n\t\t\t\t\tnextPoint = points[ 1 ];\n\n\t\t\t\t} else nextPoint = undefined;\n\n\t\t\t} else {\n\n\t\t\t\tnextPoint = points[ iPoint + 1 ];\n\n\t\t\t}\n\n\t\t\t// Normal of previous segment in tempV2_1\n\t\t\tconst normal1 = tempV2_1;\n\t\t\tgetNormal( previousPoint, currentPoint, normal1 );\n\n\t\t\ttempV2_3.copy( normal1 ).multiplyScalar( strokeWidth2 );\n\t\t\tcurrentPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\tcurrentPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\tu1 = u0 + deltaU;\n\n\t\t\tinnerSideModified = false;\n\n\t\t\tif ( nextPoint !== undefined ) {\n\n\t\t\t\t// Normal of next segment in tempV2_2\n\t\t\t\tgetNormal( currentPoint, nextPoint, tempV2_2 );\n\n\t\t\t\ttempV2_3.copy( tempV2_2 ).multiplyScalar( strokeWidth2 );\n\t\t\t\tnextPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\t\tnextPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\t\tjoinIsOnLeftSide = true;\n\t\t\t\ttempV2_3.subVectors( nextPoint, previousPoint );\n\t\t\t\tif ( normal1.dot( tempV2_3 ) < 0 ) {\n\n\t\t\t\t\tjoinIsOnLeftSide = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( iPoint === 1 ) initialJoinIsOnLeftSide = joinIsOnLeftSide;\n\n\t\t\t\ttempV2_3.subVectors( nextPoint, currentPoint );\n\t\t\t\ttempV2_3.normalize();\n\t\t\t\tconst dot = Math.abs( normal1.dot( tempV2_3 ) );\n\n\t\t\t\t// If path is straight, don't create join\n\t\t\t\tif ( dot > Number.EPSILON ) {\n\n\t\t\t\t\t// Compute inner and outer segment intersections\n\t\t\t\t\tconst miterSide = strokeWidth2 / dot;\n\t\t\t\t\ttempV2_3.multiplyScalar( - miterSide );\n\t\t\t\t\ttempV2_4.subVectors( currentPoint, previousPoint );\n\t\t\t\t\ttempV2_5.copy( tempV2_4 ).setLength( miterSide ).add( tempV2_3 );\n\t\t\t\t\tinnerPoint.copy( tempV2_5 ).negate();\n\t\t\t\t\tconst miterLength2 = tempV2_5.length();\n\t\t\t\t\tconst segmentLengthPrev = tempV2_4.length();\n\t\t\t\t\ttempV2_4.divideScalar( segmentLengthPrev );\n\t\t\t\t\ttempV2_6.subVectors( nextPoint, currentPoint );\n\t\t\t\t\tconst segmentLengthNext = tempV2_6.length();\n\t\t\t\t\ttempV2_6.divideScalar( segmentLengthNext );\n\t\t\t\t\t// Check that previous and next segments doesn't overlap with the innerPoint of intersection\n\t\t\t\t\tif ( tempV2_4.dot( innerPoint ) < segmentLengthPrev && tempV2_6.dot( innerPoint ) < segmentLengthNext ) {\n\n\t\t\t\t\t\tinnerSideModified = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\touterPoint.copy( tempV2_5 ).add( currentPoint );\n\t\t\t\t\tinnerPoint.add( currentPoint );\n\n\t\t\t\t\tisMiter = false;\n\n\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\tnextPointR.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointR.copy( innerPoint );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tnextPointL.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointL.copy( innerPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// The segment triangles are generated here if there was overlapping\n\n\t\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch ( style.strokeLineJoin ) {\n\n\t\t\t\t\t\tcase 'bevel':\n\n\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'round':\n\n\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t// Join triangles\n\n\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, currentPointL, nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, nextPointR, currentPointR, u1, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'miter':\n\t\t\t\t\t\tcase 'miter-clip':\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconst miterFraction = ( strokeWidth2 * style.strokeMiterLimit ) / miterLength2;\n\n\t\t\t\t\t\t\tif ( miterFraction < 1 ) {\n\n\t\t\t\t\t\t\t\t// The join miter length exceeds the miter limit\n\n\t\t\t\t\t\t\t\tif ( style.strokeLineJoin !== 'miter-clip' ) {\n\n\t\t\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t\t\t// Miter-clip join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointL ).multiplyScalar( miterFraction ).add( currentPointL );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointL ).multiplyScalar( miterFraction ).add( nextPointL );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointR ).multiplyScalar( miterFraction ).add( currentPointR );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointR ).multiplyScalar( miterFraction ).add( nextPointR );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Miter join segment triangles\n\n\t\t\t\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\t\t\t\t// Optimized segment + join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\tnextPointL.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tnextPointR.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Add extra miter join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tisMiter = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// The segment triangles are generated here when two consecutive points are collinear\n\n\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// The segment triangles are generated here if it is the ending segment\n\n\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t}\n\n\t\t\tif ( ! isClosed && iPoint === numPoints - 1 ) {\n\n\t\t\t\t// Start line endcap\n\t\t\t\taddCapGeometry( points[ 0 ], point0L, point0R, joinIsOnLeftSide, true, u0 );\n\n\t\t\t}\n\n\t\t\t// Increment loop variables\n\n\t\t\tu0 = u1;\n\n\t\t\tpreviousPoint = currentPoint;\n\n\t\t\tlastPointL.copy( nextPointL );\n\t\t\tlastPointR.copy( nextPointR );\n\n\t\t}\n\n\t\tif ( ! isClosed ) {\n\n\t\t\t// Ending line endcap\n\t\t\taddCapGeometry( currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1 );\n\n\t\t} else if ( innerSideModified && vertices ) {\n\n\t\t\t// Modify path first segment vertices to adjust to the segments inner and outer intersections\n\n\t\t\tlet lastOuter = outerPoint;\n\t\t\tlet lastInner = innerPoint;\n\n\t\t\tif ( initialJoinIsOnLeftSide !== joinIsOnLeftSide ) {\n\n\t\t\t\tlastOuter = innerPoint;\n\t\t\t\tlastInner = outerPoint;\n\n\t\t\t}\n\n\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\tif ( isMiter || initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 0 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 1 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( isMiter || ! initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 1 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn numVertices;\n\n\t\t// -- End of algorithm\n\n\t\t// -- Functions\n\n\t\tfunction getNormal( p1, p2, result ) {\n\n\t\t\tresult.subVectors( p2, p1 );\n\t\t\treturn result.set( - result.y, result.x ).normalize();\n\n\t\t}\n\n\t\tfunction addVertex( position, u, v ) {\n\n\t\t\tif ( vertices ) {\n\n\t\t\t\tvertices[ currentCoordinate ] = position.x;\n\t\t\t\tvertices[ currentCoordinate + 1 ] = position.y;\n\t\t\t\tvertices[ currentCoordinate + 2 ] = 0;\n\n\t\t\t\tif ( normals ) {\n\n\t\t\t\t\tnormals[ currentCoordinate ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 1 ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 2 ] = 1;\n\n\t\t\t\t}\n\n\t\t\t\tcurrentCoordinate += 3;\n\n\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\tuvs[ currentCoordinateUV ] = u;\n\t\t\t\t\tuvs[ currentCoordinateUV + 1 ] = v;\n\n\t\t\t\t\tcurrentCoordinateUV += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnumVertices += 3;\n\n\t\t}\n\n\t\tfunction makeCircularSector( center, p1, p2, u, v ) {\n\n\t\t\t// param p1, p2: Points in the circle arc.\n\t\t\t// p1 and p2 are in clockwise direction.\n\n\t\t\ttempV2_1.copy( p1 ).sub( center ).normalize();\n\t\t\ttempV2_2.copy( p2 ).sub( center ).normalize();\n\n\t\t\tlet angle = Math.PI;\n\t\t\tconst dot = tempV2_1.dot( tempV2_2 );\n\t\t\tif ( Math.abs( dot ) < 1 ) angle = Math.abs( Math.acos( dot ) );\n\n\t\t\tangle /= arcDivisions;\n\n\t\t\ttempV2_3.copy( p1 );\n\n\t\t\tfor ( let i = 0, il = arcDivisions - 1; i < il; i ++ ) {\n\n\t\t\t\ttempV2_4.copy( tempV2_3 ).rotateAround( center, angle );\n\n\t\t\t\taddVertex( tempV2_3, u, v );\n\t\t\t\taddVertex( tempV2_4, u, v );\n\t\t\t\taddVertex( center, u, 0.5 );\n\n\t\t\t\ttempV2_3.copy( tempV2_4 );\n\n\t\t\t}\n\n\t\t\taddVertex( tempV2_4, u, v );\n\t\t\taddVertex( p2, u, v );\n\t\t\taddVertex( center, u, 0.5 );\n\n\t\t}\n\n\t\tfunction makeSegmentTriangles() {\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t}\n\n\t\tfunction makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t// Optimized segment + bevel triangles\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( innerPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( innerPoint, u, 0 );\n\t\t\t\t\taddVertex( nextPointR, u, 1 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bevel join triangle. The segment triangles are done in the main loop\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( nextPointR, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( nextPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointR, u0, 1 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( nextPointR, u0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addCapGeometry( center, p1, p2, joinIsOnLeftSide, start, u ) {\n\n\t\t\t// param center: End point of the path\n\t\t\t// param p1, p2: Left and right cap points\n\n\t\t\tswitch ( style.strokeLineCap ) {\n\n\t\t\t\tcase 'round':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\tmakeCircularSector( center, p2, p1, u, 0.5 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmakeCircularSector( center, p1, p2, u, 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'square':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p1, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\t// using tempV2_4 to update 3rd vertex if the uv.y of 3rd vertex is 1\n\t\t\t\t\t\t\tuvs[ 3 * 2 + 1 ] === 1 ? tempV2_4.toArray( vertices, 3 * 3 ) : tempV2_3.toArray( vertices, 3 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p2, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\tconst vl = vertices.length;\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'butt':\n\t\t\t\tdefault:\n\n\t\t\t\t\t// Nothing to do here\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeDuplicatedPoints( points ) {\n\n\t\t\t// Creates a new array if necessary with duplicated points removed.\n\t\t\t// This does not remove duplicated initial and ending points of a closed path.\n\n\t\t\tlet dupPoints = false;\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) < minDistance ) {\n\n\t\t\t\t\tdupPoints = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! dupPoints ) return points;\n\n\t\t\tconst newPoints = [];\n\t\t\tnewPoints.push( points[ 0 ] );\n\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) >= minDistance ) {\n\n\t\t\t\t\tnewPoints.push( points[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnewPoints.push( points[ points.length - 1 ] );\n\n\t\t\treturn newPoints;\n\n\t\t}\n\n\t}\n\n\n}\n\nexport { SVGLoader };\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { SVGLoader, type SVGResult } from 'three/examples/jsm/loaders/SVGLoader.js';\nimport {\n inlineSvgStyles,\n isInteractiveGroupLabel,\n isRouteFolderLabel,\n isRoutePathLabel,\n isStoreFolderLabel,\n isTransparentColor,\n resolveFetchUrl,\n amenityHouseFill,\n isAmenityLayerId,\n resolveLayerStyle,\n sortByOutdoorSvgPaintOrder,\n} from '../../core';\n\nexport { resolveFetchUrl };\n\nconst BASE_Z = -2;\n\nfunction getLayerNameFromNode(node: Element | undefined): string | undefined {\n if (!node || node.nodeType !== 1) return undefined;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id');\n if (id) return id;\n current = current.parentElement;\n }\n return undefined;\n}\n\nfunction isInteractiveAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isInteractiveGroupLabel(id) || isInteractiveGroupLabel(dataName)) return true;\n if (isStoreFolderLabel(id) || isStoreFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\nfunction isRouteAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isRouteFolderLabel(id) || isRouteFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\nexport interface SvgVectorLayerProps {\n url: string;\n /** sourceSvgId values held in cm_shapes — skip drawing these (DB owns them). */\n suppressIds?: ReadonlySet<string>;\n imageProxyUrl?: string | null;\n is3d?: boolean;\n /** Settings overrides for house outdoor colors. */\n theme?: Partial<Record<string, string>> | null;\n}\n\ninterface PreparedMesh {\n key: string;\n layerName?: string;\n shapes: THREE.Shape[];\n color: THREE.Color;\n opacity: number;\n extrude: number;\n renderOrder: number;\n}\n\n/**\n * Live outdoor SVG as real vector geometry (not a raster texture).\n * Applies house-style colors for reserved layer names; otherwise keeps\n * Illustrator fills. Skips ROUTES-group lines and interactive ids owned by the DB.\n * Coordinates stay in SVG user space — `MapScene` flips the whole scene.\n */\nexport function SvgVectorLayer({\n url,\n suppressIds,\n imageProxyUrl,\n is3d = false,\n theme,\n}: SvgVectorLayerProps) {\n const [result, setResult] = useState<SVGResult | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n const inlined = inlineSvgStyles(text);\n const loader = new SVGLoader();\n setResult(loader.parse(inlined));\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setResult(null);\n // Silence here used to hide CORS failures as \"outdoor has no decoration\".\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapViewer.',\n err,\n );\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const meshes = useMemo(() => {\n if (!result) return [] as PreparedMesh[];\n const out: PreparedMesh[] = [];\n let idx = 0;\n for (const path of result.paths) {\n const node = path.userData?.node as Element | undefined;\n const layerName = getLayerNameFromNode(node);\n if (layerName?.toLowerCase().startsWith('route-path')) continue;\n if (layerName && (isRoutePathLabel(layerName) || isRouteFolderLabel(layerName))) {\n continue;\n }\n if (node && isRouteAncestor(node)) continue;\n if (layerName && suppressIds?.has(layerName)) continue;\n if (isInteractiveAncestor(node) && !layerName) continue;\n // Whole INTERACTIVE / STORES folders are owned by DB shapes.\n if (layerName && (isInteractiveGroupLabel(layerName) || isStoreFolderLabel(layerName))) {\n continue;\n }\n if (node && isInteractiveAncestor(node) && layerName && suppressIds?.has(layerName)) {\n continue;\n }\n // Skip paths inside INTERACTIVE/STORES even when not yet in DB (assignable units).\n if (node && isInteractiveAncestor(node)) continue;\n\n const shapes = SVGLoader.createShapes(path);\n if (shapes.length === 0) continue;\n\n const layerStyle = resolveLayerStyle(layerName, theme);\n const amenityFill = isAmenityLayerId(layerName)\n ? amenityHouseFill(theme)\n : null;\n const fillTransparent = isTransparentColor(layerStyle?.fill);\n const strokeTransparent = isTransparentColor(layerStyle?.stroke);\n const color = new THREE.Color();\n if (layerStyle?.fill && !fillTransparent) {\n color.set(layerStyle.fill);\n } else if (amenityFill) {\n color.set(amenityFill);\n } else if (path.color && !fillTransparent) {\n color.copy(path.color);\n } else {\n color.set('#cccccc');\n }\n if (layerStyle?.stroke && !layerStyle.fill && !strokeTransparent) {\n color.set(layerStyle.stroke);\n }\n\n const opacity =\n fillTransparent || (strokeTransparent && !layerStyle?.fill)\n ? 0\n : typeof path.userData?.style?.opacity === 'number'\n ? path.userData.style.opacity\n : 1;\n const extrude =\n is3d && layerStyle?.extrudeHeight != null ? layerStyle.extrudeHeight : 0;\n\n out.push({\n key: `${layerName ?? 'path'}-${idx++}`,\n layerName,\n shapes,\n color,\n opacity,\n extrude,\n renderOrder: 0,\n });\n }\n // Sequential renderOrder matches the resolved list so same-color meshes\n // cannot batch a green area over a later special shape.\n return sortByOutdoorSvgPaintOrder(out, (mesh) => mesh.layerName).map(\n (mesh, renderOrder) => ({ ...mesh, renderOrder }),\n );\n }, [result, suppressIds, is3d, theme]);\n\n if (!result || meshes.length === 0) return null;\n\n return (\n <group position={[0, 0, BASE_Z]} renderOrder={-20}>\n {meshes.map((m) =>\n m.shapes.map((shape, si) => (\n <mesh\n key={`${m.key}-${si}`}\n renderOrder={m.renderOrder}\n raycast={() => {}}\n >\n {m.extrude > 0 ? (\n <extrudeGeometry\n args={[shape, { depth: m.extrude, bevelEnabled: false }]}\n />\n ) : (\n <shapeGeometry args={[shape]} />\n )}\n <meshBasicMaterial\n color={m.color}\n transparent={m.opacity < 1}\n opacity={m.opacity}\n depthWrite={false}\n toneMapped={false}\n side={THREE.DoubleSide}\n />\n </mesh>\n )),\n )}\n </group>\n );\n}\n","import {\n expandBounds,\n applyLevelTransform,\n sceneBoundsFromBBox,\n type BBox,\n type LevelTransform,\n type PathResult,\n type SceneBounds,\n type Vec2,\n} from '../core';\n\n/**\n * Stored geometry is raw SVG user space, where Y grows downward. The scene\n * mirrors Y once so the camera can keep a conventional `up = [0, 1, 0]`.\n *\n * Do not \"fix\" orientation by setting `up = [0, -1, 0]` instead: three.js\n * derives the camera's right axis from `up × forward`, so a negative up also\n * mirrors X and the map renders rotated 180° rather than flipped.\n */\nexport const SCENE_FLIP_SCALE: [number, number, number] = [1, -1, 1];\n\n/** Stored SVG-space point → view space, matching `SCENE_FLIP_SCALE`. */\nexport function dataToViewPoint(point: Vec2): Vec2 {\n return { x: point.x, y: -point.y };\n}\n\n/** Stored SVG-space bounds → view space, for camera and controls placement. */\nexport function viewBoundsFromData(bounds: SceneBounds): SceneBounds {\n return {\n ...bounds,\n minY: -bounds.maxY,\n maxY: -bounds.minY,\n cy: -bounds.cy,\n };\n}\n\n/**\n * Fit an orthographic camera so the map fills the canvas on the limiting\n * axis (width or height) with no extra inset.\n */\nexport function fitOrthoZoom(\n viewWidth: number,\n viewHeight: number,\n worldWidth: number,\n worldHeight: number,\n): number {\n const zoomX = Math.max(viewWidth, 1) / Math.max(worldWidth, 1);\n const zoomY = Math.max(viewHeight, 1) / Math.max(worldHeight, 1);\n return Math.min(zoomX, zoomY);\n}\n\nexport function boundsExtent(bounds: SceneBounds): { width: number; height: number } {\n return {\n width: Math.max(bounds.maxX - bounds.minX, 1),\n height: Math.max(bounds.maxY - bounds.minY, 1),\n };\n}\n\nexport const VIEWER_ZOOM_ANIM_MS = 240;\n/**\n * Selection pan/zoom. v1 used 0.2s of linear travel (`CAMERA.animSpeed`).\n * Ease-in-out over 200ms bunched the motion into the last frames and looked\n * like a snap; ease-out over 400ms reads as a short, smooth glide.\n */\nexport const VIEWER_FOCUS_ANIM_MS = 400;\n\n/** Extra space around a small focused shape so it does not fill the canvas. */\nexport const FOCUS_BOUNDS_PADDING = 1;\n/**\n * Padding for a large store (extent ≥ `FOCUS_LARGE_EXTENT`).\n * 2.0 → the store occupies about a third of the frame, so neighbors stay visible.\n */\nexport const FOCUS_LARGE_PADDING = 2;\n/** World size at which padding reaches `FOCUS_LARGE_PADDING`. */\nexport const FOCUS_LARGE_EXTENT = 400;\n/**\n * Padding stays tight until this size (typical small store). Kiosks and\n * amenities below this still zoom closer via `FOCUS_MIN_EXTENT`.\n */\nexport const FOCUS_PAD_SMALL_EXTENT = 80;\n/**\n * Floor for the framed world size. Tiny amenities keep neighbors in view\n * instead of filling the canvas; anything larger frames to its own bbox.\n */\nexport const FOCUS_MIN_EXTENT = 52;\n/**\n * Click-to-focus cap vs the full-map fit. A typical store stays at a\n * neighborhood view; 64× filled the canvas on the default assign map.\n */\nexport const FOCUS_MAX_ZOOM_MULTIPLE = 8;\n/**\n * Tiny kiosks/amenities may go closer than a store so they stay readable.\n * Still far below a canvas-filling close-up.\n */\nexport const FOCUS_SMALL_MAX_ZOOM_MULTIPLE = 14;\n/** Manual +/− ceiling, independent of selection focus. */\nexport const VIEWER_MAX_ZOOM_MULTIPLE = 16;\n\n/** More margin as the store grows so a department store is not edge-to-edge. */\nexport function focusPaddingRatio(\n width: number,\n height: number,\n paddingRatio = FOCUS_BOUNDS_PADDING,\n smallExtent = FOCUS_PAD_SMALL_EXTENT,\n largePadding = FOCUS_LARGE_PADDING,\n largeExtent = FOCUS_LARGE_EXTENT,\n): number {\n const extent = Math.max(width, height);\n if (extent <= smallExtent) return paddingRatio;\n const span = Math.max(largeExtent - smallExtent, 1);\n const t = Math.min(1, (extent - smallExtent) / span);\n return paddingRatio + (largePadding - paddingRatio) * t;\n}\n\n/**\n * Expand a shape's bounds for a \"click to assign\" camera frame.\n * Small units keep a tighter frame; large stores pull the camera back.\n */\nexport function paddedFocusBounds(\n bounds: SceneBounds,\n paddingRatio = FOCUS_BOUNDS_PADDING,\n minExtent = FOCUS_MIN_EXTENT,\n): SceneBounds {\n const rawW = bounds.maxX - bounds.minX;\n const rawH = bounds.maxY - bounds.minY;\n const width = Math.max(rawW, minExtent);\n const height = Math.max(rawH, minExtent);\n const pad = focusPaddingRatio(rawW, rawH, paddingRatio);\n const halfW = (width + width * pad) / 2;\n const halfH = (height + height * pad) / 2;\n return {\n minX: bounds.cx - halfW,\n minY: bounds.cy - halfH,\n maxX: bounds.cx + halfW,\n maxY: bounds.cy + halfH,\n cx: bounds.cx,\n cy: bounds.cy,\n size: Math.max(halfW, halfH) * 2,\n };\n}\n\n/**\n * How far a click may zoom relative to the fitted map. Smaller padded\n * frames (kiosks) get more zoom; store-sized frames stay at 8×.\n */\nexport function focusMaxZoomMultiple(\n paddedWidth: number,\n paddedHeight: number,\n typicalMultiple = FOCUS_MAX_ZOOM_MULTIPLE,\n smallMultiple = FOCUS_SMALL_MAX_ZOOM_MULTIPLE,\n): number {\n const extent = Math.max(paddedWidth, paddedHeight);\n const typicalFrame = FOCUS_PAD_SMALL_EXTENT * (1 + FOCUS_BOUNDS_PADDING);\n if (extent >= typicalFrame) return typicalMultiple;\n const tinyFrame = FOCUS_MIN_EXTENT * (1 + FOCUS_BOUNDS_PADDING);\n if (extent <= tinyFrame) return smallMultiple;\n const span = Math.max(typicalFrame - tinyFrame, 1);\n const t = (extent - tinyFrame) / span;\n return smallMultiple + (typicalMultiple - smallMultiple) * t;\n}\n\nexport function clampFocusZoom(\n shapeFitZoom: number,\n mapFitZoom: number,\n maxMultiple = FOCUS_MAX_ZOOM_MULTIPLE,\n): number {\n const cap = Math.max(mapFitZoom, 0.001) * maxMultiple;\n return Math.min(shapeFitZoom, cap);\n}\n\ntype FocusLevel = {\n shapes: Array<{ id: number; bbox: BBox }>;\n transform: LevelTransform;\n};\n\n/** Stable key so adding/removing a Shift-selected shape re-frames the camera. */\nexport function selectionFocusKey(shapeIds: number[]): string | null {\n const ids = [...new Set(shapeIds.filter((id) => Number.isFinite(id)))].sort(\n (a, b) => a - b,\n );\n return ids.length > 0 ? ids.join(',') : null;\n}\n\n/** View-space frame for one or more published shapes. */\nexport function viewFocusBoundsForShapes(\n levels: FocusLevel[],\n shapeIds: number[],\n): SceneBounds | null {\n const wanted = new Set(shapeIds);\n if (wanted.size === 0) return null;\n let combined: SceneBounds | null = null;\n for (const level of levels) {\n for (const shape of level.shapes) {\n if (!wanted.has(shape.id)) continue;\n const next = sceneBoundsFromBBox(shape.bbox, level.transform);\n combined = combined ? expandBounds(combined, next) : next;\n }\n }\n return combined ? viewBoundsFromData(paddedFocusBounds(combined)) : null;\n}\n\n/** View-space frame for a published shape, ready for `CameraRig.focusBounds`. */\nexport function viewFocusBoundsForShape(\n levels: FocusLevel[],\n shapeId: number,\n): SceneBounds | null {\n return viewFocusBoundsForShapes(levels, [shapeId]);\n}\n\ntype RouteFocusLevel = FocusLevel & {\n id: number;\n anchors: Array<{ id: number; shapeId?: number | null; kind?: string }>;\n};\n\n/** Match v1: frame the current-floor route and its endpoint shapes. */\nexport function viewFocusBoundsForRoute(\n levels: RouteFocusLevel[],\n route: PathResult,\n levelId: number | null,\n): SceneBounds | null {\n if (levelId == null) return null;\n const level = levels.find((item) => item.id === levelId);\n if (!level) return null;\n const routePoints = route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => applyLevelTransform(point, level.transform));\n\n let bounds: SceneBounds | null = null;\n if (routePoints.length >= 2) {\n const minX = Math.min(...routePoints.map((point) => point.x));\n const minY = Math.min(...routePoints.map((point) => point.y));\n const maxX = Math.max(...routePoints.map((point) => point.x));\n const maxY = Math.max(...routePoints.map((point) => point.y));\n bounds = {\n minX,\n minY,\n maxX,\n maxY,\n cx: (minX + maxX) / 2,\n cy: (minY + maxY) / 2,\n size: Math.max(maxX - minX, maxY - minY, 1),\n };\n } else if (routePoints.length === 1) {\n const point = routePoints[0];\n bounds = {\n minX: point.x,\n minY: point.y,\n maxX: point.x,\n maxY: point.y,\n cx: point.x,\n cy: point.y,\n size: 1,\n };\n }\n\n const endpointIds = new Set(\n [route.anchorIds[0], route.anchorIds.at(-1)].filter(\n (id): id is number => id != null,\n ),\n );\n const routeAnchorIds = new Set(route.anchorIds);\n const focusShapeIds = new Set<number>();\n for (const anchor of level.anchors) {\n if (!routeAnchorIds.has(anchor.id) || anchor.shapeId == null) continue;\n if (endpointIds.has(anchor.id) || anchor.kind === 'connector') {\n focusShapeIds.add(anchor.shapeId);\n }\n }\n for (const shape of level.shapes) {\n if (!focusShapeIds.has(shape.id)) continue;\n const shapeBounds = sceneBoundsFromBBox(shape.bbox, level.transform);\n bounds = bounds ? expandBounds(bounds, shapeBounds) : shapeBounds;\n }\n\n if (!bounds) return null;\n return viewBoundsFromData(paddedFocusBounds(bounds, 0.1, 1));\n}\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\n/** Symmetric ease so a selection pan is visible the whole way, like v1's lerp. */\nexport function easeInOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nexport interface CameraPose {\n zoom: number;\n position: [number, number, number];\n target: [number, number, number];\n}\n\n/** Interpolate zoom + pan/orbit for a smooth +/− / Reset / selection focus. */\nexport function interpolateCameraPose(\n from: CameraPose,\n to: CameraPose,\n t: number,\n ease: (t: number) => number = easeOutCubic,\n): CameraPose {\n const e = ease(t);\n return {\n zoom: lerp(from.zoom, to.zoom, e),\n position: [\n lerp(from.position[0], to.position[0], e),\n lerp(from.position[1], to.position[1], e),\n lerp(from.position[2], to.position[2], e),\n ],\n target: [\n lerp(from.target[0], to.target[0], e),\n lerp(from.target[1], to.target[1], e),\n lerp(from.target[2], to.target[2], e),\n ],\n };\n}\n\nexport function cameraPosesNear(\n a: CameraPose,\n b: CameraPose,\n epsilon = 1e-3,\n): boolean {\n return (\n Math.abs(a.zoom - b.zoom) < epsilon &&\n Math.abs(a.position[0] - b.position[0]) < epsilon &&\n Math.abs(a.position[1] - b.position[1]) < epsilon &&\n Math.abs(a.position[2] - b.position[2]) < epsilon &&\n Math.abs(a.target[0] - b.target[0]) < epsilon &&\n Math.abs(a.target[1] - b.target[1]) < epsilon &&\n Math.abs(a.target[2] - b.target[2]) < epsilon\n );\n}\n\n/** Zoom `0` means “use the current fit zoom”. */\nexport function withFitZoom(\n pose: CameraPose | null | undefined,\n fitZoom: number,\n): CameraPose | null {\n if (!pose) return null;\n if (pose.zoom > 0) return pose;\n return { ...pose, zoom: fitZoom };\n}\n\n/**\n * RESET destination.\n * Staff capture (`fitToMap`) always returns the fitted full-map view so\n * authors can see every unit and start over. Portal / website / kiosk RESET\n * restores the configured slot pose, or that same fit when the slot is empty.\n */\nexport function resolveResetPose(\n fitToMap: boolean,\n home: CameraPose | null | undefined,\n fit: CameraPose,\n): CameraPose {\n if (fitToMap) return fit;\n return withFitZoom(home, fit.zoom) ?? fit;\n}\n\n/**\n * Chrome Reset clears the store highlight (`focusKey` → null) in the same\n * tick as the ease-home. Restoring the last snap would cancel that ease\n * and leave the camera on the store (first click only un-highlights).\n */\nexport function skipPersistedViewRestore(input: {\n resetInFlight: boolean;\n focusKey: string | number | null;\n}): boolean {\n return input.resetInFlight && input.focusKey == null;\n}\n\nexport function nextOrthoZoom(\n current: number,\n direction: 1 | -1,\n step: number,\n min: number,\n max: number,\n): number {\n const factor = 1 + Math.min(Math.max(step, 0.15), 1) * 0.5;\n const next = direction > 0 ? current * factor : current / factor;\n return Math.min(max, Math.max(min, next));\n}\n\n/** three.js `MOUSE` / `TOUCH` enums — left-drag pans the 2D admin/public map. */\nconst MOUSE_ROTATE = 0;\nconst MOUSE_DOLLY = 1;\nconst MOUSE_PAN = 2;\nconst TOUCH_ROTATE = 0;\nconst TOUCH_PAN = 1;\nconst TOUCH_DOLLY_PAN = 2;\n\n/**\n * Wheel zoom keeps the pointer over the same map point (Google Maps-style).\n * Speed is three-stdlib `pow(0.95, zoomSpeed)` per event — same helper as\n * Edit Map / Wayfinding (`nextZoomFromWheel`).\n * +/− still zooms about the view centre because those buttons have no cursor.\n */\nexport const ORBIT_ZOOM_TO_CURSOR = true;\n\nexport function orbitMouseButtons(is3d: boolean): {\n LEFT: number;\n MIDDLE: number;\n RIGHT: number;\n} {\n if (is3d) {\n return { LEFT: MOUSE_ROTATE, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n }\n return { LEFT: MOUSE_PAN, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n}\n\nexport function orbitTouches(is3d: boolean): { ONE: number; TWO: number } {\n if (is3d) {\n return { ONE: TOUCH_ROTATE, TWO: TOUCH_DOLLY_PAN };\n }\n return { ONE: TOUCH_PAN, TWO: TOUCH_DOLLY_PAN };\n}\n","import React, { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type { OrbitControls } from 'three-stdlib';\nimport * as THREE from 'three';\nimport type { SceneBounds, ThemeDefaults } from '../../core';\nimport {\n boundsExtent,\n cameraPosesNear,\n clampFocusZoom,\n easeOutCubic,\n fitOrthoZoom,\n focusMaxZoomMultiple,\n VIEWER_MAX_ZOOM_MULTIPLE,\n interpolateCameraPose,\n lerp,\n nextOrthoZoom,\n resolveResetPose,\n skipPersistedViewRestore,\n VIEWER_FOCUS_ANIM_MS,\n VIEWER_ZOOM_ANIM_MS,\n type CameraPose,\n} from '../camera';\n\nexport interface MapCameraHandle {\n zoomIn: () => void;\n zoomOut: () => void;\n reset: () => void;\n /** View-space bounds (already Y-flipped). Animates pan + zoom onto the shape. */\n focusBounds: (focus: SceneBounds) => void;\n getView: () => CameraViewSnapshot;\n applyView: (snap: CameraViewSnapshot) => void;\n}\n\n/** Survives Canvas / camera remounts so Settings color tweaks keep the view. */\nexport interface CameraViewSnapshot {\n is3d: boolean;\n boundsKey: string;\n zoom: number;\n position: [number, number, number];\n target: [number, number, number];\n userAdjusted: boolean;\n focusKey?: string | number | null;\n}\n\nexport function cameraBoundsKey(bounds: SceneBounds, is3d: boolean): string {\n return [\n bounds.cx,\n bounds.cy,\n bounds.minX,\n bounds.minY,\n bounds.maxX,\n bounds.maxY,\n bounds.size,\n is3d ? '3d' : '2d',\n ].join('|');\n}\n\nexport interface CameraRigProps {\n /** View-space bounds — already Y-flipped by the scene, so up is +Y. */\n bounds: SceneBounds;\n theme: ThemeDefaults;\n is3d: boolean;\n controlsRef: React.RefObject<OrbitControls | null>;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n persistedViewRef: React.MutableRefObject<CameraViewSnapshot | null>;\n /** Selection key; when it changes the camera eases onto `focusViewBounds`. */\n focusKey?: string | number | null;\n focusViewBounds?: SceneBounds | null;\n /** Saved floor+device pose. Zoom `0` means use the current fit zoom. */\n homePose?: CameraPose | null;\n /** Changes when the staff/runtime slot changes (level + device). */\n homePoseKey?: string | null;\n /** Staff capture: RESET fits the full map. Hosts restore `homePose`. */\n resetFitsMap?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}\n\nexport function CameraRig({\n bounds,\n theme,\n is3d,\n controlsRef,\n cameraRef,\n persistedViewRef,\n focusKey = null,\n focusViewBounds = null,\n homePose = null,\n homePoseKey = null,\n resetFitsMap = false,\n onCameraChange,\n onCameraReset,\n}: CameraRigProps) {\n const { camera, size, invalidate } = useThree();\n const userAdjusted = useRef(false);\n const applyingView = useRef(false);\n const zoomAnimRef = useRef<number | null>(null);\n const appliedFocusKey = useRef<string | number | null>(null);\n const focusKeyRef = useRef(focusKey);\n focusKeyRef.current = focusKey;\n const focusViewBoundsRef = useRef(focusViewBounds);\n focusViewBoundsRef.current = focusViewBounds;\n const homePoseRef = useRef(homePose);\n homePoseRef.current = homePose;\n const homePoseKeyRef = useRef(homePoseKey);\n homePoseKeyRef.current = homePoseKey;\n const resetFitsMapRef = useRef(resetFitsMap);\n resetFitsMapRef.current = resetFitsMap;\n const onCameraChangeRef = useRef(onCameraChange);\n onCameraChangeRef.current = onCameraChange;\n const onCameraResetRef = useRef(onCameraReset);\n onCameraResetRef.current = onCameraReset;\n const appliedHomeKey = useRef<string | null>(null);\n const ignoreUserChangeUntil = useRef(0);\n /** Chrome Reset also clears the store highlight; skip the following layout restore. */\n const resetInFlight = useRef(false);\n const focusAnimRef = useRef<{\n from: CameraPose;\n dest: CameraPose;\n started: number;\n lookAt: boolean;\n } | null>(null);\n const boundsKey = cameraBoundsKey(bounds, is3d);\n\n const cancelZoomAnim = useCallback(() => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n }, []);\n\n const captureView = useCallback(\n (adjusted = userAdjusted.current): CameraViewSnapshot => {\n const controls = controlsRef.current;\n return {\n is3d,\n boundsKey,\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [camera.position.x, camera.position.y, camera.position.z],\n target: controls\n ? [controls.target.x, controls.target.y, controls.target.z]\n : [bounds.cx, bounds.cy, 0],\n userAdjusted: adjusted,\n focusKey: focusKeyRef.current,\n };\n },\n [bounds.cx, bounds.cy, boundsKey, camera, controlsRef, is3d],\n );\n\n const restoreView = useCallback(\n (snap: CameraViewSnapshot) => {\n applyingView.current = true;\n cancelZoomAnim();\n camera.up.set(0, 1, 0);\n camera.position.set(snap.position[0], snap.position[1], snap.position[2]);\n if (camera instanceof THREE.OrthographicCamera) {\n camera.zoom = snap.zoom;\n camera.updateProjectionMatrix();\n } else {\n camera.lookAt(snap.target[0], snap.target[1], snap.target[2]);\n }\n const controls = controlsRef.current;\n if (controls) {\n controls.target.set(snap.target[0], snap.target[1], snap.target[2]);\n controls.update();\n }\n persistedViewRef.current = { ...snap, boundsKey, is3d };\n userAdjusted.current = snap.userAdjusted;\n invalidate();\n applyingView.current = false;\n },\n [boundsKey, camera, cancelZoomAnim, controlsRef, invalidate, is3d, persistedViewRef],\n );\n\n const animateOrthoZoom = useCallback(\n (targetZoom: number) => {\n if (!(camera instanceof THREE.OrthographicCamera)) return;\n cancelZoomAnim();\n const startZoom = camera.zoom;\n if (startZoom === targetZoom) return;\n const started = performance.now();\n const step = (now: number) => {\n if (!(camera instanceof THREE.OrthographicCamera)) return;\n const t = Math.min(1, (now - started) / VIEWER_ZOOM_ANIM_MS);\n camera.zoom = lerp(startZoom, targetZoom, easeOutCubic(t));\n camera.updateProjectionMatrix();\n persistedViewRef.current = captureView();\n invalidate();\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n onCameraChangeRef.current?.(captureView(true));\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n },\n [camera, cancelZoomAnim, captureView, invalidate, persistedViewRef],\n );\n\n const currentPose = useCallback((): CameraPose => {\n const controls = controlsRef.current;\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [camera.position.x, camera.position.y, camera.position.z],\n target: controls\n ? [controls.target.x, controls.target.y, controls.target.z]\n : [bounds.cx, bounds.cy, 0],\n };\n }, [bounds.cx, bounds.cy, camera, controlsRef]);\n\n const fitPose = useCallback((): CameraPose => {\n const { width, height } = boundsExtent(bounds);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n return {\n zoom: fitOrthoZoom(size.width, size.height, width, height),\n position: [bounds.cx, bounds.cy, 500],\n target: [bounds.cx, bounds.cy, 0],\n };\n }\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [bounds.cx, bounds.cy - bounds.size * 0.35, bounds.size * 0.85],\n target: [bounds.cx, bounds.cy, 0],\n };\n }, [bounds, camera, is3d, size.height, size.width]);\n\n const applyPose = useCallback(\n (pose: CameraPose, lookAt: boolean) => {\n applyingView.current = true;\n camera.up.set(0, 1, 0);\n camera.position.set(pose.position[0], pose.position[1], pose.position[2]);\n if (camera instanceof THREE.OrthographicCamera) {\n camera.zoom = pose.zoom;\n camera.updateProjectionMatrix();\n }\n if (lookAt) {\n camera.lookAt(pose.target[0], pose.target[1], pose.target[2]);\n }\n const controls = controlsRef.current;\n if (controls) {\n controls.target.set(pose.target[0], pose.target[1], pose.target[2]);\n controls.update();\n }\n invalidate();\n applyingView.current = false;\n },\n [camera, controlsRef, invalidate],\n );\n\n const poseForFocusBounds = useCallback(\n (focus: SceneBounds): CameraPose => {\n const { width, height } = boundsExtent(focus);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const mapExtent = boundsExtent(bounds);\n const mapFit = fitOrthoZoom(\n size.width,\n size.height,\n mapExtent.width,\n mapExtent.height,\n );\n return {\n zoom: clampFocusZoom(\n fitOrthoZoom(size.width, size.height, width, height),\n mapFit,\n focusMaxZoomMultiple(width, height),\n ),\n position: [focus.cx, focus.cy, 500],\n target: [focus.cx, focus.cy, 0],\n };\n }\n const sizeHint = Math.max(focus.size, 1);\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [focus.cx, focus.cy - sizeHint * 0.35, sizeHint * 0.85],\n target: [focus.cx, focus.cy, 0],\n };\n },\n [bounds, camera, is3d, size.height, size.width],\n );\n\n const resolvedHomePose = useCallback((): CameraPose | null => {\n const saved = homePoseRef.current;\n if (!saved) return null;\n if (saved.zoom > 0) return saved;\n return { ...saved, zoom: fitPose().zoom };\n }, [fitPose]);\n\n const resetDestination = useCallback((): CameraPose => {\n const fit = fitPose();\n return resolveResetPose(resetFitsMapRef.current, homePoseRef.current, fit);\n }, [fitPose]);\n\n const applyHomeOrFit = useCallback(() => {\n cancelZoomAnim();\n focusAnimRef.current = null;\n const dest = resolvedHomePose() ?? fitPose();\n applyPose(dest, is3d);\n persistedViewRef.current = captureView(false);\n userAdjusted.current = false;\n ignoreUserChangeUntil.current = performance.now() + 160;\n }, [\n applyPose,\n cancelZoomAnim,\n captureView,\n fitPose,\n is3d,\n persistedViewRef,\n resolvedHomePose,\n ]);\n\n const applyFit = useCallback(() => {\n applyHomeOrFit();\n }, [applyHomeOrFit]);\n\n const animateFocus = useCallback(\n (focus: SceneBounds) => {\n const dest = poseForFocusBounds(focus);\n const from = currentPose();\n userAdjusted.current = true;\n appliedFocusKey.current = focusKeyRef.current;\n cancelZoomAnim();\n if (cameraPosesNear(from, dest)) {\n focusAnimRef.current = null;\n persistedViewRef.current = captureView(true);\n return;\n }\n // Drive the pan in useFrame so a later layout effect cannot snap to dest.\n focusAnimRef.current = {\n from,\n dest,\n started: performance.now(),\n lookAt: is3d,\n };\n applyingView.current = true;\n invalidate();\n },\n [\n cancelZoomAnim,\n captureView,\n currentPose,\n invalidate,\n is3d,\n persistedViewRef,\n poseForFocusBounds,\n ],\n );\n\n const animateReset = useCallback(() => {\n const dest = resetDestination();\n const from = currentPose();\n focusAnimRef.current = null;\n if (cameraPosesNear(from, dest)) {\n userAdjusted.current = false;\n persistedViewRef.current = captureView(false);\n resetInFlight.current = false;\n return;\n }\n cancelZoomAnim();\n const started = performance.now();\n const lookAt = is3d;\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / VIEWER_ZOOM_ANIM_MS);\n applyPose(interpolateCameraPose(from, dest, t), lookAt);\n persistedViewRef.current = captureView(false);\n if (t < 1) {\n applyingView.current = true;\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n userAdjusted.current = false;\n applyingView.current = false;\n resetInFlight.current = false;\n };\n applyingView.current = true;\n ignoreUserChangeUntil.current = performance.now() + 400;\n zoomAnimRef.current = requestAnimationFrame(step);\n }, [\n applyPose,\n cancelZoomAnim,\n captureView,\n currentPose,\n is3d,\n persistedViewRef,\n resetDestination,\n ]);\n const applyFitRef = useRef(applyFit);\n applyFitRef.current = applyFit;\n const restoreViewRef = useRef(restoreView);\n restoreViewRef.current = restoreView;\n const animateFocusRef = useRef(animateFocus);\n animateFocusRef.current = animateFocus;\n\n const zoomBy = useCallback(\n (direction: 1 | -1) => {\n userAdjusted.current = true;\n focusAnimRef.current = null;\n const controls = controlsRef.current;\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const { width, height } = boundsExtent(bounds);\n const fit = fitOrthoZoom(size.width, size.height, width, height);\n animateOrthoZoom(\n nextOrthoZoom(\n camera.zoom,\n direction,\n theme.ZOOM_STEP,\n fit * 0.2,\n fit * VIEWER_MAX_ZOOM_MULTIPLE,\n ),\n );\n } else if (controls) {\n const offset = camera.position.clone().sub(controls.target);\n const factor = 1 + Math.min(Math.max(theme.ZOOM_STEP, 0.15), 1) * 0.5;\n const next = direction > 0 ? offset.length() / factor : offset.length() * factor;\n offset.setLength(\n Math.min(theme.CAMERA_MAX_DISTANCE, Math.max(theme.CAMERA_MIN_DISTANCE, next)),\n );\n camera.position.copy(controls.target).add(offset);\n persistedViewRef.current = captureView();\n onCameraChangeRef.current?.(captureView(true));\n }\n controls?.update();\n invalidate();\n },\n [\n animateOrthoZoom,\n bounds,\n camera,\n captureView,\n controlsRef,\n invalidate,\n is3d,\n persistedViewRef,\n size.height,\n size.width,\n theme,\n ],\n );\n\n useEffect(() => () => cancelZoomAnim(), [cancelZoomAnim]);\n\n useEffect(() => {\n const controls = controlsRef.current;\n if (!controls) return;\n const onChange = () => {\n if (applyingView.current) return;\n if (performance.now() < ignoreUserChangeUntil.current) return;\n userAdjusted.current = true;\n persistedViewRef.current = captureView(true);\n onCameraChangeRef.current?.(persistedViewRef.current);\n };\n const onStart = () => {\n if (applyingView.current) return;\n if (performance.now() < ignoreUserChangeUntil.current) return;\n // Pointer drag — not OrbitControls.update() during a programmed ease.\n userAdjusted.current = true;\n focusAnimRef.current = null;\n persistedViewRef.current = captureView(true);\n onCameraChangeRef.current?.(persistedViewRef.current);\n };\n controls.addEventListener('change', onChange);\n controls.addEventListener('start', onStart);\n return () => {\n controls.removeEventListener('change', onChange);\n controls.removeEventListener('start', onStart);\n };\n }, [camera, captureView, controlsRef, persistedViewRef]);\n\n useImperativeHandle(\n cameraRef,\n () => ({\n zoomIn: () => {\n zoomBy(1);\n },\n zoomOut: () => {\n zoomBy(-1);\n },\n reset: () => {\n userAdjusted.current = false;\n focusAnimRef.current = null;\n appliedFocusKey.current = null;\n focusKeyRef.current = null;\n resetInFlight.current = true;\n onCameraResetRef.current?.();\n animateReset();\n },\n focusBounds: (focus) => {\n animateFocus(focus);\n },\n getView: () => captureView(),\n applyView: (snap) => restoreView(snap),\n }),\n [animateFocus, animateReset, captureView, restoreView, zoomBy],\n );\n\n useLayoutEffect(() => {\n if (size.width < 2 || size.height < 2) return;\n if (focusKey == null) {\n appliedFocusKey.current = null;\n focusAnimRef.current = null;\n }\n if (skipPersistedViewRestore({ resetInFlight: resetInFlight.current, focusKey })) {\n return;\n }\n if (resetInFlight.current) resetInFlight.current = false;\n const snap = persistedViewRef.current;\n const focus = focusViewBoundsRef.current;\n const isNewFocus =\n focusKey != null && focus != null && appliedFocusKey.current !== focusKey;\n const snapMatchesFocus =\n snap != null &&\n snap.is3d === is3d &&\n snap.boundsKey === boundsKey &&\n snap.focusKey === focusKey;\n\n if (focusKey != null && focus != null) {\n if (snapMatchesFocus) {\n appliedFocusKey.current = focusKey;\n if (focusAnimRef.current == null) restoreViewRef.current(snap);\n return;\n }\n if (isNewFocus) {\n // Only the first map paint snaps — otherwise the unfitted camera flashes.\n // Every later selection eases from the current view, like v1.\n if (persistedViewRef.current == null) {\n appliedFocusKey.current = focusKey;\n userAdjusted.current = true;\n cancelZoomAnim();\n applyPose(poseForFocusBounds(focus), is3d);\n persistedViewRef.current = captureView(true);\n return;\n }\n if (snap && !snapMatchesFocus) restoreViewRef.current(snap);\n animateFocusRef.current(focus);\n return;\n }\n // Same selection after a remount / theme swap — keep the current view.\n // Do not snap: that cancelled the ease when this effect re-ran.\n return;\n }\n\n if (homePoseKey && appliedHomeKey.current !== homePoseKey) {\n appliedHomeKey.current = homePoseKey;\n userAdjusted.current = false;\n applyFitRef.current();\n return;\n }\n\n // Theme rebuilds can swap the drei camera or remount this rig. Keep the\n // last view when the map extents and 2D/3D mode have not changed.\n if (snap && snap.is3d === is3d && snap.boundsKey === boundsKey) {\n restoreViewRef.current(snap);\n return;\n }\n userAdjusted.current = false;\n applyFitRef.current();\n }, [\n applyPose,\n boundsKey,\n camera,\n cancelZoomAnim,\n captureView,\n focusKey,\n homePoseKey,\n is3d,\n persistedViewRef,\n poseForFocusBounds,\n ]);\n\n useEffect(() => {\n if (size.width < 2 || size.height < 2 || userAdjusted.current) return;\n applyFitRef.current();\n }, [size.height, size.width]);\n\n useFrame(() => {\n const anim = focusAnimRef.current;\n if (!anim) return;\n const t = Math.min(1, (performance.now() - anim.started) / VIEWER_FOCUS_ANIM_MS);\n applyPose(\n interpolateCameraPose(anim.from, anim.dest, t, easeOutCubic),\n anim.lookAt,\n );\n persistedViewRef.current = captureView(true);\n if (t < 1) {\n invalidate();\n return;\n }\n focusAnimRef.current = null;\n });\n\n return null;\n}\n","/**\n * OrbitControls uses one `enableZoom` flag for wheel and touch pinch.\n * Website maps must swallow wheel only — pinch stays on the controls.\n *\n * R3F sets `events.connected` to `false` until the canvas host is wired,\n * so callers must not treat a falsy connected value as a DOM node.\n */\n\nfunction isEventRoot(value: unknown): value is EventTarget {\n return typeof value === 'object' && value !== null;\n}\n\nexport function orbitEventRoot(\n eventSource: EventTarget | null | undefined,\n connected: unknown,\n canvas: EventTarget | null | undefined,\n): EventTarget | null {\n if (isEventRoot(eventSource)) return eventSource;\n if (isEventRoot(connected)) return connected;\n if (isEventRoot(canvas)) return canvas;\n return null;\n}\n\nexport function viewerWheelEventHitsMap(\n root: EventTarget | null | undefined,\n target: EventTarget | null,\n): boolean {\n if (!isEventRoot(root) || target == null) return false;\n const contains = (root as { contains?: (node: EventTarget) => boolean }).contains;\n return typeof contains === 'function' && contains.call(root, target);\n}\n\n/** Stop OrbitControls without preventDefault so the page can still scroll. */\nexport function suppressViewerWheelZoom(event: Event): void {\n event.stopImmediatePropagation();\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { Canvas, useThree } from '@react-three/fiber';\nimport { OrthographicCamera, OrbitControls } from '@react-three/drei';\nimport type { OrbitControls as OrbitControlsImpl } from 'three-stdlib';\nimport type {\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n SceneBounds,\n ThemeDefaults,\n ViewerHoverTooltipHandler,\n} from '../../core';\nimport type { ResponsiveCameraPose } from '../../core';\nimport {\n boundsFromStackedLevels,\n isOutdoorLevel,\n isTransparentColor,\n outdoorSvgSuppressIds,\n viewerAllowsWheelZoom,\n viewerLevelStack,\n} from '../../core';\nimport { LevelMeshes } from './LevelMeshes';\nimport { RouteLine } from './RouteLine';\nimport { SvgVectorLayer } from './SvgVectorLayer';\nimport { CameraRig, type CameraViewSnapshot, type MapCameraHandle } from './CameraRig';\nimport {\n ORBIT_ZOOM_TO_CURSOR,\n SCENE_FLIP_SCALE,\n orbitMouseButtons,\n orbitTouches,\n viewBoundsFromData,\n type CameraPose,\n} from '../camera';\nimport {\n beginViewerPointerGesture,\n createViewerPointerGesture,\n endViewerPointerGesture,\n moveViewerPointerGesture,\n pointerMissClearsSelection,\n viewerPointerClientXY,\n} from '../pointer';\nimport {\n orbitEventRoot,\n suppressViewerWheelZoom,\n viewerWheelEventHitsMap,\n} from '../orbitWheelZoom';\n\nconst OUTDOOR_Z = -1;\nconst CAMERA_UP: [number, number, number] = [0, 1, 0];\nconst CANVAS_DPR: [number, number] = [1, 2];\nconst CANVAS_GL = { antialias: true };\n\n/**\n * OrbitControls uses one `enableZoom` flag for both wheel and touch pinch.\n * Swallow wheel on the document (capture) so the page can scroll and pinch\n * stays available. Listen on `document` because R3F's `events.connected` is\n * `false` until the canvas host is wired — attaching to that value is a no-op.\n */\nfunction OrbitWheelZoomGuard({\n blockWheel,\n eventSource,\n}: {\n blockWheel: boolean;\n eventSource?: React.RefObject<HTMLElement | null>;\n}) {\n const gl = useThree((state) => state.gl);\n const connected = useThree((state) => state.events.connected);\n\n useEffect(() => {\n if (!blockWheel) return;\n\n const onWheel = (event: WheelEvent) => {\n const root = orbitEventRoot(\n eventSource?.current,\n connected,\n gl.domElement,\n );\n if (!viewerWheelEventHitsMap(root, event.target)) return;\n suppressViewerWheelZoom(event);\n };\n\n document.addEventListener('wheel', onWheel, { capture: true });\n return () => document.removeEventListener('wheel', onWheel, { capture: true });\n }, [blockWheel, connected, eventSource, gl.domElement]);\n\n return null;\n}\n\nexport interface MapSceneProps {\n doc: PublishedDocument;\n theme: ThemeDefaults;\n activeLevelId: number | null;\n route: PathResult | null;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusKey?: string | number | null;\n focusViewBounds?: SceneBounds | null;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n onSelectShape?: (\n shapeId: number | null,\n levelId: number,\n opts?: { additive?: boolean },\n ) => void;\n onActiveLevelChange?: (levelId: number) => void;\n imageProxyUrl?: string | null;\n /** Keep pointer events inside the map canvas host so header/footer stay clickable. */\n eventSource?: React.RefObject<HTMLElement | null>;\n /** WEBSITE / DISPLAY_APP hide unassigned amenity, kiosk, elevator, and escalator shapes. */\n host?: MapViewerHost;\n /** Assigned kiosk shape currently running this DISPLAY_APP viewer. */\n kioskOriginShapeId?: number | null;\n retailers?: PublishedRetailer[];\n showHoverTooltip?: boolean;\n onHoverTooltip?: ViewerHoverTooltipHandler;\n homePose?: ResponsiveCameraPose | CameraPose | null;\n homePoseKey?: string | null;\n resetFitsMap?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n /** Override website wheel-block (staff Map Responsiveness capture). */\n allowWheelZoom?: boolean;\n}\n\nexport function MapScene({\n doc,\n theme,\n activeLevelId,\n route,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId = null,\n focusKey,\n focusViewBounds,\n cameraRef,\n onSelectShape,\n onActiveLevelChange,\n imageProxyUrl,\n eventSource,\n host = 'PORTAL_ASSIGN',\n homePose = null,\n homePoseKey = null,\n resetFitsMap = false,\n onCameraChange,\n onCameraReset,\n allowWheelZoom,\n kioskOriginShapeId = null,\n retailers = [],\n showHoverTooltip = false,\n onHoverTooltip,\n}: MapSceneProps) {\n const is3d = theme.MAP_STYLE === '3D';\n const controlsRef = useRef<OrbitControlsImpl | null>(null);\n const persistedViewRef = useRef<CameraViewSnapshot | null>(null);\n const pointerDownRef = useRef<{ x: number; y: number } | null>(null);\n const pointerGestureRef = useRef(createViewerPointerGesture());\n\n useEffect(() => {\n const root = eventSource?.current;\n if (!root) return;\n\n const gesture = pointerGestureRef.current;\n\n const onDown = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n pointerDownRef.current = { x: pos.x, y: pos.y };\n beginViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n const onMove = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n moveViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n const onUp = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n endViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n root.addEventListener('pointerdown', onDown, true);\n window.addEventListener('pointermove', onMove, { passive: true });\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n root.removeEventListener('pointerdown', onDown, true);\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [eventSource]);\n\n const stacked = useMemo(\n () => viewerLevelStack(doc.levels, activeLevelId),\n [doc.levels, activeLevelId],\n );\n\n const bounds = useMemo(\n () => boundsFromStackedLevels(doc.levels, activeLevelId, doc.baseViewbox),\n [doc.levels, doc.baseViewbox, activeLevelId],\n );\n\n const view = useMemo(\n () => viewBoundsFromData(bounds),\n [\n bounds.cx,\n bounds.cy,\n bounds.maxX,\n bounds.maxY,\n bounds.minX,\n bounds.minY,\n bounds.size,\n ],\n );\n const cameraPosition = useMemo(\n () => [view.cx, view.cy, 500] as [number, number, number],\n [view.cx, view.cy],\n );\n const camera3dPosition = useMemo(\n () =>\n [view.cx, view.cy - view.size * 0.35, view.size * 0.85] as [\n number,\n number,\n number,\n ],\n [view.cx, view.cy, view.size],\n );\n const mouseButtons = useMemo(() => orbitMouseButtons(is3d), [is3d]);\n const touches = useMemo(() => orbitTouches(is3d), [is3d]);\n\n const outdoorLevel = useMemo(\n () => doc.levels.find((level) => isOutdoorLevel(level)) ?? null,\n [doc.levels],\n );\n\n const outdoorSvgUrl =\n outdoorLevel?.sourceSvgUrl ?? doc.baseSvgUrl ?? null;\n\n const suppressIds = useMemo(\n () => outdoorSvgSuppressIds(doc.levels),\n [doc.levels],\n );\n\n const showOutdoorSvg = stacked.some((level) => isOutdoorLevel(level));\n\n const outdoorTheme = useMemo(\n () => ({\n GREEN_AREA_COLOR: theme.GREEN_AREA_COLOR,\n WATER_COLOR: theme.WATER_COLOR,\n PARKING_LANE_COLOR: theme.PARKING_LANE_COLOR,\n PARKING_ICON_COLOR: theme.PARKING_ICON_COLOR,\n WALKABLE_COLOR: theme.WALKABLE_COLOR,\n }),\n [\n theme.GREEN_AREA_COLOR,\n theme.PARKING_ICON_COLOR,\n theme.PARKING_LANE_COLOR,\n theme.WALKABLE_COLOR,\n theme.WATER_COLOR,\n ],\n );\n\n return (\n <Canvas\n style={{\n width: '100%',\n height: '100%',\n background: isTransparentColor(theme.MAP_BACKGROUND_COLOR)\n ? 'transparent'\n : theme.MAP_BACKGROUND_COLOR,\n }}\n eventSource={eventSource as React.RefObject<HTMLElement> | undefined}\n eventPrefix=\"offset\"\n orthographic={!is3d}\n frameloop=\"demand\"\n dpr={CANVAS_DPR}\n flat\n gl={CANVAS_GL}\n onPointerDown={(e) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n pointerDownRef.current = { x: pos.x, y: pos.y };\n beginViewerPointerGesture(pointerGestureRef.current, pos.x, pos.y, pos.pointerId);\n }}\n onPointerMissed={(e) => {\n if (\n pointerMissClearsSelection(pointerDownRef.current, {\n x: e.clientX,\n y: e.clientY,\n button: e.button,\n })\n ) {\n onSelectShape?.(null, activeLevelId ?? 0);\n }\n }}\n camera={\n is3d\n ? {\n position: camera3dPosition,\n fov: 50,\n near: 1,\n far: 10000,\n up: CAMERA_UP,\n }\n : undefined\n }\n >\n {!is3d && (\n <OrthographicCamera\n makeDefault\n position={cameraPosition}\n up={CAMERA_UP}\n near={0.1}\n far={5000}\n />\n )}\n {isTransparentColor(theme.MAP_BACKGROUND_COLOR) ? null : (\n <color attach=\"background\" args={[theme.MAP_BACKGROUND_COLOR]} />\n )}\n <ambientLight intensity={4} color=\"#c4c4c4\" />\n <directionalLight position={[0, 400, 0]} color=\"#ffffff\" intensity={0.3} />\n <directionalLight position={[0, 0, 400]} color=\"#c4c4c4\" intensity={0.2} />\n <directionalLight position={[0, 0, -400]} color=\"#c4c4c4\" intensity={0.2} />\n\n <group scale={SCENE_FLIP_SCALE}>\n {showOutdoorSvg && outdoorSvgUrl ? (\n <SvgVectorLayer\n url={outdoorSvgUrl}\n suppressIds={suppressIds}\n imageProxyUrl={imageProxyUrl}\n is3d={is3d}\n theme={outdoorTheme}\n />\n ) : null}\n\n {stacked.map((level) => {\n const outdoor = isOutdoorLevel(level);\n const transform = level.transform;\n return (\n <group\n key={level.id}\n position={[\n transform.translateX,\n transform.translateY,\n outdoor ? OUTDOOR_Z : 0,\n ]}\n rotation={[0, 0, (transform.rotate * Math.PI) / 180]}\n scale={transform.scale || 1}\n >\n <LevelMeshes\n level={level}\n levels={doc.levels}\n theme={theme}\n is3d={is3d}\n eventSource={eventSource}\n pointerGestureRef={pointerGestureRef}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n interactiveOnly={outdoor && Boolean(outdoorSvgUrl)}\n imageProxyUrl={imageProxyUrl}\n amenities={doc.amenities}\n retailers={retailers}\n host={host}\n kioskOriginShapeId={kioskOriginShapeId}\n showHoverTooltip={showHoverTooltip}\n onHoverTooltip={onHoverTooltip}\n onSelectShape={(shapeId, opts) =>\n onSelectShape?.(shapeId, level.id, opts)\n }\n />\n {route && level.id === activeLevelId ? (\n <RouteLine\n route={route}\n levelId={level.id}\n levels={doc.levels}\n connectors={doc.connectors}\n color={theme.ROUTE_COLOR}\n thickness={theme.ROUTE_THICKNESS}\n onActiveLevelChange={onActiveLevelChange}\n />\n ) : null}\n </group>\n );\n })}\n </group>\n\n <OrbitWheelZoomGuard\n eventSource={eventSource}\n blockWheel={!(allowWheelZoom ?? viewerAllowsWheelZoom(host))}\n />\n <OrbitControls\n ref={controlsRef}\n makeDefault\n enableDamping={false}\n enableRotate={is3d}\n enablePan\n enableZoom\n screenSpacePanning\n zoomSpeed={1}\n zoomToCursor={ORBIT_ZOOM_TO_CURSOR}\n mouseButtons={mouseButtons}\n touches={touches}\n maxDistance={theme.CAMERA_MAX_DISTANCE}\n minDistance={theme.CAMERA_MIN_DISTANCE}\n />\n <CameraRig\n bounds={view}\n theme={theme}\n is3d={is3d}\n controlsRef={controlsRef}\n cameraRef={cameraRef}\n persistedViewRef={persistedViewRef}\n focusKey={focusKey ?? selectedShapeId ?? null}\n focusViewBounds={focusViewBounds ?? null}\n homePose={homePose}\n homePoseKey={homePoseKey}\n resetFitsMap={resetFitsMap}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n />\n </Canvas>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport {\n STATIC_ICON_COLORS,\n type CmAmenityCatalogItem,\n type PathResult,\n type PublishedDocument,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { getAmenityByType, recolorMapSvg } from '../../specialIcons';\n\nexport interface RuntimeChromeProps {\n doc: PublishedDocument;\n amenities: CmAmenityCatalogItem[];\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n fromAnchorId: number | null;\n toAnchorId: number | null;\n onFromChange: (id: number | null) => void;\n onToChange: (id: number | null) => void;\n accessibleOnly: boolean;\n onAccessibleOnlyChange: (v: boolean) => void;\n route: PathResult | null;\n showSearch?: boolean;\n showAmenities?: boolean;\n amenityIconColor?: string;\n}\n\ninterface ListItem {\n id: string;\n label: string;\n group: string;\n anchorId: number | null;\n levelId: number;\n kind: 'store' | 'amenity';\n amenityId: number | null;\n}\n\nfunction itemLabel(\n shape: PublishedDocument['levels'][number]['shapes'][number],\n amenityName?: string,\n): string {\n return (\n shape.assignment?.customLabel ||\n amenityName ||\n shape.label.text ||\n shape.assignment?.unitNumber ||\n shape.key\n );\n}\n\nexport function RuntimeChrome({\n doc,\n amenities,\n fromAnchorId,\n toAnchorId,\n onFromChange,\n onToChange,\n accessibleOnly,\n onAccessibleOnlyChange,\n route,\n showSearch = true,\n showAmenities = true,\n amenityIconColor = STATIC_ICON_COLORS.amenity,\n}: RuntimeChromeProps) {\n const [query, setQuery] = useState('');\n const [selectedItem, setSelectedItem] = useState<ListItem | null>(null);\n\n const items = useMemo(() => {\n const list: ListItem[] = [];\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id) ?? null;\n if (shape.kind === 'unit') {\n list.push({\n id: `store-${shape.id}`,\n label: itemLabel(shape),\n group: level.name,\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'store',\n amenityId: null,\n });\n }\n if (shape.kind === 'amenity' && shape.assignment?.amenityId) {\n const amenity = amenities.find((a) => a.id === shape.assignment!.amenityId);\n list.push({\n id: `amenity-${shape.id}`,\n label: itemLabel(shape, amenity?.name),\n group: 'Amenities',\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'amenity',\n amenityId: amenity?.id ?? shape.assignment.amenityId,\n });\n }\n }\n }\n return list;\n }, [doc, amenities]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((i) => i.label.toLowerCase().includes(q));\n }, [items, query]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, ListItem[]>();\n for (const item of filtered) {\n const arr = map.get(item.group) ?? [];\n arr.push(item);\n map.set(item.group, arr);\n }\n return Array.from(map.entries());\n }, [filtered]);\n\n const anchorOptions = items.filter((i) => i.anchorId != null);\n const hasQuery = query.trim().length > 0;\n\n const selectItem = (item: ListItem) => {\n setSelectedItem(item);\n if (item.anchorId != null) {\n onToChange(item.anchorId);\n }\n };\n\n if (!showSearch && !(showAmenities && amenities.length > 0)) {\n return null;\n }\n\n return (\n <div className=\"eyeon-map-chrome\">\n <div className=\"eyeon-map-chrome__top\">\n {showSearch && (\n <input\n type=\"search\"\n className=\"eyeon-map-chrome__search-input\"\n placeholder=\"Search...\"\n aria-label=\"Search...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n\n {showAmenities && amenities.length > 0 && (\n <div className=\"eyeon-map-chrome__amenities\">\n {amenities.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className=\"eyeon-map-chrome__amenity\"\n aria-label={a.name}\n onClick={() => {\n const match = items.find(\n (i) =>\n i.kind === 'amenity' &&\n i.amenityId === a.id &&\n i.anchorId != null,\n );\n if (match) selectItem(match);\n }}\n >\n {(() => {\n const amenity = getAmenityByType(a.code);\n return amenity ? (\n <span\n className=\"eyeon-map-chrome__amenity-icon\"\n dangerouslySetInnerHTML={{\n __html: recolorMapSvg(amenity.svgCode, amenityIconColor),\n }}\n />\n ) : (\n <span className=\"eyeon-map-chrome__amenity-label\">\n {a.name.slice(0, 2)}\n </span>\n );\n })()}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {showSearch && hasQuery && (\n <div className=\"eyeon-map-chrome__panel\">\n <div className=\"eyeon-map-chrome__groups\">\n {grouped.length === 0 ? (\n <div className=\"eyeon-map-chrome__empty\">No matching stores</div>\n ) : (\n grouped.map(([group, groupItems]) => (\n <div key={group} className=\"eyeon-map-chrome__group\">\n <div className=\"eyeon-map-chrome__group-title\">{group}</div>\n {groupItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={\n selectedItem?.id === item.id\n ? 'eyeon-map-chrome__item is-selected'\n : 'eyeon-map-chrome__item'\n }\n onClick={() => selectItem(item)}\n >\n {item.label}\n </button>\n ))}\n </div>\n ))\n )}\n </div>\n\n {selectedItem && (\n <div className=\"eyeon-map-chrome__detail\">\n <div className=\"eyeon-map-chrome__detail-title\">{selectedItem.label}</div>\n <div className=\"eyeon-map-chrome__detail-meta\">{selectedItem.group}</div>\n </div>\n )}\n\n <div className=\"eyeon-map-chrome__route\">\n <label>\n From\n <ModernSelect\n ariaLabel=\"From\"\n value={fromAnchorId != null ? String(fromAnchorId) : ''}\n placeholder=\"Select start\"\n searchable\n options={anchorOptions.map((i) => ({\n value: String(i.anchorId),\n label: `${i.label} · ${i.group}`,\n }))}\n onChange={(next) => onFromChange(next ? Number(next) : null)}\n />\n </label>\n <label>\n To\n <ModernSelect\n ariaLabel=\"To\"\n value={toAnchorId != null ? String(toAnchorId) : ''}\n placeholder=\"Select destination\"\n searchable\n options={anchorOptions.map((i) => ({\n value: String(i.anchorId),\n label: `${i.label} · ${i.group}`,\n }))}\n onChange={(next) => onToChange(next ? Number(next) : null)}\n />\n </label>\n <label className=\"eyeon-map-chrome__accessible\">\n <input\n type=\"checkbox\"\n checked={accessibleOnly}\n onChange={(e) => onAccessibleOnlyChange(e.target.checked)}\n />\n Accessible route\n </label>\n {route && (\n <div className=\"eyeon-map-chrome__route-meta\">\n {route.levelChanges.length > 0\n ? `${route.levelChanges.length} level change(s)`\n : 'Same level'}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n formatRetailerPhone,\n resolveFetchUrl,\n websiteFromRetailerOptions,\n websiteInfoModalDirections,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport type {\n MapViewerHost,\n WebsiteDestination,\n WebsiteMappedRetailer,\n} from '../../core';\n\nexport function WebsiteInfoModal({\n destination,\n retailers,\n imageProxyUrl,\n host = 'WEBSITE',\n onClose,\n onMapIt,\n}: {\n destination: WebsiteDestination;\n retailers: WebsiteMappedRetailer[];\n imageProxyUrl?: string | null;\n host?: MapViewerHost;\n onClose: () => void;\n onMapIt: (fromRetailerId: number) => void;\n}) {\n const [fromRetailerId, setFromRetailerId] = useState('');\n const retailer =\n destination.kind === 'store' && destination.retailerId != null\n ? retailers.find((item) => item.id === destination.retailerId) ?? null\n : null;\n\n const options = useMemo(\n () => websiteFromRetailerOptions(retailers, destination.retailerId),\n [destination.retailerId, retailers],\n );\n\n useEffect(() => {\n setFromRetailerId('');\n }, [destination.shapeId]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n if (typeof document === 'undefined') return null;\n\n const logo = retailer?.logoUrl\n ? resolveFetchUrl(retailer.logoUrl, imageProxyUrl)\n : null;\n const showDetails = Boolean(\n retailer &&\n (logo ||\n retailer.name ||\n retailer.location ||\n retailer.phone ||\n retailer.description),\n );\n const directions = websiteInfoModalDirections(host, destination);\n const mapItDisabled = directions.mapItDisabled || !fromRetailerId;\n const showForm = directions.showFromRetailers || directions.showMapIt;\n\n return createPortal(\n <div\n className=\"eyeon-map-info-modal\"\n role=\"presentation\"\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n className=\"eyeon-map-info-modal__dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-info-modal-title\"\n >\n <button\n type=\"button\"\n className=\"eyeon-map-info-modal__close\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#000\" />\n <path\n d=\"M8 8l8 8M16 8l-8 8\"\n stroke=\"#fff\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <div className=\"eyeon-map-info-modal__body\">\n <div className=\"eyeon-map-info-modal__content\">\n {showDetails ? (\n <div className=\"eyeon-map-info-modal__retailer\">\n {logo ? (\n <div className=\"eyeon-map-info-modal__logo\">\n <img src={logo} alt={retailer?.name ?? ''} />\n </div>\n ) : null}\n <div className=\"eyeon-map-info-modal__copy\">\n <div id=\"eyeon-map-info-modal-title\">\n <b>Retailer:</b> {retailer?.name}\n </div>\n {retailer?.location ? (\n <div>\n <b>Location:</b> {retailer.location}\n </div>\n ) : null}\n {retailer?.phone ? (\n <div>\n <b>Phone:</b>{' '}\n <a href={`tel:${retailer.phone}`}>\n {formatRetailerPhone(retailer.phone)}\n </a>\n </div>\n ) : null}\n {retailer?.description ? (\n <div\n dangerouslySetInnerHTML={{ __html: retailer.description }}\n />\n ) : null}\n </div>\n </div>\n ) : (\n <div\n id=\"eyeon-map-info-modal-title\"\n className=\"eyeon-map-info-modal__amenity\"\n >\n {destination.name}\n </div>\n )}\n </div>\n {showForm ? (\n <form\n className=\"eyeon-map-info-modal__form\"\n onSubmit={(e) => {\n e.preventDefault();\n if (mapItDisabled) return;\n const id = Number(fromRetailerId);\n if (Number.isFinite(id) && id > 0) onMapIt(id);\n }}\n >\n {directions.showFromRetailers ? (\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={fromRetailerId}\n placeholder=\"Get direction from ...\"\n searchable\n options={options}\n onChange={setFromRetailerId}\n />\n ) : null}\n {directions.showMapIt ? (\n <span\n className=\"eyeon-map-info-modal__map-it-tooltip\"\n data-tooltip={directions.mapItTooltip ?? undefined}\n tabIndex={directions.mapItTooltip ? 0 : undefined}\n >\n <button\n type=\"submit\"\n className=\"eyeon-map-info-modal__map-it\"\n disabled={mapItDisabled}\n aria-describedby={\n directions.mapItTooltip\n ? 'eyeon-map-info-modal-map-it-tip'\n : undefined\n }\n >\n Map IT\n </button>\n {directions.mapItTooltip ? (\n <span\n id=\"eyeon-map-info-modal-map-it-tip\"\n className=\"eyeon-map-info-modal__sr-only\"\n >\n {directions.mapItTooltip}\n </span>\n ) : null}\n </span>\n ) : null}\n </form>\n ) : null}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","import React from 'react';\nimport type { ViewerHoverTooltip } from '../../core';\n\nexport function HoverTooltip({\n tooltip,\n}: {\n tooltip: ViewerHoverTooltip | null;\n}) {\n if (!tooltip) return null;\n return (\n <div\n className=\"eyeon-map-hover-tooltip\"\n role=\"tooltip\"\n style={{ left: tooltip.x, top: tooltip.y }}\n >\n <div className=\"eyeon-map-hover-tooltip__pop\">\n <span className=\"eyeon-map-hover-tooltip__label\">{tooltip.text}</span>\n <span className=\"eyeon-map-hover-tooltip__arrow\" aria-hidden=\"true\" />\n </div>\n </div>\n );\n}\n","import {\n normalizeRetailerCatalogItem,\n type PublishedRetailer,\n} from '../core';\n\nexport async function fetchWebsiteRetailers(\n webApiURI: string,\n centerId?: number,\n signal?: AbortSignal,\n): Promise<PublishedRetailer[]> {\n const base = webApiURI.replace(/\\/$/, '');\n const all: unknown[] = [];\n let page = 1;\n while (!signal?.aborted) {\n const params = new URLSearchParams({\n limit: '100',\n page: String(page),\n });\n if (centerId != null && centerId > 0) {\n params.set('center_id', String(centerId));\n }\n const res = await fetch(`${base}/v1/retailers?${params}`, {\n credentials: 'include',\n signal,\n });\n if (!res.ok) break;\n const json = (await res.json()) as { items?: unknown[]; count?: number };\n const items = Array.isArray(json.items)\n ? json.items\n : Array.isArray(json)\n ? json\n : [];\n all.push(...items);\n const count = typeof json.count === 'number' ? json.count : all.length;\n if (all.length >= count || items.length < 100) break;\n page += 1;\n }\n return all\n .map(normalizeRetailerCatalogItem)\n .filter((item): item is PublishedRetailer => item != null);\n}\n","import React, { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n DeviceType,\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n ThemeDefaults,\n ViewerHoverTooltip,\n} from '../core';\nimport {\n compileGraph,\n defaultViewerLevelId,\n deviceFromHost,\n findResponsiveOverride,\n findViewerKioskOrigin,\n MAP_NO_FLOORS_MESSAGE,\n mergeTheme,\n findNearestAmenityPath,\n findShortestPlacePath,\n matchingShapeAnchorIds,\n normalizePublishedDocument,\n shapeAnchorIds,\n overrideToCameraPose,\n responsiveViewKey,\n viewerAllowsWheelZoom,\n viewerCanShowScene,\n viewerChrome,\n viewerLevelIdAfterShapeSelect,\n viewerResetPatch,\n websiteClickOpensModal,\n websiteDestination,\n websiteMapItAnchors,\n websiteRetailersOnMap,\n type ViewerResetKind,\n} from '../core';\nimport { MapScene } from './components/MapScene';\nimport { isAssignAmenity } from '../specialIcons';\nimport type { CameraViewSnapshot, MapCameraHandle } from './components/CameraRig';\nimport { RuntimeChrome } from './ui/RuntimeChrome';\nimport { MapControls } from './ui/MapControls';\nimport { WebsiteInfoModal } from './ui/WebsiteInfoModal';\nimport { HoverTooltip } from './ui/HoverTooltip';\nimport { fetchWebsiteRetailers } from './fetchWebsiteRetailers';\nimport {\n selectionFocusKey,\n viewFocusBoundsForShape,\n viewFocusBoundsForShapes,\n viewFocusBoundsForRoute,\n} from './camera';\nimport {\n routeOriginLevelId,\n shouldPinViewToRouteOrigin,\n} from './routeFloorChanges';\nimport { ensureMapFont } from '../fonts/mapFontUrl';\nimport './viewer.css';\n\nexport interface MapViewerProps {\n /** Published (or draft) document. If omitted, fetched from webApiURI. */\n document?: PublishedDocument | null;\n webApiURI?: string;\n /** Prefer fetching /v1/map/document */\n centerId?: number;\n /** Public / preview / kiosk surface. Never includes Map options (editor rail). */\n host?: MapViewerHost;\n kioskId?: number | null;\n selectedRetailerId?: number | null;\n /**\n * Media proxy base for remote http(s) media (v1 `IMAGE_PROXY_URL` contract,\n * e.g. `/eyeon-portal/media?url=`). Needed wherever the outdoor SVG or\n * retailer logos are cross-origin. Inlined amenity / kiosk data URLs skip it.\n */\n imageProxyUrl?: string | null;\n themeOverrides?: Partial<ThemeDefaults>;\n onExtractedAmenities?: (codes: string[]) => void;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n /** Zoom to this shape (PORTAL default-map assign). */\n selectedShapeId?: number | null;\n /** Extra selected shapes when Shift-selecting in PORTAL assign. */\n selectedShapeIds?: number[];\n /** Highlight from the Map options list (same fill as pointer hover). */\n hoveredShapeId?: number | null;\n /**\n * Bump when staff pick a row in the rail so the camera re-frames even if\n * the same shape is already selected.\n */\n focusNonce?: number;\n /** Controlled floor when embedded (e.g. PORTAL default). */\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Click a store/amenity to route. Off when PORTAL is assigning. Default true. */\n routeOnSelect?: boolean;\n createRouteRef?: React.MutableRefObject<{\n createRouteToStore: (retailerId: number) => void;\n createRouteToAmenity: (amenityCode: string) => void;\n clearRoute: () => void;\n /** Kiosk idle reset: clear routing, restore its floor, and reset the camera. */\n resetMap: () => void;\n } | null>;\n className?: string;\n style?: React.CSSProperties;\n /** Force a responsiveness slot (staff editor). Otherwise derived from host + width. */\n device?: DeviceType;\n /** Staff capture: wheel zoom on, no store modal, camera-change events. */\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}\n\nasync function fetchDocument(\n webApiURI: string,\n centerId?: number,\n draft?: boolean,\n signal?: AbortSignal,\n): Promise<PublishedDocument> {\n const base = webApiURI.replace(/\\/$/, '');\n const params = new URLSearchParams();\n if (centerId != null && centerId > 0) params.set('center_id', String(centerId));\n if (draft) params.set('draft', '1');\n const qs = params.toString();\n const res = await fetch(`${base}/v1/map/document${qs ? `?${qs}` : ''}`, {\n credentials: 'include',\n signal,\n });\n if (!res.ok) {\n throw new Error(`Failed to load map document (${res.status})`);\n }\n return res.json();\n}\n\nexport function MapViewer(props: MapViewerProps) {\n ensureMapFont();\n const {\n document: documentProp,\n webApiURI,\n centerId,\n host = 'WEBSITE',\n kioskId = null,\n selectedRetailerId = null,\n themeOverrides,\n onExtractedAmenities,\n createRouteRef,\n className,\n style,\n activeLevelId: activeLevelIdProp,\n onActiveLevelChange,\n routeOnSelect = true,\n imageProxyUrl,\n selectedShapeId = null,\n selectedShapeIds,\n hoveredShapeId = null,\n focusNonce,\n device: deviceProp,\n captureCamera = false,\n onCameraChange,\n onCameraReset,\n } = props;\n\n const [rawDoc, setDoc] = useState<PublishedDocument | null>(documentProp ?? null);\n const doc = useMemo(\n () => (rawDoc ? normalizePublishedDocument(rawDoc) : null),\n [rawDoc],\n );\n const [error, setError] = useState<string | null>(null);\n const [route, setRoute] = useState<PathResult | null>(null);\n const [fromAnchorId, setFromAnchorId] = useState<number | null>(null);\n const [toAnchorId, setToAnchorId] = useState<number | null>(null);\n const [accessibleOnly, setAccessibleOnly] = useState(false);\n const [websiteShapeId, setWebsiteShapeId] = useState<number | null>(null);\n const [websiteModalOpen, setWebsiteModalOpen] = useState(false);\n const [hoverTooltip, setHoverTooltip] = useState<ViewerHoverTooltip | null>(\n null,\n );\n const [fetchedRetailers, setFetchedRetailers] = useState<\n PublishedRetailer[] | null\n >(null);\n const [internalLevelId, setInternalLevelId] = useState<number | null>(() => {\n if (!documentProp) return null;\n return defaultViewerLevelId(normalizePublishedDocument(documentProp).levels);\n });\n const cameraApi = useRef<MapCameraHandle | null>(null);\n const canvasHostRef = useRef<HTMLDivElement>(null);\n const routeEndpointsRef = useRef<{ from: number | null; to: number | null }>({\n from: null,\n to: null,\n });\n const [viewportWidth, setViewportWidth] = useState(1280);\n const activeLevelId = activeLevelIdProp ?? internalLevelId;\n const setActiveLevelId = (id: number | null) => {\n setInternalLevelId(id);\n if (id != null) onActiveLevelChange?.(id);\n };\n\n useEffect(() => {\n if (documentProp) {\n setDoc(documentProp);\n return;\n }\n if (!webApiURI) return;\n let cancelled = false;\n const controller = new AbortController();\n const draft = viewerChrome(host).fetchDraft;\n fetchDocument(webApiURI, centerId, draft, controller.signal)\n .then((d) => {\n if (!cancelled) setDoc(d);\n })\n .catch((e) => {\n if (\n !cancelled &&\n !(e instanceof DOMException && e.name === 'AbortError')\n ) {\n setError(e instanceof Error ? e.message : String(e));\n }\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [documentProp, webApiURI, centerId, host]);\n\n useEffect(() => {\n const el = canvasHostRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width && width > 0) setViewportWidth(width);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [doc, host]);\n\n useEffect(() => {\n const chrome = viewerChrome(host);\n if ((!chrome.storeModal && !chrome.hoverTooltip) || !webApiURI) return;\n let cancelled = false;\n const controller = new AbortController();\n fetchWebsiteRetailers(webApiURI, centerId, controller.signal)\n .then((items) => {\n if (!cancelled) setFetchedRetailers(items);\n })\n .catch(() => {\n if (!cancelled) setFetchedRetailers([]);\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [webApiURI, centerId, host]);\n\n useEffect(() => {\n if (!doc) return;\n const ids = new Set(doc.levels.map((level) => level.id));\n if (activeLevelId == null || !ids.has(activeLevelId)) {\n setActiveLevelId(defaultViewerLevelId(doc.levels));\n }\n const codes = new Set<string>();\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.kind === 'amenity' && shape.assignment?.amenityId != null) {\n const amenity = doc.amenities.find((a) => a.id === shape.assignment!.amenityId);\n if (amenity) codes.add(amenity.code);\n }\n }\n }\n onExtractedAmenities?.(Array.from(codes));\n }, [doc, activeLevelId, onExtractedAmenities]);\n\n // Map IT / ?r= — switch to the store's floor so the highlight is visible\n useEffect(() => {\n if (!doc || selectedRetailerId == null) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.retailerId === selectedRetailerId) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, level.id),\n );\n return;\n }\n }\n }\n }, [doc, selectedRetailerId]);\n\n const focusShapeIds = useMemo(() => {\n if (websiteShapeId != null) return [websiteShapeId];\n if (selectedShapeIds && selectedShapeIds.length > 0) return selectedShapeIds;\n return selectedShapeId != null ? [selectedShapeId] : [];\n }, [selectedShapeId, selectedShapeIds, websiteShapeId]);\n const selectionKey = selectionFocusKey(focusShapeIds);\n const selectionFocusKeyWithNonce =\n selectionKey == null\n ? null\n : focusNonce != null\n ? `${selectionKey}#${focusNonce}`\n : selectionKey;\n const selectionFocusBounds = useMemo(() => {\n if (!doc || focusShapeIds.length === 0) return null;\n // Union every selected shape so Shift-select frames the group, not the first id.\n return viewFocusBoundsForShapes(doc.levels, focusShapeIds);\n }, [doc, focusShapeIds]);\n const kioskOrigin = useMemo(\n () => (doc ? findViewerKioskOrigin(doc, host, kioskId) : null),\n [doc, host, kioskId],\n );\n const routeFocusBounds = useMemo(() => {\n if (!doc || !route) return null;\n return viewFocusBoundsForRoute(doc.levels, route, activeLevelId);\n }, [activeLevelId, doc, route]);\n const routeFocusKey = route\n ? `route:${activeLevelId ?? 'none'}:${route.anchorIds.join(',')}`\n : null;\n const focusKey = captureCamera\n ? null\n : routeFocusKey ?? selectionFocusKeyWithNonce;\n const focusViewBounds = captureCamera ? null : routeFocusBounds ?? selectionFocusBounds;\n const resolvedDevice = deviceProp ?? deviceFromHost(host, viewportWidth);\n const homeOverride = doc\n ? findResponsiveOverride(doc.responsiveOverrides, activeLevelId, resolvedDevice)\n : null;\n const homePose = homeOverride ? overrideToCameraPose(homeOverride) : null;\n const homePoseKey = responsiveViewKey(\n activeLevelId,\n resolvedDevice,\n captureCamera,\n );\n\n // DISPLAY_APP starts on the physical kiosk floor and routes from that kiosk.\n useEffect(() => {\n if (!viewerChrome(host).kioskOrigin || !kioskOrigin) return;\n setFromAnchorId(kioskOrigin.anchorId);\n setActiveLevelId(kioskOrigin.levelId);\n // setActiveLevelId intentionally omitted: it is recreated each render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [host, kioskOrigin]);\n\n const compiled = useMemo(() => {\n if (!doc) return null;\n return compileGraph(\n doc.graph.nodes.map((n) => ({\n id: n.id,\n levelId: n.levelId,\n shapeId: n.shapeId,\n kind: n.kind,\n x: n.x,\n y: n.y,\n connectorId: n.connectorId,\n })),\n doc.graph.edges.map((e) => ({\n id: e.id,\n mapId: doc.mapId,\n fromAnchorId: e.from,\n toAnchorId: e.to,\n weight: e.weight,\n directed: e.directed,\n accessible: e.accessible,\n kind: e.kind,\n })),\n doc.connectors,\n );\n }, [doc]);\n\n const websiteRetailers = useMemo(() => {\n if (!doc) return [];\n return websiteRetailersOnMap(\n doc,\n fetchedRetailers && fetchedRetailers.length > 0\n ? fetchedRetailers\n : doc.retailers,\n );\n }, [doc, fetchedRetailers]);\n\n const hoverRetailers = useMemo(() => {\n if (fetchedRetailers && fetchedRetailers.length > 0) return fetchedRetailers;\n return doc?.retailers ?? [];\n }, [doc?.retailers, fetchedRetailers]);\n\n const handleHoverTooltip = useCallback(\n (\n next: ViewerHoverTooltip | null,\n opts?: { leavingShapeId?: number },\n ) => {\n setHoverTooltip((current) => {\n if (next) return next;\n if (opts?.leavingShapeId != null) {\n return current?.shapeId === opts.leavingShapeId ? null : current;\n }\n return null;\n });\n },\n [],\n );\n\n useEffect(() => {\n setHoverTooltip(null);\n }, [host, activeLevelId, websiteModalOpen]);\n\n const websiteDestinationInfo = useMemo(() => {\n if (!doc || websiteShapeId == null) return null;\n return websiteDestination(doc, websiteShapeId);\n }, [doc, websiteShapeId]);\n\n const runRoute = (fromId: number | null, toId: number | null) => {\n const pinOrigin = shouldPinViewToRouteOrigin(\n routeEndpointsRef.current.from,\n routeEndpointsRef.current.to,\n fromId,\n toId,\n );\n routeEndpointsRef.current = { from: fromId, to: toId };\n if (!compiled || fromId == null || toId == null) {\n setRoute(null);\n return;\n }\n const result = findShortestPlacePath(compiled, [fromId], [toId], {\n accessibleOnly,\n });\n setRoute(result);\n // Stay on the start floor. Taps on escalator / elevator icons change floors.\n if (pinOrigin) {\n const originLevelId = routeOriginLevelId(result);\n if (originLevelId != null) setActiveLevelId(originLevelId);\n }\n };\n\n useEffect(() => {\n runRoute(fromAnchorId, toAnchorId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromAnchorId, toAnchorId, accessibleOnly, compiled]);\n\n /** Chrome Reset: loaded default, current floor. Idle: also restore kiosk floor. */\n const applyViewerReset = useCallback(\n (kind: ViewerResetKind) => {\n const patch = viewerResetPatch({\n kind,\n kioskOrigin,\n activeLevelId,\n defaultLevelId: doc ? defaultViewerLevelId(doc.levels) : null,\n });\n setToAnchorId(null);\n setRoute(null);\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n setFromAnchorId(patch.fromAnchorId);\n if (patch.nextLevelId != null) {\n setActiveLevelId(patch.nextLevelId);\n }\n if (patch.resetCamera) {\n cameraApi.current?.reset();\n }\n },\n [activeLevelId, doc, kioskOrigin],\n );\n\n useEffect(() => {\n if (!createRouteRef || !doc) return;\n const routeApi = {\n createRouteToStore(retailerId: number) {\n const toIds = matchingShapeAnchorIds(\n doc.levels,\n (shape) => shape.assignment?.retailerId === retailerId,\n );\n if (toIds.length === 0) return;\n if (compiled && fromAnchorId != null) {\n const nearest = findShortestPlacePath(\n compiled,\n [fromAnchorId],\n toIds,\n { accessibleOnly },\n );\n const destinationAnchorId = nearest?.anchorIds.at(-1);\n if (destinationAnchorId != null) {\n setToAnchorId(destinationAnchorId);\n return;\n }\n }\n setToAnchorId(toIds[0]);\n },\n createRouteToAmenity(amenityCode: string) {\n const amenity = doc.amenities.find((a) => a.code === amenityCode);\n if (!amenity || !compiled || fromAnchorId == null) return;\n const anchorIds = matchingShapeAnchorIds(\n doc.levels,\n (shape) => shape.assignment?.amenityId === amenity.id,\n );\n const nearest = findNearestAmenityPath(compiled, fromAnchorId, anchorIds, {\n accessibleOnly,\n });\n const destinationAnchorId = nearest?.anchorIds.at(-1);\n if (destinationAnchorId != null) setToAnchorId(destinationAnchorId);\n },\n clearRoute() {\n setToAnchorId(null);\n setRoute(null);\n },\n resetMap() {\n applyViewerReset('idle');\n },\n };\n createRouteRef.current = routeApi;\n return () => {\n if (createRouteRef.current === routeApi) createRouteRef.current = null;\n };\n }, [\n accessibleOnly,\n activeLevelId,\n applyViewerReset,\n compiled,\n createRouteRef,\n doc,\n fromAnchorId,\n ]);\n\n const theme: ThemeDefaults = mergeTheme(doc?.theme, themeOverrides);\n\n if (error) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--error ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__error\">{error}</div>\n </div>\n );\n }\n\n if (!doc) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--loading ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__loading\">Loading map…</div>\n </div>\n );\n }\n\n const amenitiesOnMap: CmAmenityCatalogItem[] = doc.amenities.filter(\n (a) =>\n isAssignAmenity(a.code) &&\n doc.levels.some((l) =>\n l.shapes.some((s) => s.assignment?.amenityId === a.id),\n ),\n );\n const chrome = captureCamera\n ? { ...viewerChrome(host), storeModal: false, hoverTooltip: false }\n : viewerChrome(host);\n // Portal staff (assign + responsiveness capture) can view Outdoor alone.\n // Website and display-app still require a building floor.\n const showMap = viewerCanShowScene(\n captureCamera ? 'PORTAL_ASSIGN' : host,\n doc.levels,\n );\n\n return (\n <div\n className={`eyeon-map-viewer eyeon-map-viewer--${host}${showMap ? '' : ' eyeon-map-viewer--empty'} ${className ?? ''}`}\n style={\n {\n ...style,\n ['--map-bg' as string]: theme.MAP_BACKGROUND_COLOR,\n } as React.CSSProperties\n }\n >\n {!showMap ? (\n <div className=\"eyeon-map-viewer__empty\">{MAP_NO_FLOORS_MESSAGE}</div>\n ) : null}\n\n {showMap && (chrome.search || chrome.amenities) && (\n <RuntimeChrome\n doc={doc}\n amenities={amenitiesOnMap}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n fromAnchorId={fromAnchorId}\n toAnchorId={toAnchorId}\n onFromChange={setFromAnchorId}\n onToChange={setToAnchorId}\n accessibleOnly={accessibleOnly}\n onAccessibleOnlyChange={setAccessibleOnly}\n route={route}\n showSearch={chrome.search}\n showAmenities={chrome.amenities}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n />\n )}\n\n {showMap ? (\n <MapControls\n levels={doc.levels}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n onZoomIn={() => cameraApi.current?.zoomIn()}\n onZoomOut={() => cameraApi.current?.zoomOut()}\n onReset={() => applyViewerReset('chrome')}\n showFloors={chrome.floors}\n showZoomReset={chrome.zoomReset}\n />\n ) : null}\n\n {showMap ? (\n <div ref={canvasHostRef} className=\"eyeon-map-viewer__canvas\">\n <Suspense fallback={null}>\n <MapScene\n doc={doc}\n theme={theme}\n host={host}\n kioskOriginShapeId={kioskOrigin?.shapeId ?? null}\n activeLevelId={activeLevelId}\n route={route}\n selectedShapeId={captureCamera ? null : websiteShapeId ?? selectedShapeId}\n selectedShapeIds={captureCamera ? [] : focusShapeIds}\n hoveredShapeId={captureCamera ? null : hoveredShapeId}\n focusKey={focusKey}\n focusViewBounds={focusViewBounds}\n cameraRef={cameraApi}\n eventSource={canvasHostRef}\n imageProxyUrl={imageProxyUrl}\n homePose={homePose}\n homePoseKey={homePoseKey}\n resetFitsMap={captureCamera}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n allowWheelZoom={captureCamera || viewerAllowsWheelZoom(host)}\n retailers={hoverRetailers}\n showHoverTooltip={chrome.hoverTooltip}\n onHoverTooltip={handleHoverTooltip}\n onActiveLevelChange={setActiveLevelId}\n onSelectShape={(shapeId, levelId, opts) => {\n if (shapeId == null) {\n if (chrome.storeModal) {\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n }\n props.onSelectShape?.(null);\n return;\n }\n const level = doc.levels.find((l) => l.id === levelId);\n const shape = level?.shapes.find((s) => s.id === shapeId);\n if (chrome.storeModal && websiteClickOpensModal(host, shape)) {\n setWebsiteShapeId(shapeId);\n setWebsiteModalOpen(true);\n if (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(\n doc.levels,\n activeLevelId,\n levelId,\n ),\n );\n }\n props.onSelectShape?.(shapeId, opts);\n return;\n }\n if (chrome.storeModal) {\n props.onSelectShape?.(shapeId, opts);\n return;\n }\n if (routeOnSelect) {\n const destIds = shapeAnchorIds(level?.anchors ?? [], shapeId);\n let destId = destIds[0];\n if (compiled && fromAnchorId != null && destIds.length > 1) {\n destId =\n findShortestPlacePath(compiled, [fromAnchorId], destIds, {\n accessibleOnly,\n })?.anchorIds.at(-1) ?? destId;\n }\n if (destId != null) setToAnchorId(destId);\n } else if (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, levelId),\n );\n }\n props.onSelectShape?.(shapeId, opts);\n if (!opts?.additive && shapeId === selectedShapeId) {\n const focus =\n viewFocusBoundsForShapes(doc.levels, focusShapeIds) ??\n viewFocusBoundsForShape(doc.levels, shapeId);\n if (focus) cameraApi.current?.focusBounds(focus);\n }\n }}\n />\n </Suspense>\n </div>\n ) : null}\n\n {chrome.hoverTooltip && !websiteModalOpen ? (\n <HoverTooltip tooltip={hoverTooltip} />\n ) : null}\n\n {chrome.storeModal && websiteModalOpen && websiteDestinationInfo ? (\n <WebsiteInfoModal\n destination={websiteDestinationInfo}\n retailers={websiteRetailers}\n imageProxyUrl={imageProxyUrl}\n host={host}\n onClose={() => setWebsiteModalOpen(false)}\n onMapIt={(fromRetailerId) => {\n const from = websiteRetailers.find((r) => r.id === fromRetailerId);\n const anchors = websiteMapItAnchors(from, websiteDestinationInfo);\n if (anchors) {\n setFromAnchorId(anchors.fromAnchorId);\n setToAnchorId(anchors.toAnchorId);\n setWebsiteModalOpen(false);\n }\n }}\n />\n ) : null}\n </div>\n );\n}\n\nexport default MapViewer;\n"],"names":["MapControls","levels","activeLevelId","onActiveLevelChange","onZoomIn","onZoomOut","onReset","showFloors","showZoomReset","floorOptions","alwaysShowFloors","stackLevels","level","switcher","floorSwitcherDisplayLevels","showFloorList","shouldShowFloorSwitcher","showZoom","hasBuildingFloors","hasOutdoorLevel","jsxs","jsx","active","Fragment","MAP_FONT_FAMILY","MAP_LABEL_LINE_HEIGHT","SVGIcons","AllAmenities","CONNECTOR_AMENITY_TYPES","AssignAmenities","item","KioskSvg","EntranceSvg","EscalatorUpSvg","EscalatorDownSvg","isAssignAmenity","type","getAmenityByType","getMapSpecialSvg","id","_a","recolorMapSvg","svg","color","hex","mapSpecialSvgToDataUrl","colored","entranceIconDataUrl","amenityAssignOptions","amenityTypeFromCatalogId","amenityId","amenities","amenityCatalogIdForType","row","assignmentSpecialIconDataUrl","assignment","assignmentSpecialIconId","ASSIGNED_CONNECTOR_ICON","STATIC_ICON_COLORS","UNASSIGNED_CONNECTOR_ICON","levelTravel","from","to","fromIndex","toIndex","fromOrder","toOrder","escalatorLandingTravel","shapeId","levelId","here","connectorId","_b","anchor","partner","escalatorConnectorIconId","travel","connectorSpecialKind","shape","raw","connectorSpecialIconDataUrl","kind","assigned","fill","connectorMapIconDataUrl","iconId","assignedConnectorShapeIds","anchors","ids","connectorMapIconKind","assignedShapeIds","mapFontUrl","MAP_FONT_URL","registered","ensureMapFont","loaded","MODERN_SELECT_SEARCH_AFTER","filterModernSelectOptions","options","query","q","o","modernSelectIsSearchable","optionCount","searchable","Chevron","ModernSelect","value","onChange","disabled","placeholder","ariaLabel","listId","useId","rootRef","useRef","triggerRef","buttonRef","menuRef","searchRef","open","setOpen","useState","setQuery","activeIndex","setActiveIndex","menuPos","setMenuPos","withSearch","selected","filtered","useMemo","close","useCallback","pick","next","updateMenuPos","el","rect","spaceBelow","spaceAbove","maxHeight","openAbove","useEffect","onDoc","e","t","onKey","onMove","moveActive","delta","i","onSearchKeyDown","option","menu","createPortal","index","highlighted","target","v","polygonToThreeShape","points","THREE","polygonToThreePath","path","slabShapeWithHoles","outer","holes","hole","holesOverlappingOuter","skipRaycast","createOpeningMarkTexture","aspect","width","canvas","ctx","pad","OPENING_VOID_MARK","texture","OpeningVoidMesh","polygon","box","polygonBBox","dash","openingSpanDash","outline","first","p","geometry","material","OPENING_VOID_STROKE","line","mark","height","OPENING_VOID_FILL","bbox","span","OpeningWells","polygons","VIEWER_SELECTABLE_KINDS","isViewerSelectableKind","isViewerInteractiveShape","host","viewerShapeHoverableOnHost","viewerShapeHighlighted","hoveredShapeId","selectedShapeIds","resolvedViewerHoverId","listHoverId","pointerHoverId","viewerHoverCursor","applyViewerHoverCursor","cursor","viewerHoverFillOpacity","base","hovered","viewerPointerOffset","event","native","x","y","VIEWER_CLICK_DRAG_PX","createViewerPointerGesture","viewerPointerClientXY","beginViewerPointerGesture","gesture","pointerId","moveViewerPointerGesture","dist","endViewerPointerGesture","viewerPointerClickIsTap","maxDist","r3fDelta","pointerMissClearsSelection","down","up","dx","dy","kindColor","theme","resolvedViewerShapeFill","polygonShape","HoverOutline","extrude","sourceGeometry","CurrentLocationPulse","position","Html","LevelMeshes","is3d","onSelectShape","hoveredShapeIdProp","eventSource","pointerGestureRef","interactiveOnly","imageProxyUrl","retailers","kioskOriginShapeId","showHoverTooltip","onHoverTooltip","setPointerHoverId","publishHoverTooltip","offset","text","viewerHoverTooltipLabel","openings","voidPolygonsOnLevel","assignedConnectorIds","visibleShapes","s","viewerShapeVisibleOnHost","meshes","isEntranceIcon","INTERACTIVE_SHAPE_KINDS","resolveLayerStyle","radius","punch","isSlabShapeKind","threeShapes","poly","filletPolygon","labels","entranceIcons","overlays","assignmentOverlayVisible","connectorOverlays","layout","connectorIconLayout","iconColor","resolvedAssignmentIconColor","url","geometryBBox","align","normalizeLabelAlign","cx","cy","tilt","Text","labelAlignX","size","DEFAULT_ENTRANCE_SIZE","AssignmentImageOverlay","fontSize","DEFAULT_ASSIGNMENT_SIZE","z","imageKey","assignmentOverlayImageUrl","React","assignmentOverlayRenderSize","rotation","selectable","baseOpacity","viewerShapeBaseOpacity","fillTransparent","isTransparentColor","opacity","emphasisFill","darkenShapeFill","geoShape","idx","loadCanvasTexture","signal","resolve","reject","img","cleanup","onAbort","setTexture","setAspect","disposed","controller","proxied","resolveFetchUrl","candidates","lastError","src","error","ROUTE_CHANGE_MARKER_GAP","ROUTE_CHANGE_MARKER_CLUSTER","routeOriginLevelId","route","shouldPinViewToRouteOrigin","previousFrom","previousTo","nextFrom","nextTo","routeChangeLabel","intent","floorName","routeSegmentsForLevel","segments","current","point","markerDistance","a","b","layoutRouteLevelChangeMarkers","markers","placed","marker","used","group","j","ordered","rank","routeLevelChangeMarkers","changeIndex","change","V1_ROUTE_COLOR","V1_ROUTE_TUBULAR_SEGMENTS","V1_ROUTE_RADIAL_SEGMENTS","V1_ROUTE_REVEAL_MS","V1_ROUTE_TEXTURE_MS","resolveRouteColor","ROUTE_CHANGE_RING_COLOR","resolveRouteChangeCircleColor","resolveRouteThickness","thickness","DEFAULT_THEME","_routeScale","_routeWorldPoint","routeWorldRadiusForView","screenRadius","world","zoom","worldHeight","scale","routeWorldRadiusForCamera","camera","viewportHeight","worldScale","samplePoint","distance","applyRouteTubeRadius","basePositions","baseRadius","targetRadius","normal","i3","createRouteTexture","context","gradientWidth","gradient","easeInOutCubic","RouteTube","invalidate","useThree","state","meshRef","animationStartedAt","appliedRadius","routeShape","syncScreenRadius","mesh","useLayoutEffect","useFrame","elapsed","indexCount","progress","RouteChangeButton","connectors","connector","iconKind","isVerticalRouteConnectorKind","there","icon","targetName","label","ringColor","RouteLine","routeColor","routeRadius","segment","levelChanges","COLOR_SPACE_SVG","SRGBColorSpace","SVGLoader","Loader","manager","onLoad","onProgress","onError","scope","loader","FileLoader","parseNode","node","style","transform","getNodeTransform","isDefsNode","parseStyle","parseCSSStylesheet","parsePathNode","parseRectNode","parsePolygonNode","parsePolylineNode","parseCircleNode","parseEllipseNode","parseLineNode","usedNodeId","usedNode","transformPath","currentTransform","paths","childNodes","transformStack","ShapePath","Vector2","control","firstPoint","isFirstPoint","doSetFirstPoint","d","commands","l","command","data","numbers","parseFloats","jl","getReflection","rx","ry","start","parseArcCommand","stylesheet","selectorList","definitions","stylesheets","x_axis_rotation","large_arc_flag","sweep_flag","end","dx2","dy2","x1p","y1p","rxs","rys","x1ps","y1ps","cr","dq","pq","cxp","cyp","theta","svgAngle","ux","uy","vx","vy","dot","len","ang","parseFloatWithUnits","w","h","bci","iterator","match","regex","subpath","Path","x1","y1","x2","y2","stylesheetStyles","classSelectors","addStyle","svgName","jsName","adjustFunction","clamp","positive","input","flags","stride","RE","SEP","INT","FLOAT","EXP","seenComma","number","exponent","result","throwSyntaxError","partial","newNumber","length","units","unitConversion","string","theUnit","n","u","parseNodeTransform","Matrix3","tempTransform0","tx","ty","transformsTexts","tIndex","transformText","openParPos","closeParPos","transformType","array","angle","tempTransform1","tempTransform2","tempTransform3","scaleX","scaleY","m","transfVec2","v2","tempV3","transfEllipseGeneric","curve","cosTheta","sinTheta","v1","Vector3","f1","f2","mF","mFInv","mQe","ed","eigenDecomposition","rt1sqrt","rt2sqrt","mDsqrt","mRT","mDRF","transformAngle","phi","cosR","sinR","isTransformFlipped","transfEllipseNoSkew","sx","getTransformScaleX","sy","getTransformScaleY","subPaths","curves","tempV2","isTransformSkewed","te","basisDot","A","B","C","rt1","rt2","cs","sn","sm","df","rt","xml","shapePath","IntersectionLocationType","classifyResult","findEdgeIntersection","a0","a1","b0","b1","x3","x4","y3","y4","nom1","nom2","denom","t1","t2","classifyPoint","edgeStart","edgeEnd","ax","ay","bx","by","sa","getIntersections","path1","path2","intersectionsRaw","intersections","path1EdgeStart","path1EdgeEnd","index2","path2EdgeStart","path2EdgeEnd","intersection","getScanlineIntersections","scanline","boundingBox","center","allIntersections","i1","i2","isHoleTo","simplePath","allPaths","scanlineMinX","scanlineMaxX","_fillRule","centerBoundingBox","scanlineIntersections","baseIntersections","otherIntersections","firstXOfPath","stack","isHole","isHoleFor","lastCWValue","identifier","simplePaths","maxY","minY","maxX","minX","ShapeUtils","Box2","sp","isAHole","shapesToReturn","Shape","lineJoin","lineCap","miterLimit","arcDivisions","minDistance","vertices","normals","uvs","BufferGeometry","Float32BufferAttribute","vertexOffset","tempV2_1","tempV2_2","tempV2_3","tempV2_4","tempV2_5","tempV2_6","tempV2_7","lastPointL","lastPointR","point0L","point0R","currentPointL","currentPointR","nextPointL","nextPointR","innerPoint","outerPoint","removeDuplicatedPoints","numPoints","isClosed","currentPoint","previousPoint","nextPoint","strokeWidth2","deltaU","u0","u1","innerSideModified","joinIsOnLeftSide","isMiter","initialJoinIsOnLeftSide","numVertices","currentCoordinate","currentCoordinateUV","getNormal","iPoint","normal1","miterSide","miterLength2","segmentLengthPrev","segmentLengthNext","makeSegmentTriangles","makeSegmentWithBevelJoin","createSegmentTrianglesWithMiddleSection","makeCircularSector","miterFraction","addVertex","addCapGeometry","lastOuter","lastInner","p1","p2","il","vl","dupPoints","newPoints","BASE_Z","getLayerNameFromNode","isInteractiveAncestor","dataName","isInteractiveGroupLabel","isStoreFolderLabel","isRouteAncestor","isRouteFolderLabel","SvgVectorLayer","suppressIds","setResult","cancelled","fetchUrl","res","inlined","inlineSvgStyles","err","out","layerName","isRoutePathLabel","shapes","layerStyle","amenityFill","isAmenityLayerId","amenityHouseFill","strokeTransparent","_c","sortByOutdoorSvgPaintOrder","renderOrder","si","SCENE_FLIP_SCALE","viewBoundsFromData","bounds","fitOrthoZoom","viewWidth","viewHeight","worldWidth","zoomX","zoomY","boundsExtent","VIEWER_ZOOM_ANIM_MS","VIEWER_FOCUS_ANIM_MS","FOCUS_BOUNDS_PADDING","FOCUS_LARGE_PADDING","FOCUS_LARGE_EXTENT","FOCUS_PAD_SMALL_EXTENT","FOCUS_MIN_EXTENT","FOCUS_MAX_ZOOM_MULTIPLE","FOCUS_SMALL_MAX_ZOOM_MULTIPLE","VIEWER_MAX_ZOOM_MULTIPLE","focusPaddingRatio","paddingRatio","smallExtent","largePadding","largeExtent","extent","paddedFocusBounds","minExtent","rawW","rawH","halfW","halfH","focusMaxZoomMultiple","paddedWidth","paddedHeight","typicalMultiple","smallMultiple","typicalFrame","tinyFrame","clampFocusZoom","shapeFitZoom","mapFitZoom","maxMultiple","cap","selectionFocusKey","shapeIds","viewFocusBoundsForShapes","wanted","combined","sceneBoundsFromBBox","expandBounds","viewFocusBoundsForShape","viewFocusBoundsForRoute","routePoints","applyLevelTransform","endpointIds","routeAnchorIds","focusShapeIds","shapeBounds","easeOutCubic","lerp","interpolateCameraPose","ease","cameraPosesNear","epsilon","withFitZoom","pose","fitZoom","resolveResetPose","fitToMap","home","fit","skipPersistedViewRestore","nextOrthoZoom","direction","step","min","max","factor","MOUSE_ROTATE","MOUSE_DOLLY","MOUSE_PAN","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","ORBIT_ZOOM_TO_CURSOR","orbitMouseButtons","orbitTouches","cameraBoundsKey","CameraRig","controlsRef","cameraRef","persistedViewRef","focusKey","focusViewBounds","homePose","homePoseKey","resetFitsMap","onCameraChange","onCameraReset","userAdjusted","applyingView","zoomAnimRef","appliedFocusKey","focusKeyRef","focusViewBoundsRef","homePoseRef","homePoseKeyRef","resetFitsMapRef","onCameraChangeRef","onCameraResetRef","appliedHomeKey","ignoreUserChangeUntil","resetInFlight","focusAnimRef","boundsKey","cancelZoomAnim","captureView","adjusted","controls","restoreView","snap","animateOrthoZoom","targetZoom","startZoom","started","now","currentPose","fitPose","applyPose","lookAt","poseForFocusBounds","focus","mapExtent","mapFit","sizeHint","resolvedHomePose","saved","resetDestination","applyHomeOrFit","dest","applyFit","animateFocus","animateReset","applyFitRef","restoreViewRef","animateFocusRef","zoomBy","onStart","useImperativeHandle","isNewFocus","snapMatchesFocus","anim","isEventRoot","orbitEventRoot","connected","viewerWheelEventHitsMap","root","contains","suppressViewerWheelZoom","OUTDOOR_Z","CAMERA_UP","CANVAS_DPR","CANVAS_GL","OrbitWheelZoomGuard","blockWheel","gl","onWheel","MapScene","doc","selectedShapeId","allowWheelZoom","pointerDownRef","onDown","pos","onUp","stacked","viewerLevelStack","boundsFromStackedLevels","view","cameraPosition","camera3dPosition","mouseButtons","touches","outdoorLevel","isOutdoorLevel","outdoorSvgUrl","outdoorSvgSuppressIds","showOutdoorSvg","outdoorTheme","Canvas","OrthographicCamera","outdoor","opts","viewerAllowsWheelZoom","OrbitControls","itemLabel","amenityName","RuntimeChrome","fromAnchorId","toAnchorId","onFromChange","onToChange","accessibleOnly","onAccessibleOnlyChange","showSearch","showAmenities","amenityIconColor","selectedItem","setSelectedItem","items","list","amenity","grouped","map","arr","anchorOptions","hasQuery","selectItem","groupItems","WebsiteInfoModal","destination","onClose","onMapIt","fromRetailerId","setFromRetailerId","retailer","websiteFromRetailerOptions","logo","showDetails","directions","websiteInfoModalDirections","mapItDisabled","showForm","formatRetailerPhone","HoverTooltip","tooltip","fetchWebsiteRetailers","webApiURI","centerId","all","page","params","json","count","normalizeRetailerCatalogItem","fetchDocument","draft","qs","MapViewer","props","documentProp","kioskId","selectedRetailerId","themeOverrides","onExtractedAmenities","createRouteRef","className","activeLevelIdProp","routeOnSelect","focusNonce","deviceProp","captureCamera","rawDoc","setDoc","normalizePublishedDocument","setError","setRoute","setFromAnchorId","setToAnchorId","setAccessibleOnly","websiteShapeId","setWebsiteShapeId","websiteModalOpen","setWebsiteModalOpen","hoverTooltip","setHoverTooltip","fetchedRetailers","setFetchedRetailers","internalLevelId","setInternalLevelId","defaultViewerLevelId","cameraApi","canvasHostRef","routeEndpointsRef","viewportWidth","setViewportWidth","setActiveLevelId","viewerChrome","ro","entries","chrome","codes","viewerLevelIdAfterShapeSelect","selectionKey","selectionFocusKeyWithNonce","selectionFocusBounds","kioskOrigin","findViewerKioskOrigin","routeFocusBounds","routeFocusKey","resolvedDevice","deviceFromHost","homeOverride","findResponsiveOverride","overrideToCameraPose","responsiveViewKey","compiled","compileGraph","websiteRetailers","websiteRetailersOnMap","hoverRetailers","handleHoverTooltip","websiteDestinationInfo","websiteDestination","runRoute","fromId","toId","pinOrigin","findShortestPlacePath","originLevelId","applyViewerReset","patch","viewerResetPatch","routeApi","retailerId","toIds","matchingShapeAnchorIds","nearest","destinationAnchorId","amenityCode","anchorIds","findNearestAmenityPath","mergeTheme","amenitiesOnMap","showMap","viewerCanShowScene","Suspense","websiteClickOpensModal","destIds","shapeAnchorIds","destId","_d","_e","_f","r","websiteMapItAnchors"],"mappings":"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","x_google_ignoreList":[16]}
1
+ {"version":3,"file":"MapViewer.js","sources":["../../src/viewer/ui/MapControls.tsx","../../src/fonts/mapFont.ts","../../../threejs-map/src/helpers/svgIcons.helper.ts","../../../threejs-map/src/helpers/amenities.helper.ts","../../../threejs-map/src/amenities.ts","../../src/specialIcons.ts","../../src/fonts/Montserrat-Regular.woff?url","../../src/fonts/mapFontUrl.ts","../../src/ui/selectSearch.ts","../../src/ui/ModernSelect.tsx","../../src/viewer/components/openingGeometry.ts","../../src/viewer/components/OpeningWell.tsx","../../src/viewer/pointer.ts","../../src/viewer/components/LevelMeshes.tsx","../../src/viewer/routeFloorChanges.ts","../../src/viewer/components/RouteLine.tsx","../../../../node_modules/three/examples/jsm/loaders/SVGLoader.js","../../src/viewer/components/SvgVectorLayer.tsx","../../src/viewer/camera.ts","../../src/viewer/components/CameraRig.tsx","../../src/viewer/orbitWheelZoom.ts","../../src/viewer/components/MapScene.tsx","../../src/viewer/ui/RuntimeChrome.tsx","../../src/viewer/ui/WebsiteInfoModal.tsx","../../src/viewer/ui/HoverTooltip.tsx","../../src/viewer/fetchWebsiteRetailers.ts","../../src/viewer/MapViewer.tsx"],"sourcesContent":["import React from 'react';\nimport type { StackLevel } from '../../core';\nimport {\n floorSwitcherDisplayLevels,\n hasBuildingFloors,\n hasOutdoorLevel,\n shouldShowFloorSwitcher,\n} from '../../core';\n\nexport interface MapControlLevel {\n id: number;\n name: string;\n}\n\nexport interface MapControlsProps {\n levels: Array<MapControlLevel & Partial<StackLevel>>;\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onReset: () => void;\n showFloors?: boolean;\n showZoomReset?: boolean;\n /** Override the viewer building-floor list (e.g. Edit Map + Outdoor). */\n floorOptions?: MapControlLevel[];\n /** Show the floor list even when there is only one floor. */\n alwaysShowFloors?: boolean;\n}\n\nexport function MapControls({\n levels,\n activeLevelId,\n onActiveLevelChange,\n onZoomIn,\n onZoomOut,\n onReset,\n showFloors = true,\n showZoomReset = true,\n floorOptions,\n alwaysShowFloors = false,\n}: MapControlsProps) {\n const stackLevels = levels.filter(\n (level): level is MapControlLevel & StackLevel =>\n level.kind != null &&\n level.ordering != null &&\n level.levelIndex != null,\n );\n const switcher = floorOptions ?? floorSwitcherDisplayLevels(stackLevels);\n const showFloorList =\n showFloors &&\n (alwaysShowFloors\n ? switcher.length > 0\n : shouldShowFloorSwitcher(stackLevels));\n const showZoom =\n showZoomReset &&\n (hasBuildingFloors(stackLevels) || hasOutdoorLevel(stackLevels));\n if (!showFloorList && !showZoom) return null;\n\n return (\n <div className=\"eyeon-map-controls\">\n <div className=\"eyeon-map-controls__stack\">\n {showFloorList && (\n <div className=\"eyeon-map-controls__floors\" role=\"tablist\" aria-label=\"Floors\">\n {switcher.map((level) => {\n const active = level.id === activeLevelId;\n return (\n <button\n key={level.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n className={\n active\n ? 'eyeon-map-controls__floor is-active'\n : 'eyeon-map-controls__floor'\n }\n onClick={() => onActiveLevelChange(level.id)}\n >\n {level.name}\n </button>\n );\n })}\n </div>\n )}\n\n {showZoom && (\n <>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__reset\"\n onClick={onReset}\n aria-label=\"Reset map\"\n >\n Reset\n </button>\n\n <div className=\"eyeon-map-controls__zoom\">\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomOut}\n aria-label=\"Zoom out\"\n >\n −\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomIn}\n aria-label=\"Zoom in\"\n >\n +\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","/** CSS family — same Montserrat as admin-portal / Edit Map chrome. */\nexport const MAP_FONT_FAMILY = 'Montserrat, sans-serif';\n\n/** Shared by Edit Map SVG tspans and default-map troika `<Text>`. */\nexport const MAP_LABEL_LINE_HEIGHT = 1.15;\n","const SVGIcons = {\n Entrance: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke=\"#444444\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 3.75h8.25A3.5 3.5 0 0 1 20 7.25v9.5a3.5 3.5 0 0 1-3.5 3.5H8.25\"/>\n <path fill=\"none\" stroke=\"#444444\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.5 12h12.35M12.2 7.85 16.4 12l-4.2 4.15\"/>\n </svg>`,\n\n Kiosk: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 443.83 787.21\">\n <path fill=\"#444444\" d=\"M451,587.7V8.14H7.14V589.5H111.43V730.89H71.27L38.59,763.58v31.78H416.36V764.93l-34.05-34H345.78V587.7ZM396.91,71.23v452.7H59.85V71.23Z\" transform=\"translate(-7.14 -8.14)\" />\n </svg>`,\n\n Escalator: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n </svg>`,\n\n EscalatorUp: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n <path fill=\"#444444\" d=\"M165.81,131.14l-56.28-74.94c-1.74-2.31-5.21-2.31-6.95,0l-56.28,74.94c-2.15,2.87-.1,6.97,3.49,6.95l41.87-.17v129.17c0,2.4,1.94,4.34,4.34,4.34h20.1c2.4,0,4.34-1.94,4.34-4.34v-129.17l41.87.17c3.59.01,5.64-4.08,3.49-6.95Z\"/>\n </svg>`,\n\n EscalatorDown: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n <path fill=\"#444444\" d=\"M165.81,194.77l-56.28,74.94c-1.74,2.31-5.21,2.31-6.95,0l-56.28-74.94c-2.15-2.87-.1-6.97,3.49-6.95l41.87.17V58.81c0-2.4,1.94-4.34,4.34-4.34h20.1c2.4,0,4.34,1.94,4.34,4.34v129.17l41.87-.17c3.59-.01,5.64,4.08,3.49,6.95Z\"/>\n </svg>`,\n\n ATM: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 577.8 577\">\n <path fill=\"#444444\" d=\"M388.7,314c-3.7-10.3-10.3-19.8-17.7-27.2c-7.4-7.4-17.7-14-29.5-19.1c-6.6-2.9-19.2-6.6-39.1-11.8V144.2 c13.3,2.2,22.8,8.1,30.2,16.2c7.4,8.1,11.8,19.9,14,35.3l39.8-5.9c-2.9-24.3-13.3-44.1-30.2-58.1c-13.3-11-31-17.7-53.8-19.8V93.4 h-24.3v18.4c-25.8,2.2-45,9.6-58.2,21.3c-19.9,17.7-29.5,39.7-29.5,67.6c0,15.5,3.7,29.4,10.3,41.9s16.2,22,28.7,28.7 c17,9.6,33.2,16.2,49.4,20.6v121.3c-14.8-1.5-28-8.8-39.1-22.8c-7.4-9.6-13.3-25-16.2-46.3l-39.1,7.4c1.5,20.6,6.6,37.5,15.5,51.5 s19.9,23.5,31.7,30.1c12.5,6.6,28,11,47.9,13.2v39v-0.1V483h22.1v-39c28-0.7,50.1-11,67.1-28.7c17-18.4,25.8-40.4,25.8-67.6 C394.6,336,392.4,324.3,388.7,314z M278.9,145.1v107.2c-17.7-5.2-30.2-11.8-37.6-20.6s-11.1-19.8-11.1-33.1c0-14,4.4-25.7,13.3-35.3 C252.2,153.9,263.7,147.4,278.9,145.1V145h0.7C279.3,145,279.1,145,278.9,145.1z M340,394.2c-9.6,11-22.1,18.4-37.6,19.8l0,0V297.9 c20.6,5.2,34.6,11.8,42,20.6c6.6,8.1,10.3,19.8,10.3,33.8C354.8,369.2,349.6,383.1,340,394.2z\" />\n <path fill=\"#444444\" d=\"M289.8,2.5c-158.7,0-288,128-288,287.2c0,158.3,129.3,287.2,288,287.2s288-128.9,288-287.2S448.6,2.5,289.8,2.5z M289.9,533.9C155,533.9,45.2,424.3,45.2,289.8C45.2,154.5,155,45.7,289.9,45.7s244.7,109.5,244.7,244.1S424.8,533.9,289.9,533.9z\" />\n </svg>`,\n\n Management: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 414.6\">\n <path fill=\"#444444\" d=\"M371.6,180.4c66.8,0,101,58.5,121.4,121.9l16.4,50.4c2.7,8.8-7.5,16.3-16.4,16.3h-56.6l-7.5-27.2 c-17.7-53.1-45-106.2-94.8-125.9c13-8.8,23.9-21.1,30.7-35.4C366.1,180.4,368.8,180.4,371.6,180.4z M441.2,145.7 c64.8,2,98.2,59.2,118.7,121.9l15.7,49.7c2.7,8.8-7.5,17.7-16.4,17.7h-35.5l-12.3-38.1c-16.4-53.1-44.3-106.2-94.8-125.9 C426.2,162.7,434.3,155.2,441.2,145.7z M51.6,334.3H16.8c-9.6,0-19.1-8.2-16.4-17.7l15.7-49.7C35.9,204.2,70.1,147.1,134.9,145 c6.1,9.5,15,18.4,24.6,24.5c-49.8,19.7-77.8,72.8-94.8,125.9L51.6,334.3L51.6,334.3z M437.7,0c35.5,0,64.8,28.6,64.8,64.7 c0,31.3-22.5,57.2-52.5,62.6c3.4-8.8,5.5-18.4,5.5-27.9c0-39.5-27.3-71.5-62.8-81C403.6,6.8,419.3,0,437.7,0L437.7,0z M137.6,0 c17.7,0,34.1,6.8,45,18.4c-35.5,9.5-62.8,41.5-62.8,81c0,9.5,2.1,19.1,5.5,27.9C96,121.9,72.8,96,72.8,64.7 C73.5,28.6,102.1,0,137.6,0L137.6,0z M287.7,0c19.8,0,37.5,8.8,49.8,22.5c-15.7,6.8-29.3,19.1-38.2,34l-3.4,5.5c-2.7,0-5.5,0-7.5,0 c-2,0-6.1,0-8.9,0l-3.4-5.5c-9.6-15-22.5-27.2-38.2-34C250.2,8.9,267.9,0,287.7,0L287.7,0z M287.7,226c66.8,0,101,58.5,122.1,121.9 l15.7,50.4c2.7,8.8-8.2,16.3-16.4,16.3H166.2c-9.6,0-19.8-8.2-16.4-16.3l15.7-50.4C186,284.6,220.8,226,287.7,226z M287.7,81 c35.5,0,64.8,28.6,64.8,64.7s-28.7,64.7-64.8,64.7c-35.5,0-64.8-28.6-64.8-64.7S252.2,81,287.7,81z M138.3,369H82.3 c-9.6,0-19.1-8.2-16.4-16.3l15.7-50.4c21.1-63.3,55.3-121.9,122.1-121.9c2.7,0,5.5,0,7.5,0c6.1,15,17.7,27.2,30.7,35.4 c-49.8,19.7-78.5,72.8-94.8,125.9C147.1,341.8,138.3,369,138.3,369z M203.8,34.7c23.9,0,44.3,12.9,55.9,31.3 c-32.1,12.2-55.9,42.9-55.9,79c0,6.1,0.7,12.2,2.1,18.4h-2.1c-35.5,0-64.8-28.6-64.8-64.7S168.3,34.7,203.8,34.7z M371.6,34.7 c35.5,0,64.8,28.6,64.8,64.7s-29.3,64-64.8,64h-2.7c2.1-6.1,2.7-12.2,2.7-18.4c0-36.8-23.9-66.7-55.9-79 C327.2,47.7,347,34.7,371.6,34.7z\" />\n </svg>`,\n\n PlayArea: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 537.9\">\n <path fill=\"#444444\" d=\"M384.3,137c38,0,68.8-30.7,68.8-68.5S422.3,0,384.3,0s-68.8,30.7-68.8,68.5S346.4,137,384.3,137z\" />\n <path fill=\"#444444\" d=\"M283.3,96c20,26.3,35.9,53.3,67.6,64.4c31.2,11.1,60.5,11.1,83.5-5.3c22.9-16.4,34.7-46.8,54.1-87.2 c18.8-40.4,34.1-48,57-48c23.5,0,31.2,28.1,30.6,39.8s-10.6,31-40,52.7c-49.4,36.3-57.6,108.3-59.4,127.7 c-1.8,19.3-2.9,50.4,17.6,169.2c20.6,118.9-20,125.9-25.3,127.1c-5.3,0.6-21.2,8.2-31.1-16.4c-10-24.6-11.8-91.3-14.1-120 c-2.9-28.7-6.5-70.9-35.9-79c-30-8.2-40.6,39.8-51.7,76.1c-10.6,36.9-40,71.4-72.3,59.1s-29.4-50.4-10-78.5 c19.4-27.5,61.7-57.4,67.6-124.1c5.9-66.8-11.8-69.1-68.2-90.8c-55.8-22.3-60.5-33.4-67.6-48.6s7.6-46.8,31.1-52.7 C239.2,55.1,259.1,63.9,283.3,96L283.3,96z\" />\n <path fill=\"#444444\" d=\"M134.7,251.7c26.9,0,48.8-21.8,48.8-48.6s-21.8-48.6-48.8-48.6s-48.8,21.8-48.8,48.6S107.7,251.7,134.7,251.7z\" />\n <path fill=\"#444444\" d=\"M204,227.8c-15.3,17.6-28.2,35.7-51.1,41.6c-22.9,6.4-43.5,4.7-58.8-8.2c-15.3-12.9-21.7-35.1-32.9-64.4S40,161,23.5,159.8 C7.1,158.7,0,178,0,186.2c-0.6,8.2,5.9,22.3,25.3,39.2C58.2,253.5,60,305.1,60,318.5c0.6,13.5-0.6,35.7-21.7,118.3 s7.1,89.6,10.6,90.8s14.7,7,22.9-10s12.9-63.8,16.5-83.7c3.5-19.9,8.2-49.8,29.4-53.9s26.5,30.4,32.3,56.8 c5.9,26.3,24.7,52.7,47.6,45.7c22.9-7,23.5-34,11.2-54.4c-12.3-20.5-40-43.9-40.6-90.8c-0.6-47.4,12.3-48,52.9-60.3 c40.6-12.3,44.7-20.5,50.5-30.4c5.9-10-2.9-33.4-18.8-38.6C237.5,201.4,222.8,206.7,204,227.8L204,227.8z\" />\n </svg>`,\n\n RestRoom: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 533.9\">\n <path fill=\"#444444\" d=\"M282.3,533.9h9.2V0h-9.2V533.9z\" />\n <path fill=\"#444444\" d=\"M118.2,97.1c25.4-4.6,41.6-30.1,34.7-55.5C146,16.2,122.9,2.3,97.4,6.9S58.1,39.3,62.8,62.4S95.1,104,118.2,97.1z\" />\n <path fill=\"#444444\" d=\"M159.8,145.6h4.6c0,0,2.3,0,2.3,2.3L183,270.4c2.3,9.2,9.2,16.2,18.5,16.2c11.6,0,18.5-9.2,18.5-20.8l-18.5-129.4 c-2.3-13.9-13.9-23.1-27.7-23.1H44.3c-13.9,0-25.4,9.2-27.7,23.1L0.4,265.8c-2.3,11.6,6.9,20.8,18.5,20.8c9.2,0,16.2-6.9,18.5-16.2 l16.2-122.5c0,0,0-2.3,2.3-2.3h4.6c0,0,2.3,0,2.3,2.3L30.4,390.6c0,0,0,2.3,2.3,2.3h37c0,0,2.3,0,2.3,2.3v117.9 c0,9.2,6.9,16.2,16.2,16.2s16.2-6.9,16.2-16.2V393c0,0,0-2.3,2.3-2.3h11.6c0,0,2.3,0,2.3,2.3v117.9c0,9.2,6.9,16.2,16.2,16.2 c9.2,0,16.2-6.9,16.2-16.2V393c0,0,0-2.3,2.3-2.3h30.1c0,0,2.3,0,2.3-2.3l-27.7-242.7l0,0l0,0L159.8,145.6z\" />\n <path fill=\"#444444\" d=\"M497.3,76.3c13.9-23.1,4.6-50.9-16.2-62.4s-50.9-6.9-64.7,16.2c-13.9,23.1-4.6,50.9,16.2,62.4 C455.7,106.3,483.5,99.4,497.3,76.3z\" />\n <path fill=\"#444444\" d=\"M545.9,113.3h-178c-13.9,0-25.4,9.2-27.7,23.1v129.4c0,11.6,9.2,20.8,20.8,20.8s18.5-9.2,18.5-20.8V159.5c0,0,0-2.3,2.3-2.3 h2.3c0,0,2.3,0,2.3,2.3l25.4,161.8v187.2c0,11.6,9.2,20.8,20.8,20.8l0,0c11.6,0,20.8-9.2,20.8-20.8V323.6c0,0,0-2.3,2.3-2.3h6.9 c0,0,2.3,0,2.3,2.3v184.9c0,11.6,9.2,20.8,20.8,20.8l0,0c11.6,0,20.8-9.2,20.8-20.8V321.3l25.4-161.8c0,0,0-2.3,2.3-2.3h-2.3 c0,0,2.3,0,2.3,2.3v106.3c0,11.6,9.2,20.8,20.8,20.8s20.8-9.2,20.8-20.8V136.4C571.4,122.5,559.8,113.3,545.9,113.3L545.9,113.3 L545.9,113.3z\" />\n </svg>`,\n\n FamilyRestRoom: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 522.5\">\n <path fill=\"#444444\" d=\"M119.8,91.5c25-5.9,40.5-30.8,34.6-55.7c-5.9-24.9-30.9-40.4-55.9-34.5S58,32,63.9,56.9S94.8,97.3,119.8,91.5z\" />\n <path fill=\"#444444\" d=\"M160.6,139.1h4.5c0.6,0,1.3,0.6,1.3,1.3l15.3,123.1c1.3,8.9,8.9,15.9,17.8,15.9c10.8,0,19.1-9.5,17.8-20.3l-15.9-128.9 c-1.9-13.3-13.4-24.1-27.4-24.1H43.4c-14,0-25.5,10.2-27.4,24.1L0.1,259.1c-1.3,10.8,7,20.3,17.8,20.3c8.9,0,16.5-7,17.8-15.9 l15.3-123.8c0-0.6,0.6-1.3,1.3-1.3h4.5c0.6,0,1.3,0.6,1.3,1.3L29.4,384.1c0,0.6,0.6,1.3,1.3,1.3H67c0.6,0,1.3,0.6,1.3,1.3v118.1 c0,9.5,7.6,16.5,16.5,16.5c9.5,0,16.5-7.6,16.5-16.5V387.3c0-0.6,0.6-1.3,1.3-1.3h10.8c0.6,0,1.3,0.6,1.3,1.3v118.1 c0,9.5,7.6,16.5,16.5,16.5c9.5,0,16.5-7.6,16.5-16.5V387.3c0-0.6,0.6-1.3,1.3-1.3h36.3c0.6,0,1.3-0.6,1.3-1.3L158,140.3 C159.3,139.7,159.9,139.1,160.6,139.1L160.6,139.1z\" />\n <path fill=\"#444444\" d=\"M498.9,69.8c12.9-22.1,5.4-50.5-16.8-63.4c-22.2-12.9-50.6-5.4-63.6,16.7c-12.9,22.1-5.4,50.5,16.8,63.4 C457.5,99.4,486,91.9,498.9,69.8z\" />\n <path fill=\"#444444\" d=\"M547.9,106.1H369.6c-14,0-25.5,10.2-27.4,24.1v128.9c0,10.8,8.9,19.7,19.7,19.7s19.7-8.9,19.7-19.7v-106 c0-0.6,0.6-1.3,1.3-1.3h2.5c0.6,0,1.3,0.6,1.3,1.3l25.5,162.5v187.3c0,10.8,8.9,19.7,19.7,19.7h0.6c10.8,0,19.7-8.9,19.7-19.7v-186 c0-0.6,0.6-1.3,1.3-1.3h10.8c0.6,0,1.3,0.6,1.3,1.3v186c0,10.8,8.9,19.7,19.7,19.7h0.6c10.8,0,19.7-8.9,19.7-19.7V315.6l25.5-162.5 c0-0.6,0.6-1.3,1.3-1.3h2.6c0.6,0,1.3,0.6,1.3,1.3v106c0,10.8,8.9,19.7,19.7,19.7s19.7-8.9,19.7-19.7V130.2 C573.4,116.2,562,106.1,547.9,106.1L547.9,106.1z\" />\n <path fill=\"#444444\" d=\"M259.6,480l19.7-19.7L251.9,433L229,455.8c-7.6,7.6-5.7,20.3,1.3,27.3l32.5,33.6c12.7,12.7,29.3-5.1,17.2-17.1L259.6,480 L259.6,480z M288.9,347.9c19.1,0,34.4-15.2,34.4-34.3s-15.3-34.3-34.4-34.3s-34.4,15.2-34.4,34.3S269.7,347.9,288.9,347.9z M369.7,405.7l-46.5-46.3c-3.8-3.8-8.3-6.3-14.7-6.3h-41.4c-6.4,0-10.8,2.5-14,6.3l-45.9,45.7c-12.7,12.7,4.5,28.6,17.2,15.9 l28-27.9v26h72.6v-26l28.6,28.6C364.6,433.6,381.8,417.1,369.7,405.7L369.7,405.7z M324.5,433l-27.4,27.3l19.7,19.7l-20.4,20.3 c-12.1,12.1,4.5,29.2,17.2,17.1l32.5-33.6c7-7,8.9-20.3,1.3-27.3C347.4,455.9,324.5,433,324.5,433z\" />\n </svg>`,\n\n Elevator: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 576\">\n <path fill=\"#444444\" d=\"M576,145.2v268.6c-0.1,1.6-0.3,3.1-0.3,4.7c-0.3,33.3-0.6,66.6-0.8,99.9c-0.1,21.1-9.7,37.2-26.7,49 c-7.7,5.4-15.9,9.3-25.9,8c-3.8-0.5-7.7-0.1-11.5-0.1c-115.3,0.1-230.6,0.2-345.9,0.3c-1.1,0-2.2,0.2-3.3,0.3h-16.9 c-1.2-0.1-2.4-0.3-3.6-0.3c-30.2-0.3-60.4-0.6-90.7-0.8c-11.1-0.1-20.7-4.1-29.1-11.2c-8.7-7.4-15.5-16.7-19.9-27.3l-0.2-0.5 c-0.7-1.6-1.1-3.4-1.2-5.4v0C0,492.8,0,455.1,0,417.4c0-124.1,0-248.1,0-372.2c0-0.2,0-0.3,0-0.5c0-1.5,0.3-2.9,0.7-4.2l0,0.1 C8.3,22.5,20.5,8.9,38.7,1c1.2-0.5,2.6-0.9,4-0.9h0c162.8,0,325.6,0,488.4,0c1.5,0,2.8,0.4,4.1,0.9l-0.1,0c3.4,1.4,6.1,2.7,8.8,4.2 l-0.4-0.2c19.7,11.2,30.9,27.8,31.3,50.8c0.4,28.2,0.6,56.3,0.8,84.5C575.7,141.8,575.8,143.5,576,145.2L576,145.2z M536.4,288.6 h0.3c0-56.7,0-113.4,0-170c0-18.2-0.4-36.4-0.7-54.6c-0.1-8-8.4-19.8-15.9-22.7c-1-0.4-2.1-0.6-3.2-0.7h0c-3.2-0.3-6.4-0.6-9.5-0.6 c-25.5-0.4-51-0.9-76.6-1c-96.4-0.2-192.7-0.4-289.1-0.4c-22.9,0-45.8,0.1-68.7,0.3c-3.4,0-6.8,0.1-10,0.9 c-9.9,2.3-17.1,8.3-21.7,17.3c-1,1.9-2,3.9-2.1,5.9c-0.1,149.8-0.1,299.6-0.1,449.4c0,0.9-0.1,2,0.3,2.7c2.7,4.2,5.1,8.6,8.3,12.3 c5.6,6.3,13.2,8.4,21.6,8.4c23.7,0.1,47.5,0.6,71.2,0.6c123.5,0,247,0,370.5,0c0.1,0,0.2,0,0.3,0c1.1,0,2.1-0.2,3-0.6l-0.1,0 c8.3-3.5,15.4-8.4,20.2-16.3c1.2-1.8,2-4.1,2-6.5l0,0C536.4,438.2,536.4,363.4,536.4,288.6L536.4,288.6z\" />\n <path fill=\"#444444\" d=\"M307,277.5l75.9,68.4l0.9-0.2V150.9h49.7v194.8l1,0.3l78.2-67.4c0.1,1,0.2,1.7,0.3,2.4c0.3,19.9,0.6,39.8,0.8,59.7 c0,0,0,0,0,0.1c0,1.4-0.5,2.6-1.4,3.6l0,0c-34.1,32.7-68.2,65.3-102.3,97.9c-0.3,0.3-0.6,0.5-1,0.9c-0.6-0.5-1.3-1-1.9-1.5 c-32.7-30.7-65.5-61.4-98.2-92c-1.4-1.2-2.3-3-2.3-5c0-0.1,0-0.3,0-0.4v0c0.2-20.9,0.3-41.9,0.4-62.8C307,280.5,307,279.4,307,277.5 L307,277.5z\" />\n <path fill=\"#444444\" d=\"M142.2,234.5L67,301.8c-0.1-1.2-0.3-1.9-0.3-2.7c-0.3-20.7-0.7-41.5-1-62.2c0-1.3,0.5-2.5,1.3-3.4l0,0 c33.3-31.4,66.7-62.8,100.1-94.1c0.3-0.3,0.6-0.5,1-0.8c5.9,5.7,11.8,11.3,17.7,16.9c28.1,26.9,56.2,53.9,84.3,80.9 c0.9,0.8,1.4,2,1.5,3.3v0c-0.5,20.2-1.1,40.3-1.6,60.5c0,0.3-0.1,0.7-0.2,1.7l-77.4-67.1l-0.9,0.1v193.9h-48.3v-194L142.2,234.5z\" />\n </svg>`,\n\n Security: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 597.6\">\n <path fill=\"#444444\" d=\"M554,80.7L298.5,1.5c-6.6-2-13.2-2-19.9,0L23.2,80.7C9.3,84.7,0,97.9,0,112.4c0,352.5,178.7,436.4,274,481.9 c4.6,2,9.3,3.3,13.9,3.3c4.6,0,9.9-1.3,13.9-3.3c96-45.5,274-129.4,274-481.9C577.2,97.9,567.9,85.3,554,80.7z M288.6,527.6 C197.2,484.1,73.5,411.4,66.2,136.2l222.4-68.6L511,136.8C503.7,412.1,379.3,484.1,288.6,527.6z\" />\n <path fill=\"#444444\" d=\"M278.7,152l-26.5,87.1l-90.7-2.6c-4.6,0-8.6,2.6-9.9,7.3c-1.3,4.6,0,9.2,4,11.9l74.8,51.5L200.6,393c-1.3,4.6,0,9.2,4,11.9 c4,2.6,8.6,2.6,12.6,0l72.1-54.8l72.1,54.8c4,2.6,8.6,2.6,12.6,0c4-2.6,5.3-7.3,4-11.9l-29.8-85.8l74.8-51.5c4-2.6,5.3-7.3,4-11.9 c-1.3-4.6-5.3-7.3-9.9-7.3l-90.7,2l-26.5-87.1c-1.3-4.6-5.3-7.3-9.9-7.3C283.9,144.1,280,147.4,278.7,152L278.7,152z\" />\n </svg>`,\n\n ChildStroller: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 432 370.06\">\n <path fill=\"#444444\" d=\"M130.29,178.61l-42.67,34L33.24,254.13c-15.48,12.09-28.32-2.64-28.32-2.64-12.08-15.86,1.89-26.06,1.89-26.06l68-53.24s7.55-7.93,26.81-2.26l28.7,8.68\"/>\n <path fill=\"#444444\" d=\"M210,111A38.52,38.52,0,1,1,248.48,72.5,38.68,38.68,0,0,1,210,111\"/>\n <path fill=\"#444444\" d=\"M390.84,0a42.88,42.88,0,0,0-24.92,8.31L80.44,235.63a43.71,43.71,0,0,0-13.59,22.28,40.67,40.67,0,0,0,1.89,23.41,47.9,47.9,0,0,0-22.28,41.16A47.58,47.58,0,1,0,94,274.9,41.43,41.43,0,0,0,84.22,276a22.77,22.77,0,0,1-1.51-14.35,25.82,25.82,0,0,1,8.68-13.59l17.37-14,88,29.08a33.54,33.54,0,0,0,42.67-21.53l1.51-4.91,18.88,45.32a47.09,47.09,0,0,0-22.28,40.4,47.58,47.58,0,1,0,47.58-47.58,41.43,41.43,0,0,0-9.82,1.13l-26.43-62.68,43.8-126.12,83.08-66.08a23.7,23.7,0,0,1,15.1-5.29,25.3,25.3,0,0,1,25.3,25.3,25.72,25.72,0,0,1-10.2,20.39,8,8,0,0,0,10.58,12.08A41.37,41.37,0,0,0,390.84,0ZM93.66,301.33A20.77,20.77,0,1,1,72.89,322.1,20.71,20.71,0,0,1,93.66,301.33Zm191.07,0A20.77,20.77,0,1,1,264,322.1,20.71,20.71,0,0,1,284.73,301.33Z\"/>\n </svg>`,\n\n VendingMachine: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 594\">\n <circle fill=\"#444444\" cx=\"324\" cy=\"175.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"175.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"324\" cy=\"243\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"243\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"324\" cy=\"310.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"310.5\" r=\"13.5\"/>\n <path fill=\"#444444\" d=\"M216,94.5H67.5C59.4,94.5,54,99.9,54,108c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,99.9,224.1,94.5,216,94.5z\"/>\n <path fill=\"#444444\" d=\"M216,162H67.5c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,167.4,224.1,162,216,162z\"/>\n <path fill=\"#444444\" d=\"M216,229.5H67.5c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,234.9,224.1,229.5,216,229.5z\"/>\n <path fill=\"#444444\" d=\"M216,297H67.5c-8.1,0-13.5,5.4-13.5,13.5S59.4,324,67.5,324H216c8.1,0,13.5-5.4,13.5-13.5S224.1,297,216,297z\"/>\n <path fill=\"#444444\" d=\"M391.5,0H324c-8.1,0-13.5,5.4-13.5,13.5S315.9,27,324,27h67.5c8.1,0,13.5,5.4,13.5,13.5V567H27V40.5 C27,32.4,32.4,27,40.5,27h216v499.5c0,8.1,5.4,13.5,13.5,13.5s13.5-5.4,13.5-13.5v-513C283.5,5.4,278.1,0,270,0H40.5 C17.5,0,0,17.5,0,40.5v540c0,8.1,5.4,13.5,13.5,13.5h405c8.1,0,13.5-5.4,13.5-13.5v-540C432,17.5,414.5,0,391.5,0z\"/>\n <path fill=\"#444444\" d=\"M364.5,94.5H324c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5h40.5c8.1,0,13.5-5.4,13.5-13.5 C378,99.9,372.6,94.5,364.5,94.5z\"/>\n <path fill=\"#444444\" d=\"M216,432H67.5c-8.1,0-13.5,5.4-13.5,13.5V513c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5v-67.5 C229.5,437.4,224.1,432,216,432z M81,499.5V459h121.5v40.5H81z\"/>\n </svg>`,\n\n Stairs: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 448.5\">\n <path fill=\"#444444\" d=\"M432,243.3h-81.7v33.1h-72.2v33.1h-72.2v33.1h-72.2v33.1H61.5v33.1H0v39.7h101.2v-33.1h72.2v-33.1h72.2v-33.1h72.2v-33.1 h72.2V283H432L432,243.3\"/>\n <path fill=\"#444444\" d=\"M99.9,109.3c12,0,21.8-9.7,21.8-21.8c0-12-9.8-21.8-21.8-21.8c-12,0-21.8,9.7-21.8,21.8C78.1,99.6,87.9,109.3,99.9,109.3\"/>\n <path fill=\"#444444\" d=\"M179.4,299.8l-56.5-47.4l11.7-82.9c12.5,14.8,20.7,33.4,22.7,53.8l17.8-4.8c-0.9-32.2-14.2-61.3-35.3-82.6 c-14.4-14.5-32.9-19.2-45.9-20.6c-0.1,0-0.2,0-0.3,0c-1.6,0-2.9,1.2-3.2,2.7c-6.5,34.7-27.7,64.2-56.9,81.9l9.3,16.1 c15.6-6.6,29.5-16.4,40.9-28.6v177.3H107l10.4-73.7l57.7,33.3L179.4,299.8\"/>\n <path fill=\"#444444\" d=\"M294.1,43.6c12,0,21.8-9.8,21.8-21.8c0-12-9.8-21.8-21.8-21.8c-12,0-21.8,9.8-21.8,21.8C272.3,33.8,282.1,43.6,294.1,43.6\" />\n <path fill=\"#444444\" d=\"M337.2,154.3l-41.8-24.1l3.9-20c1.4-7.5,2.2-15.2,2.2-23.1c0-12-1.8-23.7-5-34.6c-0.4-1.4-1.7-2.4-3.1-2.4c0,0-0.1,0-0.1,0 c-46.7,1.6-84.1,40-84.1,87.1c0,2.3,0.1,4.6,0.3,6.9l18.3,3.2c0-0.5,0-0.9,0-1.4c0-19.5,8.6-36.9,22.3-48.7l-10.5,201.1h23.3 l24.9-128l23,10.7L294.9,240l16.6,16.6l34.6-74.3c1.3-2.8,2-5.9,2-9.2C348.1,165.1,343.8,158,337.2,154.3\"/>\n </svg>`,\n\n ChargingStation: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 627.4\">\n <polygon fill=\"#444444\" points=\"314.4,282.1 133.8,467.8 188.6,334.2 114.9,334.2 225.6,148.6 314.4,148.6 236.7,282.1 \"/>\n <path fill=\"#444444\" d=\"M374.2,0H63.3C28.4,0.1,0.1,28.4,0,63.3v503.6c0,32.8,30.1,60.5,62.6,60.5h309.2c33.3,0,60.3-27,60.3-60.3V374.2l0,0V57.8 C432,25.9,406.1,0,374.2,0z M220.3,600.4c-8.3,0.2-15.2-6.4-15.4-14.7c0-0.2,0-0.5,0-0.7c0.1-8.5,6.9-15.3,15.4-15.4 c8.3-0.2,15.2,6.4,15.4,14.7c0,0.2,0,0.5,0,0.7C235.4,593.8,229.1,600.4,220.3,600.4z M391.1,544.8H44v-465h346.7v294.4l0.4,55 V544.8z\"/>\n </svg>`,\n\n WheelChair: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 492.2\">\n <path fill=\"#444444\" d=\"M134.7,80.1l9.5,103h104.6v33.3H146.6l3.2,30.9h147.4l66.6,157l56.3-23.8l11.9,27l-84,36.4l-69.7-163.3H118.9l-19-221.9 c-3.2-5.5-4.7-11.9-4.7-18.2C95.1,18.2,112.5,0,134.7,0c22.2,0,40.4,18.2,40.4,40.4C175.2,61.8,156.9,80.1,134.7,80.1L134.7,80.1z\" />\n <path fill=\"#444444\" d=\"M306.7,397.1c-25.3,56.3-81.6,95.1-146.6,95.1C72.1,492.2,0,420.9,0,332.1C0,268.7,37.2,214,91.1,187.9l3.2,36.5 c-36.5,22.2-61,61.8-61,107.8c0,69.8,57.1,126.8,126.8,126.8c65,0,118.1-48.3,126-110.2L306.7,397.1\"/>\n </svg>`,\n\n};\n\nexport default SVGIcons;","import SVGIcons from \"./svgIcons.helper\";\n\nexport type MapAmenityID = 'atm' | 'management' | 'playarea' | 'restroom' | 'family-restroom' | 'elevator' | 'escalator' | 'security' | 'dog-poop-station' | 'child-stroller' | 'vending-machine' | 'stairs' | 'charging-station' | 'wheelchair';\n\nexport interface MapAmenity {\n name: string;\n type: MapAmenityID;\n svgCode: string;\n}\n\nexport const AllAmenities: MapAmenity[] = [\n {\n name: \"ATM\",\n type: \"atm\",\n svgCode: SVGIcons.ATM\n },\n {\n name: \"Management\",\n type: \"management\",\n svgCode: SVGIcons.Management\n },\n {\n name: \"Kids Area\",\n type: \"playarea\",\n svgCode: SVGIcons.PlayArea\n },\n {\n name: \"Restroom\",\n type: \"restroom\",\n svgCode: SVGIcons.RestRoom\n },\n {\n name: \"Family Restroom\",\n type: \"family-restroom\",\n svgCode: SVGIcons.FamilyRestRoom\n },\n {\n name: \"Elevator\",\n type: \"elevator\",\n svgCode: SVGIcons.Elevator\n },\n {\n name: \"Security\",\n type: \"security\",\n svgCode: SVGIcons.Security\n },\n {\n name: \"Escalator\",\n type: \"escalator\",\n svgCode: SVGIcons.Escalator\n },\n {\n name: 'Child Stroller',\n type: 'child-stroller',\n svgCode: SVGIcons.ChildStroller\n },\n {\n name: 'Vending Machine',\n type: 'vending-machine',\n svgCode: SVGIcons.VendingMachine\n },\n {\n name: 'Stairs',\n type: 'stairs',\n svgCode: SVGIcons.Stairs\n },\n {\n name: 'Charging Station',\n type: 'charging-station',\n svgCode: SVGIcons.ChargingStation\n },\n {\n name: 'Wheelchair',\n type: 'wheelchair',\n svgCode: SVGIcons.WheelChair\n },\n];\n\n","/**\n * Lightweight amenity + kiosk icon catalog for every EyeOn surface.\n * Import from `@eyeon/threejs-map/amenities` (or `@eyeon/threejs-map`) —\n * do not copy these SVGs into other packages.\n */\nimport SVGIcons from './helpers/svgIcons.helper';\nimport {\n AllAmenities,\n type MapAmenity,\n type MapAmenityID,\n} from './helpers/amenities.helper';\n\nexport { AllAmenities };\nexport type { MapAmenity, MapAmenityID };\n\n/** Elevator / escalator are their own v1 modules, not amenity assignments. */\nconst CONNECTOR_AMENITY_TYPES = new Set<MapAmenityID>([\n 'elevator',\n 'escalator',\n]);\n\nexport const AssignAmenities: MapAmenity[] = AllAmenities.filter(\n (item) => !CONNECTOR_AMENITY_TYPES.has(item.type),\n);\n\nexport const KioskSvg = SVGIcons.Kiosk;\nexport const EntranceSvg = SVGIcons.Entrance;\nexport const EscalatorUpSvg = SVGIcons.EscalatorUp;\nexport const EscalatorDownSvg = SVGIcons.EscalatorDown;\n\nexport function isAssignAmenity(type: string): boolean {\n return AssignAmenities.some((item) => item.type === type);\n}\n\nexport function getAmenityByType(type: string): MapAmenity | undefined {\n return AssignAmenities.find((item) => item.type === type) ??\n AllAmenities.find((item) => item.type === type);\n}\n\nexport function getMapSpecialSvg(id: string): string | undefined {\n if (id === 'kiosk') return KioskSvg;\n if (id === 'entrance') return EntranceSvg;\n if (id === 'escalator-up') return EscalatorUpSvg;\n if (id === 'escalator-down') return EscalatorDownSvg;\n return getAmenityByType(id)?.svgCode;\n}\n\nexport function recolorMapSvg(svg: string, color: string): string {\n const hex = color.startsWith('#') ? color : `#${color}`;\n return svg\n .replace(/fill=\"(?!none\")[^\"]*\"/gi, `fill=\"${hex}\"`)\n .replace(/stroke=\"(?!none\")[^\"]*\"/gi, `stroke=\"${hex}\"`);\n}\n\nexport function mapSpecialSvgToDataUrl(\n svg: string,\n color?: string | null,\n): string {\n const colored = color ? recolorMapSvg(svg, color) : svg;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(colored)}`;\n}\n","/**\n * v2 render helpers for amenity / kiosk icons.\n * SVG markup lives only in `@eyeon/threejs-map/amenities`.\n */\nimport {\n AllAmenities,\n AssignAmenities,\n getAmenityByType,\n getMapSpecialSvg,\n isAssignAmenity,\n mapSpecialSvgToDataUrl,\n recolorMapSvg,\n} from '@eyeon/threejs-map/amenities';\nimport type { CmAmenityCatalogItem, CmShapeAssignment } from './core';\nimport { assignmentSpecialIconId, STATIC_ICON_COLORS } from './core';\n\nexport {\n AllAmenities,\n AssignAmenities,\n getAmenityByType,\n isAssignAmenity,\n getMapSpecialSvg,\n mapSpecialSvgToDataUrl,\n recolorMapSvg,\n};\n\nexport function entranceIconDataUrl(color?: string | null): string | undefined {\n const svg = getMapSpecialSvg('entrance');\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, color);\n}\n\n/** v1 amenity list for the assign dropdown — elevator / escalator are separate modules. */\nexport function amenityAssignOptions(): { value: string; label: string }[] {\n return AssignAmenities.map((item) => ({\n value: item.type,\n label: item.name,\n }));\n}\n\nexport function amenityTypeFromCatalogId(\n amenityId: number | null | undefined,\n amenities: CmAmenityCatalogItem[],\n): string {\n if (amenityId == null) return '';\n return amenities.find((item) => item.id === amenityId)?.code ?? '';\n}\n\nexport function amenityCatalogIdForType(\n type: string,\n amenities: CmAmenityCatalogItem[],\n): number | null {\n const row = amenities.find(\n (item) => item.isActive !== false && item.code === type,\n );\n return row?.id ?? null;\n}\n\nexport function assignmentSpecialIconDataUrl(\n assignment: CmShapeAssignment | null | undefined,\n amenities: Array<{ id: number; code: string }>,\n color?: string | null,\n): string | undefined {\n const id = assignmentSpecialIconId(assignment, amenities);\n if (!id) return undefined;\n const svg = getMapSpecialSvg(id);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, color);\n}\n\nexport type ConnectorSpecialKind = 'escalator' | 'elevator';\nexport type EscalatorTravel = 'up' | 'down';\nexport type ConnectorIconId =\n | ConnectorSpecialKind\n | 'escalator-up'\n | 'escalator-down';\n\nconst ASSIGNED_CONNECTOR_ICON = STATIC_ICON_COLORS.connector;\nconst UNASSIGNED_CONNECTOR_ICON = '#94a3b8';\n\ntype LevelTravelInput = {\n id: number;\n levelIndex?: number;\n ordering?: number;\n anchors?: Array<{ shapeId?: number | null; connectorId?: number | null }>;\n};\n\n/** Compare two floors — higher index / ordering is up. */\nexport function levelTravel(\n from: Pick<LevelTravelInput, 'levelIndex' | 'ordering'>,\n to: Pick<LevelTravelInput, 'levelIndex' | 'ordering'>,\n): EscalatorTravel | null {\n const fromIndex = from.levelIndex ?? from.ordering;\n const toIndex = to.levelIndex ?? to.ordering;\n if (fromIndex == null || toIndex == null || toIndex === fromIndex) {\n const fromOrder = from.ordering ?? from.levelIndex;\n const toOrder = to.ordering ?? to.levelIndex;\n if (fromOrder == null || toOrder == null || toOrder === fromOrder) {\n return null;\n }\n return toOrder > fromOrder ? 'up' : 'down';\n }\n return toIndex > fromIndex ? 'up' : 'down';\n}\n\n/**\n * From this linked landing, which way does the ride go? Used for the\n * EscalatorUp / EscalatorDown overlay. Lists keep the plain Escalator icon.\n */\nexport function escalatorLandingTravel(\n shapeId: number,\n levelId: number,\n levels: readonly LevelTravelInput[],\n): EscalatorTravel | null {\n const here = levels.find((level) => level.id === levelId);\n if (!here) return null;\n const connectorId = here.anchors?.find(\n (anchor) => anchor.shapeId === shapeId && anchor.connectorId != null,\n )?.connectorId;\n if (connectorId == null) return null;\n\n const partner = levels.find((level) => {\n if (level.id === here.id) return false;\n return Boolean(\n level.anchors?.some(\n (anchor) =>\n anchor.connectorId === connectorId &&\n anchor.shapeId != null &&\n anchor.shapeId !== shapeId,\n ),\n );\n });\n if (!partner) return null;\n return levelTravel(here, partner);\n}\n\n/** Linked map overlays use the arrow variants; UI lists pass no travel. */\nexport function escalatorConnectorIconId(\n travel?: EscalatorTravel | null,\n): ConnectorIconId {\n if (travel === 'up') return 'escalator-up';\n if (travel === 'down') return 'escalator-down';\n return 'escalator';\n}\n\n/** Escalator / elevator SVG ids from the floor file (`escalator-5-up-start`). */\nexport function connectorSpecialKind(shape: {\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorSpecialKind | null {\n const raw = (shape.sourceSvgId ?? shape.key)\n .trim()\n .toLowerCase()\n .replace(/_/g, '-');\n if (raw === 'escalator' || raw.startsWith('escalator-')) return 'escalator';\n if (raw === 'elevator' || raw.startsWith('elevator-')) return 'elevator';\n return null;\n}\n\nexport function connectorSpecialIconDataUrl(\n kind: ConnectorIconId,\n assigned: boolean,\n color?: string | null,\n): string | undefined {\n const svg = getMapSpecialSvg(kind);\n if (!svg) return undefined;\n const fill = color?.trim()\n ? color.trim()\n : assigned\n ? ASSIGNED_CONNECTOR_ICON\n : UNASSIGNED_CONNECTOR_ICON;\n return mapSpecialSvgToDataUrl(svg, fill);\n}\n\nexport function connectorMapIconDataUrl(\n kind: ConnectorSpecialKind,\n assigned: boolean,\n color?: string | null,\n travel?: EscalatorTravel | null,\n): string | undefined {\n const iconId = kind === 'escalator' ? escalatorConnectorIconId(travel) : kind;\n return connectorSpecialIconDataUrl(iconId, assigned, color);\n}\n\n/** Landings that belong to a linked escalator ride / elevator shaft. */\nexport function assignedConnectorShapeIds(\n anchors: Array<{ shapeId?: number | null; connectorId?: number | null }>,\n): Set<number> {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.shapeId != null && anchor.connectorId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return ids;\n}\n\n/**\n * Map overlay: only a linked landing gets an icon. Unassigned escalators\n * and elevators stay as empty polygons on PORTAL assign; WEBSITE / DISPLAY_APP\n * hide those polygons entirely.\n */\nexport function connectorMapIconKind(\n shape: {\n id: number;\n key: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | Date | null;\n },\n assignedShapeIds: Set<number>,\n): ConnectorSpecialKind | null {\n if (shape.orphanedAt) return null;\n const kind = connectorSpecialKind(shape);\n if (!kind || !assignedShapeIds.has(shape.id)) return null;\n return kind;\n}\n","export default \"data:font/woff;base64,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\"","import mapFontUrl from './Montserrat-Regular.woff?url';\n\n/**\n * Troika (drei `<Text>`) cannot use CSS `font-family`; it needs a font file.\n * Latin 400 WOFF, same face as `@fontsource/montserrat` / admin-portal.\n */\nexport const MAP_FONT_URL = mapFontUrl;\n\nlet registered = false;\n\n/** Register Montserrat so SVG + canvas measurement match the 3D overlay. */\nexport function ensureMapFont(): void {\n if (registered || typeof document === 'undefined' || !('fonts' in document)) {\n return;\n }\n registered = true;\n const face = new FontFace('Montserrat', `url(${MAP_FONT_URL})`);\n void face.load().then((loaded) => {\n document.fonts.add(loaded);\n });\n}\n\nensureMapFont();\n","export interface ModernSelectOption {\n value: string;\n label: string;\n hint?: string;\n iconUrl?: string;\n iconMuted?: boolean;\n}\n\n/** Show a search field once a list is long enough to scan by eye. */\nexport const MODERN_SELECT_SEARCH_AFTER = 8;\n\nexport function filterModernSelectOptions(\n options: ModernSelectOption[],\n query: string,\n): ModernSelectOption[] {\n const q = query.trim().toLowerCase();\n if (!q) return options;\n return options.filter((o) => {\n const haystack = `${o.label} ${o.hint ?? ''}`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nexport function modernSelectIsSearchable(\n optionCount: number,\n searchable?: boolean,\n): boolean {\n return searchable ?? optionCount >= MODERN_SELECT_SEARCH_AFTER;\n}\n","import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './modern-select.css';\nimport {\n filterModernSelectOptions,\n modernSelectIsSearchable,\n type ModernSelectOption,\n} from './selectSearch';\n\nexport type { ModernSelectOption } from './selectSearch';\nexport { filterModernSelectOptions } from './selectSearch';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ModernSelect({\n value,\n options,\n onChange,\n disabled = false,\n placeholder = 'Select…',\n searchable,\n ariaLabel,\n}: {\n value: string;\n options: ModernSelectOption[];\n onChange: (value: string) => void;\n disabled?: boolean;\n placeholder?: string;\n searchable?: boolean;\n ariaLabel?: string;\n}) {\n const listId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const withSearch = modernSelectIsSearchable(options.length, searchable);\n const selected = options.find((o) => o.value === value);\n const filtered = useMemo(\n () => filterModernSelectOptions(options, withSearch && open ? query : ''),\n [open, options, query, withSearch],\n );\n\n const close = useCallback(() => {\n setOpen(false);\n setQuery('');\n setActiveIndex(0);\n }, []);\n\n const pick = useCallback(\n (next: string) => {\n onChange(next);\n close();\n },\n [close, onChange],\n );\n\n const updateMenuPos = useCallback(() => {\n const el = triggerRef.current ?? buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 160),\n maxHeight,\n });\n }, []);\n\n useEffect(() => {\n if (!open) {\n setMenuPos(null);\n return;\n }\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (rootRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n (withSearch ? searchRef.current : buttonRef.current)?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos, withSearch]);\n\n useEffect(() => {\n if (!open || !withSearch) return;\n requestAnimationFrame(() => searchRef.current?.focus());\n }, [open, withSearch]);\n\n useEffect(() => {\n setActiveIndex(0);\n }, [query, filtered.length]);\n\n const moveActive = (delta: number) => {\n if (filtered.length === 0) return;\n setActiveIndex((i) => (i + delta + filtered.length) % filtered.length);\n };\n\n const onSearchKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (!open) setOpen(true);\n else moveActive(1);\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (!open) setOpen(true);\n else moveActive(-1);\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n const option = filtered[activeIndex];\n if (open && option) pick(option.value);\n else setOpen(true);\n }\n };\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label={ariaLabel}\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {filtered.length === 0 ? (\n <li className=\"eyeon-map-select__empty\">No matches</li>\n ) : (\n filtered.map((option, index) => {\n const active = option.value === value;\n const highlighted = index === activeIndex;\n return (\n <li\n key={option.value}\n id={`${listId}-${option.value}`}\n role=\"option\"\n aria-selected={active}\n >\n <button\n type=\"button\"\n className={[\n 'eyeon-map-select__option',\n active ? 'is-active' : '',\n highlighted ? 'is-highlight' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => pick(option.value)}\n >\n {option.iconUrl ? (\n <img\n className={\n option.iconMuted\n ? 'eyeon-map-select__option-icon is-muted'\n : 'eyeon-map-select__option-icon'\n }\n src={option.iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-select__option-copy\">\n <span>{option.label}</span>\n {option.hint ? (\n <span className=\"eyeon-map-select__option-hint\">\n {option.hint}\n </span>\n ) : null}\n </span>\n </button>\n </li>\n );\n })\n )}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div ref={rootRef} className=\"eyeon-map-select\">\n {withSearch ? (\n <div\n ref={triggerRef}\n className={\n open\n ? 'eyeon-map-select__trigger is-open'\n : 'eyeon-map-select__trigger'\n }\n onMouseDown={(e) => {\n if (disabled) return;\n const target = e.target as HTMLElement;\n if (target.closest('.eyeon-map-select__chevron-btn')) return;\n if (target !== searchRef.current) {\n e.preventDefault();\n searchRef.current?.focus();\n }\n if (!open) setOpen(true);\n }}\n >\n <input\n ref={searchRef}\n className=\"eyeon-map-select__input\"\n type=\"text\"\n role=\"combobox\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && filtered[activeIndex]\n ? `${listId}-${filtered[activeIndex].value}`\n : undefined\n }\n disabled={disabled}\n placeholder={placeholder}\n value={open ? query : (selected?.label ?? '')}\n onChange={(e) => {\n setQuery(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={() => {\n if (!disabled) setOpen(true);\n }}\n onKeyDown={onSearchKeyDown}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-select__chevron-btn\"\n tabIndex={-1}\n aria-hidden\n disabled={disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (disabled) return;\n setOpen((v) => !v);\n }}\n >\n <Chevron />\n </button>\n </div>\n ) : (\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"eyeon-map-select__trigger\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setOpen((v) => !v);\n }}\n >\n <span\n className={\n selected\n ? 'eyeon-map-select__value'\n : 'eyeon-map-select__placeholder'\n }\n >\n {selected?.iconUrl ? (\n <img\n className={\n selected.iconMuted\n ? 'eyeon-map-select__option-icon is-muted'\n : 'eyeon-map-select__option-icon'\n }\n src={selected.iconUrl}\n alt=\"\"\n />\n ) : null}\n {selected?.label ?? placeholder}\n </span>\n <Chevron />\n </button>\n )}\n {menu}\n </div>\n );\n}\n","import * as THREE from 'three';\nimport type { Vec2 } from '../../core';\nimport { holesOverlappingOuter } from '../../core';\n\nexport function polygonToThreeShape(points: Vec2[]): THREE.Shape | null {\n if (points.length < 3) return null;\n const shape = new THREE.Shape();\n shape.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n shape.lineTo(points[i].x, points[i].y);\n }\n shape.closePath();\n return shape;\n}\n\nexport function polygonToThreePath(points: Vec2[]): THREE.Path | null {\n if (points.length < 3) return null;\n const path = new THREE.Path();\n path.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n path.lineTo(points[i].x, points[i].y);\n }\n path.closePath();\n return path;\n}\n\n/** Punch overlapping openings out of a slab polygon. */\nexport function slabShapeWithHoles(\n outer: Vec2[],\n holes: Vec2[][],\n): THREE.Shape | null {\n const shape = polygonToThreeShape(outer);\n if (!shape) return null;\n for (const hole of holesOverlappingOuter(outer, holes)) {\n const path = polygonToThreePath(hole);\n if (path) shape.holes.push(path);\n }\n return shape;\n}\n","import React, { useEffect, useMemo } from 'react';\nimport * as THREE from 'three';\nimport type { Vec2 } from '../../core';\nimport {\n OPENING_VOID_FILL,\n OPENING_VOID_MARK,\n OPENING_VOID_STROKE,\n polygonBBox,\n} from '../../core';\nimport { polygonToThreeShape } from './openingGeometry';\n\nfunction skipRaycast() {}\n\n/** X mark in bbox UV space — ShapeGeometry clips it to the opening. */\nfunction createOpeningMarkTexture(aspect: number): THREE.CanvasTexture {\n const height = 256;\n const width = Math.max(48, Math.round(height * Math.max(aspect, 0.2)));\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return new THREE.CanvasTexture(canvas);\n ctx.clearRect(0, 0, width, height);\n const pad = Math.min(width, height) * 0.14;\n ctx.strokeStyle = OPENING_VOID_MARK;\n ctx.globalAlpha = 0.82;\n ctx.lineWidth = Math.max(5, Math.min(width, height) * 0.045);\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(pad, pad);\n ctx.lineTo(width - pad, height - pad);\n ctx.moveTo(width - pad, pad);\n ctx.lineTo(pad, height - pad);\n ctx.stroke();\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.anisotropy = 4;\n texture.needsUpdate = true;\n return texture;\n}\n\nfunction OpeningVoidMesh({ polygon }: { polygon: Vec2[] }) {\n const shape = useMemo(() => polygonToThreeShape(polygon), [polygon]);\n const box = useMemo(() => polygonBBox(polygon), [polygon]);\n const dash = Math.max(8, openingSpanDash(box));\n const outline = useMemo(() => {\n if (polygon.length < 2) return null;\n const first = polygon[0];\n const points = [\n ...polygon.map((p) => new THREE.Vector3(p.x, p.y, 0.05)),\n new THREE.Vector3(first.x, first.y, 0.05),\n ];\n const geometry = new THREE.BufferGeometry().setFromPoints(points);\n const material = new THREE.LineDashedMaterial({\n color: OPENING_VOID_STROKE,\n dashSize: dash,\n gapSize: dash * 0.65,\n });\n const line = new THREE.Line(geometry, material);\n line.renderOrder = 8;\n line.computeLineDistances();\n line.raycast = skipRaycast;\n return line;\n }, [dash, polygon]);\n\n useEffect(\n () => () => {\n if (!outline) return;\n outline.geometry.dispose();\n const material = outline.material;\n if (Array.isArray(material)) material.forEach((item) => item.dispose());\n else material.dispose();\n },\n [outline],\n );\n const mark = useMemo(() => {\n const width = Math.max(box.maxX - box.minX, 1);\n const height = Math.max(box.maxY - box.minY, 1);\n return createOpeningMarkTexture(width / height);\n }, [box]);\n\n useEffect(() => () => mark.dispose(), [mark]);\n\n if (!shape || !outline) return null;\n\n return (\n <group>\n <mesh\n position={[0, 0, 0.02]}\n renderOrder={6}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n color={OPENING_VOID_FILL}\n side={THREE.DoubleSide}\n depthWrite={false}\n />\n </mesh>\n <mesh position={[0, 0, 0.03]} renderOrder={7} raycast={skipRaycast}>\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n map={mark}\n transparent\n depthWrite={false}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n {outline ? <primitive object={outline} /> : null}\n </group>\n );\n}\n\nfunction openingSpanDash(bbox: {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}): number {\n const span = Math.min(bbox.maxX - bbox.minX, bbox.maxY - bbox.minY);\n return Math.min(18, Math.max(7, span * 0.08));\n}\n\nexport function OpeningWells({\n polygons,\n}: {\n polygons: Vec2[][];\n is3d?: boolean;\n}) {\n if (polygons.length === 0) return null;\n return (\n <group>\n {polygons.map((polygon, index) => (\n <OpeningVoidMesh key={`opening-void-${index}`} polygon={polygon} />\n ))}\n </group>\n );\n}\n","import {\n darkenShapeFill,\n viewerShapeHoverableOnHost,\n type MapViewerHost,\n type PublicServiceShape,\n type ShapeKind,\n} from '../core';\n\n/** Kinds that select (or Shift-add) on the assign / public map. */\nexport const VIEWER_SELECTABLE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'entrance',\n 'parking_zone',\n 'custom',\n];\n\nexport function isViewerSelectableKind(kind: string): boolean {\n return (VIEWER_SELECTABLE_KINDS as readonly string[]).includes(kind);\n}\n\n/** Assign map: any selectable kind. Public hosts: only assigned items. */\nexport function isViewerInteractiveShape(\n kind: string,\n host: MapViewerHost = 'PORTAL_ASSIGN',\n assignment?: PublicServiceShape['assignment'] | null,\n): boolean {\n return (\n isViewerSelectableKind(kind) &&\n viewerShapeHoverableOnHost({ assignment: assignment ?? undefined }, host)\n );\n}\n\n/** Hover and the current selection share the same assign-map highlight. */\nexport function viewerShapeHighlighted(\n shapeId: number,\n hoveredShapeId: number | null,\n selectedShapeIds: readonly number[],\n): boolean {\n return hoveredShapeId === shapeId || selectedShapeIds.includes(shapeId);\n}\n\n/** Map pointer hover wins over a leftover list hover. */\nexport function resolvedViewerHoverId(\n listHoverId: number | null | undefined,\n pointerHoverId: number | null,\n): number | null {\n return pointerHoverId ?? listHoverId ?? null;\n}\n\nexport function viewerHoverCursor(\n kind: string,\n host: MapViewerHost = 'PORTAL_ASSIGN',\n assignment?: PublicServiceShape['assignment'] | null,\n): 'pointer' | '' {\n return isViewerInteractiveShape(kind, host, assignment) ? 'pointer' : '';\n}\n\n/** R3F `eventSource` hosts the cursor — the WebGL canvas has pointer-events: none. */\nexport function applyViewerHoverCursor(\n host: HTMLElement | null | undefined,\n cursor: 'pointer' | '',\n): void {\n if (!host) return;\n host.classList.toggle('is-hover-shape', cursor === 'pointer');\n}\n\n/** Near-invisible fills (legacy amenity 0.01) still need a readable hover. */\nexport function viewerHoverFillOpacity(\n kind: string,\n base: number,\n hovered: boolean,\n): number {\n if (!hovered || !isViewerSelectableKind(kind)) return base;\n if (base < 0.08) return 0.28;\n return base;\n}\n\n/** Hover and the current selection use the same darker shade of this fill. */\nexport function viewerHoverFillColor(fill: string, hovered: boolean): string {\n if (!hovered) return fill;\n return darkenShapeFill(fill);\n}\n\n/** Canvas-host coordinates — MapScene uses `eventPrefix=\"offset\"`. */\nexport function viewerPointerOffset(event: {\n offsetX?: number;\n offsetY?: number;\n nativeEvent?: { offsetX?: number; offsetY?: number };\n}): { x: number; y: number } | null {\n const native = event.nativeEvent;\n const x = typeof event.offsetX === 'number' ? event.offsetX : native?.offsetX;\n const y = typeof event.offsetY === 'number' ? event.offsetY : native?.offsetY;\n if (typeof x !== 'number' || typeof y !== 'number') return null;\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n return { x, y };\n}\n\n/** Pan farther than this and a pointer-up is not a click/tap. */\nexport const VIEWER_CLICK_DRAG_PX = 5;\n\nexport type ViewerPointerGesture = {\n pointerId: number | null;\n x: number;\n y: number;\n maxDist: number;\n active: boolean;\n};\n\nexport function createViewerPointerGesture(): ViewerPointerGesture {\n return { pointerId: null, x: 0, y: 0, maxDist: 0, active: false };\n}\n\nexport function viewerPointerClientXY(e: {\n clientX?: number;\n clientY?: number;\n pointerId?: number;\n}): { x: number; y: number; pointerId: number | null } | null {\n const x = e.clientX;\n const y = e.clientY;\n if (typeof x !== 'number' || typeof y !== 'number' || !Number.isFinite(x) || !Number.isFinite(y)) {\n return null;\n }\n return { x, y, pointerId: e.pointerId ?? null };\n}\n\nexport function beginViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (gesture.active) return;\n gesture.active = true;\n gesture.pointerId = pointerId;\n gesture.x = x;\n gesture.y = y;\n gesture.maxDist = 0;\n}\n\nexport function moveViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (!gesture.active) return;\n if (gesture.pointerId != null && pointerId != null && pointerId !== gesture.pointerId) return;\n const dist = Math.hypot(x - gesture.x, y - gesture.y);\n if (dist > gesture.maxDist) gesture.maxDist = dist;\n}\n\nexport function endViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (!gesture.active) return;\n if (gesture.pointerId != null && pointerId != null && pointerId !== gesture.pointerId) return;\n moveViewerPointerGesture(gesture, x, y, pointerId);\n gesture.active = false;\n gesture.pointerId = null;\n}\n\n/** True when the pointer barely moved — R3F delta alone is unreliable on touch. */\nexport function viewerPointerClickIsTap(maxDist: number, r3fDelta?: number): boolean {\n const delta = Number.isFinite(r3fDelta) ? r3fDelta! : 0;\n return Math.max(maxDist, delta) <= VIEWER_CLICK_DRAG_PX;\n}\n\nexport function pointerMissClearsSelection(\n down: { x: number; y: number } | null,\n up: { x: number; y: number; button?: number },\n): boolean {\n if ((up.button ?? 0) !== 0) return false;\n if (!down) return true;\n const dx = up.x - down.x;\n const dy = up.y - down.y;\n return dx * dx + dy * dy <= VIEWER_CLICK_DRAG_PX * VIEWER_CLICK_DRAG_PX;\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { Html, Text } from '@react-three/drei';\nimport type {\n CmAmenityCatalogItem,\n MapViewerHost,\n PublishedLevel,\n PublishedRetailer,\n ThemeDefaults,\n ShapeKind,\n ViewerHoverTooltipHandler,\n} from '../../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n connectorIconLayout,\n darkenShapeFill,\n DEFAULT_ASSIGNMENT_SIZE,\n DEFAULT_ENTRANCE_SIZE,\n filletPolygon,\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n isEntranceIcon,\n isSlabShapeKind,\n isTransparentColor,\n labelAlignX,\n normalizeLabelAlign,\n resolveFetchUrl,\n resolveLayerStyle,\n resolvedAssignmentIconColor,\n resolvedViewerShapeFill,\n viewerHoverTooltipLabel,\n viewerShapeBaseOpacity,\n viewerShapeVisibleOnHost,\n voidPolygonsOnLevel,\n} from '../../core';\nimport { polygonToThreeShape, slabShapeWithHoles } from './openingGeometry';\nimport { OpeningWells } from './OpeningWell';\nimport { MAP_LABEL_LINE_HEIGHT } from '../../fonts/mapFont';\nimport { MAP_FONT_URL } from '../../fonts/mapFontUrl';\nimport {\n applyViewerHoverCursor,\n isViewerInteractiveShape,\n viewerHoverCursor,\n viewerHoverFillOpacity,\n resolvedViewerHoverId,\n viewerPointerClickIsTap,\n viewerPointerOffset,\n viewerShapeHighlighted,\n type ViewerPointerGesture,\n} from '../pointer';\nimport {\n assignedConnectorShapeIds,\n assignmentSpecialIconDataUrl,\n connectorMapIconDataUrl,\n connectorMapIconKind,\n escalatorLandingTravel,\n entranceIconDataUrl,\n} from '../../specialIcons';\n\nfunction kindColor(\n kind: ShapeKind,\n theme: ThemeDefaults,\n host: MapViewerHost,\n fill?: string,\n assignment?: { bgColor?: string | null } | null,\n): string {\n return resolvedViewerShapeFill(kind, theme, host, fill, assignment);\n}\n\nfunction polygonShape(points: { x: number; y: number }[]): THREE.Shape | null {\n return polygonToThreeShape(points);\n}\n\nexport interface LevelMeshesProps {\n level: PublishedLevel;\n /** All floors — used to pick EscalatorUp / EscalatorDown from the linked landing. */\n levels?: readonly PublishedLevel[];\n theme: ThemeDefaults;\n is3d: boolean;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n /** Assign-map selection — same highlight as hover so staff can see the set. */\n selectedShapeIds?: readonly number[];\n /** Rail / search hover — same darker fill as pointer hover. */\n hoveredShapeId?: number | null;\n /** Host that owns pointer events (and therefore the CSS cursor). */\n eventSource?: React.RefObject<HTMLElement | null>;\n /** Tracks pointer travel so pan-release on a store is not treated as a click. */\n pointerGestureRef?: React.RefObject<ViewerPointerGesture>;\n /**\n * When true (outdoor with live SVG), only interactive shapes are drawn —\n * decoration comes from SvgVectorLayer.\n */\n interactiveOnly?: boolean;\n /** Same media proxy as outdoor SVGs — remote retailer logos only, not data URLs. */\n imageProxyUrl?: string | null;\n /** Published amenity catalog — used to resolve v1 amenity icons by code. */\n amenities?: CmAmenityCatalogItem[];\n /** Live / published retailers — logo-only stores have no label text. */\n retailers?: PublishedRetailer[];\n /** Public hosts hide unassigned amenity / kiosk / elevator / escalator polygons. */\n host?: MapViewerHost;\n /** Assigned kiosk shape currently running this DISPLAY_APP viewer. */\n kioskOriginShapeId?: number | null;\n /** WEBSITE / DISPLAY_APP store and amenity name pop-out. */\n showHoverTooltip?: boolean;\n onHoverTooltip?: ViewerHoverTooltipHandler;\n}\n\nfunction HoverOutline({\n shape,\n extrude,\n color,\n}: {\n shape: THREE.Shape;\n extrude: number;\n color: string;\n}) {\n const sourceGeometry = useMemo(\n () =>\n extrude > 0\n ? new THREE.ExtrudeGeometry(shape, {\n depth: extrude,\n bevelEnabled: false,\n })\n : new THREE.ShapeGeometry(shape),\n [extrude, shape],\n );\n\n useEffect(() => () => sourceGeometry.dispose(), [sourceGeometry]);\n\n return (\n <lineSegments renderOrder={40}>\n <edgesGeometry args={[sourceGeometry]} />\n <lineBasicMaterial color={color} depthTest={false} />\n </lineSegments>\n );\n}\n\nfunction CurrentLocationPulse({\n position,\n}: {\n position: [number, number, number];\n}) {\n return (\n <Html\n position={position}\n center\n zIndexRange={[10, 0]}\n style={{ pointerEvents: 'none' }}\n >\n <span\n className=\"eyeon-map-current-location-marker\"\n aria-hidden=\"true\"\n />\n </Html>\n );\n}\n\nexport function LevelMeshes({\n level,\n levels,\n theme,\n is3d,\n onSelectShape,\n selectedShapeIds = [],\n hoveredShapeId: hoveredShapeIdProp = null,\n eventSource,\n pointerGestureRef,\n interactiveOnly = false,\n imageProxyUrl = null,\n amenities = [],\n retailers = [],\n host = 'PORTAL_ASSIGN',\n kioskOriginShapeId = null,\n showHoverTooltip = false,\n onHoverTooltip,\n}: LevelMeshesProps) {\n const [pointerHoverId, setPointerHoverId] = useState<number | null>(null);\n const hoveredShapeId = resolvedViewerHoverId(\n hoveredShapeIdProp,\n pointerHoverId,\n );\n useEffect(\n () => () => {\n applyViewerHoverCursor(eventSource?.current, '');\n onHoverTooltip?.(null);\n },\n [eventSource, onHoverTooltip],\n );\n const publishHoverTooltip = (\n shape: PublishedLevel['shapes'][number],\n event: {\n buttons?: number;\n offsetX?: number;\n offsetY?: number;\n nativeEvent?: { offsetX?: number; offsetY?: number; buttons?: number };\n },\n ) => {\n if (!showHoverTooltip || !onHoverTooltip) return;\n const buttons = event.buttons ?? event.nativeEvent?.buttons ?? 0;\n if (buttons > 0) {\n onHoverTooltip(null);\n return;\n }\n const offset = viewerPointerOffset(event);\n const text = viewerHoverTooltipLabel(shape, retailers, amenities);\n if (!offset || !text) {\n onHoverTooltip(null, { leavingShapeId: shape.id });\n return;\n }\n onHoverTooltip({ shapeId: shape.id, text, x: offset.x, y: offset.y });\n };\n\n const openings = useMemo(() => voidPolygonsOnLevel(level), [level]);\n const assignedConnectorIds = useMemo(\n () => assignedConnectorShapeIds(level.anchors),\n [level.anchors],\n );\n const visibleShapes = useMemo(\n () =>\n level.shapes.filter((s) =>\n viewerShapeVisibleOnHost(s, host, assignedConnectorIds),\n ),\n [assignedConnectorIds, host, level.shapes],\n );\n const meshes = useMemo(() => {\n return visibleShapes\n .filter((s) => s.kind !== 'void')\n .filter((s) => !(s.kind === 'label' && s.label?.text?.trim()))\n .filter((s) => !isEntranceIcon(s))\n .filter(\n (s) =>\n !interactiveOnly ||\n INTERACTIVE_SHAPE_KINDS.includes(s.kind) ||\n (s.kind === 'label' && Boolean(s.label?.text?.trim())) ||\n (s.kind === 'walkable' && !resolveLayerStyle(s.sourceSvgId)),\n )\n .filter((s) => !s.orphanedAt)\n .map((shape) => {\n const radius = shape.kind === 'unit' ? theme.STORE_RADIUS : 0;\n const punch = isSlabShapeKind(shape.kind) && openings.length > 0;\n const polys = shape.geometry.polygons.map((poly) =>\n radius > 0 ? filletPolygon(poly, radius) : poly,\n );\n const threeShapes = polys\n .map((poly) =>\n punch ? slabShapeWithHoles(poly, openings) : polygonShape(poly),\n )\n .filter((s): s is THREE.Shape => s != null);\n if (threeShapes.length === 0) return null;\n\n const color = kindColor(\n shape.kind,\n theme,\n host,\n shape.style.fill,\n shape.assignment,\n );\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n\n return { shape, threeShapes, color, extrude };\n })\n .filter(Boolean) as Array<{\n shape: (typeof visibleShapes)[number];\n threeShapes: THREE.Shape[];\n color: string;\n extrude: number;\n }>;\n }, [visibleShapes, theme, is3d, interactiveOnly, openings, host]);\n\n const labels = useMemo(\n () =>\n visibleShapes.filter(\n (s) => !s.orphanedAt && s.kind === 'label' && Boolean(s.label?.text?.trim()),\n ),\n [visibleShapes],\n );\n\n const entranceIcons = useMemo(\n () => visibleShapes.filter((s) => !s.orphanedAt && isEntranceIcon(s)),\n [visibleShapes],\n );\n\n const overlays = useMemo(\n () =>\n visibleShapes.filter(\n (s) =>\n !s.orphanedAt &&\n s.kind !== 'label' &&\n !isEntranceIcon(s) &&\n assignmentOverlayVisible(s.assignment, s.label),\n ),\n [visibleShapes],\n );\n\n const connectorOverlays = useMemo(() => {\n return visibleShapes.flatMap((shape) => {\n const kind = connectorMapIconKind(shape, assignedConnectorIds);\n if (!kind) return [];\n const layout = connectorIconLayout(shape);\n const iconColor = resolvedAssignmentIconColor(\n shape.assignment,\n theme,\n layout.iconColor,\n shape.kind,\n );\n const travel =\n kind === 'escalator'\n ? escalatorLandingTravel(shape.id, level.id, levels ?? [level])\n : null;\n const url = connectorMapIconDataUrl(kind, true, iconColor, travel);\n if (!url) return [];\n const box = geometryBBox(shape.geometry);\n return [\n {\n shape,\n url,\n width: layout.size,\n rotation: (layout.rotate * Math.PI) / 180,\n x: (box.minX + box.maxX) / 2 + layout.offsetX,\n y: (box.minY + box.maxY) / 2 + layout.offsetY,\n },\n ];\n });\n }, [assignedConnectorIds, level.id, levels, theme, visibleShapes]);\n\n return (\n <group>\n {labels.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const align = normalizeLabelAlign(shape.label.align);\n const cx = (box.minX + box.maxX) / 2;\n const cy = (box.minY + box.maxY) / 2;\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n return (\n <group\n key={`label-${shape.id}`}\n position={[cx, cy, 0.15]}\n rotation={[0, 0, tilt]}\n >\n <Text\n font={MAP_FONT_URL}\n position={[labelAlignX(box, align) - cx, 0, 0]}\n fontSize={shape.label.size ?? 24}\n color={shape.label.color ?? theme.STORE_TEXT_COLOR}\n anchorX={align}\n anchorY=\"middle\"\n textAlign={align}\n lineHeight={MAP_LABEL_LINE_HEIGHT}\n scale={[1, -1, 1]}\n >\n {shape.label.text}\n </Text>\n </group>\n );\n })}\n {entranceIcons.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const cx = (box.minX + box.maxX) / 2 + (shape.label.offsetX ?? 0);\n const cy = (box.minY + box.maxY) / 2 + (shape.label.offsetY ?? 0);\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n const size = shape.label.size || DEFAULT_ENTRANCE_SIZE;\n const url = entranceIconDataUrl(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n );\n if (!url) return null;\n return (\n <AssignmentImageOverlay\n key={`entrance-${shape.id}`}\n url={url}\n width={size}\n position={[cx, cy, 0.18]}\n rotation={tilt}\n />\n );\n })}\n {overlays.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const cx = (box.minX + box.maxX) / 2 + (shape.label.offsetX ?? 0);\n const cy = (box.minY + box.maxY) / 2 + (shape.label.offsetY ?? 0);\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n const fontSize = shape.label.size || shape.assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n const z = extrude > 0 ? extrude + 0.15 : 0.2;\n const iconColor = resolvedAssignmentIconColor(\n shape.assignment,\n theme,\n shape.label.color,\n shape.kind,\n );\n const imageKey =\n assignmentOverlayImageUrl(shape.assignment, null, shape.label) ??\n assignmentSpecialIconDataUrl(\n shape.assignment,\n amenities,\n iconColor,\n );\n const text = shape.label.text?.trim();\n const align = normalizeLabelAlign(shape.label.align);\n const position: [number, number, number] = [cx, cy, z];\n return (\n <React.Fragment key={`overlay-${shape.id}`}>\n {imageKey ? (\n <AssignmentImageOverlay\n url={imageKey}\n width={assignmentOverlayRenderSize(fontSize, shape.assignment)}\n position={position}\n rotation={tilt}\n imageProxyUrl={imageProxyUrl}\n />\n ) : (\n <Text\n font={MAP_FONT_URL}\n position={position}\n rotation={[0, 0, tilt]}\n fontSize={fontSize}\n color={iconColor}\n anchorX=\"center\"\n anchorY=\"middle\"\n textAlign={align}\n lineHeight={MAP_LABEL_LINE_HEIGHT}\n scale={[1, -1, 1]}\n raycast={skipRaycast}\n >\n {text}\n </Text>\n )}\n {shape.id === kioskOriginShapeId ? (\n <CurrentLocationPulse position={[cx, cy, z + 0.02]} />\n ) : null}\n </React.Fragment>\n );\n })}\n {connectorOverlays.map(({ shape, url, width, rotation, x, y }) => (\n <AssignmentImageOverlay\n key={`connector-icon-${shape.id}`}\n url={url}\n width={width}\n position={[x, y, 0.22]}\n rotation={rotation}\n />\n ))}\n <OpeningWells polygons={openings} />\n {meshes.map(({ shape, threeShapes, color, extrude }) => {\n const selectable = isViewerInteractiveShape(\n shape.kind,\n host,\n shape.assignment,\n );\n const hovered =\n selectable &&\n viewerShapeHighlighted(shape.id, hoveredShapeId, selectedShapeIds);\n const baseOpacity = viewerShapeBaseOpacity(\n shape.kind,\n shape.style.opacity,\n );\n const fillTransparent = isTransparentColor(color);\n const opacity = fillTransparent\n ? hovered\n ? 0.2\n : 0\n : viewerHoverFillOpacity(\n shape.kind,\n baseOpacity,\n hovered,\n );\n const emphasisFill = darkenShapeFill(\n fillTransparent ? theme.STORE_DEFAULT_COLOR : color,\n );\n const fill = hovered\n ? emphasisFill\n : fillTransparent\n ? '#000000'\n : color;\n return (\n <group key={shape.id}>\n {threeShapes.map((geoShape, idx) => (\n <mesh\n key={`${shape.id}-${idx}`}\n position={[0, 0, shape.zIndex * 0.01]}\n onPointerOver={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId(shape.id);\n applyViewerHoverCursor(\n eventSource?.current,\n viewerHoverCursor(shape.kind, host, shape.assignment),\n );\n publishHoverTooltip(shape, e);\n }}\n onPointerMove={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n publishHoverTooltip(shape, e);\n }}\n onPointerOut={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId((id) => (id === shape.id ? null : id));\n applyViewerHoverCursor(eventSource?.current, '');\n if (showHoverTooltip) {\n onHoverTooltip?.(null, { leavingShapeId: shape.id });\n }\n }}\n onPointerDown={(e) => {\n const additive = Boolean(\n e.shiftKey ||\n (e.nativeEvent as MouseEvent | undefined)?.shiftKey,\n );\n if (additive) e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n const maxDist = pointerGestureRef?.current.maxDist ?? 0;\n if (!viewerPointerClickIsTap(maxDist, e.delta)) return;\n if (selectable) {\n onSelectShape?.(shape.id, {\n additive: Boolean(\n e.shiftKey ||\n (e.nativeEvent as MouseEvent | undefined)?.shiftKey,\n ),\n });\n return;\n }\n onSelectShape?.(null);\n }}\n >\n {extrude > 0 ? (\n <extrudeGeometry\n args={[\n geoShape,\n { depth: extrude, bevelEnabled: false },\n ]}\n />\n ) : (\n <shapeGeometry args={[geoShape]} />\n )}\n <meshBasicMaterial\n color={fill}\n transparent={\n shape.style.transparent ||\n shape.kind === 'amenity' ||\n opacity < 1\n }\n opacity={opacity}\n side={THREE.DoubleSide}\n />\n {hovered ? (\n <HoverOutline\n shape={geoShape}\n extrude={extrude}\n color={emphasisFill}\n />\n ) : null}\n </mesh>\n ))}\n </group>\n );\n })}\n </group>\n );\n}\n\nfunction skipRaycast() {}\n\nfunction loadCanvasTexture(\n url: string,\n signal?: AbortSignal,\n): Promise<{ texture: THREE.CanvasTexture; aspect: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const cleanup = () => {\n signal?.removeEventListener('abort', onAbort);\n img.onload = null;\n img.onerror = null;\n };\n const onAbort = () => {\n cleanup();\n img.src = '';\n reject(new DOMException('Image load aborted', 'AbortError'));\n };\n if (signal?.aborted) {\n onAbort();\n return;\n }\n signal?.addEventListener('abort', onAbort, { once: true });\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n cleanup();\n const width = img.naturalWidth || img.width;\n const height = img.naturalHeight || img.height;\n if (!width || !height) {\n reject(new Error('empty image'));\n return;\n }\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('canvas'));\n return;\n }\n ctx.drawImage(img, 0, 0);\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.needsUpdate = true;\n resolve({ texture, aspect: height / width });\n };\n img.onerror = () => {\n cleanup();\n reject(new Error(`Failed to load ${url}`));\n };\n img.src = url;\n });\n}\n\nfunction AssignmentImageOverlay({\n url,\n width,\n position,\n rotation,\n imageProxyUrl,\n}: {\n url: string;\n width: number;\n position: [number, number, number];\n rotation: number;\n imageProxyUrl?: string | null;\n}) {\n const [texture, setTexture] = useState<THREE.CanvasTexture | null>(null);\n const [aspect, setAspect] = useState(1);\n\n useEffect(() => {\n let disposed = false;\n let loaded: THREE.CanvasTexture | null = null;\n const controller = new AbortController();\n setTexture(null);\n const proxied = resolveFetchUrl(url, imageProxyUrl);\n const candidates = proxied === url ? [url] : [proxied, url];\n const load = async () => {\n let lastError: unknown;\n for (const src of candidates) {\n try {\n const next = await loadCanvasTexture(src, controller.signal);\n if (disposed) {\n next.texture.dispose();\n return;\n }\n loaded = next.texture;\n setAspect(next.aspect);\n setTexture(next.texture);\n return;\n } catch (error) {\n if (controller.signal.aborted) return;\n lastError = error;\n }\n }\n if (!disposed) {\n setTexture(null);\n if (lastError) console.warn('Retail logo failed to load', url, lastError);\n }\n };\n void load();\n return () => {\n disposed = true;\n controller.abort();\n loaded?.dispose();\n };\n }, [url, imageProxyUrl]);\n\n if (!texture || width <= 0) return null;\n\n return (\n <mesh\n position={position}\n rotation={[0, 0, rotation]}\n scale={[1, -1, 1]}\n renderOrder={30}\n raycast={skipRaycast}\n >\n <planeGeometry args={[width, width * aspect]} />\n <meshBasicMaterial\n map={texture}\n transparent\n depthTest={false}\n depthWrite={false}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n );\n}\n","import type { PathResult, RouteCurve, Vec2 } from '../core';\n\nexport type RouteChangeIntent = 'forward' | 'back';\n\nexport interface RouteLevelChangeMarker {\n x: number;\n y: number;\n displayX: number;\n displayY: number;\n connectorId: number | null;\n targetLevelId: number;\n /** v1 label: To = continue toward the destination, From = go back. */\n direction: 'To' | 'From';\n intent: RouteChangeIntent;\n}\n\nexport const ROUTE_CHANGE_MARKER_GAP = 44;\nexport const ROUTE_CHANGE_MARKER_CLUSTER = 8;\n\nexport function routeOriginLevelId(\n route: PathResult | null | undefined,\n): number | null {\n return route?.points[0]?.levelId ?? null;\n}\n\n/** Pin the camera to the start floor only when the trip itself changes. */\nexport function shouldPinViewToRouteOrigin(\n previousFrom: number | null,\n previousTo: number | null,\n nextFrom: number | null,\n nextTo: number | null,\n): boolean {\n if (nextFrom == null || nextTo == null) return false;\n return previousFrom !== nextFrom || previousTo !== nextTo;\n}\n\nexport function routeVisitedLevelIds(route: PathResult): number[] {\n const ids: number[] = [];\n for (const point of route.points) {\n if (ids[ids.length - 1] !== point.levelId) ids.push(point.levelId);\n }\n return ids;\n}\n\nexport function routeChangeLabel(\n intent: RouteChangeIntent,\n floorName: string,\n): string {\n return intent === 'forward' ? `Continue to ${floorName}` : `Back to ${floorName}`;\n}\n\nexport function routePointsOnLevel(\n route: PathResult,\n levelId: number,\n): Vec2[] {\n return route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => ({ x: point.x, y: point.y }));\n}\n\nexport interface RouteDrawSpan {\n from: Vec2;\n to: Vec2;\n curve: RouteCurve | null;\n}\n\n/** Contiguous curved walks on one floor. A later revisit starts a new group. */\nexport function routeSpanGroupsForLevel(\n route: PathResult,\n levelId: number,\n): RouteDrawSpan[][] {\n const groups: RouteDrawSpan[][] = [];\n let current: RouteDrawSpan[] = [];\n for (let index = 1; index < route.points.length; index += 1) {\n const from = route.points[index - 1];\n const to = route.points[index];\n if (from.levelId === levelId && to.levelId === levelId) {\n current.push({\n from: { x: from.x, y: from.y },\n to: { x: to.x, y: to.y },\n curve: route.curves?.[index - 1] ?? null,\n });\n continue;\n }\n if (current.length > 0) {\n groups.push(current);\n current = [];\n }\n }\n if (current.length > 0) groups.push(current);\n return groups;\n}\n\n/** Contiguous walks on one floor — a later revisit starts a new segment. */\nexport function routeSegmentsForLevel(\n route: PathResult,\n levelId: number,\n): Vec2[][] {\n const segments: Vec2[][] = [];\n let current: Vec2[] = [];\n for (const point of route.points) {\n if (point.levelId === levelId) {\n current.push({ x: point.x, y: point.y });\n continue;\n }\n if (current.length > 0) {\n segments.push(current);\n current = [];\n }\n }\n if (current.length > 0) segments.push(current);\n return segments;\n}\n\nfunction markerDistance(a: Vec2, b: Vec2): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\n\nexport function layoutRouteLevelChangeMarkers<\n T extends { x: number; y: number; intent: RouteChangeIntent },\n>(markers: T[]): Array<T & { displayX: number; displayY: number }> {\n const placed = markers.map((marker) => ({\n ...marker,\n displayX: marker.x,\n displayY: marker.y,\n }));\n const used = new Set<number>();\n\n for (let i = 0; i < placed.length; i += 1) {\n if (used.has(i)) continue;\n const group = [i];\n for (let j = i + 1; j < placed.length; j += 1) {\n if (used.has(j)) continue;\n if (markerDistance(placed[i], placed[j]) <= ROUTE_CHANGE_MARKER_CLUSTER) {\n group.push(j);\n }\n }\n for (const index of group) used.add(index);\n\n if (group.length === 1) continue;\n\n const ordered = [...group].sort((a, b) => {\n const rank = (intent: RouteChangeIntent) => (intent === 'back' ? 0 : 1);\n return rank(placed[a].intent) - rank(placed[b].intent);\n });\n const span = ROUTE_CHANGE_MARKER_GAP * (ordered.length - 1);\n ordered.forEach((index, offset) => {\n placed[index].displayX =\n placed[index].x - span / 2 + offset * ROUTE_CHANGE_MARKER_GAP;\n placed[index].displayY = placed[index].y;\n });\n }\n\n return placed;\n}\n\nexport function routeLevelChangeMarkers(\n route: PathResult,\n levelId: number,\n): RouteLevelChangeMarker[] {\n const raw: Array<Omit<RouteLevelChangeMarker, 'displayX' | 'displayY'>> = [];\n let changeIndex = 0;\n for (let index = 1; index < route.points.length; index += 1) {\n const from = route.points[index - 1];\n const to = route.points[index];\n if (from.levelId === to.levelId) continue;\n const change = route.levelChanges[changeIndex];\n changeIndex += 1;\n if (from.levelId === levelId) {\n raw.push({\n x: from.x,\n y: from.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: to.levelId,\n direction: 'To',\n intent: 'forward',\n });\n } else if (to.levelId === levelId) {\n raw.push({\n x: to.x,\n y: to.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: from.levelId,\n direction: 'From',\n intent: 'back',\n });\n }\n }\n return layoutRouteLevelChangeMarkers(raw);\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { Html } from '@react-three/drei';\nimport * as THREE from 'three';\nimport type { CmConnector, PathResult, RouteCurve } from '../../core';\nimport { routeEdgeLength } from '../../core';\nimport {\n DEFAULT_THEME,\n isTransparentColor,\n isVerticalRouteConnectorKind,\n} from '../../core';\nimport {\n connectorMapIconDataUrl,\n levelTravel,\n} from '../../specialIcons';\nimport {\n routeChangeLabel,\n routeLevelChangeMarkers,\n routePointsOnLevel,\n routeSpanGroupsForLevel,\n type RouteLevelChangeMarker,\n} from '../routeFloorChanges';\n\nexport const V1_ROUTE_COLOR = '#4ea5ff';\nexport const V1_ROUTE_RADIUS = 6;\nexport const V1_ROUTE_TUBULAR_SEGMENTS = 400;\nexport const V1_ROUTE_RADIAL_SEGMENTS = 8;\nexport const V1_ROUTE_REVEAL_MS = 1000;\nexport const V1_ROUTE_TEXTURE_MS = 2000;\n\nexport {\n routeChangeLabel,\n routeLevelChangeMarkers,\n routeSegmentsForLevel,\n routeSpanGroupsForLevel,\n type RouteDrawSpan,\n type RouteLevelChangeMarker,\n} from '../routeFloorChanges';\n\nexport function routePointsForLevel(\n route: PathResult,\n levelId: number,\n): THREE.Vector3[] {\n return routePointsOnLevel(route, levelId).map(\n (point) => new THREE.Vector3(point.x, point.y, 0),\n );\n}\n\nexport function resolveRouteColor(color?: string | null): string {\n if (!color || isTransparentColor(color)) return V1_ROUTE_COLOR;\n return color;\n}\n\nexport const ROUTE_CHANGE_RING_COLOR = '#444444';\n\nexport function resolveRouteChangeCircleColor(): string {\n return ROUTE_CHANGE_RING_COLOR;\n}\n\nexport function resolveRouteThickness(thickness?: number | null): number {\n if (thickness == null || !Number.isFinite(thickness) || thickness <= 0) {\n return DEFAULT_THEME.ROUTE_THICKNESS;\n }\n return thickness;\n}\n\nconst _routeScale = new THREE.Vector3();\nconst _routeWorldPoint = new THREE.Vector3();\n\n/**\n * World-space tube radius that keeps `screenRadius` pixels on screen.\n * Orthographic: `1 / zoom` world units per CSS pixel.\n * Perspective: uses vertical fov, camera distance, and viewport height.\n * `worldScale` undoes a parent level transform so the line stays the same\n * after the group scale is applied.\n */\nexport function routeWorldRadiusForView(options: {\n screenRadius: number;\n orthoZoom?: number;\n perspectiveFov?: number;\n perspectiveDistance?: number;\n viewportHeight?: number;\n worldScale?: number;\n}): number {\n const screenRadius = Math.max(options.screenRadius, 0);\n let world = screenRadius;\n const zoom = options.orthoZoom;\n if (zoom != null && Number.isFinite(zoom) && zoom > 0) {\n world = screenRadius / zoom;\n } else if (\n options.perspectiveFov != null &&\n options.perspectiveDistance != null &&\n options.viewportHeight != null &&\n options.perspectiveFov > 0 &&\n options.perspectiveDistance > 0 &&\n options.viewportHeight > 0\n ) {\n const worldHeight =\n 2 *\n Math.tan((options.perspectiveFov * Math.PI) / 360) *\n options.perspectiveDistance;\n world = (screenRadius * worldHeight) / options.viewportHeight;\n }\n const scale = Math.abs(options.worldScale ?? 1);\n return world / Math.max(scale, 1e-6);\n}\n\nexport function routeWorldRadiusForCamera(\n camera: THREE.Camera,\n screenRadius: number,\n viewportHeight: number,\n worldScale: number,\n samplePoint?: THREE.Vector3,\n): number {\n if (camera instanceof THREE.OrthographicCamera) {\n return routeWorldRadiusForView({\n screenRadius,\n orthoZoom: camera.zoom,\n worldScale,\n });\n }\n if (camera instanceof THREE.PerspectiveCamera) {\n const distance = samplePoint\n ? camera.position.distanceTo(samplePoint)\n : camera.position.length();\n return routeWorldRadiusForView({\n screenRadius,\n perspectiveFov: camera.fov,\n perspectiveDistance: Math.max(distance, 1e-6),\n viewportHeight,\n worldScale,\n });\n }\n return routeWorldRadiusForView({ screenRadius, worldScale });\n}\n\n/** Tube vertices sit `baseRadius` along their normals from the path. */\nexport function applyRouteTubeRadius(\n geometry: THREE.BufferGeometry,\n basePositions: ArrayLike<number>,\n baseRadius: number,\n targetRadius: number,\n): void {\n const position = geometry.getAttribute('position');\n const normal = geometry.getAttribute('normal');\n if (!position || !normal) return;\n const delta = targetRadius - baseRadius;\n for (let i = 0; i < position.count; i += 1) {\n const i3 = i * 3;\n position.setXYZ(\n i,\n basePositions[i3] + normal.getX(i) * delta,\n basePositions[i3 + 1] + normal.getY(i) * delta,\n basePositions[i3 + 2] + normal.getZ(i) * delta,\n );\n }\n position.needsUpdate = true;\n}\n\nfunction createRouteTexture(distance: number, color: string): THREE.CanvasTexture {\n const canvas = document.createElement('canvas');\n const width = Math.max(1, Math.floor(distance));\n canvas.width = width;\n canvas.height = 80;\n const context = canvas.getContext('2d');\n\n if (context) {\n context.fillStyle = color;\n context.fillRect(0, 0, width, canvas.height);\n\n const gradientWidth = Math.min(120, Math.max(60, distance * 0.1));\n const gradient = context.createLinearGradient(0, 0, gradientWidth, 0);\n gradient.addColorStop(0, color);\n gradient.addColorStop(0.4, 'white');\n gradient.addColorStop(0.6, 'white');\n gradient.addColorStop(1, color);\n context.fillStyle = gradient;\n context.fillRect(10, 0, gradientWidth, canvas.height);\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.offset.x = 1;\n texture.colorSpace = THREE.SRGBColorSpace;\n return texture;\n}\n\nfunction easeInOutCubic(value: number): number {\n const x = Math.min(1, Math.max(0, value));\n return x < 0.5 ? 4 * x ** 3 : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nfunction RouteTube({\n spans,\n color,\n radius,\n}: {\n spans: Array<{\n from: THREE.Vector3;\n to: THREE.Vector3;\n curve: RouteCurve | null;\n }>;\n color: string;\n radius: number;\n}) {\n const invalidate = useThree((state) => state.invalidate);\n const camera = useThree((state) => state.camera);\n const viewportHeight = useThree((state) => state.size.height);\n const meshRef = useRef<THREE.Mesh>(null);\n const animationStartedAt = useRef(0);\n const appliedRadius = useRef<number | null>(null);\n const routeShape = useMemo(() => {\n if (spans.length === 0) return null;\n const path = new THREE.CurvePath<THREE.Vector3>();\n let distance = 0;\n for (const span of spans) {\n if (span.curve) {\n path.add(\n new THREE.CubicBezierCurve3(\n span.from,\n new THREE.Vector3(span.curve.c1.x, span.curve.c1.y, span.from.z),\n new THREE.Vector3(span.curve.c2.x, span.curve.c2.y, span.to.z),\n span.to,\n ),\n );\n distance += routeEdgeLength(\n { x: span.from.x, y: span.from.y },\n { x: span.to.x, y: span.to.y },\n span.curve,\n );\n } else {\n path.add(new THREE.LineCurve3(span.from, span.to));\n distance += span.from.distanceTo(span.to);\n }\n }\n const geometry = new THREE.TubeGeometry(\n path,\n V1_ROUTE_TUBULAR_SEGMENTS,\n radius,\n V1_ROUTE_RADIAL_SEGMENTS,\n );\n geometry.setDrawRange(0, 0);\n return {\n distance,\n geometry,\n texture: createRouteTexture(distance, color),\n basePositions: new Float32Array(geometry.attributes.position.array),\n baseRadius: radius,\n };\n }, [color, radius, spans]);\n\n const syncScreenRadius = () => {\n const mesh = meshRef.current;\n if (!routeShape || !mesh) return;\n const worldScale = Math.abs(mesh.getWorldScale(_routeScale).x);\n _routeWorldPoint.copy(spans[0].from);\n mesh.localToWorld(_routeWorldPoint);\n const target = routeWorldRadiusForCamera(\n camera,\n radius,\n viewportHeight,\n worldScale,\n _routeWorldPoint,\n );\n if (appliedRadius.current === target) return;\n applyRouteTubeRadius(\n routeShape.geometry,\n routeShape.basePositions,\n routeShape.baseRadius,\n target,\n );\n appliedRadius.current = target;\n };\n\n useLayoutEffect(() => {\n appliedRadius.current = null;\n syncScreenRadius();\n }, [camera, radius, routeShape, viewportHeight]);\n\n useEffect(() => {\n if (!routeShape) return;\n animationStartedAt.current = performance.now();\n routeShape.geometry.setDrawRange(0, 0);\n routeShape.texture.offset.x = 1;\n invalidate();\n return () => {\n routeShape.geometry.dispose();\n routeShape.texture.dispose();\n };\n }, [invalidate, routeShape]);\n\n useFrame(() => {\n if (!routeShape) return;\n syncScreenRadius();\n const elapsed = performance.now() - animationStartedAt.current;\n const indexCount = routeShape.geometry.index?.count ?? 0;\n if (elapsed < V1_ROUTE_REVEAL_MS) {\n const progress = easeInOutCubic(elapsed / V1_ROUTE_REVEAL_MS);\n routeShape.geometry.setDrawRange(0, Math.floor(progress * indexCount));\n } else {\n routeShape.geometry.setDrawRange(0, indexCount);\n const progress = (elapsed / V1_ROUTE_TEXTURE_MS) % 1;\n routeShape.texture.offset.x = 0.1 - 1.1 * easeInOutCubic(progress);\n }\n invalidate();\n });\n\n if (!routeShape) return null;\n return (\n <mesh ref={meshRef} geometry={routeShape.geometry} renderOrder={20}>\n <meshBasicMaterial\n map={routeShape.texture}\n transparent\n side={THREE.DoubleSide}\n depthTest={false}\n depthWrite={false}\n />\n </mesh>\n );\n}\n\nfunction RouteChangeButton({\n change,\n levelId,\n levels,\n connectors,\n color,\n onActiveLevelChange,\n}: {\n change: RouteLevelChangeMarker;\n levelId: number;\n levels?: ReadonlyArray<{\n id: number;\n name: string;\n levelIndex?: number;\n ordering?: number;\n }>;\n connectors?: readonly CmConnector[];\n color: string;\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const connector = connectors?.find((item) => item.id === change.connectorId);\n const iconKind = isVerticalRouteConnectorKind(connector?.kind)\n ? connector.kind\n : null;\n const here = levels?.find((item) => item.id === levelId);\n const there = levels?.find((item) => item.id === change.targetLevelId);\n const travel =\n iconKind === 'escalator' && here && there\n ? levelTravel(here, there)\n : null;\n const icon = iconKind\n ? connectorMapIconDataUrl(iconKind, true, '#ffffff', travel)\n : undefined;\n const targetName =\n levels?.find((level) => level.id === change.targetLevelId)?.name ??\n String(change.targetLevelId);\n const label = routeChangeLabel(change.intent, targetName);\n const ringColor = resolveRouteChangeCircleColor();\n return (\n <Html\n position={[change.displayX, change.displayY, 7]}\n zIndexRange={[30, 20]}\n style={{ pointerEvents: 'none' }}\n >\n <button\n type=\"button\"\n className={`eyeon-map-route-change eyeon-map-route-change--${change.intent}`}\n style={\n {\n backgroundColor: color,\n borderColor: ringColor,\n '--eyeon-route-change-intent': ringColor,\n pointerEvents: 'auto',\n } as React.CSSProperties\n }\n aria-label={label}\n onClick={(event) => {\n event.stopPropagation();\n onActiveLevelChange?.(change.targetLevelId);\n }}\n >\n <span className=\"eyeon-map-route-change__icon\">\n {icon ? <img src={icon} alt=\"\" /> : <span aria-hidden>↕</span>}\n </span>\n <span className=\"eyeon-map-route-change__intent\" aria-hidden>\n {change.intent === 'forward' ? '→' : '←'}\n </span>\n <span className=\"eyeon-map-hover-tooltip eyeon-map-route-change__tooltip\">\n <span className=\"eyeon-map-hover-tooltip__pop\">\n <span className=\"eyeon-map-hover-tooltip__label\">{label}</span>\n <span className=\"eyeon-map-hover-tooltip__arrow\" aria-hidden=\"true\" />\n </span>\n </span>\n </button>\n </Html>\n );\n}\n\nexport function RouteLine({\n route,\n levelId,\n levels,\n connectors,\n color,\n thickness,\n onActiveLevelChange,\n}: {\n route: PathResult;\n levelId: number;\n levels?: ReadonlyArray<{\n id: number;\n name: string;\n levelIndex?: number;\n ordering?: number;\n }>;\n connectors?: readonly CmConnector[];\n color?: string;\n thickness?: number;\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const routeColor = resolveRouteColor(color);\n const routeRadius = resolveRouteThickness(thickness);\n const spanGroups = useMemo(\n () =>\n routeSpanGroupsForLevel(route, levelId).map((group) =>\n group.map((span) => ({\n from: new THREE.Vector3(span.from.x, span.from.y, 0),\n to: new THREE.Vector3(span.to.x, span.to.y, 0),\n curve: span.curve,\n })),\n ),\n [levelId, route],\n );\n const levelChanges = useMemo(\n () => routeLevelChangeMarkers(route, levelId),\n [levelId, route],\n );\n\n if (spanGroups.length === 0 && levelChanges.length === 0) {\n return null;\n }\n\n return (\n <>\n {spanGroups.map((spans, index) =>\n spans.length > 0 ? (\n <RouteTube\n key={`route-seg-${levelId}-${index}`}\n spans={spans}\n color={routeColor}\n radius={routeRadius}\n />\n ) : null,\n )}\n {levelChanges.map((change, index) => (\n <RouteChangeButton\n key={`${change.intent}-${change.targetLevelId}-${index}`}\n change={change}\n levelId={levelId}\n levels={levels}\n connectors={connectors}\n color={routeColor}\n onActiveLevelChange={onActiveLevelChange}\n />\n ))}\n </>\n );\n}\n","import {\n\tBox2,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tMatrix3,\n\tPath,\n\tShape,\n\tShapePath,\n\tShapeUtils,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst COLOR_SPACE_SVG = SRGBColorSpace;\n\n/**\n * A loader for the SVG format.\n *\n * Scalable Vector Graphics is an XML-based vector image format for two-dimensional graphics\n * with support for interactivity and animation.\n *\n * ```js\n * const loader = new SVGLoader();\n * const data = await loader.loadAsync( 'data/svgSample.svg' );\n *\n * const paths = data.paths;\n * const group = new THREE.Group();\n *\n * for ( let i = 0; i < paths.length; i ++ ) {\n *\n * \tconst path = paths[ i ];\n * \tconst material = new THREE.MeshBasicMaterial( {\n * \t\tcolor: path.color,\n * \t\tside: THREE.DoubleSide,\n * \t\tdepthWrite: false\n * \t} );\n *\n * \tconst shapes = SVGLoader.createShapes( path );\n *\n * \tfor ( let j = 0; j < shapes.length; j ++ ) {\n *\n * \t\tconst shape = shapes[ j ];\n * \t\tconst geometry = new THREE.ShapeGeometry( shape );\n * \t\tconst mesh = new THREE.Mesh( geometry, material );\n * \t\tgroup.add( mesh );\n *\n * \t}\n *\n * }\n *\n * scene.add( group );\n * ```\n *\n * @augments Loader\n * @three_import import { SVGLoader } from 'three/addons/loaders/SVGLoader.js';\n */\nclass SVGLoader extends Loader {\n\n\t/**\n\t * Constructs a new SVG loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Default dots per inch.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 90\n\t\t */\n\t\tthis.defaultDPI = 90;\n\n\t\t/**\n\t\t * Default unit.\n\t\t *\n\t\t * @type {('mm'|'cm'|'in'|'pt'|'pc'|'px')}\n\t\t * @default 'px'\n\t\t */\n\t\tthis.defaultUnit = 'px';\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded SVG asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({paths:Array<ShapePath>,xml:string})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given SVG data and returns the resulting data.\n\t *\n\t * @param {string} text - The raw SVG data as a string.\n\t * @return {{paths:Array<ShapePath>,xml:string}} An object holding an array of shape paths and the\n\t * SVG XML document.\n\t */\n\tparse( text ) {\n\n\t\tconst scope = this;\n\n\t\tfunction parseNode( node, style ) {\n\n\t\t\tif ( node.nodeType !== 1 ) return;\n\n\t\t\tconst transform = getNodeTransform( node );\n\n\t\t\tlet isDefsNode = false;\n\n\t\t\tlet path = null;\n\n\t\t\tswitch ( node.nodeName ) {\n\n\t\t\t\tcase 'svg':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'style':\n\t\t\t\t\tparseCSSStylesheet( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'g':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'path':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tif ( node.hasAttribute( 'd' ) ) path = parsePathNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rect':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseRectNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polygon':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolygonNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polyline':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolylineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'circle':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseCircleNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ellipse':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseEllipseNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'line':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseLineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'defs':\n\t\t\t\t\tisDefsNode = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'use':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\n\t\t\t\t\tconst href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || '';\n\t\t\t\t\tconst usedNodeId = href.substring( 1 );\n\t\t\t\t\tconst usedNode = node.viewportElement.getElementById( usedNodeId );\n\t\t\t\t\tif ( usedNode ) {\n\n\t\t\t\t\t\tparseNode( usedNode, style );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'SVGLoader: \\'use node\\' references non-existent node id: ' + usedNodeId );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// console.log( node );\n\n\t\t\t}\n\n\t\t\tif ( path ) {\n\n\t\t\t\tif ( style.fill !== undefined && style.fill !== 'none' ) {\n\n\t\t\t\t\tpath.color.setStyle( style.fill, COLOR_SPACE_SVG );\n\n\t\t\t\t}\n\n\t\t\t\ttransformPath( path, currentTransform );\n\n\t\t\t\tpaths.push( path );\n\n\t\t\t\tpath.userData = { node: node, style: style };\n\n\t\t\t}\n\n\t\t\tconst childNodes = node.childNodes;\n\n\t\t\tfor ( let i = 0; i < childNodes.length; i ++ ) {\n\n\t\t\t\tconst node = childNodes[ i ];\n\n\t\t\t\tif ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) {\n\n\t\t\t\t\t// Ignore everything in defs except CSS style definitions\n\t\t\t\t\t// and nested defs, because it is OK by the standard to have\n\t\t\t\t\t// <style/> there.\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tparseNode( node, style );\n\n\t\t\t}\n\n\n\t\t\tif ( transform ) {\n\n\t\t\t\ttransformStack.pop();\n\n\t\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\t\tcurrentTransform.copy( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePathNode( node ) {\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tconst point = new Vector2();\n\t\t\tconst control = new Vector2();\n\n\t\t\tconst firstPoint = new Vector2();\n\t\t\tlet isFirstPoint = true;\n\t\t\tlet doSetFirstPoint = false;\n\n\t\t\tconst d = node.getAttribute( 'd' );\n\n\t\t\tif ( d === '' || d === 'none' ) return null;\n\n\t\t\t// console.log( d );\n\n\t\t\tconst commands = d.match( /[a-df-z][^a-df-z]*/ig );\n\n\t\t\tfor ( let i = 0, l = commands.length; i < l; i ++ ) {\n\n\t\t\t\tconst command = commands[ i ];\n\n\t\t\t\tconst type = command.charAt( 0 );\n\t\t\t\tconst data = command.slice( 1 ).trim();\n\n\t\t\t\tif ( isFirstPoint === true ) {\n\n\t\t\t\t\tdoSetFirstPoint = true;\n\t\t\t\t\tisFirstPoint = false;\n\n\t\t\t\t}\n\n\t\t\t\tlet numbers;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'H':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'V':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 4 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'S':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'T':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if start point == end point\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == point.x && numbers[ j + 6 ] == point.y ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'h':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 4 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = point.y + numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if no displacement\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == 0 && numbers[ j + 6 ] == 0 ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\t\t\t\tif ( path.currentPath.curves.length > 0 ) {\n\n\t\t\t\t\t\t\t// Reset point to beginning of Path\n\t\t\t\t\t\t\tpoint.copy( firstPoint );\n\t\t\t\t\t\t\tpath.currentPath.currentPoint.copy( point );\n\t\t\t\t\t\t\tisFirstPoint = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( command );\n\n\t\t\t\t}\n\n\t\t\t\t// console.log( type, parseFloats( data ), parseFloats( data ).length )\n\n\t\t\t\tdoSetFirstPoint = false;\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCSSStylesheet( node ) {\n\n\t\t\tif ( ! node.sheet || ! node.sheet.cssRules || ! node.sheet.cssRules.length ) return;\n\n\t\t\tfor ( let i = 0; i < node.sheet.cssRules.length; i ++ ) {\n\n\t\t\t\tconst stylesheet = node.sheet.cssRules[ i ];\n\n\t\t\t\tif ( stylesheet.type !== 1 ) continue;\n\n\t\t\t\tconst selectorList = stylesheet.selectorText\n\t\t\t\t\t.split( /,/gm )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let j = 0; j < selectorList.length; j ++ ) {\n\n\t\t\t\t\t// Remove empty rules\n\t\t\t\t\tconst definitions = Object.fromEntries(\n\t\t\t\t\t\tObject.entries( stylesheet.style ).filter( ( [ , v ] ) => v !== '' )\n\t\t\t\t\t);\n\n\t\t\t\t\tstylesheets[ selectorList[ j ] ] = Object.assign(\n\t\t\t\t\t\tstylesheets[ selectorList[ j ] ] || {},\n\t\t\t\t\t\tdefinitions\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n\t\t * https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion\n\t\t * From\n\t\t * rx ry x-axis-rotation large-arc-flag sweep-flag x y\n\t\t * To\n\t\t * aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation\n\t\t */\n\n\t\tfunction parseArcCommand( path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end ) {\n\n\t\t\tif ( rx == 0 || ry == 0 ) {\n\n\t\t\t\t// draw a line if either of the radii == 0\n\t\t\t\tpath.lineTo( end.x, end.y );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tx_axis_rotation = x_axis_rotation * Math.PI / 180;\n\n\t\t\t// Ensure radii are positive\n\t\t\trx = Math.abs( rx );\n\t\t\try = Math.abs( ry );\n\n\t\t\t// Compute (x1', y1')\n\t\t\tconst dx2 = ( start.x - end.x ) / 2.0;\n\t\t\tconst dy2 = ( start.y - end.y ) / 2.0;\n\t\t\tconst x1p = Math.cos( x_axis_rotation ) * dx2 + Math.sin( x_axis_rotation ) * dy2;\n\t\t\tconst y1p = - Math.sin( x_axis_rotation ) * dx2 + Math.cos( x_axis_rotation ) * dy2;\n\n\t\t\t// Compute (cx', cy')\n\t\t\tlet rxs = rx * rx;\n\t\t\tlet rys = ry * ry;\n\t\t\tconst x1ps = x1p * x1p;\n\t\t\tconst y1ps = y1p * y1p;\n\n\t\t\t// Ensure radii are large enough\n\t\t\tconst cr = x1ps / rxs + y1ps / rys;\n\n\t\t\tif ( cr > 1 ) {\n\n\t\t\t\t// scale up rx,ry equally so cr == 1\n\t\t\t\tconst s = Math.sqrt( cr );\n\t\t\t\trx = s * rx;\n\t\t\t\try = s * ry;\n\t\t\t\trxs = rx * rx;\n\t\t\t\trys = ry * ry;\n\n\t\t\t}\n\n\t\t\tconst dq = ( rxs * y1ps + rys * x1ps );\n\t\t\tconst pq = ( rxs * rys - dq ) / dq;\n\t\t\tlet q = Math.sqrt( Math.max( 0, pq ) );\n\t\t\tif ( large_arc_flag === sweep_flag ) q = - q;\n\t\t\tconst cxp = q * rx * y1p / ry;\n\t\t\tconst cyp = - q * ry * x1p / rx;\n\n\t\t\t// Step 3: Compute (cx, cy) from (cx', cy')\n\t\t\tconst cx = Math.cos( x_axis_rotation ) * cxp - Math.sin( x_axis_rotation ) * cyp + ( start.x + end.x ) / 2;\n\t\t\tconst cy = Math.sin( x_axis_rotation ) * cxp + Math.cos( x_axis_rotation ) * cyp + ( start.y + end.y ) / 2;\n\n\t\t\t// Step 4: Compute θ1 and Δθ\n\t\t\tconst theta = svgAngle( 1, 0, ( x1p - cxp ) / rx, ( y1p - cyp ) / ry );\n\t\t\tconst delta = svgAngle( ( x1p - cxp ) / rx, ( y1p - cyp ) / ry, ( - x1p - cxp ) / rx, ( - y1p - cyp ) / ry ) % ( Math.PI * 2 );\n\n\t\t\tpath.currentPath.absellipse( cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation );\n\n\t\t}\n\n\t\tfunction svgAngle( ux, uy, vx, vy ) {\n\n\t\t\tconst dot = ux * vx + uy * vy;\n\t\t\tconst len = Math.sqrt( ux * ux + uy * uy ) * Math.sqrt( vx * vx + vy * vy );\n\t\t\tlet ang = Math.acos( Math.max( - 1, Math.min( 1, dot / len ) ) ); // floating point precision, slightly over values appear\n\t\t\tif ( ( ux * vy - uy * vx ) < 0 ) ang = - ang;\n\t\t\treturn ang;\n\n\t\t}\n\n\t\t/*\n\t\t* According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute\n\t\t* rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough\n\t\t*/\n\n\t\tfunction parseRectNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || node.getAttribute( 'ry' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst w = parseFloatWithUnits( node.getAttribute( 'width' ) );\n\t\t\tconst h = parseFloatWithUnits( node.getAttribute( 'height' ) );\n\n\t\t\t// Ellipse arc to Bezier approximation Coefficient (Inversed). See:\n\t\t\t// https://spencermortensen.com/articles/bezier-circle/\n\t\t\tconst bci = 1 - 0.551915024494;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\t// top left\n\t\t\tpath.moveTo( x + rx, y );\n\n\t\t\t// top right\n\t\t\tpath.lineTo( x + w - rx, y );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry * bci,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom right\n\t\t\tpath.lineTo( x + w, y + h - ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx + w - rx,\n\t\t\t\t\ty + h\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom left\n\t\t\tpath.lineTo( x + rx, y + h );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// back to top left\n\t\t\tpath.lineTo( x, y + ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo( x, y + ry * bci, x + rx * bci, y, x + rx, y );\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolygonNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolylineNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCircleNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst r = parseFloatWithUnits( node.getAttribute( 'r' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absarc( x, y, r, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseEllipseNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseLineNode( node ) {\n\n\t\t\tconst x1 = parseFloatWithUnits( node.getAttribute( 'x1' ) || 0 );\n\t\t\tconst y1 = parseFloatWithUnits( node.getAttribute( 'y1' ) || 0 );\n\t\t\tconst x2 = parseFloatWithUnits( node.getAttribute( 'x2' ) || 0 );\n\t\t\tconst y2 = parseFloatWithUnits( node.getAttribute( 'y2' ) || 0 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.moveTo( x1, y1 );\n\t\t\tpath.lineTo( x2, y2 );\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction parseStyle( node, style ) {\n\n\t\t\tstyle = Object.assign( {}, style ); // clone style\n\n\t\t\tlet stylesheetStyles = {};\n\n\t\t\tif ( node.hasAttribute( 'class' ) ) {\n\n\t\t\t\tconst classSelectors = node.getAttribute( 'class' )\n\t\t\t\t\t.split( /\\s/ )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let i = 0; i < classSelectors.length; i ++ ) {\n\n\t\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'id' ) ) {\n\n\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );\n\n\t\t\t}\n\n\t\t\tfunction addStyle( svgName, jsName, adjustFunction ) {\n\n\t\t\t\tif ( adjustFunction === undefined ) adjustFunction = function copy( v ) {\n\n\t\t\t\t\tif ( v.startsWith( 'url' ) ) console.warn( 'SVGLoader: url access in attributes is not implemented.' );\n\n\t\t\t\t\treturn v;\n\n\t\t\t\t};\n\n\t\t\t\tif ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );\n\t\t\t\tif ( stylesheetStyles[ svgName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ svgName ] );\n\t\t\t\tif ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );\n\n\t\t\t}\n\n\t\t\tfunction clamp( v ) {\n\n\t\t\t\treturn Math.max( 0, Math.min( 1, parseFloatWithUnits( v ) ) );\n\n\t\t\t}\n\n\t\t\tfunction positive( v ) {\n\n\t\t\t\treturn Math.max( 0, parseFloatWithUnits( v ) );\n\n\t\t\t}\n\n\t\t\taddStyle( 'fill', 'fill' );\n\t\t\taddStyle( 'fill-opacity', 'fillOpacity', clamp );\n\t\t\taddStyle( 'fill-rule', 'fillRule' );\n\t\t\taddStyle( 'opacity', 'opacity', clamp );\n\t\t\taddStyle( 'stroke', 'stroke' );\n\t\t\taddStyle( 'stroke-opacity', 'strokeOpacity', clamp );\n\t\t\taddStyle( 'stroke-width', 'strokeWidth', positive );\n\t\t\taddStyle( 'stroke-linejoin', 'strokeLineJoin' );\n\t\t\taddStyle( 'stroke-linecap', 'strokeLineCap' );\n\t\t\taddStyle( 'stroke-miterlimit', 'strokeMiterLimit', positive );\n\t\t\taddStyle( 'visibility', 'visibility' );\n\n\t\t\treturn style;\n\n\t\t}\n\n\t\t// http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes\n\n\t\tfunction getReflection( a, b ) {\n\n\t\t\treturn a - ( b - a );\n\n\t\t}\n\n\t\t// from https://github.com/ppvg/svg-numbers (MIT License)\n\n\t\tfunction parseFloats( input, flags, stride ) {\n\n\t\t\tif ( typeof input !== 'string' ) {\n\n\t\t\t\tthrow new TypeError( 'Invalid input: ' + typeof input );\n\n\t\t\t}\n\n\t\t\t// Character groups\n\t\t\tconst RE = {\n\t\t\t\tSEPARATOR: /[ \\t\\r\\n\\,.\\-+]/,\n\t\t\t\tWHITESPACE: /[ \\t\\r\\n]/,\n\t\t\t\tDIGIT: /[\\d]/,\n\t\t\t\tSIGN: /[-+]/,\n\t\t\t\tPOINT: /\\./,\n\t\t\t\tCOMMA: /,/,\n\t\t\t\tEXP: /e/i,\n\t\t\t\tFLAGS: /[01]/\n\t\t\t};\n\n\t\t\t// States\n\t\t\tconst SEP = 0;\n\t\t\tconst INT = 1;\n\t\t\tconst FLOAT = 2;\n\t\t\tconst EXP = 3;\n\n\t\t\tlet state = SEP;\n\t\t\tlet seenComma = true;\n\t\t\tlet number = '', exponent = '';\n\t\t\tconst result = [];\n\n\t\t\tfunction throwSyntaxError( current, i, partial ) {\n\n\t\t\t\tconst error = new SyntaxError( 'Unexpected character \"' + current + '\" at index ' + i + '.' );\n\t\t\t\terror.partial = partial;\n\t\t\t\tthrow error;\n\n\t\t\t}\n\n\t\t\tfunction newNumber() {\n\n\t\t\t\tif ( number !== '' ) {\n\n\t\t\t\t\tif ( exponent === '' ) result.push( Number( number ) );\n\t\t\t\t\telse result.push( Number( number ) * Math.pow( 10, Number( exponent ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tnumber = '';\n\t\t\t\texponent = '';\n\n\t\t\t}\n\n\t\t\tlet current;\n\t\t\tconst length = input.length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tcurrent = input[ i ];\n\n\t\t\t\t// check for flags\n\t\t\t\tif ( Array.isArray( flags ) && flags.includes( result.length % stride ) && RE.FLAGS.test( current ) ) {\n\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// parse until next number\n\t\t\t\tif ( state === SEP ) {\n\n\t\t\t\t\t// eat whitespace\n\t\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// start new number\n\t\t\t\t\tif ( RE.DIGIT.test( current ) || RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tstate = INT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double commas (e.g. \"1, , 2\")\n\t\t\t\t\tif ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\t\tif ( seenComma ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tseenComma = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse integer part\n\t\t\t\tif ( state === INT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double signs (\"-+1\"), but not on sign as separator (\"-1-2\")\n\t\t\t\t\tif ( RE.SIGN.test( current )\n\t\t\t\t\t\t\t&& number.length === 1\n\t\t\t\t\t\t\t&& RE.SIGN.test( number[ 0 ] ) ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse decimal part\n\t\t\t\tif ( state === FLOAT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double decimal points (e.g. \"1..2\")\n\t\t\t\t\tif ( RE.POINT.test( current ) && number[ number.length - 1 ] === '.' ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse exponent part\n\t\t\t\tif ( state === EXP ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tif ( exponent === '' ) {\n\n\t\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( exponent.length === 1 && RE.SIGN.test( exponent ) ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// end of number\n\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = false;\n\n\t\t\t\t} else if ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = true;\n\n\t\t\t\t} else if ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else if ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add the last number found (if any)\n\t\t\tnewNumber();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// Units\n\n\t\tconst units = [ 'mm', 'cm', 'in', 'pt', 'pc', 'px' ];\n\n\t\t// Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)\n\t\tconst unitConversion = {\n\n\t\t\t'mm': {\n\t\t\t\t'mm': 1,\n\t\t\t\t'cm': 0.1,\n\t\t\t\t'in': 1 / 25.4,\n\t\t\t\t'pt': 72 / 25.4,\n\t\t\t\t'pc': 6 / 25.4,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'cm': {\n\t\t\t\t'mm': 10,\n\t\t\t\t'cm': 1,\n\t\t\t\t'in': 1 / 2.54,\n\t\t\t\t'pt': 72 / 2.54,\n\t\t\t\t'pc': 6 / 2.54,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'in': {\n\t\t\t\t'mm': 25.4,\n\t\t\t\t'cm': 2.54,\n\t\t\t\t'in': 1,\n\t\t\t\t'pt': 72,\n\t\t\t\t'pc': 6,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pt': {\n\t\t\t\t'mm': 25.4 / 72,\n\t\t\t\t'cm': 2.54 / 72,\n\t\t\t\t'in': 1 / 72,\n\t\t\t\t'pt': 1,\n\t\t\t\t'pc': 6 / 72,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pc': {\n\t\t\t\t'mm': 25.4 / 6,\n\t\t\t\t'cm': 2.54 / 6,\n\t\t\t\t'in': 1 / 6,\n\t\t\t\t'pt': 72 / 6,\n\t\t\t\t'pc': 1,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'px': {\n\t\t\t\t'px': 1\n\t\t\t}\n\n\t\t};\n\n\t\tfunction parseFloatWithUnits( string ) {\n\n\t\t\tlet theUnit = 'px';\n\n\t\t\tif ( typeof string === 'string' || string instanceof String ) {\n\n\t\t\t\tfor ( let i = 0, n = units.length; i < n; i ++ ) {\n\n\t\t\t\t\tconst u = units[ i ];\n\n\t\t\t\t\tif ( string.endsWith( u ) ) {\n\n\t\t\t\t\t\ttheUnit = u;\n\t\t\t\t\t\tstring = string.substring( 0, string.length - u.length );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet scale = undefined;\n\n\t\t\tif ( theUnit === 'px' && scope.defaultUnit !== 'px' ) {\n\n\t\t\t\t// Conversion scale from pixels to inches, then to default units\n\n\t\t\t\tscale = unitConversion[ 'in' ][ scope.defaultUnit ] / scope.defaultDPI;\n\n\t\t\t} else {\n\n\t\t\t\tscale = unitConversion[ theUnit ][ scope.defaultUnit ];\n\n\t\t\t\tif ( scale < 0 ) {\n\n\t\t\t\t\t// Conversion scale to pixels\n\n\t\t\t\t\tscale = unitConversion[ theUnit ][ 'in' ] * scope.defaultDPI;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn scale * parseFloat( string );\n\n\t\t}\n\n\t\t// Transforms\n\n\t\tfunction getNodeTransform( node ) {\n\n\t\t\tif ( ! ( node.hasAttribute( 'transform' ) || ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) ) ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst transform = parseNodeTransform( node );\n\n\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\ttransform.premultiply( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tcurrentTransform.copy( transform );\n\t\t\ttransformStack.push( transform );\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction parseNodeTransform( node ) {\n\n\t\t\tconst transform = new Matrix3();\n\t\t\tconst currentTransform = tempTransform0;\n\n\t\t\tif ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) {\n\n\t\t\t\tconst tx = parseFloatWithUnits( node.getAttribute( 'x' ) );\n\t\t\t\tconst ty = parseFloatWithUnits( node.getAttribute( 'y' ) );\n\n\t\t\t\ttransform.translate( tx, ty );\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'transform' ) ) {\n\n\t\t\t\tconst transformsTexts = node.getAttribute( 'transform' ).split( ')' );\n\n\t\t\t\tfor ( let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex -- ) {\n\n\t\t\t\t\tconst transformText = transformsTexts[ tIndex ].trim();\n\n\t\t\t\t\tif ( transformText === '' ) continue;\n\n\t\t\t\t\tconst openParPos = transformText.indexOf( '(' );\n\t\t\t\t\tconst closeParPos = transformText.length;\n\n\t\t\t\t\tif ( openParPos > 0 && openParPos < closeParPos ) {\n\n\t\t\t\t\t\tconst transformType = transformText.slice( 0, openParPos );\n\n\t\t\t\t\t\tconst array = parseFloats( transformText.slice( openParPos + 1 ) );\n\n\t\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t\t\tswitch ( transformType ) {\n\n\t\t\t\t\t\t\tcase 'translate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst tx = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet ty = 0;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tty = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.translate( tx, ty );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'rotate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tlet angle = 0;\n\t\t\t\t\t\t\t\t\tlet cx = 0;\n\t\t\t\t\t\t\t\t\tlet cy = 0;\n\n\t\t\t\t\t\t\t\t\t// Angle\n\t\t\t\t\t\t\t\t\tangle = array[ 0 ] * Math.PI / 180;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 3 ) {\n\n\t\t\t\t\t\t\t\t\t\t// Center x, y\n\t\t\t\t\t\t\t\t\t\tcx = array[ 1 ];\n\t\t\t\t\t\t\t\t\t\tcy = array[ 2 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Rotate around center (cx, cy)\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( - cx, - cy );\n\t\t\t\t\t\t\t\t\ttempTransform2.makeRotation( angle );\n\t\t\t\t\t\t\t\t\ttempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( cx, cy );\n\t\t\t\t\t\t\t\t\tcurrentTransform.multiplyMatrices( tempTransform1, tempTransform3 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'scale':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst scaleX = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet scaleY = scaleX;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tscaleY = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.scale( scaleX, scaleY );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewX':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0,\n\t\t\t\t\t\t\t\t\t\t0, 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewY':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, 0, 0,\n\t\t\t\t\t\t\t\t\t\tMath.tan( array[ 0 ] * Math.PI / 180 ), 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'matrix':\n\n\t\t\t\t\t\t\t\tif ( array.length === 6 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\tarray[ 0 ], array[ 2 ], array[ 4 ],\n\t\t\t\t\t\t\t\t\t\tarray[ 1 ], array[ 3 ], array[ 5 ],\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttransform.premultiply( currentTransform );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction transformPath( path, m ) {\n\n\t\t\tfunction transfVec2( v2 ) {\n\n\t\t\t\ttempV3.set( v2.x, v2.y, 1 ).applyMatrix3( m );\n\n\t\t\t\tv2.set( tempV3.x, tempV3.y );\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseGeneric( curve ) {\n\n\t\t\t\t// For math description see:\n\t\t\t\t// https://math.stackexchange.com/questions/4544164\n\n\t\t\t\tconst a = curve.xRadius;\n\t\t\t\tconst b = curve.yRadius;\n\n\t\t\t\tconst cosTheta = Math.cos( curve.aRotation );\n\t\t\t\tconst sinTheta = Math.sin( curve.aRotation );\n\n\t\t\t\tconst v1 = new Vector3( a * cosTheta, a * sinTheta, 0 );\n\t\t\t\tconst v2 = new Vector3( - b * sinTheta, b * cosTheta, 0 );\n\n\t\t\t\tconst f1 = v1.applyMatrix3( m );\n\t\t\t\tconst f2 = v2.applyMatrix3( m );\n\n\t\t\t\tconst mF = tempTransform0.set(\n\t\t\t\t\tf1.x, f2.x, 0,\n\t\t\t\t\tf1.y, f2.y, 0,\n\t\t\t\t\t0, 0, 1,\n\t\t\t\t);\n\n\t\t\t\tconst mFInv = tempTransform1.copy( mF ).invert();\n\t\t\t\tconst mFInvT = tempTransform2.copy( mFInv ).transpose();\n\t\t\t\tconst mQ = mFInvT.multiply( mFInv );\n\t\t\t\tconst mQe = mQ.elements;\n\n\t\t\t\tconst ed = eigenDecomposition( mQe[ 0 ], mQe[ 1 ], mQe[ 4 ] );\n\t\t\t\tconst rt1sqrt = Math.sqrt( ed.rt1 );\n\t\t\t\tconst rt2sqrt = Math.sqrt( ed.rt2 );\n\n\t\t\t\tcurve.xRadius = 1 / rt1sqrt;\n\t\t\t\tcurve.yRadius = 1 / rt2sqrt;\n\t\t\t\tcurve.aRotation = Math.atan2( ed.sn, ed.cs );\n\n\t\t\t\tconst isFullEllipse =\n\t\t\t\t\t( curve.aEndAngle - curve.aStartAngle ) % ( 2 * Math.PI ) < Number.EPSILON;\n\n\t\t\t\t// Do not touch angles of a full ellipse because after transformation they\n\t\t\t\t// would converge to a single value effectively removing the whole curve\n\n\t\t\t\tif ( ! isFullEllipse ) {\n\n\t\t\t\t\tconst mDsqrt = tempTransform1.set(\n\t\t\t\t\t\trt1sqrt, 0, 0,\n\t\t\t\t\t\t0, rt2sqrt, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mRT = tempTransform2.set(\n\t\t\t\t\t\ted.cs, ed.sn, 0,\n\t\t\t\t\t\t- ed.sn, ed.cs, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mDRF = mDsqrt.multiply( mRT ).multiply( mF );\n\n\t\t\t\t\tconst transformAngle = phi => {\n\n\t\t\t\t\t\tconst { x: cosR, y: sinR } =\n\t\t\t\t\t\t\tnew Vector3( Math.cos( phi ), Math.sin( phi ), 0 ).applyMatrix3( mDRF );\n\n\t\t\t\t\t\treturn Math.atan2( sinR, cosR );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tcurve.aStartAngle = transformAngle( curve.aStartAngle );\n\t\t\t\t\tcurve.aEndAngle = transformAngle( curve.aEndAngle );\n\n\t\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseNoSkew( curve ) {\n\n\t\t\t\t// Faster shortcut if no skew is applied\n\t\t\t\t// (e.g, a euclidean transform of a group containing the ellipse)\n\n\t\t\t\tconst sx = getTransformScaleX( m );\n\t\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\t\tcurve.xRadius *= sx;\n\t\t\t\tcurve.yRadius *= sy;\n\n\t\t\t\t// Extract rotation angle from the matrix of form:\n\t\t\t\t//\n\t\t\t\t// | cosθ sx -sinθ sy |\n\t\t\t\t// | sinθ sx cosθ sy |\n\t\t\t\t//\n\t\t\t\t// Remembering that tanθ = sinθ / cosθ; and that\n\t\t\t\t// `sx`, `sy`, or both might be zero.\n\t\t\t\tconst theta =\n\t\t\t\t\tsx > Number.EPSILON\n\t\t\t\t\t\t? Math.atan2( m.elements[ 1 ], m.elements[ 0 ] )\n\t\t\t\t\t\t: Math.atan2( - m.elements[ 3 ], m.elements[ 4 ] );\n\n\t\t\t\tcurve.aRotation += theta;\n\n\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\tcurve.aStartAngle *= - 1;\n\t\t\t\t\tcurve.aEndAngle *= - 1;\n\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst subPaths = path.subPaths;\n\n\t\t\tfor ( let i = 0, n = subPaths.length; i < n; i ++ ) {\n\n\t\t\t\tconst subPath = subPaths[ i ];\n\t\t\t\tconst curves = subPath.curves;\n\n\t\t\t\tfor ( let j = 0; j < curves.length; j ++ ) {\n\n\t\t\t\t\tconst curve = curves[ j ];\n\n\t\t\t\t\tif ( curve.isLineCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isCubicBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\t\t\t\t\t\ttransfVec2( curve.v3 );\n\n\t\t\t\t\t} else if ( curve.isQuadraticBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isEllipseCurve ) {\n\n\t\t\t\t\t\t// Transform ellipse center point\n\n\t\t\t\t\t\ttempV2.set( curve.aX, curve.aY );\n\t\t\t\t\t\ttransfVec2( tempV2 );\n\t\t\t\t\t\tcurve.aX = tempV2.x;\n\t\t\t\t\t\tcurve.aY = tempV2.y;\n\n\t\t\t\t\t\t// Transform ellipse shape parameters\n\n\t\t\t\t\t\tif ( isTransformSkewed( m ) ) {\n\n\t\t\t\t\t\t\ttransfEllipseGeneric( curve );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttransfEllipseNoSkew( curve );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction isTransformFlipped( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn te[ 0 ] * te[ 4 ] - te[ 1 ] * te[ 3 ] < 0;\n\n\t\t}\n\n\t\tfunction isTransformSkewed( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\tconst basisDot = te[ 0 ] * te[ 3 ] + te[ 1 ] * te[ 4 ];\n\n\t\t\t// Shortcut for trivial rotations and transformations\n\t\t\tif ( basisDot === 0 ) return false;\n\n\t\t\tconst sx = getTransformScaleX( m );\n\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\treturn Math.abs( basisDot / ( sx * sy ) ) > Number.EPSILON;\n\n\t\t}\n\n\t\tfunction getTransformScaleX( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] );\n\n\t\t}\n\n\t\tfunction getTransformScaleY( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 3 ] * te[ 3 ] + te[ 4 ] * te[ 4 ] );\n\n\t\t}\n\n\t\t// Calculates the eigensystem of a real symmetric 2x2 matrix\n\t\t// [ A B ]\n\t\t// [ B C ]\n\t\t// in the form\n\t\t// [ A B ] = [ cs -sn ] [ rt1 0 ] [ cs sn ]\n\t\t// [ B C ] [ sn cs ] [ 0 rt2 ] [ -sn cs ]\n\t\t// where rt1 >= rt2.\n\t\t//\n\t\t// Adapted from: https://www.mpi-hd.mpg.de/personalhomes/globes/3x3/index.html\n\t\t// -> Algorithms for real symmetric matrices -> Analytical (2x2 symmetric)\n\t\tfunction eigenDecomposition( A, B, C ) {\n\n\t\t\tlet rt1, rt2, cs, sn, t;\n\t\t\tconst sm = A + C;\n\t\t\tconst df = A - C;\n\t\t\tconst rt = Math.sqrt( df * df + 4 * B * B );\n\n\t\t\tif ( sm > 0 ) {\n\n\t\t\t\trt1 = 0.5 * ( sm + rt );\n\t\t\t\tt = 1 / rt1;\n\t\t\t\trt2 = A * t * C - B * t * B;\n\n\t\t\t} else if ( sm < 0 ) {\n\n\t\t\t\trt2 = 0.5 * ( sm - rt );\n\n\t\t\t} else {\n\n\t\t\t\t// This case needs to be treated separately to avoid div by 0\n\n\t\t\t\trt1 = 0.5 * rt;\n\t\t\t\trt2 = - 0.5 * rt;\n\n\t\t\t}\n\n\t\t\t// Calculate eigenvectors\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tcs = df + rt;\n\n\t\t\t} else {\n\n\t\t\t\tcs = df - rt;\n\n\t\t\t}\n\n\t\t\tif ( Math.abs( cs ) > 2 * Math.abs( B ) ) {\n\n\t\t\t\tt = - 2 * B / cs;\n\t\t\t\tsn = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tcs = t * sn;\n\n\t\t\t} else if ( Math.abs( B ) === 0 ) {\n\n\t\t\t\tcs = 1;\n\t\t\t\tsn = 0;\n\n\t\t\t} else {\n\n\t\t\t\tt = - 0.5 * cs / B;\n\t\t\t\tcs = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tsn = t * cs;\n\n\t\t\t}\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tt = cs;\n\t\t\t\tcs = - sn;\n\t\t\t\tsn = t;\n\n\t\t\t}\n\n\t\t\treturn { rt1, rt2, cs, sn };\n\n\t\t}\n\n\t\t//\n\n\t\tconst paths = [];\n\t\tconst stylesheets = {};\n\n\t\tconst transformStack = [];\n\n\t\tconst tempTransform0 = new Matrix3();\n\t\tconst tempTransform1 = new Matrix3();\n\t\tconst tempTransform2 = new Matrix3();\n\t\tconst tempTransform3 = new Matrix3();\n\t\tconst tempV2 = new Vector2();\n\t\tconst tempV3 = new Vector3();\n\n\t\tconst currentTransform = new Matrix3();\n\n\t\tconst xml = new DOMParser().parseFromString( text, 'image/svg+xml' ); // application/xml\n\n\t\tparseNode( xml.documentElement, {\n\t\t\tfill: '#000',\n\t\t\tfillOpacity: 1,\n\t\t\tstrokeOpacity: 1,\n\t\t\tstrokeWidth: 1,\n\t\t\tstrokeLineJoin: 'miter',\n\t\t\tstrokeLineCap: 'butt',\n\t\t\tstrokeMiterLimit: 4\n\t\t} );\n\n\t\tconst data = { paths: paths, xml: xml.documentElement };\n\n\t\t// console.log( paths );\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Creates from the given shape path and array of shapes.\n\t *\n\t * @param {ShapePath} shapePath - The shape path.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\tstatic createShapes( shapePath ) {\n\n\t\tconst BIGNUMBER = 999999999;\n\n\t\tconst IntersectionLocationType = {\n\t\t\tORIGIN: 0,\n\t\t\tDESTINATION: 1,\n\t\t\tBETWEEN: 2,\n\t\t\tLEFT: 3,\n\t\t\tRIGHT: 4,\n\t\t\tBEHIND: 5,\n\t\t\tBEYOND: 6\n\t\t};\n\n\t\tconst classifyResult = {\n\t\t\tloc: IntersectionLocationType.ORIGIN,\n\t\t\tt: 0\n\t\t};\n\n\t\tfunction findEdgeIntersection( a0, a1, b0, b1 ) {\n\n\t\t\tconst x1 = a0.x;\n\t\t\tconst x2 = a1.x;\n\t\t\tconst x3 = b0.x;\n\t\t\tconst x4 = b1.x;\n\t\t\tconst y1 = a0.y;\n\t\t\tconst y2 = a1.y;\n\t\t\tconst y3 = b0.y;\n\t\t\tconst y4 = b1.y;\n\t\t\tconst nom1 = ( x4 - x3 ) * ( y1 - y3 ) - ( y4 - y3 ) * ( x1 - x3 );\n\t\t\tconst nom2 = ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 );\n\t\t\tconst denom = ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 );\n\t\t\tconst t1 = nom1 / denom;\n\t\t\tconst t2 = nom2 / denom;\n\n\t\t\tif ( ( ( denom === 0 ) && ( nom1 !== 0 ) ) || ( t1 <= 0 ) || ( t1 >= 1 ) || ( t2 < 0 ) || ( t2 > 1 ) ) {\n\n\t\t\t\t//1. lines are parallel or edges don't intersect\n\n\t\t\t\treturn null;\n\n\t\t\t} else if ( ( nom1 === 0 ) && ( denom === 0 ) ) {\n\n\t\t\t\t//2. lines are colinear\n\n\t\t\t\t//check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\t\t\t\t\t//find position of this endpoints relatively to edge1\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t} else if ( classifyResult.loc == IntersectionLocationType.BETWEEN ) {\n\n\t\t\t\t\t\tconst x = + ( ( x1 + classifyResult.t * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\tconst y = + ( ( y1 + classifyResult.t * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\treturn { x: x, y: y, t: classifyResult.t, };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t} else {\n\n\t\t\t\t//3. edges intersect\n\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst x = + ( ( x1 + t1 * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\tconst y = + ( ( y1 + t1 * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\treturn { x: x, y: y, t: t1 };\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction classifyPoint( p, edgeStart, edgeEnd ) {\n\n\t\t\tconst ax = edgeEnd.x - edgeStart.x;\n\t\t\tconst ay = edgeEnd.y - edgeStart.y;\n\t\t\tconst bx = p.x - edgeStart.x;\n\t\t\tconst by = p.y - edgeStart.y;\n\t\t\tconst sa = ax * by - bx * ay;\n\n\t\t\tif ( ( p.x === edgeStart.x ) && ( p.y === edgeStart.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.ORIGIN;\n\t\t\t\tclassifyResult.t = 0;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( p.x === edgeEnd.x ) && ( p.y === edgeEnd.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.DESTINATION;\n\t\t\t\tclassifyResult.t = 1;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa < - Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.LEFT;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa > Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.RIGHT;\n\t\t\t\treturn;\n\n\n\t\t\t}\n\n\t\t\tif ( ( ( ax * bx ) < 0 ) || ( ( ay * by ) < 0 ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEHIND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( Math.sqrt( ax * ax + ay * ay ) ) < ( Math.sqrt( bx * bx + by * by ) ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEYOND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet t;\n\n\t\t\tif ( ax !== 0 ) {\n\n\t\t\t\tt = bx / ax;\n\n\t\t\t} else {\n\n\t\t\t\tt = by / ay;\n\n\t\t\t}\n\n\t\t\tclassifyResult.loc = IntersectionLocationType.BETWEEN;\n\t\t\tclassifyResult.t = t;\n\n\t\t}\n\n\t\tfunction getIntersections( path1, path2 ) {\n\n\t\t\tconst intersectionsRaw = [];\n\t\t\tconst intersections = [];\n\n\t\t\tfor ( let index = 1; index < path1.length; index ++ ) {\n\n\t\t\t\tconst path1EdgeStart = path1[ index - 1 ];\n\t\t\t\tconst path1EdgeEnd = path1[ index ];\n\n\t\t\t\tfor ( let index2 = 1; index2 < path2.length; index2 ++ ) {\n\n\t\t\t\t\tconst path2EdgeStart = path2[ index2 - 1 ];\n\t\t\t\t\tconst path2EdgeEnd = path2[ index2 ];\n\n\t\t\t\t\tconst intersection = findEdgeIntersection( path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd );\n\n\t\t\t\t\tif ( intersection !== null && intersectionsRaw.find( i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON ) === undefined ) {\n\n\t\t\t\t\t\tintersectionsRaw.push( intersection );\n\t\t\t\t\t\tintersections.push( new Vector2( intersection.x, intersection.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn intersections;\n\n\t\t}\n\n\t\tfunction getScanlineIntersections( scanline, boundingBox, paths ) {\n\n\t\t\tconst center = new Vector2();\n\t\t\tboundingBox.getCenter( center );\n\n\t\t\tconst allIntersections = [];\n\n\t\t\tpaths.forEach( path => {\n\n\t\t\t\t// check if the center of the bounding box is in the bounding box of the paths.\n\t\t\t\t// this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.\n\t\t\t\t// if a path envelops another path. The center of that other path, has to be inside the bounding box of the enveloping path.\n\t\t\t\tif ( path.boundingBox.containsPoint( center ) ) {\n\n\t\t\t\t\tconst intersections = getIntersections( scanline, path.points );\n\n\t\t\t\t\tintersections.forEach( p => {\n\n\t\t\t\t\t\tallIntersections.push( { identifier: path.identifier, isCW: path.isCW, point: p } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tallIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\treturn allIntersections;\n\n\t\t}\n\n\t\tfunction isHoleTo( simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule ) {\n\n\t\t\tif ( _fillRule === null || _fillRule === undefined || _fillRule === '' ) {\n\n\t\t\t\t_fillRule = 'nonzero';\n\n\t\t\t}\n\n\t\t\tconst centerBoundingBox = new Vector2();\n\t\t\tsimplePath.boundingBox.getCenter( centerBoundingBox );\n\n\t\t\tconst scanline = [ new Vector2( scanlineMinX, centerBoundingBox.y ), new Vector2( scanlineMaxX, centerBoundingBox.y ) ];\n\n\t\t\tconst scanlineIntersections = getScanlineIntersections( scanline, simplePath.boundingBox, allPaths );\n\n\t\t\tscanlineIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\tconst baseIntersections = [];\n\t\t\tconst otherIntersections = [];\n\n\t\t\tscanlineIntersections.forEach( i => {\n\n\t\t\t\tif ( i.identifier === simplePath.identifier ) {\n\n\t\t\t\t\tbaseIntersections.push( i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\totherIntersections.push( i );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst firstXOfPath = baseIntersections[ 0 ].point.x;\n\n\t\t\t// build up the path hierarchy\n\t\t\tconst stack = [];\n\t\t\tlet i = 0;\n\n\t\t\twhile ( i < otherIntersections.length && otherIntersections[ i ].point.x < firstXOfPath ) {\n\n\t\t\t\tif ( stack.length > 0 && stack[ stack.length - 1 ] === otherIntersections[ i ].identifier ) {\n\n\t\t\t\t\tstack.pop();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstack.push( otherIntersections[ i ].identifier );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\tstack.push( simplePath.identifier );\n\n\t\t\tif ( _fillRule === 'evenodd' ) {\n\n\t\t\t\tconst isHole = stack.length % 2 === 0 ? true : false;\n\t\t\t\tconst isHoleFor = stack[ stack.length - 2 ];\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else if ( _fillRule === 'nonzero' ) {\n\n\t\t\t\t// check if path is a hole by counting the amount of paths with alternating rotations it has to cross.\n\t\t\t\tlet isHole = true;\n\t\t\t\tlet isHoleFor = null;\n\t\t\t\tlet lastCWValue = null;\n\n\t\t\t\tfor ( let i = 0; i < stack.length; i ++ ) {\n\n\t\t\t\t\tconst identifier = stack[ i ];\n\t\t\t\t\tif ( isHole ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = false;\n\t\t\t\t\t\tisHoleFor = identifier;\n\n\t\t\t\t\t} else if ( lastCWValue !== allPaths[ identifier ].isCW ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'fill-rule: \"' + _fillRule + '\" is currently not implemented.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check for self intersecting paths\n\t\t// TODO\n\n\t\t// check intersecting paths\n\t\t// TODO\n\n\t\t// prepare paths for hole detection\n\t\tlet scanlineMinX = BIGNUMBER;\n\t\tlet scanlineMaxX = - BIGNUMBER;\n\n\t\tlet simplePaths = shapePath.subPaths.map( p => {\n\n\t\t\tconst points = p.getPoints();\n\t\t\tlet maxY = - BIGNUMBER;\n\t\t\tlet minY = BIGNUMBER;\n\t\t\tlet maxX = - BIGNUMBER;\n\t\t\tlet minX = BIGNUMBER;\n\n\t \t//points.forEach(p => p.y *= -1);\n\n\t\t\tfor ( let i = 0; i < points.length; i ++ ) {\n\n\t\t\t\tconst p = points[ i ];\n\n\t\t\t\tif ( p.y > maxY ) {\n\n\t\t\t\t\tmaxY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.y < minY ) {\n\n\t\t\t\t\tminY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x > maxX ) {\n\n\t\t\t\t\tmaxX = p.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x < minX ) {\n\n\t\t\t\t\tminX = p.x;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scanlineMaxX <= maxX ) {\n\n\t\t\t\tscanlineMaxX = maxX + 1;\n\n\t\t\t}\n\n\t\t\tif ( scanlineMinX >= minX ) {\n\n\t\t\t\tscanlineMinX = minX - 1;\n\n\t\t\t}\n\n\t\t\treturn { curves: p.curves, points: points, isCW: ShapeUtils.isClockWise( points ), identifier: - 1, boundingBox: new Box2( new Vector2( minX, minY ), new Vector2( maxX, maxY ) ) };\n\n\t\t} );\n\n\t\tsimplePaths = simplePaths.filter( sp => sp.points.length > 1 );\n\n\t\tfor ( let identifier = 0; identifier < simplePaths.length; identifier ++ ) {\n\n\t\t\tsimplePaths[ identifier ].identifier = identifier;\n\n\t\t}\n\n\t\t// check if path is solid or a hole\n\t\tconst isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, ( shapePath.userData ? shapePath.userData.style.fillRule : undefined ) ) );\n\n\n\t\tconst shapesToReturn = [];\n\t\tsimplePaths.forEach( p => {\n\n\t\t\tconst amIAHole = isAHole[ p.identifier ];\n\n\t\t\tif ( ! amIAHole.isHole ) {\n\n\t\t\t\tconst shape = new Shape();\n\t\t\t\tshape.curves = p.curves;\n\t\t\t\tconst holes = isAHole.filter( h => h.isHole && h.for === p.identifier );\n\t\t\t\tholes.forEach( h => {\n\n\t\t\t\t\tconst hole = simplePaths[ h.identifier ];\n\t\t\t\t\tconst path = new Path();\n\t\t\t\t\tpath.curves = hole.curves;\n\t\t\t\t\tshape.holes.push( path );\n\n\t\t\t\t} );\n\t\t\t\tshapesToReturn.push( shape );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn shapesToReturn;\n\n\t}\n\n\t/**\n\t * Returns a stroke style object from the given parameters.\n\t *\n\t * @param {number} [width=1] - The stroke width.\n\t * @param {string} [color='#000'] - The stroke color, as returned by {@link Color#getStyle}.\n\t * @param {'round'|'bevel'|'miter'|'miter-limit'} [lineJoin='miter'] - The line join style.\n\t * @param {'round'|'square'|'butt'} [lineCap='butt'] - The line cap style.\n\t * @param {number} [miterLimit=4] - Maximum join length, in multiples of the `width` parameter (join is truncated if it exceeds that distance).\n\t * @return {Object} The style object.\n\t */\n\tstatic getStrokeStyle( width, color, lineJoin, lineCap, miterLimit ) {\n\n\t\twidth = width !== undefined ? width : 1;\n\t\tcolor = color !== undefined ? color : '#000';\n\t\tlineJoin = lineJoin !== undefined ? lineJoin : 'miter';\n\t\tlineCap = lineCap !== undefined ? lineCap : 'butt';\n\t\tmiterLimit = miterLimit !== undefined ? miterLimit : 4;\n\n\t\treturn {\n\t\t\tstrokeColor: color,\n\t\t\tstrokeWidth: width,\n\t\t\tstrokeLineJoin: lineJoin,\n\t\t\tstrokeLineCap: lineCap,\n\t\t\tstrokeMiterLimit: miterLimit\n\t\t};\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points. The path can be open or closed (last point equals to first point).\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @return {?BufferGeometry} The stroke geometry. UV coordinates are generated ('u' along path. 'v' across it, from left to right).\n\t * Returns `null` if not geometry was generated.\n\t */\n\tstatic pointsToStroke( points, style, arcDivisions, minDistance ) {\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tif ( SVGLoader.pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs ) === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\treturn geometry;\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points.\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @param {Array<number>} vertices - An array holding vertices.\n\t * @param {Array<number>} normals - An array holding normals.\n\t * @param {Array<number>} uvs - An array holding uvs.\n\t * @param {number} [vertexOffset=0] - The vertex offset.\n\t * @return {number} The number of vertices.\n\t */\n\tstatic pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset ) {\n\n\t\t// This function can be called to update existing arrays or buffers.\n\t\t// Accepts same parameters as pointsToStroke, plus the buffers and optional offset.\n\t\t// Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)\n\t\t// Returns number of written vertices / normals / uvs pairs\n\t\t// if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)\n\t\t// 'normals' and 'uvs' buffers are optional\n\n\t\tconst tempV2_1 = new Vector2();\n\t\tconst tempV2_2 = new Vector2();\n\t\tconst tempV2_3 = new Vector2();\n\t\tconst tempV2_4 = new Vector2();\n\t\tconst tempV2_5 = new Vector2();\n\t\tconst tempV2_6 = new Vector2();\n\t\tconst tempV2_7 = new Vector2();\n\t\tconst lastPointL = new Vector2();\n\t\tconst lastPointR = new Vector2();\n\t\tconst point0L = new Vector2();\n\t\tconst point0R = new Vector2();\n\t\tconst currentPointL = new Vector2();\n\t\tconst currentPointR = new Vector2();\n\t\tconst nextPointL = new Vector2();\n\t\tconst nextPointR = new Vector2();\n\t\tconst innerPoint = new Vector2();\n\t\tconst outerPoint = new Vector2();\n\n\t\tarcDivisions = arcDivisions !== undefined ? arcDivisions : 12;\n\t\tminDistance = minDistance !== undefined ? minDistance : 0.001;\n\t\tvertexOffset = vertexOffset !== undefined ? vertexOffset : 0;\n\n\t\t// First ensure there are no duplicated points\n\t\tpoints = removeDuplicatedPoints( points );\n\n\t\tconst numPoints = points.length;\n\n\t\tif ( numPoints < 2 ) return 0;\n\n\t\tconst isClosed = points[ 0 ].equals( points[ numPoints - 1 ] );\n\n\t\tlet currentPoint;\n\t\tlet previousPoint = points[ 0 ];\n\t\tlet nextPoint;\n\n\t\tconst strokeWidth2 = style.strokeWidth / 2;\n\n\t\tconst deltaU = 1 / ( numPoints - 1 );\n\t\tlet u0 = 0, u1;\n\n\t\tlet innerSideModified;\n\t\tlet joinIsOnLeftSide;\n\t\tlet isMiter;\n\t\tlet initialJoinIsOnLeftSide = false;\n\n\t\tlet numVertices = 0;\n\t\tlet currentCoordinate = vertexOffset * 3;\n\t\tlet currentCoordinateUV = vertexOffset * 2;\n\n\t\t// Get initial left and right stroke points\n\t\tgetNormal( points[ 0 ], points[ 1 ], tempV2_1 ).multiplyScalar( strokeWidth2 );\n\t\tlastPointL.copy( points[ 0 ] ).sub( tempV2_1 );\n\t\tlastPointR.copy( points[ 0 ] ).add( tempV2_1 );\n\t\tpoint0L.copy( lastPointL );\n\t\tpoint0R.copy( lastPointR );\n\n\t\tfor ( let iPoint = 1; iPoint < numPoints; iPoint ++ ) {\n\n\t\t\tcurrentPoint = points[ iPoint ];\n\n\t\t\t// Get next point\n\t\t\tif ( iPoint === numPoints - 1 ) {\n\n\t\t\t\tif ( isClosed ) {\n\n\t\t\t\t\t// Skip duplicated initial point\n\t\t\t\t\tnextPoint = points[ 1 ];\n\n\t\t\t\t} else nextPoint = undefined;\n\n\t\t\t} else {\n\n\t\t\t\tnextPoint = points[ iPoint + 1 ];\n\n\t\t\t}\n\n\t\t\t// Normal of previous segment in tempV2_1\n\t\t\tconst normal1 = tempV2_1;\n\t\t\tgetNormal( previousPoint, currentPoint, normal1 );\n\n\t\t\ttempV2_3.copy( normal1 ).multiplyScalar( strokeWidth2 );\n\t\t\tcurrentPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\tcurrentPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\tu1 = u0 + deltaU;\n\n\t\t\tinnerSideModified = false;\n\n\t\t\tif ( nextPoint !== undefined ) {\n\n\t\t\t\t// Normal of next segment in tempV2_2\n\t\t\t\tgetNormal( currentPoint, nextPoint, tempV2_2 );\n\n\t\t\t\ttempV2_3.copy( tempV2_2 ).multiplyScalar( strokeWidth2 );\n\t\t\t\tnextPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\t\tnextPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\t\tjoinIsOnLeftSide = true;\n\t\t\t\ttempV2_3.subVectors( nextPoint, previousPoint );\n\t\t\t\tif ( normal1.dot( tempV2_3 ) < 0 ) {\n\n\t\t\t\t\tjoinIsOnLeftSide = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( iPoint === 1 ) initialJoinIsOnLeftSide = joinIsOnLeftSide;\n\n\t\t\t\ttempV2_3.subVectors( nextPoint, currentPoint );\n\t\t\t\ttempV2_3.normalize();\n\t\t\t\tconst dot = Math.abs( normal1.dot( tempV2_3 ) );\n\n\t\t\t\t// If path is straight, don't create join\n\t\t\t\tif ( dot > Number.EPSILON ) {\n\n\t\t\t\t\t// Compute inner and outer segment intersections\n\t\t\t\t\tconst miterSide = strokeWidth2 / dot;\n\t\t\t\t\ttempV2_3.multiplyScalar( - miterSide );\n\t\t\t\t\ttempV2_4.subVectors( currentPoint, previousPoint );\n\t\t\t\t\ttempV2_5.copy( tempV2_4 ).setLength( miterSide ).add( tempV2_3 );\n\t\t\t\t\tinnerPoint.copy( tempV2_5 ).negate();\n\t\t\t\t\tconst miterLength2 = tempV2_5.length();\n\t\t\t\t\tconst segmentLengthPrev = tempV2_4.length();\n\t\t\t\t\ttempV2_4.divideScalar( segmentLengthPrev );\n\t\t\t\t\ttempV2_6.subVectors( nextPoint, currentPoint );\n\t\t\t\t\tconst segmentLengthNext = tempV2_6.length();\n\t\t\t\t\ttempV2_6.divideScalar( segmentLengthNext );\n\t\t\t\t\t// Check that previous and next segments doesn't overlap with the innerPoint of intersection\n\t\t\t\t\tif ( tempV2_4.dot( innerPoint ) < segmentLengthPrev && tempV2_6.dot( innerPoint ) < segmentLengthNext ) {\n\n\t\t\t\t\t\tinnerSideModified = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\touterPoint.copy( tempV2_5 ).add( currentPoint );\n\t\t\t\t\tinnerPoint.add( currentPoint );\n\n\t\t\t\t\tisMiter = false;\n\n\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\tnextPointR.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointR.copy( innerPoint );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tnextPointL.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointL.copy( innerPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// The segment triangles are generated here if there was overlapping\n\n\t\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch ( style.strokeLineJoin ) {\n\n\t\t\t\t\t\tcase 'bevel':\n\n\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'round':\n\n\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t// Join triangles\n\n\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, currentPointL, nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, nextPointR, currentPointR, u1, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'miter':\n\t\t\t\t\t\tcase 'miter-clip':\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconst miterFraction = ( strokeWidth2 * style.strokeMiterLimit ) / miterLength2;\n\n\t\t\t\t\t\t\tif ( miterFraction < 1 ) {\n\n\t\t\t\t\t\t\t\t// The join miter length exceeds the miter limit\n\n\t\t\t\t\t\t\t\tif ( style.strokeLineJoin !== 'miter-clip' ) {\n\n\t\t\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t\t\t// Miter-clip join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointL ).multiplyScalar( miterFraction ).add( currentPointL );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointL ).multiplyScalar( miterFraction ).add( nextPointL );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointR ).multiplyScalar( miterFraction ).add( currentPointR );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointR ).multiplyScalar( miterFraction ).add( nextPointR );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Miter join segment triangles\n\n\t\t\t\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\t\t\t\t// Optimized segment + join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\tnextPointL.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tnextPointR.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Add extra miter join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tisMiter = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// The segment triangles are generated here when two consecutive points are collinear\n\n\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// The segment triangles are generated here if it is the ending segment\n\n\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t}\n\n\t\t\tif ( ! isClosed && iPoint === numPoints - 1 ) {\n\n\t\t\t\t// Start line endcap\n\t\t\t\taddCapGeometry( points[ 0 ], point0L, point0R, joinIsOnLeftSide, true, u0 );\n\n\t\t\t}\n\n\t\t\t// Increment loop variables\n\n\t\t\tu0 = u1;\n\n\t\t\tpreviousPoint = currentPoint;\n\n\t\t\tlastPointL.copy( nextPointL );\n\t\t\tlastPointR.copy( nextPointR );\n\n\t\t}\n\n\t\tif ( ! isClosed ) {\n\n\t\t\t// Ending line endcap\n\t\t\taddCapGeometry( currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1 );\n\n\t\t} else if ( innerSideModified && vertices ) {\n\n\t\t\t// Modify path first segment vertices to adjust to the segments inner and outer intersections\n\n\t\t\tlet lastOuter = outerPoint;\n\t\t\tlet lastInner = innerPoint;\n\n\t\t\tif ( initialJoinIsOnLeftSide !== joinIsOnLeftSide ) {\n\n\t\t\t\tlastOuter = innerPoint;\n\t\t\t\tlastInner = outerPoint;\n\n\t\t\t}\n\n\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\tif ( isMiter || initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 0 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 1 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( isMiter || ! initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 1 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn numVertices;\n\n\t\t// -- End of algorithm\n\n\t\t// -- Functions\n\n\t\tfunction getNormal( p1, p2, result ) {\n\n\t\t\tresult.subVectors( p2, p1 );\n\t\t\treturn result.set( - result.y, result.x ).normalize();\n\n\t\t}\n\n\t\tfunction addVertex( position, u, v ) {\n\n\t\t\tif ( vertices ) {\n\n\t\t\t\tvertices[ currentCoordinate ] = position.x;\n\t\t\t\tvertices[ currentCoordinate + 1 ] = position.y;\n\t\t\t\tvertices[ currentCoordinate + 2 ] = 0;\n\n\t\t\t\tif ( normals ) {\n\n\t\t\t\t\tnormals[ currentCoordinate ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 1 ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 2 ] = 1;\n\n\t\t\t\t}\n\n\t\t\t\tcurrentCoordinate += 3;\n\n\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\tuvs[ currentCoordinateUV ] = u;\n\t\t\t\t\tuvs[ currentCoordinateUV + 1 ] = v;\n\n\t\t\t\t\tcurrentCoordinateUV += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnumVertices += 3;\n\n\t\t}\n\n\t\tfunction makeCircularSector( center, p1, p2, u, v ) {\n\n\t\t\t// param p1, p2: Points in the circle arc.\n\t\t\t// p1 and p2 are in clockwise direction.\n\n\t\t\ttempV2_1.copy( p1 ).sub( center ).normalize();\n\t\t\ttempV2_2.copy( p2 ).sub( center ).normalize();\n\n\t\t\tlet angle = Math.PI;\n\t\t\tconst dot = tempV2_1.dot( tempV2_2 );\n\t\t\tif ( Math.abs( dot ) < 1 ) angle = Math.abs( Math.acos( dot ) );\n\n\t\t\tangle /= arcDivisions;\n\n\t\t\ttempV2_3.copy( p1 );\n\n\t\t\tfor ( let i = 0, il = arcDivisions - 1; i < il; i ++ ) {\n\n\t\t\t\ttempV2_4.copy( tempV2_3 ).rotateAround( center, angle );\n\n\t\t\t\taddVertex( tempV2_3, u, v );\n\t\t\t\taddVertex( tempV2_4, u, v );\n\t\t\t\taddVertex( center, u, 0.5 );\n\n\t\t\t\ttempV2_3.copy( tempV2_4 );\n\n\t\t\t}\n\n\t\t\taddVertex( tempV2_4, u, v );\n\t\t\taddVertex( p2, u, v );\n\t\t\taddVertex( center, u, 0.5 );\n\n\t\t}\n\n\t\tfunction makeSegmentTriangles() {\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t}\n\n\t\tfunction makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t// Optimized segment + bevel triangles\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( innerPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( innerPoint, u, 0 );\n\t\t\t\t\taddVertex( nextPointR, u, 1 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bevel join triangle. The segment triangles are done in the main loop\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( nextPointR, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( nextPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointR, u0, 1 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( nextPointR, u0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addCapGeometry( center, p1, p2, joinIsOnLeftSide, start, u ) {\n\n\t\t\t// param center: End point of the path\n\t\t\t// param p1, p2: Left and right cap points\n\n\t\t\tswitch ( style.strokeLineCap ) {\n\n\t\t\t\tcase 'round':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\tmakeCircularSector( center, p2, p1, u, 0.5 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmakeCircularSector( center, p1, p2, u, 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'square':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p1, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\t// using tempV2_4 to update 3rd vertex if the uv.y of 3rd vertex is 1\n\t\t\t\t\t\t\tuvs[ 3 * 2 + 1 ] === 1 ? tempV2_4.toArray( vertices, 3 * 3 ) : tempV2_3.toArray( vertices, 3 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p2, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\tconst vl = vertices.length;\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'butt':\n\t\t\t\tdefault:\n\n\t\t\t\t\t// Nothing to do here\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeDuplicatedPoints( points ) {\n\n\t\t\t// Creates a new array if necessary with duplicated points removed.\n\t\t\t// This does not remove duplicated initial and ending points of a closed path.\n\n\t\t\tlet dupPoints = false;\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) < minDistance ) {\n\n\t\t\t\t\tdupPoints = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! dupPoints ) return points;\n\n\t\t\tconst newPoints = [];\n\t\t\tnewPoints.push( points[ 0 ] );\n\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) >= minDistance ) {\n\n\t\t\t\t\tnewPoints.push( points[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnewPoints.push( points[ points.length - 1 ] );\n\n\t\t\treturn newPoints;\n\n\t\t}\n\n\t}\n\n\n}\n\nexport { SVGLoader };\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { SVGLoader, type SVGResult } from 'three/examples/jsm/loaders/SVGLoader.js';\nimport {\n inlineSvgStyles,\n isInteractiveGroupLabel,\n isRouteFolderLabel,\n isRoutePathLabel,\n isStoreFolderLabel,\n isTransparentColor,\n resolveFetchUrl,\n amenityHouseFill,\n isAmenityLayerId,\n resolveLayerStyle,\n sortByOutdoorSvgPaintOrder,\n} from '../../core';\n\nexport { resolveFetchUrl };\n\nconst BASE_Z = -2;\n\nfunction getLayerNameFromNode(node: Element | undefined): string | undefined {\n if (!node || node.nodeType !== 1) return undefined;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id');\n if (id) return id;\n current = current.parentElement;\n }\n return undefined;\n}\n\nfunction isInteractiveAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isInteractiveGroupLabel(id) || isInteractiveGroupLabel(dataName)) return true;\n if (isStoreFolderLabel(id) || isStoreFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\nfunction isRouteAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isRouteFolderLabel(id) || isRouteFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\nexport interface SvgVectorLayerProps {\n url: string;\n /** sourceSvgId values held in cm_shapes — skip drawing these (DB owns them). */\n suppressIds?: ReadonlySet<string>;\n imageProxyUrl?: string | null;\n is3d?: boolean;\n /** Settings overrides for house outdoor colors. */\n theme?: Partial<Record<string, string>> | null;\n}\n\ninterface PreparedMesh {\n key: string;\n layerName?: string;\n shapes: THREE.Shape[];\n color: THREE.Color;\n opacity: number;\n extrude: number;\n renderOrder: number;\n}\n\n/**\n * Live outdoor SVG as real vector geometry (not a raster texture).\n * Applies house-style colors for reserved layer names; otherwise keeps\n * Illustrator fills. Skips ROUTES-group lines and interactive ids owned by the DB.\n * Coordinates stay in SVG user space — `MapScene` flips the whole scene.\n */\nexport function SvgVectorLayer({\n url,\n suppressIds,\n imageProxyUrl,\n is3d = false,\n theme,\n}: SvgVectorLayerProps) {\n const [result, setResult] = useState<SVGResult | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n const inlined = inlineSvgStyles(text);\n const loader = new SVGLoader();\n setResult(loader.parse(inlined));\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setResult(null);\n // Silence here used to hide CORS failures as \"outdoor has no decoration\".\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapViewer.',\n err,\n );\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const meshes = useMemo(() => {\n if (!result) return [] as PreparedMesh[];\n const out: PreparedMesh[] = [];\n let idx = 0;\n for (const path of result.paths) {\n const node = path.userData?.node as Element | undefined;\n const layerName = getLayerNameFromNode(node);\n if (layerName?.toLowerCase().startsWith('route-path')) continue;\n if (layerName && (isRoutePathLabel(layerName) || isRouteFolderLabel(layerName))) {\n continue;\n }\n if (node && isRouteAncestor(node)) continue;\n if (layerName && suppressIds?.has(layerName)) continue;\n if (isInteractiveAncestor(node) && !layerName) continue;\n // Whole INTERACTIVE / STORES folders are owned by DB shapes.\n if (layerName && (isInteractiveGroupLabel(layerName) || isStoreFolderLabel(layerName))) {\n continue;\n }\n if (node && isInteractiveAncestor(node) && layerName && suppressIds?.has(layerName)) {\n continue;\n }\n // Skip paths inside INTERACTIVE/STORES even when not yet in DB (assignable units).\n if (node && isInteractiveAncestor(node)) continue;\n\n const shapes = SVGLoader.createShapes(path);\n if (shapes.length === 0) continue;\n\n const layerStyle = resolveLayerStyle(layerName, theme);\n const amenityFill = isAmenityLayerId(layerName)\n ? amenityHouseFill(theme)\n : null;\n const fillTransparent = isTransparentColor(layerStyle?.fill);\n const strokeTransparent = isTransparentColor(layerStyle?.stroke);\n const color = new THREE.Color();\n if (layerStyle?.fill && !fillTransparent) {\n color.set(layerStyle.fill);\n } else if (amenityFill) {\n color.set(amenityFill);\n } else if (path.color && !fillTransparent) {\n color.copy(path.color);\n } else {\n color.set('#cccccc');\n }\n if (layerStyle?.stroke && !layerStyle.fill && !strokeTransparent) {\n color.set(layerStyle.stroke);\n }\n\n const opacity =\n fillTransparent || (strokeTransparent && !layerStyle?.fill)\n ? 0\n : typeof path.userData?.style?.opacity === 'number'\n ? path.userData.style.opacity\n : 1;\n const extrude =\n is3d && layerStyle?.extrudeHeight != null ? layerStyle.extrudeHeight : 0;\n\n out.push({\n key: `${layerName ?? 'path'}-${idx++}`,\n layerName,\n shapes,\n color,\n opacity,\n extrude,\n renderOrder: 0,\n });\n }\n // Sequential renderOrder matches the resolved list so same-color meshes\n // cannot batch a green area over a later special shape.\n return sortByOutdoorSvgPaintOrder(out, (mesh) => mesh.layerName).map(\n (mesh, renderOrder) => ({ ...mesh, renderOrder }),\n );\n }, [result, suppressIds, is3d, theme]);\n\n if (!result || meshes.length === 0) return null;\n\n return (\n <group position={[0, 0, BASE_Z]} renderOrder={-20}>\n {meshes.map((m) =>\n m.shapes.map((shape, si) => (\n <mesh\n key={`${m.key}-${si}`}\n renderOrder={m.renderOrder}\n raycast={() => {}}\n >\n {m.extrude > 0 ? (\n <extrudeGeometry\n args={[shape, { depth: m.extrude, bevelEnabled: false }]}\n />\n ) : (\n <shapeGeometry args={[shape]} />\n )}\n <meshBasicMaterial\n color={m.color}\n transparent={m.opacity < 1}\n opacity={m.opacity}\n depthWrite={false}\n toneMapped={false}\n side={THREE.DoubleSide}\n />\n </mesh>\n )),\n )}\n </group>\n );\n}\n","import {\n expandBounds,\n applyLevelTransform,\n sceneBoundsFromBBox,\n type BBox,\n type LevelTransform,\n type PathResult,\n type SceneBounds,\n type Vec2,\n} from '../core';\n\n/**\n * Stored geometry is raw SVG user space, where Y grows downward. The scene\n * mirrors Y once so the camera can keep a conventional `up = [0, 1, 0]`.\n *\n * Do not \"fix\" orientation by setting `up = [0, -1, 0]` instead: three.js\n * derives the camera's right axis from `up × forward`, so a negative up also\n * mirrors X and the map renders rotated 180° rather than flipped.\n */\nexport const SCENE_FLIP_SCALE: [number, number, number] = [1, -1, 1];\n\n/** Stored SVG-space point → view space, matching `SCENE_FLIP_SCALE`. */\nexport function dataToViewPoint(point: Vec2): Vec2 {\n return { x: point.x, y: -point.y };\n}\n\n/** Stored SVG-space bounds → view space, for camera and controls placement. */\nexport function viewBoundsFromData(bounds: SceneBounds): SceneBounds {\n return {\n ...bounds,\n minY: -bounds.maxY,\n maxY: -bounds.minY,\n cy: -bounds.cy,\n };\n}\n\n/**\n * Fit an orthographic camera so the map fills the canvas on the limiting\n * axis (width or height) with no extra inset.\n */\nexport function fitOrthoZoom(\n viewWidth: number,\n viewHeight: number,\n worldWidth: number,\n worldHeight: number,\n): number {\n const zoomX = Math.max(viewWidth, 1) / Math.max(worldWidth, 1);\n const zoomY = Math.max(viewHeight, 1) / Math.max(worldHeight, 1);\n return Math.min(zoomX, zoomY);\n}\n\nexport function boundsExtent(bounds: SceneBounds): { width: number; height: number } {\n return {\n width: Math.max(bounds.maxX - bounds.minX, 1),\n height: Math.max(bounds.maxY - bounds.minY, 1),\n };\n}\n\nexport const VIEWER_ZOOM_ANIM_MS = 240;\n/**\n * Selection pan/zoom. v1 used 0.2s of linear travel (`CAMERA.animSpeed`).\n * Ease-in-out over 200ms bunched the motion into the last frames and looked\n * like a snap; ease-out over 400ms reads as a short, smooth glide.\n */\nexport const VIEWER_FOCUS_ANIM_MS = 400;\n\n/** Extra space around a small focused shape so it does not fill the canvas. */\nexport const FOCUS_BOUNDS_PADDING = 1;\n/**\n * Padding for a large store (extent ≥ `FOCUS_LARGE_EXTENT`).\n * 2.0 → the store occupies about a third of the frame, so neighbors stay visible.\n */\nexport const FOCUS_LARGE_PADDING = 2;\n/** World size at which padding reaches `FOCUS_LARGE_PADDING`. */\nexport const FOCUS_LARGE_EXTENT = 400;\n/**\n * Padding stays tight until this size (typical small store). Kiosks and\n * amenities below this still zoom closer via `FOCUS_MIN_EXTENT`.\n */\nexport const FOCUS_PAD_SMALL_EXTENT = 80;\n/**\n * Floor for the framed world size. Tiny amenities keep neighbors in view\n * instead of filling the canvas; anything larger frames to its own bbox.\n */\nexport const FOCUS_MIN_EXTENT = 52;\n/**\n * Click-to-focus cap vs the full-map fit. A typical store stays at a\n * neighborhood view; 64× filled the canvas on the default assign map.\n */\nexport const FOCUS_MAX_ZOOM_MULTIPLE = 8;\n/**\n * Tiny kiosks/amenities may go closer than a store so they stay readable.\n * Still far below a canvas-filling close-up.\n */\nexport const FOCUS_SMALL_MAX_ZOOM_MULTIPLE = 14;\n/** Manual +/− ceiling, independent of selection focus. */\nexport const VIEWER_MAX_ZOOM_MULTIPLE = 16;\n\n/** More margin as the store grows so a department store is not edge-to-edge. */\nexport function focusPaddingRatio(\n width: number,\n height: number,\n paddingRatio = FOCUS_BOUNDS_PADDING,\n smallExtent = FOCUS_PAD_SMALL_EXTENT,\n largePadding = FOCUS_LARGE_PADDING,\n largeExtent = FOCUS_LARGE_EXTENT,\n): number {\n const extent = Math.max(width, height);\n if (extent <= smallExtent) return paddingRatio;\n const span = Math.max(largeExtent - smallExtent, 1);\n const t = Math.min(1, (extent - smallExtent) / span);\n return paddingRatio + (largePadding - paddingRatio) * t;\n}\n\n/**\n * Expand a shape's bounds for a \"click to assign\" camera frame.\n * Small units keep a tighter frame; large stores pull the camera back.\n */\nexport function paddedFocusBounds(\n bounds: SceneBounds,\n paddingRatio = FOCUS_BOUNDS_PADDING,\n minExtent = FOCUS_MIN_EXTENT,\n): SceneBounds {\n const rawW = bounds.maxX - bounds.minX;\n const rawH = bounds.maxY - bounds.minY;\n const width = Math.max(rawW, minExtent);\n const height = Math.max(rawH, minExtent);\n const pad = focusPaddingRatio(rawW, rawH, paddingRatio);\n const halfW = (width + width * pad) / 2;\n const halfH = (height + height * pad) / 2;\n return {\n minX: bounds.cx - halfW,\n minY: bounds.cy - halfH,\n maxX: bounds.cx + halfW,\n maxY: bounds.cy + halfH,\n cx: bounds.cx,\n cy: bounds.cy,\n size: Math.max(halfW, halfH) * 2,\n };\n}\n\n/**\n * How far a click may zoom relative to the fitted map. Smaller padded\n * frames (kiosks) get more zoom; store-sized frames stay at 8×.\n */\nexport function focusMaxZoomMultiple(\n paddedWidth: number,\n paddedHeight: number,\n typicalMultiple = FOCUS_MAX_ZOOM_MULTIPLE,\n smallMultiple = FOCUS_SMALL_MAX_ZOOM_MULTIPLE,\n): number {\n const extent = Math.max(paddedWidth, paddedHeight);\n const typicalFrame = FOCUS_PAD_SMALL_EXTENT * (1 + FOCUS_BOUNDS_PADDING);\n if (extent >= typicalFrame) return typicalMultiple;\n const tinyFrame = FOCUS_MIN_EXTENT * (1 + FOCUS_BOUNDS_PADDING);\n if (extent <= tinyFrame) return smallMultiple;\n const span = Math.max(typicalFrame - tinyFrame, 1);\n const t = (extent - tinyFrame) / span;\n return smallMultiple + (typicalMultiple - smallMultiple) * t;\n}\n\nexport function clampFocusZoom(\n shapeFitZoom: number,\n mapFitZoom: number,\n maxMultiple = FOCUS_MAX_ZOOM_MULTIPLE,\n): number {\n const cap = Math.max(mapFitZoom, 0.001) * maxMultiple;\n return Math.min(shapeFitZoom, cap);\n}\n\ntype FocusLevel = {\n shapes: Array<{ id: number; bbox: BBox }>;\n transform: LevelTransform;\n};\n\n/** Stable key so adding/removing a Shift-selected shape re-frames the camera. */\nexport function selectionFocusKey(shapeIds: number[]): string | null {\n const ids = [...new Set(shapeIds.filter((id) => Number.isFinite(id)))].sort(\n (a, b) => a - b,\n );\n return ids.length > 0 ? ids.join(',') : null;\n}\n\n/** View-space frame for one or more published shapes. */\nexport function viewFocusBoundsForShapes(\n levels: FocusLevel[],\n shapeIds: number[],\n): SceneBounds | null {\n const wanted = new Set(shapeIds);\n if (wanted.size === 0) return null;\n let combined: SceneBounds | null = null;\n for (const level of levels) {\n for (const shape of level.shapes) {\n if (!wanted.has(shape.id)) continue;\n const next = sceneBoundsFromBBox(shape.bbox, level.transform);\n combined = combined ? expandBounds(combined, next) : next;\n }\n }\n return combined ? viewBoundsFromData(paddedFocusBounds(combined)) : null;\n}\n\n/** View-space frame for a published shape, ready for `CameraRig.focusBounds`. */\nexport function viewFocusBoundsForShape(\n levels: FocusLevel[],\n shapeId: number,\n): SceneBounds | null {\n return viewFocusBoundsForShapes(levels, [shapeId]);\n}\n\ntype RouteFocusLevel = FocusLevel & {\n id: number;\n anchors: Array<{ id: number; shapeId?: number | null; kind?: string }>;\n};\n\n/** Match v1: frame the current-floor route and its endpoint shapes. */\nexport function viewFocusBoundsForRoute(\n levels: RouteFocusLevel[],\n route: PathResult,\n levelId: number | null,\n): SceneBounds | null {\n if (levelId == null) return null;\n const level = levels.find((item) => item.id === levelId);\n if (!level) return null;\n const routePoints = route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => applyLevelTransform(point, level.transform));\n\n let bounds: SceneBounds | null = null;\n if (routePoints.length >= 2) {\n const minX = Math.min(...routePoints.map((point) => point.x));\n const minY = Math.min(...routePoints.map((point) => point.y));\n const maxX = Math.max(...routePoints.map((point) => point.x));\n const maxY = Math.max(...routePoints.map((point) => point.y));\n bounds = {\n minX,\n minY,\n maxX,\n maxY,\n cx: (minX + maxX) / 2,\n cy: (minY + maxY) / 2,\n size: Math.max(maxX - minX, maxY - minY, 1),\n };\n } else if (routePoints.length === 1) {\n const point = routePoints[0];\n bounds = {\n minX: point.x,\n minY: point.y,\n maxX: point.x,\n maxY: point.y,\n cx: point.x,\n cy: point.y,\n size: 1,\n };\n }\n\n const endpointIds = new Set(\n [route.anchorIds[0], route.anchorIds.at(-1)].filter(\n (id): id is number => id != null,\n ),\n );\n const routeAnchorIds = new Set(route.anchorIds);\n const focusShapeIds = new Set<number>();\n for (const anchor of level.anchors) {\n if (!routeAnchorIds.has(anchor.id) || anchor.shapeId == null) continue;\n if (endpointIds.has(anchor.id) || anchor.kind === 'connector') {\n focusShapeIds.add(anchor.shapeId);\n }\n }\n for (const shape of level.shapes) {\n if (!focusShapeIds.has(shape.id)) continue;\n const shapeBounds = sceneBoundsFromBBox(shape.bbox, level.transform);\n bounds = bounds ? expandBounds(bounds, shapeBounds) : shapeBounds;\n }\n\n if (!bounds) return null;\n return viewBoundsFromData(paddedFocusBounds(bounds, 0.1, 1));\n}\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\n/** Symmetric ease so a selection pan is visible the whole way, like v1's lerp. */\nexport function easeInOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nexport interface CameraPose {\n zoom: number;\n position: [number, number, number];\n target: [number, number, number];\n}\n\n/** Interpolate zoom + pan/orbit for a smooth +/− / Reset / selection focus. */\nexport function interpolateCameraPose(\n from: CameraPose,\n to: CameraPose,\n t: number,\n ease: (t: number) => number = easeOutCubic,\n): CameraPose {\n const e = ease(t);\n return {\n zoom: lerp(from.zoom, to.zoom, e),\n position: [\n lerp(from.position[0], to.position[0], e),\n lerp(from.position[1], to.position[1], e),\n lerp(from.position[2], to.position[2], e),\n ],\n target: [\n lerp(from.target[0], to.target[0], e),\n lerp(from.target[1], to.target[1], e),\n lerp(from.target[2], to.target[2], e),\n ],\n };\n}\n\nexport function cameraPosesNear(\n a: CameraPose,\n b: CameraPose,\n epsilon = 1e-3,\n): boolean {\n return (\n Math.abs(a.zoom - b.zoom) < epsilon &&\n Math.abs(a.position[0] - b.position[0]) < epsilon &&\n Math.abs(a.position[1] - b.position[1]) < epsilon &&\n Math.abs(a.position[2] - b.position[2]) < epsilon &&\n Math.abs(a.target[0] - b.target[0]) < epsilon &&\n Math.abs(a.target[1] - b.target[1]) < epsilon &&\n Math.abs(a.target[2] - b.target[2]) < epsilon\n );\n}\n\n/** Zoom `0` means “use the current fit zoom”. */\nexport function withFitZoom(\n pose: CameraPose | null | undefined,\n fitZoom: number,\n): CameraPose | null {\n if (!pose) return null;\n if (pose.zoom > 0) return pose;\n return { ...pose, zoom: fitZoom };\n}\n\n/**\n * RESET destination.\n * Staff capture (`fitToMap`) always returns the fitted full-map view so\n * authors can see every unit and start over. Portal / website / kiosk RESET\n * restores the configured slot pose, or that same fit when the slot is empty.\n */\nexport function resolveResetPose(\n fitToMap: boolean,\n home: CameraPose | null | undefined,\n fit: CameraPose,\n): CameraPose {\n if (fitToMap) return fit;\n return withFitZoom(home, fit.zoom) ?? fit;\n}\n\n/**\n * Chrome Reset clears the store highlight (`focusKey` → null) in the same\n * tick as the ease-home. Restoring the last snap would cancel that ease\n * and leave the camera on the store (first click only un-highlights).\n */\nexport function skipPersistedViewRestore(input: {\n resetInFlight: boolean;\n focusKey: string | number | null;\n}): boolean {\n return input.resetInFlight && input.focusKey == null;\n}\n\nexport function nextOrthoZoom(\n current: number,\n direction: 1 | -1,\n step: number,\n min: number,\n max: number,\n): number {\n const factor = 1 + Math.min(Math.max(step, 0.15), 1) * 0.5;\n const next = direction > 0 ? current * factor : current / factor;\n return Math.min(max, Math.max(min, next));\n}\n\n/** three.js `MOUSE` / `TOUCH` enums — left-drag pans the 2D admin/public map. */\nconst MOUSE_ROTATE = 0;\nconst MOUSE_DOLLY = 1;\nconst MOUSE_PAN = 2;\nconst TOUCH_ROTATE = 0;\nconst TOUCH_PAN = 1;\nconst TOUCH_DOLLY_PAN = 2;\n\n/**\n * Wheel zoom keeps the pointer over the same map point (Google Maps-style).\n * Speed is three-stdlib `pow(0.95, zoomSpeed)` per event — same helper as\n * Edit Map / Wayfinding (`nextZoomFromWheel`).\n * +/− still zooms about the view centre because those buttons have no cursor.\n */\nexport const ORBIT_ZOOM_TO_CURSOR = true;\n\nexport function orbitMouseButtons(is3d: boolean): {\n LEFT: number;\n MIDDLE: number;\n RIGHT: number;\n} {\n if (is3d) {\n return { LEFT: MOUSE_ROTATE, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n }\n return { LEFT: MOUSE_PAN, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n}\n\nexport function orbitTouches(is3d: boolean): { ONE: number; TWO: number } {\n if (is3d) {\n return { ONE: TOUCH_ROTATE, TWO: TOUCH_DOLLY_PAN };\n }\n return { ONE: TOUCH_PAN, TWO: TOUCH_DOLLY_PAN };\n}\n","import React, { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type { OrbitControls } from 'three-stdlib';\nimport * as THREE from 'three';\nimport type { SceneBounds, ThemeDefaults } from '../../core';\nimport {\n boundsExtent,\n cameraPosesNear,\n clampFocusZoom,\n easeOutCubic,\n fitOrthoZoom,\n focusMaxZoomMultiple,\n VIEWER_MAX_ZOOM_MULTIPLE,\n interpolateCameraPose,\n lerp,\n nextOrthoZoom,\n resolveResetPose,\n skipPersistedViewRestore,\n VIEWER_FOCUS_ANIM_MS,\n VIEWER_ZOOM_ANIM_MS,\n type CameraPose,\n} from '../camera';\n\nexport interface MapCameraHandle {\n zoomIn: () => void;\n zoomOut: () => void;\n reset: () => void;\n /** View-space bounds (already Y-flipped). Animates pan + zoom onto the shape. */\n focusBounds: (focus: SceneBounds) => void;\n getView: () => CameraViewSnapshot;\n applyView: (snap: CameraViewSnapshot) => void;\n}\n\n/** Survives Canvas / camera remounts so Settings color tweaks keep the view. */\nexport interface CameraViewSnapshot {\n is3d: boolean;\n boundsKey: string;\n zoom: number;\n position: [number, number, number];\n target: [number, number, number];\n userAdjusted: boolean;\n focusKey?: string | number | null;\n}\n\nexport function cameraBoundsKey(bounds: SceneBounds, is3d: boolean): string {\n return [\n bounds.cx,\n bounds.cy,\n bounds.minX,\n bounds.minY,\n bounds.maxX,\n bounds.maxY,\n bounds.size,\n is3d ? '3d' : '2d',\n ].join('|');\n}\n\nexport interface CameraRigProps {\n /** View-space bounds — already Y-flipped by the scene, so up is +Y. */\n bounds: SceneBounds;\n theme: ThemeDefaults;\n is3d: boolean;\n controlsRef: React.RefObject<OrbitControls | null>;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n persistedViewRef: React.MutableRefObject<CameraViewSnapshot | null>;\n /** Selection key; when it changes the camera eases onto `focusViewBounds`. */\n focusKey?: string | number | null;\n focusViewBounds?: SceneBounds | null;\n /** Saved floor+device pose. Zoom `0` means use the current fit zoom. */\n homePose?: CameraPose | null;\n /** Changes when the staff/runtime slot changes (level + device). */\n homePoseKey?: string | null;\n /** Staff capture: RESET fits the full map. Hosts restore `homePose`. */\n resetFitsMap?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}\n\nexport function CameraRig({\n bounds,\n theme,\n is3d,\n controlsRef,\n cameraRef,\n persistedViewRef,\n focusKey = null,\n focusViewBounds = null,\n homePose = null,\n homePoseKey = null,\n resetFitsMap = false,\n onCameraChange,\n onCameraReset,\n}: CameraRigProps) {\n const { camera, size, invalidate } = useThree();\n const userAdjusted = useRef(false);\n const applyingView = useRef(false);\n const zoomAnimRef = useRef<number | null>(null);\n const appliedFocusKey = useRef<string | number | null>(null);\n const focusKeyRef = useRef(focusKey);\n focusKeyRef.current = focusKey;\n const focusViewBoundsRef = useRef(focusViewBounds);\n focusViewBoundsRef.current = focusViewBounds;\n const homePoseRef = useRef(homePose);\n homePoseRef.current = homePose;\n const homePoseKeyRef = useRef(homePoseKey);\n homePoseKeyRef.current = homePoseKey;\n const resetFitsMapRef = useRef(resetFitsMap);\n resetFitsMapRef.current = resetFitsMap;\n const onCameraChangeRef = useRef(onCameraChange);\n onCameraChangeRef.current = onCameraChange;\n const onCameraResetRef = useRef(onCameraReset);\n onCameraResetRef.current = onCameraReset;\n const appliedHomeKey = useRef<string | null>(null);\n const ignoreUserChangeUntil = useRef(0);\n /** Chrome Reset also clears the store highlight; skip the following layout restore. */\n const resetInFlight = useRef(false);\n const focusAnimRef = useRef<{\n from: CameraPose;\n dest: CameraPose;\n started: number;\n lookAt: boolean;\n } | null>(null);\n const boundsKey = cameraBoundsKey(bounds, is3d);\n\n const cancelZoomAnim = useCallback(() => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n }, []);\n\n const captureView = useCallback(\n (adjusted = userAdjusted.current): CameraViewSnapshot => {\n const controls = controlsRef.current;\n return {\n is3d,\n boundsKey,\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [camera.position.x, camera.position.y, camera.position.z],\n target: controls\n ? [controls.target.x, controls.target.y, controls.target.z]\n : [bounds.cx, bounds.cy, 0],\n userAdjusted: adjusted,\n focusKey: focusKeyRef.current,\n };\n },\n [bounds.cx, bounds.cy, boundsKey, camera, controlsRef, is3d],\n );\n\n const restoreView = useCallback(\n (snap: CameraViewSnapshot) => {\n applyingView.current = true;\n cancelZoomAnim();\n camera.up.set(0, 1, 0);\n camera.position.set(snap.position[0], snap.position[1], snap.position[2]);\n if (camera instanceof THREE.OrthographicCamera) {\n camera.zoom = snap.zoom;\n camera.updateProjectionMatrix();\n } else {\n camera.lookAt(snap.target[0], snap.target[1], snap.target[2]);\n }\n const controls = controlsRef.current;\n if (controls) {\n controls.target.set(snap.target[0], snap.target[1], snap.target[2]);\n controls.update();\n }\n persistedViewRef.current = { ...snap, boundsKey, is3d };\n userAdjusted.current = snap.userAdjusted;\n invalidate();\n applyingView.current = false;\n },\n [boundsKey, camera, cancelZoomAnim, controlsRef, invalidate, is3d, persistedViewRef],\n );\n\n const animateOrthoZoom = useCallback(\n (targetZoom: number) => {\n if (!(camera instanceof THREE.OrthographicCamera)) return;\n cancelZoomAnim();\n const startZoom = camera.zoom;\n if (startZoom === targetZoom) return;\n const started = performance.now();\n const step = (now: number) => {\n if (!(camera instanceof THREE.OrthographicCamera)) return;\n const t = Math.min(1, (now - started) / VIEWER_ZOOM_ANIM_MS);\n camera.zoom = lerp(startZoom, targetZoom, easeOutCubic(t));\n camera.updateProjectionMatrix();\n persistedViewRef.current = captureView();\n invalidate();\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n onCameraChangeRef.current?.(captureView(true));\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n },\n [camera, cancelZoomAnim, captureView, invalidate, persistedViewRef],\n );\n\n const currentPose = useCallback((): CameraPose => {\n const controls = controlsRef.current;\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [camera.position.x, camera.position.y, camera.position.z],\n target: controls\n ? [controls.target.x, controls.target.y, controls.target.z]\n : [bounds.cx, bounds.cy, 0],\n };\n }, [bounds.cx, bounds.cy, camera, controlsRef]);\n\n const fitPose = useCallback((): CameraPose => {\n const { width, height } = boundsExtent(bounds);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n return {\n zoom: fitOrthoZoom(size.width, size.height, width, height),\n position: [bounds.cx, bounds.cy, 500],\n target: [bounds.cx, bounds.cy, 0],\n };\n }\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [bounds.cx, bounds.cy - bounds.size * 0.35, bounds.size * 0.85],\n target: [bounds.cx, bounds.cy, 0],\n };\n }, [bounds, camera, is3d, size.height, size.width]);\n\n const applyPose = useCallback(\n (pose: CameraPose, lookAt: boolean) => {\n applyingView.current = true;\n camera.up.set(0, 1, 0);\n camera.position.set(pose.position[0], pose.position[1], pose.position[2]);\n if (camera instanceof THREE.OrthographicCamera) {\n camera.zoom = pose.zoom;\n camera.updateProjectionMatrix();\n }\n if (lookAt) {\n camera.lookAt(pose.target[0], pose.target[1], pose.target[2]);\n }\n const controls = controlsRef.current;\n if (controls) {\n controls.target.set(pose.target[0], pose.target[1], pose.target[2]);\n controls.update();\n }\n invalidate();\n applyingView.current = false;\n },\n [camera, controlsRef, invalidate],\n );\n\n const poseForFocusBounds = useCallback(\n (focus: SceneBounds): CameraPose => {\n const { width, height } = boundsExtent(focus);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const mapExtent = boundsExtent(bounds);\n const mapFit = fitOrthoZoom(\n size.width,\n size.height,\n mapExtent.width,\n mapExtent.height,\n );\n return {\n zoom: clampFocusZoom(\n fitOrthoZoom(size.width, size.height, width, height),\n mapFit,\n focusMaxZoomMultiple(width, height),\n ),\n position: [focus.cx, focus.cy, 500],\n target: [focus.cx, focus.cy, 0],\n };\n }\n const sizeHint = Math.max(focus.size, 1);\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [focus.cx, focus.cy - sizeHint * 0.35, sizeHint * 0.85],\n target: [focus.cx, focus.cy, 0],\n };\n },\n [bounds, camera, is3d, size.height, size.width],\n );\n\n const resolvedHomePose = useCallback((): CameraPose | null => {\n const saved = homePoseRef.current;\n if (!saved) return null;\n if (saved.zoom > 0) return saved;\n return { ...saved, zoom: fitPose().zoom };\n }, [fitPose]);\n\n const resetDestination = useCallback((): CameraPose => {\n const fit = fitPose();\n return resolveResetPose(resetFitsMapRef.current, homePoseRef.current, fit);\n }, [fitPose]);\n\n const applyHomeOrFit = useCallback(() => {\n cancelZoomAnim();\n focusAnimRef.current = null;\n const dest = resolvedHomePose() ?? fitPose();\n applyPose(dest, is3d);\n persistedViewRef.current = captureView(false);\n userAdjusted.current = false;\n ignoreUserChangeUntil.current = performance.now() + 160;\n }, [\n applyPose,\n cancelZoomAnim,\n captureView,\n fitPose,\n is3d,\n persistedViewRef,\n resolvedHomePose,\n ]);\n\n const applyFit = useCallback(() => {\n applyHomeOrFit();\n }, [applyHomeOrFit]);\n\n const animateFocus = useCallback(\n (focus: SceneBounds) => {\n const dest = poseForFocusBounds(focus);\n const from = currentPose();\n userAdjusted.current = true;\n appliedFocusKey.current = focusKeyRef.current;\n cancelZoomAnim();\n if (cameraPosesNear(from, dest)) {\n focusAnimRef.current = null;\n persistedViewRef.current = captureView(true);\n return;\n }\n // Drive the pan in useFrame so a later layout effect cannot snap to dest.\n focusAnimRef.current = {\n from,\n dest,\n started: performance.now(),\n lookAt: is3d,\n };\n applyingView.current = true;\n invalidate();\n },\n [\n cancelZoomAnim,\n captureView,\n currentPose,\n invalidate,\n is3d,\n persistedViewRef,\n poseForFocusBounds,\n ],\n );\n\n const animateReset = useCallback(() => {\n const dest = resetDestination();\n const from = currentPose();\n focusAnimRef.current = null;\n if (cameraPosesNear(from, dest)) {\n userAdjusted.current = false;\n persistedViewRef.current = captureView(false);\n resetInFlight.current = false;\n return;\n }\n cancelZoomAnim();\n const started = performance.now();\n const lookAt = is3d;\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / VIEWER_ZOOM_ANIM_MS);\n applyPose(interpolateCameraPose(from, dest, t), lookAt);\n persistedViewRef.current = captureView(false);\n if (t < 1) {\n applyingView.current = true;\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n userAdjusted.current = false;\n applyingView.current = false;\n resetInFlight.current = false;\n };\n applyingView.current = true;\n ignoreUserChangeUntil.current = performance.now() + 400;\n zoomAnimRef.current = requestAnimationFrame(step);\n }, [\n applyPose,\n cancelZoomAnim,\n captureView,\n currentPose,\n is3d,\n persistedViewRef,\n resetDestination,\n ]);\n const applyFitRef = useRef(applyFit);\n applyFitRef.current = applyFit;\n const restoreViewRef = useRef(restoreView);\n restoreViewRef.current = restoreView;\n const animateFocusRef = useRef(animateFocus);\n animateFocusRef.current = animateFocus;\n\n const zoomBy = useCallback(\n (direction: 1 | -1) => {\n userAdjusted.current = true;\n focusAnimRef.current = null;\n const controls = controlsRef.current;\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const { width, height } = boundsExtent(bounds);\n const fit = fitOrthoZoom(size.width, size.height, width, height);\n animateOrthoZoom(\n nextOrthoZoom(\n camera.zoom,\n direction,\n theme.ZOOM_STEP,\n fit * 0.2,\n fit * VIEWER_MAX_ZOOM_MULTIPLE,\n ),\n );\n } else if (controls) {\n const offset = camera.position.clone().sub(controls.target);\n const factor = 1 + Math.min(Math.max(theme.ZOOM_STEP, 0.15), 1) * 0.5;\n const next = direction > 0 ? offset.length() / factor : offset.length() * factor;\n offset.setLength(\n Math.min(theme.CAMERA_MAX_DISTANCE, Math.max(theme.CAMERA_MIN_DISTANCE, next)),\n );\n camera.position.copy(controls.target).add(offset);\n persistedViewRef.current = captureView();\n onCameraChangeRef.current?.(captureView(true));\n }\n controls?.update();\n invalidate();\n },\n [\n animateOrthoZoom,\n bounds,\n camera,\n captureView,\n controlsRef,\n invalidate,\n is3d,\n persistedViewRef,\n size.height,\n size.width,\n theme,\n ],\n );\n\n useEffect(() => () => cancelZoomAnim(), [cancelZoomAnim]);\n\n useEffect(() => {\n const controls = controlsRef.current;\n if (!controls) return;\n const onChange = () => {\n if (applyingView.current) return;\n if (performance.now() < ignoreUserChangeUntil.current) return;\n userAdjusted.current = true;\n persistedViewRef.current = captureView(true);\n onCameraChangeRef.current?.(persistedViewRef.current);\n };\n const onStart = () => {\n if (applyingView.current) return;\n if (performance.now() < ignoreUserChangeUntil.current) return;\n // Pointer drag — not OrbitControls.update() during a programmed ease.\n userAdjusted.current = true;\n focusAnimRef.current = null;\n persistedViewRef.current = captureView(true);\n onCameraChangeRef.current?.(persistedViewRef.current);\n };\n controls.addEventListener('change', onChange);\n controls.addEventListener('start', onStart);\n return () => {\n controls.removeEventListener('change', onChange);\n controls.removeEventListener('start', onStart);\n };\n }, [camera, captureView, controlsRef, persistedViewRef]);\n\n useImperativeHandle(\n cameraRef,\n () => ({\n zoomIn: () => {\n zoomBy(1);\n },\n zoomOut: () => {\n zoomBy(-1);\n },\n reset: () => {\n userAdjusted.current = false;\n focusAnimRef.current = null;\n appliedFocusKey.current = null;\n focusKeyRef.current = null;\n resetInFlight.current = true;\n onCameraResetRef.current?.();\n animateReset();\n },\n focusBounds: (focus) => {\n animateFocus(focus);\n },\n getView: () => captureView(),\n applyView: (snap) => restoreView(snap),\n }),\n [animateFocus, animateReset, captureView, restoreView, zoomBy],\n );\n\n useLayoutEffect(() => {\n if (size.width < 2 || size.height < 2) return;\n if (focusKey == null) {\n appliedFocusKey.current = null;\n focusAnimRef.current = null;\n }\n if (skipPersistedViewRestore({ resetInFlight: resetInFlight.current, focusKey })) {\n return;\n }\n if (resetInFlight.current) resetInFlight.current = false;\n const snap = persistedViewRef.current;\n const focus = focusViewBoundsRef.current;\n const isNewFocus =\n focusKey != null && focus != null && appliedFocusKey.current !== focusKey;\n const snapMatchesFocus =\n snap != null &&\n snap.is3d === is3d &&\n snap.boundsKey === boundsKey &&\n snap.focusKey === focusKey;\n\n if (focusKey != null && focus != null) {\n if (snapMatchesFocus) {\n appliedFocusKey.current = focusKey;\n if (focusAnimRef.current == null) restoreViewRef.current(snap);\n return;\n }\n if (isNewFocus) {\n // Only the first map paint snaps — otherwise the unfitted camera flashes.\n // Every later selection eases from the current view, like v1.\n if (persistedViewRef.current == null) {\n appliedFocusKey.current = focusKey;\n userAdjusted.current = true;\n cancelZoomAnim();\n applyPose(poseForFocusBounds(focus), is3d);\n persistedViewRef.current = captureView(true);\n return;\n }\n if (snap && !snapMatchesFocus) restoreViewRef.current(snap);\n animateFocusRef.current(focus);\n return;\n }\n // Same selection after a remount / theme swap — keep the current view.\n // Do not snap: that cancelled the ease when this effect re-ran.\n return;\n }\n\n if (homePoseKey && appliedHomeKey.current !== homePoseKey) {\n appliedHomeKey.current = homePoseKey;\n userAdjusted.current = false;\n applyFitRef.current();\n return;\n }\n\n // Theme rebuilds can swap the drei camera or remount this rig. Keep the\n // last view when the map extents and 2D/3D mode have not changed.\n if (snap && snap.is3d === is3d && snap.boundsKey === boundsKey) {\n restoreViewRef.current(snap);\n return;\n }\n userAdjusted.current = false;\n applyFitRef.current();\n }, [\n applyPose,\n boundsKey,\n camera,\n cancelZoomAnim,\n captureView,\n focusKey,\n homePoseKey,\n is3d,\n persistedViewRef,\n poseForFocusBounds,\n ]);\n\n useEffect(() => {\n if (size.width < 2 || size.height < 2 || userAdjusted.current) return;\n applyFitRef.current();\n }, [size.height, size.width]);\n\n useFrame(() => {\n const anim = focusAnimRef.current;\n if (!anim) return;\n const t = Math.min(1, (performance.now() - anim.started) / VIEWER_FOCUS_ANIM_MS);\n applyPose(\n interpolateCameraPose(anim.from, anim.dest, t, easeOutCubic),\n anim.lookAt,\n );\n persistedViewRef.current = captureView(true);\n if (t < 1) {\n invalidate();\n return;\n }\n focusAnimRef.current = null;\n });\n\n return null;\n}\n","/**\n * OrbitControls uses one `enableZoom` flag for wheel and touch pinch.\n * Website maps must swallow wheel only — pinch stays on the controls.\n *\n * R3F sets `events.connected` to `false` until the canvas host is wired,\n * so callers must not treat a falsy connected value as a DOM node.\n */\n\nfunction isEventRoot(value: unknown): value is EventTarget {\n return typeof value === 'object' && value !== null;\n}\n\nexport function orbitEventRoot(\n eventSource: EventTarget | null | undefined,\n connected: unknown,\n canvas: EventTarget | null | undefined,\n): EventTarget | null {\n if (isEventRoot(eventSource)) return eventSource;\n if (isEventRoot(connected)) return connected;\n if (isEventRoot(canvas)) return canvas;\n return null;\n}\n\nexport function viewerWheelEventHitsMap(\n root: EventTarget | null | undefined,\n target: EventTarget | null,\n): boolean {\n if (!isEventRoot(root) || target == null) return false;\n const contains = (root as { contains?: (node: EventTarget) => boolean }).contains;\n return typeof contains === 'function' && contains.call(root, target);\n}\n\n/** Stop OrbitControls without preventDefault so the page can still scroll. */\nexport function suppressViewerWheelZoom(event: Event): void {\n event.stopImmediatePropagation();\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { Canvas, useThree } from '@react-three/fiber';\nimport { OrthographicCamera, OrbitControls } from '@react-three/drei';\nimport type { OrbitControls as OrbitControlsImpl } from 'three-stdlib';\nimport type {\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n SceneBounds,\n ThemeDefaults,\n ViewerHoverTooltipHandler,\n} from '../../core';\nimport type { ResponsiveCameraPose } from '../../core';\nimport {\n boundsFromStackedLevels,\n isOutdoorLevel,\n isTransparentColor,\n outdoorSvgSuppressIds,\n viewerAllowsWheelZoom,\n viewerLevelStack,\n} from '../../core';\nimport { LevelMeshes } from './LevelMeshes';\nimport { RouteLine } from './RouteLine';\nimport { SvgVectorLayer } from './SvgVectorLayer';\nimport { CameraRig, type CameraViewSnapshot, type MapCameraHandle } from './CameraRig';\nimport {\n ORBIT_ZOOM_TO_CURSOR,\n SCENE_FLIP_SCALE,\n orbitMouseButtons,\n orbitTouches,\n viewBoundsFromData,\n type CameraPose,\n} from '../camera';\nimport {\n beginViewerPointerGesture,\n createViewerPointerGesture,\n endViewerPointerGesture,\n moveViewerPointerGesture,\n pointerMissClearsSelection,\n viewerPointerClientXY,\n} from '../pointer';\nimport {\n orbitEventRoot,\n suppressViewerWheelZoom,\n viewerWheelEventHitsMap,\n} from '../orbitWheelZoom';\n\nconst OUTDOOR_Z = -1;\nconst CAMERA_UP: [number, number, number] = [0, 1, 0];\nconst CANVAS_DPR: [number, number] = [1, 2];\nconst CANVAS_GL = { antialias: true };\n\n/**\n * OrbitControls uses one `enableZoom` flag for both wheel and touch pinch.\n * Swallow wheel on the document (capture) so the page can scroll and pinch\n * stays available. Listen on `document` because R3F's `events.connected` is\n * `false` until the canvas host is wired — attaching to that value is a no-op.\n */\nfunction OrbitWheelZoomGuard({\n blockWheel,\n eventSource,\n}: {\n blockWheel: boolean;\n eventSource?: React.RefObject<HTMLElement | null>;\n}) {\n const gl = useThree((state) => state.gl);\n const connected = useThree((state) => state.events.connected);\n\n useEffect(() => {\n if (!blockWheel) return;\n\n const onWheel = (event: WheelEvent) => {\n const root = orbitEventRoot(\n eventSource?.current,\n connected,\n gl.domElement,\n );\n if (!viewerWheelEventHitsMap(root, event.target)) return;\n suppressViewerWheelZoom(event);\n };\n\n document.addEventListener('wheel', onWheel, { capture: true });\n return () => document.removeEventListener('wheel', onWheel, { capture: true });\n }, [blockWheel, connected, eventSource, gl.domElement]);\n\n return null;\n}\n\nexport interface MapSceneProps {\n doc: PublishedDocument;\n theme: ThemeDefaults;\n activeLevelId: number | null;\n route: PathResult | null;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusKey?: string | number | null;\n focusViewBounds?: SceneBounds | null;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n onSelectShape?: (\n shapeId: number | null,\n levelId: number,\n opts?: { additive?: boolean },\n ) => void;\n onActiveLevelChange?: (levelId: number) => void;\n imageProxyUrl?: string | null;\n /** Keep pointer events inside the map canvas host so header/footer stay clickable. */\n eventSource?: React.RefObject<HTMLElement | null>;\n /** WEBSITE / DISPLAY_APP hide unassigned amenity, kiosk, elevator, and escalator shapes. */\n host?: MapViewerHost;\n /** Assigned kiosk shape currently running this DISPLAY_APP viewer. */\n kioskOriginShapeId?: number | null;\n retailers?: PublishedRetailer[];\n showHoverTooltip?: boolean;\n onHoverTooltip?: ViewerHoverTooltipHandler;\n homePose?: ResponsiveCameraPose | CameraPose | null;\n homePoseKey?: string | null;\n resetFitsMap?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n /** Override website wheel-block (staff Map Responsiveness capture). */\n allowWheelZoom?: boolean;\n}\n\nexport function MapScene({\n doc,\n theme,\n activeLevelId,\n route,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId = null,\n focusKey,\n focusViewBounds,\n cameraRef,\n onSelectShape,\n onActiveLevelChange,\n imageProxyUrl,\n eventSource,\n host = 'PORTAL_ASSIGN',\n homePose = null,\n homePoseKey = null,\n resetFitsMap = false,\n onCameraChange,\n onCameraReset,\n allowWheelZoom,\n kioskOriginShapeId = null,\n retailers = [],\n showHoverTooltip = false,\n onHoverTooltip,\n}: MapSceneProps) {\n const is3d = theme.MAP_STYLE === '3D';\n const controlsRef = useRef<OrbitControlsImpl | null>(null);\n const persistedViewRef = useRef<CameraViewSnapshot | null>(null);\n const pointerDownRef = useRef<{ x: number; y: number } | null>(null);\n const pointerGestureRef = useRef(createViewerPointerGesture());\n\n useEffect(() => {\n const root = eventSource?.current;\n if (!root) return;\n\n const gesture = pointerGestureRef.current;\n\n const onDown = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n pointerDownRef.current = { x: pos.x, y: pos.y };\n beginViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n const onMove = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n moveViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n const onUp = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n endViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n root.addEventListener('pointerdown', onDown, true);\n window.addEventListener('pointermove', onMove, { passive: true });\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n root.removeEventListener('pointerdown', onDown, true);\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [eventSource]);\n\n const stacked = useMemo(\n () => viewerLevelStack(doc.levels, activeLevelId),\n [doc.levels, activeLevelId],\n );\n\n const bounds = useMemo(\n () => boundsFromStackedLevels(doc.levels, activeLevelId, doc.baseViewbox),\n [doc.levels, doc.baseViewbox, activeLevelId],\n );\n\n const view = useMemo(\n () => viewBoundsFromData(bounds),\n [\n bounds.cx,\n bounds.cy,\n bounds.maxX,\n bounds.maxY,\n bounds.minX,\n bounds.minY,\n bounds.size,\n ],\n );\n const cameraPosition = useMemo(\n () => [view.cx, view.cy, 500] as [number, number, number],\n [view.cx, view.cy],\n );\n const camera3dPosition = useMemo(\n () =>\n [view.cx, view.cy - view.size * 0.35, view.size * 0.85] as [\n number,\n number,\n number,\n ],\n [view.cx, view.cy, view.size],\n );\n const mouseButtons = useMemo(() => orbitMouseButtons(is3d), [is3d]);\n const touches = useMemo(() => orbitTouches(is3d), [is3d]);\n\n const outdoorLevel = useMemo(\n () => doc.levels.find((level) => isOutdoorLevel(level)) ?? null,\n [doc.levels],\n );\n\n const outdoorSvgUrl =\n outdoorLevel?.sourceSvgUrl ?? doc.baseSvgUrl ?? null;\n\n const suppressIds = useMemo(\n () => outdoorSvgSuppressIds(doc.levels),\n [doc.levels],\n );\n\n const showOutdoorSvg = stacked.some((level) => isOutdoorLevel(level));\n\n const outdoorTheme = useMemo(\n () => ({\n GREEN_AREA_COLOR: theme.GREEN_AREA_COLOR,\n WATER_COLOR: theme.WATER_COLOR,\n PARKING_LANE_COLOR: theme.PARKING_LANE_COLOR,\n PARKING_ICON_COLOR: theme.PARKING_ICON_COLOR,\n WALKABLE_COLOR: theme.WALKABLE_COLOR,\n }),\n [\n theme.GREEN_AREA_COLOR,\n theme.PARKING_ICON_COLOR,\n theme.PARKING_LANE_COLOR,\n theme.WALKABLE_COLOR,\n theme.WATER_COLOR,\n ],\n );\n\n return (\n <Canvas\n style={{\n width: '100%',\n height: '100%',\n background: isTransparentColor(theme.MAP_BACKGROUND_COLOR)\n ? 'transparent'\n : theme.MAP_BACKGROUND_COLOR,\n }}\n eventSource={eventSource as React.RefObject<HTMLElement> | undefined}\n eventPrefix=\"offset\"\n orthographic={!is3d}\n frameloop=\"demand\"\n dpr={CANVAS_DPR}\n flat\n gl={CANVAS_GL}\n onPointerDown={(e) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n pointerDownRef.current = { x: pos.x, y: pos.y };\n beginViewerPointerGesture(pointerGestureRef.current, pos.x, pos.y, pos.pointerId);\n }}\n onPointerMissed={(e) => {\n if (\n pointerMissClearsSelection(pointerDownRef.current, {\n x: e.clientX,\n y: e.clientY,\n button: e.button,\n })\n ) {\n onSelectShape?.(null, activeLevelId ?? 0);\n }\n }}\n camera={\n is3d\n ? {\n position: camera3dPosition,\n fov: 50,\n near: 1,\n far: 10000,\n up: CAMERA_UP,\n }\n : undefined\n }\n >\n {!is3d && (\n <OrthographicCamera\n makeDefault\n position={cameraPosition}\n up={CAMERA_UP}\n near={0.1}\n far={5000}\n />\n )}\n {isTransparentColor(theme.MAP_BACKGROUND_COLOR) ? null : (\n <color attach=\"background\" args={[theme.MAP_BACKGROUND_COLOR]} />\n )}\n <ambientLight intensity={4} color=\"#c4c4c4\" />\n <directionalLight position={[0, 400, 0]} color=\"#ffffff\" intensity={0.3} />\n <directionalLight position={[0, 0, 400]} color=\"#c4c4c4\" intensity={0.2} />\n <directionalLight position={[0, 0, -400]} color=\"#c4c4c4\" intensity={0.2} />\n\n <group scale={SCENE_FLIP_SCALE}>\n {showOutdoorSvg && outdoorSvgUrl ? (\n <SvgVectorLayer\n url={outdoorSvgUrl}\n suppressIds={suppressIds}\n imageProxyUrl={imageProxyUrl}\n is3d={is3d}\n theme={outdoorTheme}\n />\n ) : null}\n\n {stacked.map((level) => {\n const outdoor = isOutdoorLevel(level);\n const transform = level.transform;\n return (\n <group\n key={level.id}\n position={[\n transform.translateX,\n transform.translateY,\n outdoor ? OUTDOOR_Z : 0,\n ]}\n rotation={[0, 0, (transform.rotate * Math.PI) / 180]}\n scale={transform.scale || 1}\n >\n <LevelMeshes\n level={level}\n levels={doc.levels}\n theme={theme}\n is3d={is3d}\n eventSource={eventSource}\n pointerGestureRef={pointerGestureRef}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n interactiveOnly={outdoor && Boolean(outdoorSvgUrl)}\n imageProxyUrl={imageProxyUrl}\n amenities={doc.amenities}\n retailers={retailers}\n host={host}\n kioskOriginShapeId={kioskOriginShapeId}\n showHoverTooltip={showHoverTooltip}\n onHoverTooltip={onHoverTooltip}\n onSelectShape={(shapeId, opts) =>\n onSelectShape?.(shapeId, level.id, opts)\n }\n />\n {route && level.id === activeLevelId ? (\n <RouteLine\n route={route}\n levelId={level.id}\n levels={doc.levels}\n connectors={doc.connectors}\n color={theme.ROUTE_COLOR}\n thickness={theme.ROUTE_THICKNESS}\n onActiveLevelChange={onActiveLevelChange}\n />\n ) : null}\n </group>\n );\n })}\n </group>\n\n <OrbitWheelZoomGuard\n eventSource={eventSource}\n blockWheel={!(allowWheelZoom ?? viewerAllowsWheelZoom(host))}\n />\n <OrbitControls\n ref={controlsRef}\n makeDefault\n enableDamping={false}\n enableRotate={is3d}\n enablePan\n enableZoom\n screenSpacePanning\n zoomSpeed={1}\n zoomToCursor={ORBIT_ZOOM_TO_CURSOR}\n mouseButtons={mouseButtons}\n touches={touches}\n maxDistance={theme.CAMERA_MAX_DISTANCE}\n minDistance={theme.CAMERA_MIN_DISTANCE}\n />\n <CameraRig\n bounds={view}\n theme={theme}\n is3d={is3d}\n controlsRef={controlsRef}\n cameraRef={cameraRef}\n persistedViewRef={persistedViewRef}\n focusKey={focusKey ?? selectedShapeId ?? null}\n focusViewBounds={focusViewBounds ?? null}\n homePose={homePose}\n homePoseKey={homePoseKey}\n resetFitsMap={resetFitsMap}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n />\n </Canvas>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport {\n STATIC_ICON_COLORS,\n type CmAmenityCatalogItem,\n type PathResult,\n type PublishedDocument,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { getAmenityByType, recolorMapSvg } from '../../specialIcons';\n\nexport interface RuntimeChromeProps {\n doc: PublishedDocument;\n amenities: CmAmenityCatalogItem[];\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n fromAnchorId: number | null;\n toAnchorId: number | null;\n onFromChange: (id: number | null) => void;\n onToChange: (id: number | null) => void;\n accessibleOnly: boolean;\n onAccessibleOnlyChange: (v: boolean) => void;\n route: PathResult | null;\n showSearch?: boolean;\n showAmenities?: boolean;\n amenityIconColor?: string;\n}\n\ninterface ListItem {\n id: string;\n label: string;\n group: string;\n anchorId: number | null;\n levelId: number;\n kind: 'store' | 'amenity';\n amenityId: number | null;\n}\n\nfunction itemLabel(\n shape: PublishedDocument['levels'][number]['shapes'][number],\n amenityName?: string,\n): string {\n return (\n shape.assignment?.customLabel ||\n amenityName ||\n shape.label.text ||\n shape.assignment?.unitNumber ||\n shape.key\n );\n}\n\nexport function RuntimeChrome({\n doc,\n amenities,\n fromAnchorId,\n toAnchorId,\n onFromChange,\n onToChange,\n accessibleOnly,\n onAccessibleOnlyChange,\n route,\n showSearch = true,\n showAmenities = true,\n amenityIconColor = STATIC_ICON_COLORS.amenity,\n}: RuntimeChromeProps) {\n const [query, setQuery] = useState('');\n const [selectedItem, setSelectedItem] = useState<ListItem | null>(null);\n\n const items = useMemo(() => {\n const list: ListItem[] = [];\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id) ?? null;\n if (shape.kind === 'unit') {\n list.push({\n id: `store-${shape.id}`,\n label: itemLabel(shape),\n group: level.name,\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'store',\n amenityId: null,\n });\n }\n if (shape.kind === 'amenity' && shape.assignment?.amenityId) {\n const amenity = amenities.find((a) => a.id === shape.assignment!.amenityId);\n list.push({\n id: `amenity-${shape.id}`,\n label: itemLabel(shape, amenity?.name),\n group: 'Amenities',\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'amenity',\n amenityId: amenity?.id ?? shape.assignment.amenityId,\n });\n }\n }\n }\n return list;\n }, [doc, amenities]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((i) => i.label.toLowerCase().includes(q));\n }, [items, query]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, ListItem[]>();\n for (const item of filtered) {\n const arr = map.get(item.group) ?? [];\n arr.push(item);\n map.set(item.group, arr);\n }\n return Array.from(map.entries());\n }, [filtered]);\n\n const anchorOptions = items.filter((i) => i.anchorId != null);\n const hasQuery = query.trim().length > 0;\n\n const selectItem = (item: ListItem) => {\n setSelectedItem(item);\n if (item.anchorId != null) {\n onToChange(item.anchorId);\n }\n };\n\n if (!showSearch && !(showAmenities && amenities.length > 0)) {\n return null;\n }\n\n return (\n <div className=\"eyeon-map-chrome\">\n <div className=\"eyeon-map-chrome__top\">\n {showSearch && (\n <input\n type=\"search\"\n className=\"eyeon-map-chrome__search-input\"\n placeholder=\"Search...\"\n aria-label=\"Search...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n\n {showAmenities && amenities.length > 0 && (\n <div className=\"eyeon-map-chrome__amenities\">\n {amenities.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className=\"eyeon-map-chrome__amenity\"\n aria-label={a.name}\n onClick={() => {\n const match = items.find(\n (i) =>\n i.kind === 'amenity' &&\n i.amenityId === a.id &&\n i.anchorId != null,\n );\n if (match) selectItem(match);\n }}\n >\n {(() => {\n const amenity = getAmenityByType(a.code);\n return amenity ? (\n <span\n className=\"eyeon-map-chrome__amenity-icon\"\n dangerouslySetInnerHTML={{\n __html: recolorMapSvg(amenity.svgCode, amenityIconColor),\n }}\n />\n ) : (\n <span className=\"eyeon-map-chrome__amenity-label\">\n {a.name.slice(0, 2)}\n </span>\n );\n })()}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {showSearch && hasQuery && (\n <div className=\"eyeon-map-chrome__panel\">\n <div className=\"eyeon-map-chrome__groups\">\n {grouped.length === 0 ? (\n <div className=\"eyeon-map-chrome__empty\">No matching stores</div>\n ) : (\n grouped.map(([group, groupItems]) => (\n <div key={group} className=\"eyeon-map-chrome__group\">\n <div className=\"eyeon-map-chrome__group-title\">{group}</div>\n {groupItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={\n selectedItem?.id === item.id\n ? 'eyeon-map-chrome__item is-selected'\n : 'eyeon-map-chrome__item'\n }\n onClick={() => selectItem(item)}\n >\n {item.label}\n </button>\n ))}\n </div>\n ))\n )}\n </div>\n\n {selectedItem && (\n <div className=\"eyeon-map-chrome__detail\">\n <div className=\"eyeon-map-chrome__detail-title\">{selectedItem.label}</div>\n <div className=\"eyeon-map-chrome__detail-meta\">{selectedItem.group}</div>\n </div>\n )}\n\n <div className=\"eyeon-map-chrome__route\">\n <label>\n From\n <ModernSelect\n ariaLabel=\"From\"\n value={fromAnchorId != null ? String(fromAnchorId) : ''}\n placeholder=\"Select start\"\n searchable\n options={anchorOptions.map((i) => ({\n value: String(i.anchorId),\n label: `${i.label} · ${i.group}`,\n }))}\n onChange={(next) => onFromChange(next ? Number(next) : null)}\n />\n </label>\n <label>\n To\n <ModernSelect\n ariaLabel=\"To\"\n value={toAnchorId != null ? String(toAnchorId) : ''}\n placeholder=\"Select destination\"\n searchable\n options={anchorOptions.map((i) => ({\n value: String(i.anchorId),\n label: `${i.label} · ${i.group}`,\n }))}\n onChange={(next) => onToChange(next ? Number(next) : null)}\n />\n </label>\n <label className=\"eyeon-map-chrome__accessible\">\n <input\n type=\"checkbox\"\n checked={accessibleOnly}\n onChange={(e) => onAccessibleOnlyChange(e.target.checked)}\n />\n Accessible route\n </label>\n {route && (\n <div className=\"eyeon-map-chrome__route-meta\">\n {route.levelChanges.length > 0\n ? `${route.levelChanges.length} level change(s)`\n : 'Same level'}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n formatRetailerPhone,\n resolveFetchUrl,\n websiteFromRetailerOptions,\n websiteInfoModalDirections,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport type {\n MapViewerHost,\n WebsiteDestination,\n WebsiteMappedRetailer,\n} from '../../core';\n\nexport function WebsiteInfoModal({\n destination,\n retailers,\n imageProxyUrl,\n host = 'WEBSITE',\n onClose,\n onMapIt,\n}: {\n destination: WebsiteDestination;\n retailers: WebsiteMappedRetailer[];\n imageProxyUrl?: string | null;\n host?: MapViewerHost;\n onClose: () => void;\n onMapIt: (fromRetailerId: number) => void;\n}) {\n const [fromRetailerId, setFromRetailerId] = useState('');\n const retailer =\n destination.kind === 'store' && destination.retailerId != null\n ? retailers.find((item) => item.id === destination.retailerId) ?? null\n : null;\n\n const options = useMemo(\n () => websiteFromRetailerOptions(retailers, destination.retailerId),\n [destination.retailerId, retailers],\n );\n\n useEffect(() => {\n setFromRetailerId('');\n }, [destination.shapeId]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n if (typeof document === 'undefined') return null;\n\n const logo = retailer?.logoUrl\n ? resolveFetchUrl(retailer.logoUrl, imageProxyUrl)\n : null;\n const showDetails = Boolean(\n retailer &&\n (logo ||\n retailer.name ||\n retailer.location ||\n retailer.phone ||\n retailer.description),\n );\n const directions = websiteInfoModalDirections(host, destination);\n const mapItDisabled = directions.mapItDisabled || !fromRetailerId;\n const showForm = directions.showFromRetailers || directions.showMapIt;\n\n return createPortal(\n <div\n className=\"eyeon-map-info-modal\"\n role=\"presentation\"\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n className=\"eyeon-map-info-modal__dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-info-modal-title\"\n >\n <button\n type=\"button\"\n className=\"eyeon-map-info-modal__close\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#000\" />\n <path\n d=\"M8 8l8 8M16 8l-8 8\"\n stroke=\"#fff\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <div className=\"eyeon-map-info-modal__body\">\n <div className=\"eyeon-map-info-modal__content\">\n {showDetails ? (\n <div className=\"eyeon-map-info-modal__retailer\">\n {logo ? (\n <div className=\"eyeon-map-info-modal__logo\">\n <img src={logo} alt={retailer?.name ?? ''} />\n </div>\n ) : null}\n <div className=\"eyeon-map-info-modal__copy\">\n <div id=\"eyeon-map-info-modal-title\">\n <b>Retailer:</b> {retailer?.name}\n </div>\n {retailer?.location ? (\n <div>\n <b>Location:</b> {retailer.location}\n </div>\n ) : null}\n {retailer?.phone ? (\n <div>\n <b>Phone:</b>{' '}\n <a href={`tel:${retailer.phone}`}>\n {formatRetailerPhone(retailer.phone)}\n </a>\n </div>\n ) : null}\n {retailer?.description ? (\n <div\n dangerouslySetInnerHTML={{ __html: retailer.description }}\n />\n ) : null}\n </div>\n </div>\n ) : (\n <div\n id=\"eyeon-map-info-modal-title\"\n className=\"eyeon-map-info-modal__amenity\"\n >\n {destination.name}\n </div>\n )}\n </div>\n {showForm ? (\n <form\n className=\"eyeon-map-info-modal__form\"\n onSubmit={(e) => {\n e.preventDefault();\n if (mapItDisabled) return;\n const id = Number(fromRetailerId);\n if (Number.isFinite(id) && id > 0) onMapIt(id);\n }}\n >\n {directions.showFromRetailers ? (\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={fromRetailerId}\n placeholder=\"Get direction from ...\"\n searchable\n options={options}\n onChange={setFromRetailerId}\n />\n ) : null}\n {directions.showMapIt ? (\n <span\n className=\"eyeon-map-info-modal__map-it-tooltip\"\n data-tooltip={directions.mapItTooltip ?? undefined}\n tabIndex={directions.mapItTooltip ? 0 : undefined}\n >\n <button\n type=\"submit\"\n className=\"eyeon-map-info-modal__map-it\"\n disabled={mapItDisabled}\n aria-describedby={\n directions.mapItTooltip\n ? 'eyeon-map-info-modal-map-it-tip'\n : undefined\n }\n >\n Map IT\n </button>\n {directions.mapItTooltip ? (\n <span\n id=\"eyeon-map-info-modal-map-it-tip\"\n className=\"eyeon-map-info-modal__sr-only\"\n >\n {directions.mapItTooltip}\n </span>\n ) : null}\n </span>\n ) : null}\n </form>\n ) : null}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","import React from 'react';\nimport type { ViewerHoverTooltip } from '../../core';\n\nexport function HoverTooltip({\n tooltip,\n}: {\n tooltip: ViewerHoverTooltip | null;\n}) {\n if (!tooltip) return null;\n return (\n <div\n className=\"eyeon-map-hover-tooltip\"\n role=\"tooltip\"\n style={{ left: tooltip.x, top: tooltip.y }}\n >\n <div className=\"eyeon-map-hover-tooltip__pop\">\n <span className=\"eyeon-map-hover-tooltip__label\">{tooltip.text}</span>\n <span className=\"eyeon-map-hover-tooltip__arrow\" aria-hidden=\"true\" />\n </div>\n </div>\n );\n}\n","import {\n normalizeRetailerCatalogItem,\n type PublishedRetailer,\n} from '../core';\n\nexport async function fetchWebsiteRetailers(\n webApiURI: string,\n centerId?: number,\n signal?: AbortSignal,\n): Promise<PublishedRetailer[]> {\n const base = webApiURI.replace(/\\/$/, '');\n const all: unknown[] = [];\n let page = 1;\n while (!signal?.aborted) {\n const params = new URLSearchParams({\n limit: '100',\n page: String(page),\n });\n if (centerId != null && centerId > 0) {\n params.set('center_id', String(centerId));\n }\n const res = await fetch(`${base}/v1/retailers?${params}`, {\n credentials: 'include',\n signal,\n });\n if (!res.ok) break;\n const json = (await res.json()) as { items?: unknown[]; count?: number };\n const items = Array.isArray(json.items)\n ? json.items\n : Array.isArray(json)\n ? json\n : [];\n all.push(...items);\n const count = typeof json.count === 'number' ? json.count : all.length;\n if (all.length >= count || items.length < 100) break;\n page += 1;\n }\n return all\n .map(normalizeRetailerCatalogItem)\n .filter((item): item is PublishedRetailer => item != null);\n}\n","import React, { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n DeviceType,\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n ThemeDefaults,\n ViewerHoverTooltip,\n} from '../core';\nimport {\n compileGraph,\n defaultViewerLevelId,\n deviceFromHost,\n findResponsiveOverride,\n findViewerKioskOrigin,\n MAP_NO_FLOORS_MESSAGE,\n mergeTheme,\n findNearestAmenityPath,\n findShortestPlacePath,\n matchingShapeAnchorIds,\n normalizePublishedDocument,\n shapeAnchorIds,\n overrideToCameraPose,\n responsiveViewKey,\n viewerAllowsWheelZoom,\n viewerCanShowScene,\n viewerChrome,\n viewerLevelIdAfterShapeSelect,\n viewerResetPatch,\n websiteClickOpensModal,\n websiteDestination,\n websiteMapItAnchors,\n websiteRetailersOnMap,\n type ViewerResetKind,\n} from '../core';\nimport { MapScene } from './components/MapScene';\nimport { isAssignAmenity } from '../specialIcons';\nimport type { CameraViewSnapshot, MapCameraHandle } from './components/CameraRig';\nimport { RuntimeChrome } from './ui/RuntimeChrome';\nimport { MapControls } from './ui/MapControls';\nimport { WebsiteInfoModal } from './ui/WebsiteInfoModal';\nimport { HoverTooltip } from './ui/HoverTooltip';\nimport { fetchWebsiteRetailers } from './fetchWebsiteRetailers';\nimport {\n selectionFocusKey,\n viewFocusBoundsForShape,\n viewFocusBoundsForShapes,\n viewFocusBoundsForRoute,\n} from './camera';\nimport {\n routeOriginLevelId,\n shouldPinViewToRouteOrigin,\n} from './routeFloorChanges';\nimport { ensureMapFont } from '../fonts/mapFontUrl';\nimport './viewer.css';\n\nexport interface MapViewerProps {\n /** Published (or draft) document. If omitted, fetched from webApiURI. */\n document?: PublishedDocument | null;\n webApiURI?: string;\n /** Prefer fetching /v1/map/document */\n centerId?: number;\n /** Public / preview / kiosk surface. Never includes Map options (editor rail). */\n host?: MapViewerHost;\n kioskId?: number | null;\n selectedRetailerId?: number | null;\n /**\n * Media proxy base for remote http(s) media (v1 `IMAGE_PROXY_URL` contract,\n * e.g. `/eyeon-portal/media?url=`). Needed wherever the outdoor SVG or\n * retailer logos are cross-origin. Inlined amenity / kiosk data URLs skip it.\n */\n imageProxyUrl?: string | null;\n themeOverrides?: Partial<ThemeDefaults>;\n onExtractedAmenities?: (codes: string[]) => void;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n /** Zoom to this shape (PORTAL default-map assign). */\n selectedShapeId?: number | null;\n /** Extra selected shapes when Shift-selecting in PORTAL assign. */\n selectedShapeIds?: number[];\n /** Highlight from the Map options list (same fill as pointer hover). */\n hoveredShapeId?: number | null;\n /**\n * Bump when staff pick a row in the rail so the camera re-frames even if\n * the same shape is already selected.\n */\n focusNonce?: number;\n /** Controlled floor when embedded (e.g. PORTAL default). */\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Click a store/amenity to route. Off when PORTAL is assigning. Default true. */\n routeOnSelect?: boolean;\n createRouteRef?: React.MutableRefObject<{\n createRouteToStore: (retailerId: number) => void;\n createRouteToAmenity: (amenityCode: string) => void;\n clearRoute: () => void;\n /** Kiosk idle reset: clear routing, restore its floor, and reset the camera. */\n resetMap: () => void;\n } | null>;\n className?: string;\n style?: React.CSSProperties;\n /** Force a responsiveness slot (staff editor). Otherwise derived from host + width. */\n device?: DeviceType;\n /** Staff capture: wheel zoom on, no store modal, camera-change events. */\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}\n\nasync function fetchDocument(\n webApiURI: string,\n centerId?: number,\n draft?: boolean,\n signal?: AbortSignal,\n): Promise<PublishedDocument> {\n const base = webApiURI.replace(/\\/$/, '');\n const params = new URLSearchParams();\n if (centerId != null && centerId > 0) params.set('center_id', String(centerId));\n if (draft) params.set('draft', '1');\n const qs = params.toString();\n const res = await fetch(`${base}/v1/map/document${qs ? `?${qs}` : ''}`, {\n credentials: 'include',\n signal,\n });\n if (!res.ok) {\n throw new Error(`Failed to load map document (${res.status})`);\n }\n return res.json();\n}\n\nexport function MapViewer(props: MapViewerProps) {\n ensureMapFont();\n const {\n document: documentProp,\n webApiURI,\n centerId,\n host = 'WEBSITE',\n kioskId = null,\n selectedRetailerId = null,\n themeOverrides,\n onExtractedAmenities,\n createRouteRef,\n className,\n style,\n activeLevelId: activeLevelIdProp,\n onActiveLevelChange,\n routeOnSelect = true,\n imageProxyUrl,\n selectedShapeId = null,\n selectedShapeIds,\n hoveredShapeId = null,\n focusNonce,\n device: deviceProp,\n captureCamera = false,\n onCameraChange,\n onCameraReset,\n } = props;\n\n const [rawDoc, setDoc] = useState<PublishedDocument | null>(documentProp ?? null);\n const doc = useMemo(\n () => (rawDoc ? normalizePublishedDocument(rawDoc) : null),\n [rawDoc],\n );\n const [error, setError] = useState<string | null>(null);\n const [route, setRoute] = useState<PathResult | null>(null);\n const [fromAnchorId, setFromAnchorId] = useState<number | null>(null);\n const [toAnchorId, setToAnchorId] = useState<number | null>(null);\n const [accessibleOnly, setAccessibleOnly] = useState(false);\n const [websiteShapeId, setWebsiteShapeId] = useState<number | null>(null);\n const [websiteModalOpen, setWebsiteModalOpen] = useState(false);\n const [hoverTooltip, setHoverTooltip] = useState<ViewerHoverTooltip | null>(\n null,\n );\n const [fetchedRetailers, setFetchedRetailers] = useState<\n PublishedRetailer[] | null\n >(null);\n const [internalLevelId, setInternalLevelId] = useState<number | null>(() => {\n if (!documentProp) return null;\n return defaultViewerLevelId(normalizePublishedDocument(documentProp).levels);\n });\n const cameraApi = useRef<MapCameraHandle | null>(null);\n const canvasHostRef = useRef<HTMLDivElement>(null);\n const routeEndpointsRef = useRef<{ from: number | null; to: number | null }>({\n from: null,\n to: null,\n });\n const [viewportWidth, setViewportWidth] = useState(1280);\n const activeLevelId = activeLevelIdProp ?? internalLevelId;\n const setActiveLevelId = (id: number | null) => {\n setInternalLevelId(id);\n if (id != null) onActiveLevelChange?.(id);\n };\n\n useEffect(() => {\n if (documentProp) {\n setDoc(documentProp);\n return;\n }\n if (!webApiURI) return;\n let cancelled = false;\n const controller = new AbortController();\n const draft = viewerChrome(host).fetchDraft;\n fetchDocument(webApiURI, centerId, draft, controller.signal)\n .then((d) => {\n if (!cancelled) setDoc(d);\n })\n .catch((e) => {\n if (\n !cancelled &&\n !(e instanceof DOMException && e.name === 'AbortError')\n ) {\n setError(e instanceof Error ? e.message : String(e));\n }\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [documentProp, webApiURI, centerId, host]);\n\n useEffect(() => {\n const el = canvasHostRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width && width > 0) setViewportWidth(width);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [doc, host]);\n\n useEffect(() => {\n const chrome = viewerChrome(host);\n if ((!chrome.storeModal && !chrome.hoverTooltip) || !webApiURI) return;\n let cancelled = false;\n const controller = new AbortController();\n fetchWebsiteRetailers(webApiURI, centerId, controller.signal)\n .then((items) => {\n if (!cancelled) setFetchedRetailers(items);\n })\n .catch(() => {\n if (!cancelled) setFetchedRetailers([]);\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [webApiURI, centerId, host]);\n\n useEffect(() => {\n if (!doc) return;\n const ids = new Set(doc.levels.map((level) => level.id));\n if (activeLevelId == null || !ids.has(activeLevelId)) {\n setActiveLevelId(defaultViewerLevelId(doc.levels));\n }\n const codes = new Set<string>();\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.kind === 'amenity' && shape.assignment?.amenityId != null) {\n const amenity = doc.amenities.find((a) => a.id === shape.assignment!.amenityId);\n if (amenity) codes.add(amenity.code);\n }\n }\n }\n onExtractedAmenities?.(Array.from(codes));\n }, [doc, activeLevelId, onExtractedAmenities]);\n\n // Map IT / ?r= — switch to the store's floor so the highlight is visible\n useEffect(() => {\n if (!doc || selectedRetailerId == null) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.retailerId === selectedRetailerId) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, level.id),\n );\n return;\n }\n }\n }\n }, [doc, selectedRetailerId]);\n\n const focusShapeIds = useMemo(() => {\n if (websiteShapeId != null) return [websiteShapeId];\n if (selectedShapeIds && selectedShapeIds.length > 0) return selectedShapeIds;\n return selectedShapeId != null ? [selectedShapeId] : [];\n }, [selectedShapeId, selectedShapeIds, websiteShapeId]);\n const selectionKey = selectionFocusKey(focusShapeIds);\n const selectionFocusKeyWithNonce =\n selectionKey == null\n ? null\n : focusNonce != null\n ? `${selectionKey}#${focusNonce}`\n : selectionKey;\n const selectionFocusBounds = useMemo(() => {\n if (!doc || focusShapeIds.length === 0) return null;\n // Union every selected shape so Shift-select frames the group, not the first id.\n return viewFocusBoundsForShapes(doc.levels, focusShapeIds);\n }, [doc, focusShapeIds]);\n const kioskOrigin = useMemo(\n () => (doc ? findViewerKioskOrigin(doc, host, kioskId) : null),\n [doc, host, kioskId],\n );\n const routeFocusBounds = useMemo(() => {\n if (!doc || !route) return null;\n return viewFocusBoundsForRoute(doc.levels, route, activeLevelId);\n }, [activeLevelId, doc, route]);\n const routeFocusKey = route\n ? `route:${activeLevelId ?? 'none'}:${route.anchorIds.join(',')}`\n : null;\n const focusKey = captureCamera\n ? null\n : routeFocusKey ?? selectionFocusKeyWithNonce;\n const focusViewBounds = captureCamera ? null : routeFocusBounds ?? selectionFocusBounds;\n const resolvedDevice = deviceProp ?? deviceFromHost(host, viewportWidth);\n const homeOverride = doc\n ? findResponsiveOverride(doc.responsiveOverrides, activeLevelId, resolvedDevice)\n : null;\n const homePose = homeOverride ? overrideToCameraPose(homeOverride) : null;\n const homePoseKey = responsiveViewKey(\n activeLevelId,\n resolvedDevice,\n captureCamera,\n );\n\n // DISPLAY_APP starts on the physical kiosk floor and routes from that kiosk.\n useEffect(() => {\n if (!viewerChrome(host).kioskOrigin || !kioskOrigin) return;\n setFromAnchorId(kioskOrigin.anchorId);\n setActiveLevelId(kioskOrigin.levelId);\n // setActiveLevelId intentionally omitted: it is recreated each render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [host, kioskOrigin]);\n\n const compiled = useMemo(() => {\n if (!doc) return null;\n return compileGraph(\n doc.graph.nodes.map((n) => ({\n id: n.id,\n levelId: n.levelId,\n shapeId: n.shapeId,\n kind: n.kind,\n x: n.x,\n y: n.y,\n connectorId: n.connectorId,\n })),\n doc.graph.edges.map((e) => ({\n id: e.id,\n mapId: doc.mapId,\n fromAnchorId: e.from,\n toAnchorId: e.to,\n weight: e.weight,\n directed: e.directed,\n accessible: e.accessible,\n kind: e.kind,\n curve: e.curve ?? null,\n })),\n doc.connectors,\n );\n }, [doc]);\n\n const websiteRetailers = useMemo(() => {\n if (!doc) return [];\n return websiteRetailersOnMap(\n doc,\n fetchedRetailers && fetchedRetailers.length > 0\n ? fetchedRetailers\n : doc.retailers,\n );\n }, [doc, fetchedRetailers]);\n\n const hoverRetailers = useMemo(() => {\n if (fetchedRetailers && fetchedRetailers.length > 0) return fetchedRetailers;\n return doc?.retailers ?? [];\n }, [doc?.retailers, fetchedRetailers]);\n\n const handleHoverTooltip = useCallback(\n (\n next: ViewerHoverTooltip | null,\n opts?: { leavingShapeId?: number },\n ) => {\n setHoverTooltip((current) => {\n if (next) return next;\n if (opts?.leavingShapeId != null) {\n return current?.shapeId === opts.leavingShapeId ? null : current;\n }\n return null;\n });\n },\n [],\n );\n\n useEffect(() => {\n setHoverTooltip(null);\n }, [host, activeLevelId, websiteModalOpen]);\n\n const websiteDestinationInfo = useMemo(() => {\n if (!doc || websiteShapeId == null) return null;\n return websiteDestination(doc, websiteShapeId);\n }, [doc, websiteShapeId]);\n\n const runRoute = (fromId: number | null, toId: number | null) => {\n const pinOrigin = shouldPinViewToRouteOrigin(\n routeEndpointsRef.current.from,\n routeEndpointsRef.current.to,\n fromId,\n toId,\n );\n routeEndpointsRef.current = { from: fromId, to: toId };\n if (!compiled || fromId == null || toId == null) {\n setRoute(null);\n return;\n }\n const result = findShortestPlacePath(compiled, [fromId], [toId], {\n accessibleOnly,\n });\n setRoute(result);\n // Stay on the start floor. Taps on escalator / elevator icons change floors.\n if (pinOrigin) {\n const originLevelId = routeOriginLevelId(result);\n if (originLevelId != null) setActiveLevelId(originLevelId);\n }\n };\n\n useEffect(() => {\n runRoute(fromAnchorId, toAnchorId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromAnchorId, toAnchorId, accessibleOnly, compiled]);\n\n /** Chrome Reset: loaded default, current floor. Idle: also restore kiosk floor. */\n const applyViewerReset = useCallback(\n (kind: ViewerResetKind) => {\n const patch = viewerResetPatch({\n kind,\n kioskOrigin,\n activeLevelId,\n defaultLevelId: doc ? defaultViewerLevelId(doc.levels) : null,\n });\n setToAnchorId(null);\n setRoute(null);\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n setFromAnchorId(patch.fromAnchorId);\n if (patch.nextLevelId != null) {\n setActiveLevelId(patch.nextLevelId);\n }\n if (patch.resetCamera) {\n cameraApi.current?.reset();\n }\n },\n [activeLevelId, doc, kioskOrigin],\n );\n\n useEffect(() => {\n if (!createRouteRef || !doc) return;\n const routeApi = {\n createRouteToStore(retailerId: number) {\n const toIds = matchingShapeAnchorIds(\n doc.levels,\n (shape) => shape.assignment?.retailerId === retailerId,\n );\n if (toIds.length === 0) return;\n if (compiled && fromAnchorId != null) {\n const nearest = findShortestPlacePath(\n compiled,\n [fromAnchorId],\n toIds,\n { accessibleOnly },\n );\n const destinationAnchorId = nearest?.anchorIds.at(-1);\n if (destinationAnchorId != null) {\n setToAnchorId(destinationAnchorId);\n return;\n }\n }\n setToAnchorId(toIds[0]);\n },\n createRouteToAmenity(amenityCode: string) {\n const amenity = doc.amenities.find((a) => a.code === amenityCode);\n if (!amenity || !compiled || fromAnchorId == null) return;\n const anchorIds = matchingShapeAnchorIds(\n doc.levels,\n (shape) => shape.assignment?.amenityId === amenity.id,\n );\n const nearest = findNearestAmenityPath(compiled, fromAnchorId, anchorIds, {\n accessibleOnly,\n });\n const destinationAnchorId = nearest?.anchorIds.at(-1);\n if (destinationAnchorId != null) setToAnchorId(destinationAnchorId);\n },\n clearRoute() {\n setToAnchorId(null);\n setRoute(null);\n },\n resetMap() {\n applyViewerReset('idle');\n },\n };\n createRouteRef.current = routeApi;\n return () => {\n if (createRouteRef.current === routeApi) createRouteRef.current = null;\n };\n }, [\n accessibleOnly,\n activeLevelId,\n applyViewerReset,\n compiled,\n createRouteRef,\n doc,\n fromAnchorId,\n ]);\n\n const theme: ThemeDefaults = mergeTheme(doc?.theme, themeOverrides);\n\n if (error) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--error ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__error\">{error}</div>\n </div>\n );\n }\n\n if (!doc) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--loading ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__loading\">Loading map…</div>\n </div>\n );\n }\n\n const amenitiesOnMap: CmAmenityCatalogItem[] = doc.amenities.filter(\n (a) =>\n isAssignAmenity(a.code) &&\n doc.levels.some((l) =>\n l.shapes.some((s) => s.assignment?.amenityId === a.id),\n ),\n );\n const chrome = captureCamera\n ? { ...viewerChrome(host), storeModal: false, hoverTooltip: false }\n : viewerChrome(host);\n // Portal staff (assign + responsiveness capture) can view Outdoor alone.\n // Website and display-app still require a building floor.\n const showMap = viewerCanShowScene(\n captureCamera ? 'PORTAL_ASSIGN' : host,\n doc.levels,\n );\n\n return (\n <div\n className={`eyeon-map-viewer eyeon-map-viewer--${host}${showMap ? '' : ' eyeon-map-viewer--empty'} ${className ?? ''}`}\n style={\n {\n ...style,\n ['--map-bg' as string]: theme.MAP_BACKGROUND_COLOR,\n } as React.CSSProperties\n }\n >\n {!showMap ? (\n <div className=\"eyeon-map-viewer__empty\">{MAP_NO_FLOORS_MESSAGE}</div>\n ) : null}\n\n {showMap && (chrome.search || chrome.amenities) && (\n <RuntimeChrome\n doc={doc}\n amenities={amenitiesOnMap}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n fromAnchorId={fromAnchorId}\n toAnchorId={toAnchorId}\n onFromChange={setFromAnchorId}\n onToChange={setToAnchorId}\n accessibleOnly={accessibleOnly}\n onAccessibleOnlyChange={setAccessibleOnly}\n route={route}\n showSearch={chrome.search}\n showAmenities={chrome.amenities}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n />\n )}\n\n {showMap ? (\n <MapControls\n levels={doc.levels}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n onZoomIn={() => cameraApi.current?.zoomIn()}\n onZoomOut={() => cameraApi.current?.zoomOut()}\n onReset={() => applyViewerReset('chrome')}\n showFloors={chrome.floors}\n showZoomReset={chrome.zoomReset}\n />\n ) : null}\n\n {showMap ? (\n <div ref={canvasHostRef} className=\"eyeon-map-viewer__canvas\">\n <Suspense fallback={null}>\n <MapScene\n doc={doc}\n theme={theme}\n host={host}\n kioskOriginShapeId={kioskOrigin?.shapeId ?? null}\n activeLevelId={activeLevelId}\n route={route}\n selectedShapeId={captureCamera ? null : websiteShapeId ?? selectedShapeId}\n selectedShapeIds={captureCamera ? [] : focusShapeIds}\n hoveredShapeId={captureCamera ? null : hoveredShapeId}\n focusKey={focusKey}\n focusViewBounds={focusViewBounds}\n cameraRef={cameraApi}\n eventSource={canvasHostRef}\n imageProxyUrl={imageProxyUrl}\n homePose={homePose}\n homePoseKey={homePoseKey}\n resetFitsMap={captureCamera}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n allowWheelZoom={captureCamera || viewerAllowsWheelZoom(host)}\n retailers={hoverRetailers}\n showHoverTooltip={chrome.hoverTooltip}\n onHoverTooltip={handleHoverTooltip}\n onActiveLevelChange={setActiveLevelId}\n onSelectShape={(shapeId, levelId, opts) => {\n if (shapeId == null) {\n if (chrome.storeModal) {\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n }\n props.onSelectShape?.(null);\n return;\n }\n const level = doc.levels.find((l) => l.id === levelId);\n const shape = level?.shapes.find((s) => s.id === shapeId);\n if (chrome.storeModal && websiteClickOpensModal(host, shape)) {\n setWebsiteShapeId(shapeId);\n setWebsiteModalOpen(true);\n if (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(\n doc.levels,\n activeLevelId,\n levelId,\n ),\n );\n }\n props.onSelectShape?.(shapeId, opts);\n return;\n }\n if (chrome.storeModal) {\n props.onSelectShape?.(shapeId, opts);\n return;\n }\n if (routeOnSelect) {\n const destIds = shapeAnchorIds(level?.anchors ?? [], shapeId);\n let destId = destIds[0];\n if (compiled && fromAnchorId != null && destIds.length > 1) {\n destId =\n findShortestPlacePath(compiled, [fromAnchorId], destIds, {\n accessibleOnly,\n })?.anchorIds.at(-1) ?? destId;\n }\n if (destId != null) setToAnchorId(destId);\n } else if (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, levelId),\n );\n }\n props.onSelectShape?.(shapeId, opts);\n if (!opts?.additive && shapeId === selectedShapeId) {\n const focus =\n viewFocusBoundsForShapes(doc.levels, focusShapeIds) ??\n viewFocusBoundsForShape(doc.levels, shapeId);\n if (focus) cameraApi.current?.focusBounds(focus);\n }\n }}\n />\n </Suspense>\n </div>\n ) : null}\n\n {chrome.hoverTooltip && !websiteModalOpen ? (\n <HoverTooltip tooltip={hoverTooltip} />\n ) : null}\n\n {chrome.storeModal && websiteModalOpen && websiteDestinationInfo ? (\n <WebsiteInfoModal\n destination={websiteDestinationInfo}\n retailers={websiteRetailers}\n imageProxyUrl={imageProxyUrl}\n host={host}\n onClose={() => setWebsiteModalOpen(false)}\n onMapIt={(fromRetailerId) => {\n const from = websiteRetailers.find((r) => r.id === fromRetailerId);\n const anchors = websiteMapItAnchors(from, websiteDestinationInfo);\n if (anchors) {\n setFromAnchorId(anchors.fromAnchorId);\n setToAnchorId(anchors.toAnchorId);\n setWebsiteModalOpen(false);\n }\n }}\n />\n ) : null}\n </div>\n );\n}\n\nexport default MapViewer;\n"],"names":["MapControls","levels","activeLevelId","onActiveLevelChange","onZoomIn","onZoomOut","onReset","showFloors","showZoomReset","floorOptions","alwaysShowFloors","stackLevels","level","switcher","floorSwitcherDisplayLevels","showFloorList","shouldShowFloorSwitcher","showZoom","hasBuildingFloors","hasOutdoorLevel","jsxs","jsx","active","Fragment","MAP_FONT_FAMILY","MAP_LABEL_LINE_HEIGHT","SVGIcons","AllAmenities","CONNECTOR_AMENITY_TYPES","AssignAmenities","item","KioskSvg","EntranceSvg","EscalatorUpSvg","EscalatorDownSvg","isAssignAmenity","type","getAmenityByType","getMapSpecialSvg","id","_a","recolorMapSvg","svg","color","hex","mapSpecialSvgToDataUrl","colored","entranceIconDataUrl","amenityAssignOptions","amenityTypeFromCatalogId","amenityId","amenities","amenityCatalogIdForType","row","assignmentSpecialIconDataUrl","assignment","assignmentSpecialIconId","ASSIGNED_CONNECTOR_ICON","STATIC_ICON_COLORS","UNASSIGNED_CONNECTOR_ICON","levelTravel","from","to","fromIndex","toIndex","fromOrder","toOrder","escalatorLandingTravel","shapeId","levelId","here","connectorId","_b","anchor","partner","escalatorConnectorIconId","travel","connectorSpecialKind","shape","raw","connectorSpecialIconDataUrl","kind","assigned","fill","connectorMapIconDataUrl","iconId","assignedConnectorShapeIds","anchors","ids","connectorMapIconKind","assignedShapeIds","mapFontUrl","MAP_FONT_URL","registered","ensureMapFont","loaded","MODERN_SELECT_SEARCH_AFTER","filterModernSelectOptions","options","query","q","o","modernSelectIsSearchable","optionCount","searchable","Chevron","ModernSelect","value","onChange","disabled","placeholder","ariaLabel","listId","useId","rootRef","useRef","triggerRef","buttonRef","menuRef","searchRef","open","setOpen","useState","setQuery","activeIndex","setActiveIndex","menuPos","setMenuPos","withSearch","selected","filtered","useMemo","close","useCallback","pick","next","updateMenuPos","el","rect","spaceBelow","spaceAbove","maxHeight","openAbove","useEffect","onDoc","e","t","onKey","onMove","moveActive","delta","i","onSearchKeyDown","option","menu","createPortal","index","highlighted","target","v","polygonToThreeShape","points","THREE","polygonToThreePath","path","slabShapeWithHoles","outer","holes","hole","holesOverlappingOuter","skipRaycast","createOpeningMarkTexture","aspect","width","canvas","ctx","pad","OPENING_VOID_MARK","texture","OpeningVoidMesh","polygon","box","polygonBBox","dash","openingSpanDash","outline","first","p","geometry","material","OPENING_VOID_STROKE","line","mark","height","OPENING_VOID_FILL","bbox","span","OpeningWells","polygons","VIEWER_SELECTABLE_KINDS","isViewerSelectableKind","isViewerInteractiveShape","host","viewerShapeHoverableOnHost","viewerShapeHighlighted","hoveredShapeId","selectedShapeIds","resolvedViewerHoverId","listHoverId","pointerHoverId","viewerHoverCursor","applyViewerHoverCursor","cursor","viewerHoverFillOpacity","base","hovered","viewerPointerOffset","event","native","x","y","VIEWER_CLICK_DRAG_PX","createViewerPointerGesture","viewerPointerClientXY","beginViewerPointerGesture","gesture","pointerId","moveViewerPointerGesture","dist","endViewerPointerGesture","viewerPointerClickIsTap","maxDist","r3fDelta","pointerMissClearsSelection","down","up","dx","dy","kindColor","theme","resolvedViewerShapeFill","polygonShape","HoverOutline","extrude","sourceGeometry","CurrentLocationPulse","position","Html","LevelMeshes","is3d","onSelectShape","hoveredShapeIdProp","eventSource","pointerGestureRef","interactiveOnly","imageProxyUrl","retailers","kioskOriginShapeId","showHoverTooltip","onHoverTooltip","setPointerHoverId","publishHoverTooltip","offset","text","viewerHoverTooltipLabel","openings","voidPolygonsOnLevel","assignedConnectorIds","visibleShapes","s","viewerShapeVisibleOnHost","meshes","isEntranceIcon","INTERACTIVE_SHAPE_KINDS","resolveLayerStyle","radius","punch","isSlabShapeKind","threeShapes","poly","filletPolygon","labels","entranceIcons","overlays","assignmentOverlayVisible","connectorOverlays","layout","connectorIconLayout","iconColor","resolvedAssignmentIconColor","url","geometryBBox","align","normalizeLabelAlign","cx","cy","tilt","Text","labelAlignX","size","DEFAULT_ENTRANCE_SIZE","AssignmentImageOverlay","fontSize","DEFAULT_ASSIGNMENT_SIZE","z","imageKey","assignmentOverlayImageUrl","React","assignmentOverlayRenderSize","rotation","selectable","baseOpacity","viewerShapeBaseOpacity","fillTransparent","isTransparentColor","opacity","emphasisFill","darkenShapeFill","geoShape","idx","loadCanvasTexture","signal","resolve","reject","img","cleanup","onAbort","setTexture","setAspect","disposed","controller","proxied","resolveFetchUrl","candidates","lastError","src","error","ROUTE_CHANGE_MARKER_GAP","ROUTE_CHANGE_MARKER_CLUSTER","routeOriginLevelId","route","shouldPinViewToRouteOrigin","previousFrom","previousTo","nextFrom","nextTo","routeChangeLabel","intent","floorName","routeSpanGroupsForLevel","groups","current","markerDistance","a","b","layoutRouteLevelChangeMarkers","markers","placed","marker","used","group","j","ordered","rank","routeLevelChangeMarkers","changeIndex","change","V1_ROUTE_COLOR","V1_ROUTE_TUBULAR_SEGMENTS","V1_ROUTE_RADIAL_SEGMENTS","V1_ROUTE_REVEAL_MS","V1_ROUTE_TEXTURE_MS","resolveRouteColor","ROUTE_CHANGE_RING_COLOR","resolveRouteChangeCircleColor","resolveRouteThickness","thickness","DEFAULT_THEME","_routeScale","_routeWorldPoint","routeWorldRadiusForView","screenRadius","world","zoom","worldHeight","scale","routeWorldRadiusForCamera","camera","viewportHeight","worldScale","samplePoint","distance","applyRouteTubeRadius","basePositions","baseRadius","targetRadius","normal","i3","createRouteTexture","context","gradientWidth","gradient","easeInOutCubic","RouteTube","spans","invalidate","useThree","state","meshRef","animationStartedAt","appliedRadius","routeShape","routeEdgeLength","syncScreenRadius","mesh","useLayoutEffect","useFrame","elapsed","indexCount","progress","RouteChangeButton","connectors","connector","iconKind","isVerticalRouteConnectorKind","there","icon","targetName","label","ringColor","RouteLine","routeColor","routeRadius","spanGroups","levelChanges","COLOR_SPACE_SVG","SRGBColorSpace","SVGLoader","Loader","manager","onLoad","onProgress","onError","scope","loader","FileLoader","parseNode","node","style","transform","getNodeTransform","isDefsNode","parseStyle","parseCSSStylesheet","parsePathNode","parseRectNode","parsePolygonNode","parsePolylineNode","parseCircleNode","parseEllipseNode","parseLineNode","usedNodeId","usedNode","transformPath","currentTransform","paths","childNodes","transformStack","ShapePath","point","Vector2","control","firstPoint","isFirstPoint","doSetFirstPoint","d","commands","l","command","data","numbers","parseFloats","jl","getReflection","rx","ry","start","parseArcCommand","stylesheet","selectorList","definitions","stylesheets","x_axis_rotation","large_arc_flag","sweep_flag","end","dx2","dy2","x1p","y1p","rxs","rys","x1ps","y1ps","cr","dq","pq","cxp","cyp","theta","svgAngle","ux","uy","vx","vy","dot","len","ang","parseFloatWithUnits","w","h","bci","iterator","match","regex","subpath","Path","x1","y1","x2","y2","stylesheetStyles","classSelectors","addStyle","svgName","jsName","adjustFunction","clamp","positive","input","flags","stride","RE","SEP","INT","FLOAT","EXP","seenComma","number","exponent","result","throwSyntaxError","partial","newNumber","length","units","unitConversion","string","theUnit","n","u","parseNodeTransform","Matrix3","tempTransform0","tx","ty","transformsTexts","tIndex","transformText","openParPos","closeParPos","transformType","array","angle","tempTransform1","tempTransform2","tempTransform3","scaleX","scaleY","m","transfVec2","v2","tempV3","transfEllipseGeneric","curve","cosTheta","sinTheta","v1","Vector3","f1","f2","mF","mFInv","mQe","ed","eigenDecomposition","rt1sqrt","rt2sqrt","mDsqrt","mRT","mDRF","transformAngle","phi","cosR","sinR","isTransformFlipped","transfEllipseNoSkew","sx","getTransformScaleX","sy","getTransformScaleY","subPaths","curves","tempV2","isTransformSkewed","te","basisDot","A","B","C","rt1","rt2","cs","sn","sm","df","rt","xml","shapePath","IntersectionLocationType","classifyResult","findEdgeIntersection","a0","a1","b0","b1","x3","x4","y3","y4","nom1","nom2","denom","t1","t2","classifyPoint","edgeStart","edgeEnd","ax","ay","bx","by","sa","getIntersections","path1","path2","intersectionsRaw","intersections","path1EdgeStart","path1EdgeEnd","index2","path2EdgeStart","path2EdgeEnd","intersection","getScanlineIntersections","scanline","boundingBox","center","allIntersections","i1","i2","isHoleTo","simplePath","allPaths","scanlineMinX","scanlineMaxX","_fillRule","centerBoundingBox","scanlineIntersections","baseIntersections","otherIntersections","firstXOfPath","stack","isHole","isHoleFor","lastCWValue","identifier","simplePaths","maxY","minY","maxX","minX","ShapeUtils","Box2","sp","isAHole","shapesToReturn","Shape","lineJoin","lineCap","miterLimit","arcDivisions","minDistance","vertices","normals","uvs","BufferGeometry","Float32BufferAttribute","vertexOffset","tempV2_1","tempV2_2","tempV2_3","tempV2_4","tempV2_5","tempV2_6","tempV2_7","lastPointL","lastPointR","point0L","point0R","currentPointL","currentPointR","nextPointL","nextPointR","innerPoint","outerPoint","removeDuplicatedPoints","numPoints","isClosed","currentPoint","previousPoint","nextPoint","strokeWidth2","deltaU","u0","u1","innerSideModified","joinIsOnLeftSide","isMiter","initialJoinIsOnLeftSide","numVertices","currentCoordinate","currentCoordinateUV","getNormal","iPoint","normal1","miterSide","miterLength2","segmentLengthPrev","segmentLengthNext","makeSegmentTriangles","makeSegmentWithBevelJoin","createSegmentTrianglesWithMiddleSection","makeCircularSector","miterFraction","addVertex","addCapGeometry","lastOuter","lastInner","p1","p2","il","vl","dupPoints","newPoints","BASE_Z","getLayerNameFromNode","isInteractiveAncestor","dataName","isInteractiveGroupLabel","isStoreFolderLabel","isRouteAncestor","isRouteFolderLabel","SvgVectorLayer","suppressIds","setResult","cancelled","fetchUrl","res","inlined","inlineSvgStyles","err","out","layerName","isRoutePathLabel","shapes","layerStyle","amenityFill","isAmenityLayerId","amenityHouseFill","strokeTransparent","_c","sortByOutdoorSvgPaintOrder","renderOrder","si","SCENE_FLIP_SCALE","viewBoundsFromData","bounds","fitOrthoZoom","viewWidth","viewHeight","worldWidth","zoomX","zoomY","boundsExtent","VIEWER_ZOOM_ANIM_MS","VIEWER_FOCUS_ANIM_MS","FOCUS_BOUNDS_PADDING","FOCUS_LARGE_PADDING","FOCUS_LARGE_EXTENT","FOCUS_PAD_SMALL_EXTENT","FOCUS_MIN_EXTENT","FOCUS_MAX_ZOOM_MULTIPLE","FOCUS_SMALL_MAX_ZOOM_MULTIPLE","VIEWER_MAX_ZOOM_MULTIPLE","focusPaddingRatio","paddingRatio","smallExtent","largePadding","largeExtent","extent","paddedFocusBounds","minExtent","rawW","rawH","halfW","halfH","focusMaxZoomMultiple","paddedWidth","paddedHeight","typicalMultiple","smallMultiple","typicalFrame","tinyFrame","clampFocusZoom","shapeFitZoom","mapFitZoom","maxMultiple","cap","selectionFocusKey","shapeIds","viewFocusBoundsForShapes","wanted","combined","sceneBoundsFromBBox","expandBounds","viewFocusBoundsForShape","viewFocusBoundsForRoute","routePoints","applyLevelTransform","endpointIds","routeAnchorIds","focusShapeIds","shapeBounds","easeOutCubic","lerp","interpolateCameraPose","ease","cameraPosesNear","epsilon","withFitZoom","pose","fitZoom","resolveResetPose","fitToMap","home","fit","skipPersistedViewRestore","nextOrthoZoom","direction","step","min","max","factor","MOUSE_ROTATE","MOUSE_DOLLY","MOUSE_PAN","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","ORBIT_ZOOM_TO_CURSOR","orbitMouseButtons","orbitTouches","cameraBoundsKey","CameraRig","controlsRef","cameraRef","persistedViewRef","focusKey","focusViewBounds","homePose","homePoseKey","resetFitsMap","onCameraChange","onCameraReset","userAdjusted","applyingView","zoomAnimRef","appliedFocusKey","focusKeyRef","focusViewBoundsRef","homePoseRef","homePoseKeyRef","resetFitsMapRef","onCameraChangeRef","onCameraResetRef","appliedHomeKey","ignoreUserChangeUntil","resetInFlight","focusAnimRef","boundsKey","cancelZoomAnim","captureView","adjusted","controls","restoreView","snap","animateOrthoZoom","targetZoom","startZoom","started","now","currentPose","fitPose","applyPose","lookAt","poseForFocusBounds","focus","mapExtent","mapFit","sizeHint","resolvedHomePose","saved","resetDestination","applyHomeOrFit","dest","applyFit","animateFocus","animateReset","applyFitRef","restoreViewRef","animateFocusRef","zoomBy","onStart","useImperativeHandle","isNewFocus","snapMatchesFocus","anim","isEventRoot","orbitEventRoot","connected","viewerWheelEventHitsMap","root","contains","suppressViewerWheelZoom","OUTDOOR_Z","CAMERA_UP","CANVAS_DPR","CANVAS_GL","OrbitWheelZoomGuard","blockWheel","gl","onWheel","MapScene","doc","selectedShapeId","allowWheelZoom","pointerDownRef","onDown","pos","onUp","stacked","viewerLevelStack","boundsFromStackedLevels","view","cameraPosition","camera3dPosition","mouseButtons","touches","outdoorLevel","isOutdoorLevel","outdoorSvgUrl","outdoorSvgSuppressIds","showOutdoorSvg","outdoorTheme","Canvas","OrthographicCamera","outdoor","opts","viewerAllowsWheelZoom","OrbitControls","itemLabel","amenityName","RuntimeChrome","fromAnchorId","toAnchorId","onFromChange","onToChange","accessibleOnly","onAccessibleOnlyChange","showSearch","showAmenities","amenityIconColor","selectedItem","setSelectedItem","items","list","amenity","grouped","map","arr","anchorOptions","hasQuery","selectItem","groupItems","WebsiteInfoModal","destination","onClose","onMapIt","fromRetailerId","setFromRetailerId","retailer","websiteFromRetailerOptions","logo","showDetails","directions","websiteInfoModalDirections","mapItDisabled","showForm","formatRetailerPhone","HoverTooltip","tooltip","fetchWebsiteRetailers","webApiURI","centerId","all","page","params","json","count","normalizeRetailerCatalogItem","fetchDocument","draft","qs","MapViewer","props","documentProp","kioskId","selectedRetailerId","themeOverrides","onExtractedAmenities","createRouteRef","className","activeLevelIdProp","routeOnSelect","focusNonce","deviceProp","captureCamera","rawDoc","setDoc","normalizePublishedDocument","setError","setRoute","setFromAnchorId","setToAnchorId","setAccessibleOnly","websiteShapeId","setWebsiteShapeId","websiteModalOpen","setWebsiteModalOpen","hoverTooltip","setHoverTooltip","fetchedRetailers","setFetchedRetailers","internalLevelId","setInternalLevelId","defaultViewerLevelId","cameraApi","canvasHostRef","routeEndpointsRef","viewportWidth","setViewportWidth","setActiveLevelId","viewerChrome","ro","entries","chrome","codes","viewerLevelIdAfterShapeSelect","selectionKey","selectionFocusKeyWithNonce","selectionFocusBounds","kioskOrigin","findViewerKioskOrigin","routeFocusBounds","routeFocusKey","resolvedDevice","deviceFromHost","homeOverride","findResponsiveOverride","overrideToCameraPose","responsiveViewKey","compiled","compileGraph","websiteRetailers","websiteRetailersOnMap","hoverRetailers","handleHoverTooltip","websiteDestinationInfo","websiteDestination","runRoute","fromId","toId","pinOrigin","findShortestPlacePath","originLevelId","applyViewerReset","patch","viewerResetPatch","routeApi","retailerId","toIds","matchingShapeAnchorIds","nearest","destinationAnchorId","amenityCode","anchorIds","findNearestAmenityPath","mergeTheme","amenitiesOnMap","showMap","viewerCanShowScene","Suspense","websiteClickOpensModal","destIds","shapeAnchorIds","destId","_d","_e","_f","r","websiteMapItAnchors"],"mappings":"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","x_google_ignoreList":[16]}