{"version":3,"sources":["src/index.ts","src/events.ts","src/MapPlugin.ts","src/components/MapComponent.ts","src/constants.ts","src/utils.ts","src/components/MapCloseButton.ts","src/icons/map.svg","src/components/AbstractMapButton.ts","src/icons/compass.svg","src/components/MapCompassButton.ts","src/icons/maximize.svg","src/icons/minimize.svg","src/components/MapMaximizeButton.ts","src/icons/reset.svg","src/components/MapResetButton.ts","src/components/MapZoomToolbar.ts","src/icons/minus.svg","src/icons/plus.svg","src/overlay-round.svg","src/overlay-square.svg","src/icons/pin.svg"],"sourcesContent":["import { DEFAULTS } from '@photo-sphere-viewer/core';\nimport * as events from './events';\n\nDEFAULTS.lang['map'] = 'Map';\nDEFAULTS.lang['mapMaximize'] = 'Maximize';\nDEFAULTS.lang['mapMinimize'] = 'Minimize';\nDEFAULTS.lang['mapNorth'] = 'Go to north';\nDEFAULTS.lang['mapReset'] = 'Reset';\n\nexport { MapPlugin } from './MapPlugin';\nexport * from './model';\nexport { events };\n\n/** @internal  */\nimport './styles/index.scss';\n","import { TypedEvent } from '@photo-sphere-viewer/core';\nimport type { MapPlugin } from './MapPlugin';\n\n/**\n * @event Triggered when the user clicks on a hotspot\n */\nexport class SelectHotspot extends TypedEvent<MapPlugin> {\n    static override readonly type = 'select-hotspot';\n    override type: 'select-hotspot';\n\n    /** @internal */\n    constructor(public readonly hotspotId: string) {\n        super(SelectHotspot.type);\n    }\n}\n\n/**\n * @event Triggered when the size of the map changes\n */\nexport class ViewChanged extends TypedEvent<MapPlugin> {\n    static override readonly type = 'view-changed';\n    override type: 'view-changed';\n\n    /** @internal */\n    constructor(public readonly view: 'closed' | 'normal' | 'maximized') {\n        super(ViewChanged.type);\n    }\n}\n\nexport type MapPluginEvents = SelectHotspot | ViewChanged;\n","import { AbstractConfigurablePlugin, events, PluginConstructor, Point, utils, Viewer } from '@photo-sphere-viewer/core';\nimport type { Marker, events as markersEvents, MarkersPlugin } from '@photo-sphere-viewer/markers-plugin';\nimport { Color } from 'three';\nimport { MapComponent } from './components/MapComponent';\nimport { HOTSPOT_GENERATED_ID, HOTSPOT_MARKER_ID, MARKER_DATA_KEY } from './constants';\nimport { MapPluginEvents } from './events';\nimport pin from './icons/pin.svg';\nimport { MapHotspot, MapPluginConfig, ParsedMapPluginConfig, UpdatableMapPluginConfig } from './model';\n\nconst getConfig = utils.getConfigParser<MapPluginConfig, ParsedMapPluginConfig>(\n    {\n        imageUrl: null,\n        center: null,\n        rotation: 0,\n        shape: 'round',\n        size: '200px',\n        position: ['bottom', 'left'],\n        visibleOnLoad: true,\n        overlayImage: undefined,\n        pinImage: pin,\n        pinSize: 35,\n        coneColor: '#1E78E6',\n        coneSize: 40,\n        spotStyle: {\n            size: 15,\n            image: null,\n            color: 'white',\n            borderSize: 0,\n            borderColor: null,\n            hoverSize: null,\n            hoverImage: null,\n            hoverColor: null,\n            hoverBorderSize: 4,\n            hoverBorderColor: 'rgba(255, 255, 255, 0.6)',\n        },\n        static: false,\n        defaultZoom: 100,\n        minZoom: 20,\n        maxZoom: 200,\n        hotspots: [],\n        minimizeOnHotspotClick: true,\n        buttons: {\n            maximize: true,\n            close: true,\n            reset: true,\n            north: true,\n        },\n    },\n    {\n        spotStyle: (spotStyle, { defValue }) => ({ ...defValue, ...spotStyle }),\n        position: (position, { defValue }) => {\n            return utils.cleanCssPosition(position, { allowCenter: false, cssOrder: true }) || defValue;\n        },\n        rotation: rotation => utils.parseAngle(rotation),\n        coneColor: coneColor => (coneColor ? new Color(coneColor).getStyle() : null), // must be in rgb format\n        defaultZoom: defaultZoom => Math.log(defaultZoom / 100),\n        maxZoom: maxZoom => Math.log(maxZoom / 100),\n        minZoom: minZoom => Math.log(minZoom / 100),\n        buttons: (buttons, { defValue }) => ({ ...defValue, ...buttons }),\n    },\n);\n\n/**\n * Adds a minimap on the viewer\n */\nexport class MapPlugin extends AbstractConfigurablePlugin<\n    MapPluginConfig,\n    ParsedMapPluginConfig,\n    UpdatableMapPluginConfig,\n    MapPluginEvents\n> {\n    static override readonly id = 'map';\n    static override readonly VERSION = PKG_VERSION;\n    static override readonly configParser = getConfig;\n    static override readonly readonlyOptions: Array<keyof MapPluginConfig> = [\n        'imageUrl',\n        'visibleOnLoad',\n        'defaultZoom',\n        'buttons',\n    ];\n\n    private markers?: MarkersPlugin;\n    readonly component: MapComponent;\n\n    static withConfig(config: MapPluginConfig): [PluginConstructor, any] {\n        return [MapPlugin, config];\n    }\n\n    constructor(viewer: Viewer, config: MapPluginConfig) {\n        super(viewer, config);\n\n        this.component = new MapComponent(this.viewer, this);\n    }\n\n    /**\n     * @internal\n     */\n    override init() {\n        super.init();\n\n        utils.checkStylesheet(this.viewer.container, 'map-plugin');\n\n        this.component.init();\n\n        this.markers = this.viewer.getPlugin('markers');\n\n        this.viewer.addEventListener(events.PositionUpdatedEvent.type, this);\n        this.viewer.addEventListener(events.ZoomUpdatedEvent.type, this);\n        this.viewer.addEventListener(events.SizeUpdatedEvent.type, this);\n        this.viewer.addEventListener(events.ReadyEvent.type, this, { once: true });\n        this.markers?.addEventListener('set-markers', this);\n\n        this.setHotspots(this.config.hotspots, false);\n    }\n\n    /**\n     * @internal\n     */\n    override destroy() {\n        this.viewer.removeEventListener(events.PositionUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.ZoomUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.SizeUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.ReadyEvent.type, this);\n        this.markers?.removeEventListener('set-markers', this);\n\n        this.component.destroy();\n\n        delete this.markers;\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case events.ReadyEvent.type:\n                this.component.reload(this.config.imageUrl);\n                break;\n            case events.PositionUpdatedEvent.type:\n            case events.ZoomUpdatedEvent.type:\n                this.component.update();\n                break;\n            case events.SizeUpdatedEvent.type:\n                if (this.component.maximized) {\n                    this.component.update();\n                }\n                break;\n            case 'set-markers':\n                this.component.setMarkers(this.__markersToHotspots((e as markersEvents.SetMarkersEvent).markers));\n                break;\n            default:\n                break;\n        }\n    }\n\n    override setOptions(options: Partial<UpdatableMapPluginConfig>) {\n        super.setOptions(options);\n\n        if (options.center) {\n            this.component.recenter();\n        }\n        if (options.hotspots !== undefined) {\n            this.setHotspots(options.hotspots);\n        }\n\n        this.component.applyConfig();\n    }\n\n    /**\n     * Hides the map\n     */\n    hide() {\n        this.component.hide();\n    }\n\n    /**\n     * Shows the map\n     */\n    show() {\n        this.component.show();\n    }\n\n    /**\n     * Changes the current zoom level\n     */\n    setZoom(level: number) {\n        this.component.setZoom(Math.log(level / 100));\n    }\n\n    /**\n     * Closes the map\n     */\n    close() {\n        if (!this.component.collapsed) {\n            this.component.toggleCollapse();\n        }\n    }\n\n    /**\n     * Open the map\n     */\n    open() {\n        if (this.component.collapsed) {\n            this.component.toggleCollapse();\n        }\n    }\n\n    /**\n     * Minimizes the map\n     */\n    minimize() {\n        if (this.component.maximized) {\n            this.component.toggleMaximized();\n        }\n    }\n\n    /**\n     * Maximizes the map\n     */\n    maximize() {\n        if (!this.component.maximized) {\n            this.component.toggleMaximized();\n        }\n    }\n\n    /**\n     * Changes the image of the map\n     * @param rotation Also change the image rotation\n     * @param center Also change the position on the map\n     */\n    setImage(url: string, center?: Point, rotation?: string | number) {\n        if (!utils.isNil(rotation)) {\n            this.config.rotation = utils.parseAngle(rotation);\n        }\n        if (!utils.isNil(center)) {\n            this.config.center = center;\n        }\n        this.component.reload(url);\n    }\n\n    /**\n     * Changes the position on the map\n     */\n    setCenter(center: Point, resetView = true) {\n        const previousCenter = this.config.center;\n        this.config.center = center;\n        if (resetView || !previousCenter) {\n            this.component.recenter();\n        } else {\n            this.component.addOffset({\n                x: previousCenter.x - center.x,\n                y: previousCenter.y - center.y,\n            });\n        }\n    }\n\n    /**\n     * Changes the hotspots on the map\n     */\n    setHotspots(hotspots: MapHotspot[] | null, render = true) {\n        const ids: string[] = [];\n        let i = 1;\n\n        hotspots?.forEach((hotspot) => {\n            if (!hotspot.id) {\n                hotspot.id = HOTSPOT_GENERATED_ID + i++;\n            } else if (ids.includes(hotspot.id)) {\n                utils.logWarn(`Duplicated hotspot id \"${hotspot.id}`);\n            } else {\n                ids.push(hotspot.id);\n            }\n        });\n\n        this.config.hotspots = hotspots || [];\n\n        if (render) {\n            this.component.update();\n        }\n    }\n\n    /**\n     * Removes all hotspots\n     */\n    clearHotspots() {\n        this.setHotspots(null);\n    }\n\n    /**\n     * Changes the highlighted hotspot\n     */\n    setActiveHotspot(hotspotId: string | null) {\n        this.component.setActiveHotspot(hotspotId);\n    }\n\n    private __markersToHotspots(markers: Marker[]): MapHotspot[] {\n        return markers\n            .filter(marker => marker.data?.[MARKER_DATA_KEY])\n            .map((marker) => {\n                const hotspot: MapHotspot = {\n                    ...marker.data[MARKER_DATA_KEY],\n                    id: HOTSPOT_MARKER_ID + marker.id,\n                    tooltip: marker.config.tooltip,\n                };\n\n                if ('distance' in hotspot) {\n                    hotspot.yaw = marker.state.position.yaw;\n                } else if (!('x' in hotspot) || !('y' in hotspot)) {\n                    utils.logWarn(`Marker #${marker.id} \"map\" data is missing position (distance or x+y)`);\n                    return null;\n                }\n\n                return hotspot;\n            })\n            .filter(h => h);\n    }\n}\n","import type { Point, Tooltip, Viewer } from '@photo-sphere-viewer/core';\nimport { AbstractComponent, CONSTANTS, events, SYSTEM, utils } from '@photo-sphere-viewer/core';\nimport type { MarkersPlugin } from '@photo-sphere-viewer/markers-plugin';\nimport type { GalleryPlugin, events as GalleryEvents } from '@photo-sphere-viewer/gallery-plugin';\nimport { MathUtils } from 'three';\nimport { HOTSPOT_MARKER_ID, MAP_SHADOW_BLUR, PIN_SHADOW_BLUR, PIN_SHADOW_OFFSET } from '../constants';\nimport { SelectHotspot, ViewChanged } from '../events';\nimport type { MapPlugin } from '../MapPlugin';\nimport { MapHotspot } from '../model';\nimport {\n    canvasShadow,\n    drawImageCentered,\n    drawImageHighDpi,\n    getImageHtml,\n    getStyle,\n    ImageSource,\n    loadImage,\n    projectPoint,\n    rgbToRgba,\n    unprojectPoint,\n} from '../utils';\nimport { MapCloseButton } from './MapCloseButton';\nimport { MapCompassButton } from './MapCompassButton';\nimport { MapMaximizeButton } from './MapMaximizeButton';\nimport { MapResetButton } from './MapResetButton';\nimport { MapZoomToolbar } from './MapZoomToolbar';\nimport overlayRound from '../overlay-round.svg';\nimport overlaySquare from '../overlay-square.svg';\n\nexport class MapComponent extends AbstractComponent {\n    protected override readonly state = {\n        visible: false,\n        maximized: false,\n        collapsed: false,\n        galleryWasVisible: false,\n\n        imgScale: 1,\n        zoom: this.config.defaultZoom,\n        offset: { x: 0, y: 0 } as Point,\n\n        mouseX: null as number,\n        mouseY: null as number,\n        mousedown: false,\n        pinchDist: 0,\n        pinchAngle: 0,\n\n        hotspotPos: {} as Record<string, Point & { s: number }>,\n        hotspotId: null as string,\n        hotspotTooltip: null as Tooltip,\n        markers: [] as MapHotspot[],\n\n        forceRender: false,\n        needsUpdate: false,\n        renderLoop: null as ReturnType<typeof requestAnimationFrame>,\n\n        images: {} as Record<string, { loading: boolean; value: ImageSource }>,\n    };\n\n    private gallery?: GalleryPlugin;\n\n    private readonly canvas: HTMLCanvasElement;\n    private readonly overlay: HTMLElement;\n    private readonly resetButton: MapResetButton;\n    private readonly maximizeButton: MapMaximizeButton;\n    private readonly closeButton: MapCloseButton;\n    private readonly compassButton: MapCompassButton;\n    private readonly zoomToolbar: MapZoomToolbar;\n\n    get config() {\n        return this.plugin.config;\n    }\n\n    get maximized() {\n        return this.state.maximized;\n    }\n\n    get collapsed() {\n        return this.state.collapsed;\n    }\n\n    constructor(\n        viewer: Viewer,\n        private plugin: MapPlugin,\n    ) {\n        super(viewer, {\n            className: `psv-map ${CONSTANTS.CAPTURE_EVENTS_CLASS}`,\n        });\n\n        // map + compass container\n        const canvasContainer = document.createElement('div');\n        canvasContainer.className = 'psv-map__container';\n\n        canvasContainer.addEventListener('mousedown', this);\n        window.addEventListener('mousemove', this);\n        window.addEventListener('mouseup', this);\n        canvasContainer.addEventListener('touchstart', this);\n        window.addEventListener('touchmove', this);\n        window.addEventListener('touchend', this);\n        canvasContainer.addEventListener('wheel', this);\n        viewer.addEventListener(events.KeypressEvent.type, this);\n        viewer.addEventListener(events.ConfigChangedEvent.type, this);\n\n        // map canvas\n        this.canvas = document.createElement('canvas');\n        this.__setCursor('move');\n        canvasContainer.appendChild(this.canvas);\n\n        // overlay\n        this.overlay = document.createElement('div');\n        this.overlay.className = 'psv-map__overlay';\n        canvasContainer.appendChild(this.overlay);\n\n        this.container.appendChild(canvasContainer);\n\n        this.container.addEventListener('transitionstart', this);\n        this.container.addEventListener('transitionend', this);\n\n        // sub-components\n        if (this.config.buttons.reset) {\n            this.resetButton = new MapResetButton(this);\n        }\n        if (this.config.buttons.maximize) {\n            this.maximizeButton = new MapMaximizeButton(this);\n        }\n        if (this.config.buttons.close) {\n            this.closeButton = new MapCloseButton(this);\n        }\n        if (this.config.buttons.north) {\n            this.compassButton = new MapCompassButton(this);\n        }\n        this.zoomToolbar = new MapZoomToolbar(this);\n\n        // render loop\n        const renderLoop = () => {\n            if (this.isVisible() && (this.state.needsUpdate || this.state.forceRender)) {\n                this.render();\n                this.state.needsUpdate = false;\n            }\n            this.state.renderLoop = requestAnimationFrame(renderLoop);\n        };\n        renderLoop();\n\n        this.applyConfig();\n        this.hide();\n\n        if (!this.config.visibleOnLoad) {\n            this.toggleCollapse();\n        }\n    }\n\n    init() {\n        this.gallery = this.viewer.getPlugin('gallery');\n\n        this.gallery?.addEventListener('show-gallery', this);\n        this.gallery?.addEventListener('hide-gallery', this);\n    }\n\n    override destroy(): void {\n        this.canvas.width = 0;\n        this.canvas.height = 0;\n\n        window.removeEventListener('touchmove', this);\n        window.removeEventListener('mousemove', this);\n        window.removeEventListener('touchend', this);\n        window.removeEventListener('mouseup', this);\n        this.viewer.removeEventListener(events.KeypressEvent.type, this);\n\n        this.gallery?.removeEventListener('show-gallery', this);\n        this.gallery?.removeEventListener('hide-gallery', this);\n\n        cancelAnimationFrame(this.state.renderLoop);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        if (utils.getMatchingTarget(e, `.${CONSTANTS.CAPTURE_EVENTS_CLASS}:not(.psv-map)`)) {\n            return;\n        }\n        switch (e.type) {\n            case events.KeypressEvent.type:\n                if (this.state.maximized) {\n                    this.__onKeyPress(e as events.KeypressEvent);\n                    e.preventDefault();\n                }\n                break;\n            case events.ConfigChangedEvent.type:\n                if ((e as events.ConfigChangedEvent).containsOptions('lang')) {\n                    this.resetButton?.update();\n                    this.closeButton?.update();\n                    this.compassButton?.update();\n                    this.maximizeButton?.update();\n                }\n                break;\n            case 'mousedown': {\n                const event = e as MouseEvent;\n                this.state.mouseX = event.clientX;\n                this.state.mouseY = event.clientY;\n                this.state.mousedown = true;\n                e.stopPropagation();\n                break;\n            }\n            case 'touchstart': {\n                const event = e as TouchEvent;\n                if (event.touches.length === 1) {\n                    this.state.mouseX = event.touches[0].clientX;\n                    this.state.mouseY = event.touches[0].clientY;\n                    this.state.mousedown = true;\n                } else if (event.touches.length === 2) {\n                    ({\n                        distance: this.state.pinchDist,\n                        angle: this.state.pinchAngle,\n                        center: { x: this.state.mouseX, y: this.state.mouseY },\n                    } = utils.getTouchData(event));\n                }\n                e.stopPropagation();\n                e.preventDefault();\n                break;\n            }\n            case 'mousemove': {\n                const event = e as MouseEvent;\n                if (this.state.mousedown) {\n                    this.__move(event.clientX, event.clientY);\n                    e.stopPropagation();\n                } else if (e.composedPath().includes(this.canvas)) {\n                    this.__handleHotspots(event.clientX, event.clientY);\n                }\n                break;\n            }\n            case 'touchmove': {\n                const event = e as TouchEvent;\n                if (this.state.mousedown && event.touches.length === 1) {\n                    this.__move(event.touches[0].clientX, event.touches[0].clientY);\n                    e.stopPropagation();\n                } else if (this.state.mousedown && event.touches.length === 2) {\n                    const touchData = utils.getTouchData(event);\n                    const delta = (touchData.distance - this.state.pinchDist) / SYSTEM.pixelRatio;\n\n                    this.zoom(delta / 100);\n                    this.__move(touchData.center.x, touchData.center.y);\n\n                    if (this.state.maximized && !this.config.static) {\n                        this.viewer.dynamics.position.step({ yaw: this.state.pinchAngle - touchData.angle }, 0);\n                    }\n\n                    ({ distance: this.state.pinchDist, angle: this.state.pinchAngle } = touchData);\n                    e.stopPropagation();\n                }\n                break;\n            }\n            case 'mouseup':\n            case 'touchend': {\n                const mouse = (e as TouchEvent).changedTouches?.[0] || (e as MouseEvent);\n                if (this.state.mousedown) {\n                    this.state.mousedown = false;\n                    e.stopPropagation();\n                }\n                if (e.composedPath().includes(this.canvas)) {\n                    this.__clickHotspot(mouse.clientX, mouse.clientY);\n                }\n                break;\n            }\n            case 'wheel': {\n                const event = e as WheelEvent;\n                const delta = event.deltaY / Math.abs(event.deltaY);\n                if (event.ctrlKey) {\n                    this.viewer.dynamics.position.step({ yaw: delta / 10 });\n                } else {\n                    this.zoom(-delta / 10);\n                }\n                e.stopPropagation();\n                e.preventDefault();\n                break;\n            }\n            case 'transitionstart':\n                this.state.forceRender = true;\n                break;\n            case 'transitionend':\n                if (!this.state.maximized) {\n                    this.overlay.style.display = '';\n                    this.recenter();\n                }\n                this.state.forceRender = false;\n                this.update();\n                break;\n            case 'hide-gallery':\n                this.__onToggleGallery(false);\n                break;\n            case 'show-gallery':\n                if (!(e as GalleryEvents.ShowGalleryEvent).fullscreen) {\n                    this.__onToggleGallery(true);\n                }\n                break;\n        }\n    }\n\n    applyConfig() {\n        this.container.classList.remove(\n            'psv-map--top-right',\n            'psv-map--top-left',\n            'psv-map--bottom-right',\n            'psv-map--bottom-left',\n            'psv-map--round',\n            'psv-map--square',\n        );\n        this.container.classList.add(`psv-map--${this.config.position.join('-')}`);\n        this.container.classList.add(`psv-map--${this.config.shape}`);\n\n        this.container.style.width = this.config.size;\n        this.container.style.height = this.config.size;\n\n        this.overlay.innerHTML = this.config.overlayImage === null\n            ? ''\n            : getImageHtml(this.config.overlayImage ?? (this.config.shape === 'square' ? overlaySquare : overlayRound));\n\n        this.resetButton?.applyConfig();\n        this.closeButton?.applyConfig();\n        this.compassButton?.applyConfig();\n        this.maximizeButton?.applyConfig();\n\n        if (this.config.static) {\n            this.compassButton?.rotate(0);\n            this.overlay.style.transform = '';\n        }\n        if (this.config.shape === 'square') {\n            this.overlay.style.transform = '';\n        }\n\n        this.update();\n    }\n\n    override isVisible(): boolean {\n        return this.state.visible && !this.state.collapsed;\n    }\n\n    override show() {\n        super.show();\n        this.update();\n        if (!this.state.maximized) {\n            this.overlay.style.display = '';\n        }\n    }\n\n    override hide() {\n        super.hide();\n        this.state.forceRender = false;\n    }\n\n    /**\n     * Flag for render\n     */\n    update(clear = true) {\n        this.state.needsUpdate = true;\n\n        if (clear) {\n            // clear hotspots status\n            this.state.hotspotPos = {};\n            this.__resetHotspot();\n        }\n    }\n\n    /**\n     * Load a new map image\n     */\n    reload(url: string) {\n        delete this.state.images[this.config.imageUrl];\n        this.config.imageUrl = url;\n        this.state.imgScale = 1;\n        this.__loadImage(this.config.imageUrl, true);\n        this.recenter();\n    }\n\n    /**\n     * Clears the offset and zoom level\n     */\n    reset() {\n        this.state.zoom = this.config.defaultZoom;\n        this.recenter();\n    }\n\n    /**\n     * Clears the offset\n     */\n    recenter() {\n        this.state.offset.x = 0;\n        this.state.offset.y = 0;\n        this.update();\n    }\n\n    /**\n     * Increase the offset\n     */\n    addOffset(offset: Point) {\n        this.state.offset.x += offset.x;\n        this.state.offset.y += offset.y;\n        this.update();\n    }\n\n    /**\n     * Switch collapsed mode\n     */\n    toggleCollapse() {\n        if (this.state.maximized) {\n            this.toggleMaximized(false);\n        }\n\n        this.state.collapsed = !this.state.collapsed;\n\n        utils.toggleClass(this.container, 'psv-map--collapsed', this.state.collapsed);\n\n        if (!this.state.collapsed) {\n            this.reset();\n            this.plugin.dispatchEvent(new ViewChanged('normal'));\n        } else {\n            this.plugin.dispatchEvent(new ViewChanged('closed'));\n        }\n\n        this.closeButton?.update();\n    }\n\n    /**\n     * Switch maximized mode\n     */\n    toggleMaximized(dispatchMinimizeEvent = true) {\n        if (this.state.collapsed) {\n            return;\n        }\n\n        this.state.maximized = !this.state.maximized;\n\n        utils.toggleClass(this.container, 'psv-map--maximized', this.state.maximized);\n\n        if (this.state.maximized) {\n            this.state.galleryWasVisible = this.gallery?.isVisible();\n            this.gallery?.hide();\n\n            this.overlay.style.display = 'none';\n            this.plugin.dispatchEvent(new ViewChanged('maximized'));\n        } else {\n            if (this.state.galleryWasVisible) {\n                this.gallery.show();\n            }\n            if (dispatchMinimizeEvent) {\n                this.plugin.dispatchEvent(new ViewChanged('normal'));\n            }\n        }\n\n        this.maximizeButton?.update();\n    }\n\n    /**\n     * Changes the zoom level\n     */\n    zoom(d: number) {\n        this.setZoom(this.state.zoom + d);\n    }\n\n    /**\n     * Changes the zoom level\n     */\n    setZoom(value: number) {\n        this.state.zoom = MathUtils.clamp(value, this.config.minZoom, this.config.maxZoom);\n        this.update();\n    }\n\n    /**\n     * Updates the markers\n     */\n    setMarkers(markers: MapHotspot[]) {\n        this.state.markers = markers;\n        this.update();\n    }\n\n    /**\n     * Changes the highlighted hotspot\n     */\n    setActiveHotspot(hotspotId: string) {\n        this.state.hotspotId = hotspotId;\n        this.update(false);\n    }\n\n    private render() {\n        if (!this.config.center) {\n            return;\n        }\n\n        // load the map image\n        const mapImage = this.__loadImage(this.config.imageUrl);\n        if (!mapImage) {\n            return;\n        }\n\n        const yaw = this.viewer.getPosition().yaw;\n        const zoom = Math.exp(this.state.zoom) / this.state.imgScale;\n        const center: Point = {\n            x: this.config.center.x * this.state.imgScale,\n            y: this.config.center.y * this.state.imgScale,\n        };\n        const offset: Point = {\n            x: this.state.offset.x * this.state.imgScale,\n            y: this.state.offset.y * this.state.imgScale,\n        };\n        const rotation = this.config.rotation;\n        const yawAndRotation = this.config.static ? 0 : yaw + rotation;\n\n        // update UI\n        if (!this.config.static) {\n            if (this.config.shape === 'round') {\n                this.overlay.style.transform = `rotate(${-yawAndRotation}rad)`;\n            }\n            this.compassButton?.rotate(yawAndRotation);\n        }\n        this.zoomToolbar.setText(this.state.zoom);\n\n        // clear canvas\n        this.canvas.width = this.container.clientWidth * SYSTEM.pixelRatio;\n        this.canvas.height = this.container.clientHeight * SYSTEM.pixelRatio;\n\n        const canvasPos = utils.getPosition(this.canvas);\n        const canvasW = this.canvas.width;\n        const canvasH = this.canvas.height;\n        const canvasVirtualCenterX = canvasW / 2 / SYSTEM.pixelRatio;\n        const canvasVirtualCenterY = canvasH / 2 / SYSTEM.pixelRatio;\n\n        const context = this.canvas.getContext('2d');\n        context.clearRect(0, 0, canvasW, canvasH);\n\n        // draw the map\n        const mapW = mapImage.width;\n        const mapH = mapImage.height;\n\n        context.save();\n        context.translate(canvasW / 2, canvasH / 2);\n        context.rotate(-yawAndRotation);\n        context.scale(zoom, zoom);\n        canvasShadow(context, 0, 0, MAP_SHADOW_BLUR);\n        drawImageHighDpi(\n            context,\n            mapImage,\n            -center.x - offset.x,\n            -center.y - offset.y,\n            mapW,\n            mapH,\n        );\n        context.restore();\n\n        // draw the hotspots\n        [...this.config.hotspots, ...this.state.markers]\n            .sort((a, b) => {\n                if (this.state.hotspotId === a.id) {\n                    return 1;\n                }\n                if (this.state.hotspotId === b.id) {\n                    return -1;\n                }\n                return (a.zIndex ?? 0) - (b.zIndex ?? 0);\n            })\n            .forEach((hotspot: MapHotspot) => {\n                const isHover = this.state.hotspotId === hotspot.id;\n\n                const style = getStyle(this.config.spotStyle, hotspot, isHover);\n                let image: ImageSource;\n\n                if (style.image) {\n                    image = this.__loadImage(style.image);\n                    if (!image) {\n                        return;\n                    }\n\n                    // preload the hover image\n                    if (!isHover && (hotspot.hoverImage || this.config.spotStyle.hoverImage)) {\n                        this.__loadImage(hotspot.hoverImage || this.config.spotStyle.hoverImage, false, false);\n                    }\n                }\n\n                const hotspotPos = { ...offset };\n                if ('yaw' in hotspot && 'distance' in hotspot) {\n                    const angle = utils.parseAngle(hotspot.yaw) + rotation;\n                    hotspotPos.x += Math.sin(-angle) * hotspot.distance * this.state.imgScale;\n                    hotspotPos.y += Math.cos(-angle) * hotspot.distance * this.state.imgScale;\n                } else if ('x' in hotspot && 'y' in hotspot) {\n                    hotspotPos.x += center.x - hotspot.x * this.state.imgScale;\n                    hotspotPos.y += center.y - hotspot.y * this.state.imgScale;\n                } else {\n                    utils.logWarn(`Hotspot ${hotspot['id']} is missing position (yaw+distance or x+y)`);\n                    return;\n                }\n\n                const spotPos = projectPoint(hotspotPos, yawAndRotation, zoom);\n\n                // TODO filter out not visible\n\n                const x = canvasVirtualCenterX - spotPos.x;\n                const y = canvasVirtualCenterY - spotPos.y;\n\n                // save absolute position on the viewer\n                this.state.hotspotPos[hotspot.id] = {\n                    x: x + canvasPos.x,\n                    y: y + canvasPos.y,\n                    s: style.size,\n                };\n\n                context.save();\n                context.translate(x * SYSTEM.pixelRatio, y * SYSTEM.pixelRatio);\n                canvasShadow(context, PIN_SHADOW_OFFSET, PIN_SHADOW_OFFSET, PIN_SHADOW_BLUR);\n                if (image) {\n                    drawImageCentered(context, image, style.size);\n                } else {\n                    context.fillStyle = style.color;\n                    context.beginPath();\n                    context.arc(0, 0, (style.size * SYSTEM.pixelRatio) / 2, 0, 2 * Math.PI);\n                    context.fill();\n\n                    if (style.borderColor && style.borderSize) {\n                        context.shadowColor = 'transparent';\n                        context.strokeStyle = style.borderColor;\n                        context.lineWidth = style.borderSize;\n                        context.beginPath();\n                        context.arc(0, 0, ((style.size + style.borderSize) * SYSTEM.pixelRatio) / 2, 0, 2 * Math.PI);\n                        context.stroke();\n                    }\n                }\n                context.restore();\n            });\n\n        const pinImage = this.__loadImage(this.config.pinImage);\n        if (pinImage || (this.config.coneColor && this.config.coneSize)) {\n            const pinPos = projectPoint(offset, yawAndRotation, zoom);\n\n            const x = canvasVirtualCenterX - pinPos.x;\n            const y = canvasVirtualCenterY - pinPos.y;\n            const size = this.config.pinSize;\n            const angle = this.config.static ? yaw + rotation : 0;\n\n            context.save();\n            context.translate(x * SYSTEM.pixelRatio, y * SYSTEM.pixelRatio);\n            context.rotate(angle);\n\n            // draw the cone\n            if (this.config.coneColor && this.config.coneSize) {\n                const fov = MathUtils.degToRad(this.viewer.state.hFov);\n                const a1 = -Math.PI / 2 - fov / 2;\n                const a2 = a1 + fov;\n                const c = this.config.coneSize * SYSTEM.pixelRatio;\n\n                const grad = context.createRadialGradient(0, 0, c / 4, 0, 0, c);\n                grad.addColorStop(0, this.config.coneColor);\n                grad.addColorStop(1, rgbToRgba(this.config.coneColor, 0));\n\n                context.beginPath();\n                context.moveTo(0, 0);\n                context.lineTo(Math.cos(a1) * c, Math.sin(a1) * c);\n                context.arc(0, 0, c, a1, a2, false);\n                context.lineTo(0, 0);\n                context.fillStyle = grad;\n                context.fill();\n            }\n\n            // draw the pin\n            if (pinImage) {\n                canvasShadow(context, PIN_SHADOW_OFFSET, PIN_SHADOW_OFFSET, PIN_SHADOW_BLUR);\n                drawImageCentered(context, pinImage, size);\n            }\n\n            context.restore();\n        }\n    }\n\n    /**\n     * Applies mouse movement to the map\n     */\n    private __move(clientX: number, clientY: number) {\n        const yaw = this.viewer.getPosition().yaw;\n        const zoom = Math.exp(this.state.zoom);\n\n        const move = unprojectPoint(\n            {\n                x: this.state.mouseX - clientX,\n                y: this.state.mouseY - clientY,\n            },\n            this.config.static ? 0 : yaw + this.config.rotation,\n            zoom,\n        );\n\n        this.state.offset.x += move.x;\n        this.state.offset.y += move.y;\n\n        this.update();\n\n        this.state.mouseX = clientX;\n        this.state.mouseY = clientY;\n    }\n\n    /**\n     * Finds the hotspot under the mouse\n     */\n    private __findHotspot(clientX: number, clientY: number): string {\n        const k = this.config.spotStyle.size / 2;\n\n        let hotspotId: string = null;\n        for (const [id, { x, y }] of Object.entries(this.state.hotspotPos)) {\n            if (clientX > x - k && clientX < x + k && clientY > y - k && clientY < y + k) {\n                hotspotId = id;\n                break;\n            }\n        }\n\n        return hotspotId;\n    }\n\n    /**\n     * Updates current hotspot on mouse move and displays tooltip\n     */\n    private __handleHotspots(clientX: number, clientY: number) {\n        const hotspotId = this.__findHotspot(clientX, clientY);\n\n        if (this.state.hotspotId !== hotspotId) {\n            this.__resetHotspot();\n\n            if (hotspotId) {\n                let tooltip;\n                if (hotspotId.startsWith(HOTSPOT_MARKER_ID)) {\n                    tooltip = this.state.markers.find(({ id }) => id === hotspotId)?.tooltip;\n                } else {\n                    tooltip = this.config.hotspots.find(({ id }) => id === hotspotId)?.tooltip;\n                }\n\n                if (tooltip) {\n                    if (typeof tooltip === 'string') {\n                        tooltip = { content: tooltip };\n                    }\n\n                    const hotspotPos = this.state.hotspotPos[hotspotId];\n                    const viewerPos = utils.getPosition(this.viewer.container);\n\n                    this.state.hotspotTooltip = this.viewer.createTooltip({\n                        content: tooltip.content,\n                        className: tooltip.className,\n                        left: hotspotPos.x - viewerPos.x,\n                        top: hotspotPos.y - viewerPos.y,\n                        box: {\n                            width: hotspotPos.s,\n                            height: hotspotPos.s,\n                        },\n                    });\n                }\n            }\n\n            this.setActiveHotspot(hotspotId);\n            this.__setCursor(hotspotId ? 'pointer' : 'move');\n        }\n    }\n\n    /**\n     * Dispatch event when a hotspot is clicked\n     */\n    private __clickHotspot(clientX: number, clientY: number) {\n        const hotspotId = this.__findHotspot(clientX, clientY);\n\n        if (hotspotId) {\n            this.plugin.dispatchEvent(new SelectHotspot(hotspotId));\n\n            if (hotspotId.startsWith(HOTSPOT_MARKER_ID)) {\n                const markerId = hotspotId.substring(HOTSPOT_MARKER_ID.length);\n                this.viewer.getPlugin<MarkersPlugin>('markers').gotoMarker(markerId);\n            }\n\n            if (this.maximized && this.config.minimizeOnHotspotClick) {\n                this.toggleMaximized();\n            }\n        }\n\n        this.__resetHotspot();\n    }\n\n    private __resetHotspot() {\n        this.state.hotspotTooltip?.hide();\n        this.state.hotspotTooltip = null;\n        this.state.hotspotId = null;\n    }\n\n    /**\n     * Loads an image and returns the result **synchronously**.\n     * If the image is not already loaded it returns `null` and schedules a new render when the image is ready.\n     */\n    private __loadImage(url: string, isInit = false, autoRefresh = true): ImageSource {\n        if (!url) {\n            return null;\n        }\n\n        if (!this.state.images[url]) {\n            const image = loadImage(url);\n\n            this.state.images[url] = {\n                loading: true,\n                value: image,\n            };\n\n            image.onload = () => {\n                if (isInit && Math.max(image.width, image.height) > SYSTEM.maxCanvasWidth) {\n                    this.state.imgScale = SYSTEM.maxCanvasWidth / Math.max(image.width, image.height);\n\n                    const buffer = document.createElement('canvas');\n                    buffer.width = image.width * this.state.imgScale;\n                    buffer.height = image.height * this.state.imgScale;\n\n                    const ctx = buffer.getContext('2d');\n                    ctx.drawImage(image, 0, 0, buffer.width, buffer.height);\n\n                    this.state.images[url].value = buffer;\n                }\n\n                this.state.images[url].loading = false;\n\n                if (autoRefresh) {\n                    this.update(false);\n                }\n                if (isInit) {\n                    this.show();\n                }\n            };\n\n            return null;\n        }\n\n        if (this.state.images[url].loading) {\n            return null;\n        }\n\n        return this.state.images[url].value;\n    }\n\n    private __onKeyPress(e: events.KeypressEvent) {\n        if (e.matches(CONSTANTS.KEY_CODES.Escape)) {\n            this.toggleMaximized();\n            return;\n        }\n\n        if (!this.viewer.state.keyboardEnabled) {\n            return;\n        }\n\n        let x = 0;\n        let y = 0;\n        let z = 0;\n\n        if (e.matches(CONSTANTS.KEY_CODES.ArrowUp)) y = 1;\n        if (e.matches(CONSTANTS.KEY_CODES.ArrowDown)) y = -1;\n        if (e.matches(CONSTANTS.KEY_CODES.ArrowLeft)) x = 1;\n        if (e.matches(CONSTANTS.KEY_CODES.ArrowRight)) x = -1;\n        if (e.matches(CONSTANTS.KEY_CODES.Plus)) z = 1;\n        if (e.matches(CONSTANTS.KEY_CODES.Minus)) z = -1;\n        if (e.matches(CONSTANTS.KEY_CODES.PageUp)) z = 1;\n        if (e.matches(CONSTANTS.KEY_CODES.PageDown)) z = -1;\n\n        if (x || y) {\n            this.state.mouseX = 0;\n            this.state.mouseY = 0;\n            this.__move(x * 10, y * 10);\n        }\n\n        if (z) {\n            this.zoom(z / 10);\n        }\n    }\n\n    private __setCursor(cursor: string) {\n        this.canvas.style.cursor = cursor;\n    }\n\n    private __onToggleGallery(visible: boolean) {\n        if (!visible) {\n            this.container.style.marginBottom = '';\n        } else {\n            this.container.style.marginBottom = (this.viewer.container.querySelector<HTMLElement>('.psv-gallery').offsetHeight + 10) + 'px';\n        }\n    }\n}\n","export const MARKER_DATA_KEY = 'map';\nexport const HOTSPOT_GENERATED_ID = '__generated__';\nexport const HOTSPOT_MARKER_ID = '__marker__';\n\nexport const PIN_SHADOW_OFFSET = 2;\nexport const PIN_SHADOW_BLUR = 4;\nexport const MAP_SHADOW_BLUR = 10;\n","import { Point, SYSTEM } from '@photo-sphere-viewer/core';\nimport { MapHotspotStyle } from './model';\n\nexport function loadImage(src: string): HTMLImageElement {\n    const image = document.createElement('img');\n\n    if (!src.includes('<svg')) {\n        image.src = src;\n    } else {\n        // the SVG must have it's own size, use the viewBox if not defined\n        if (!/<svg[^>]*width=\"/.test(src) && src.includes('viewBox')) {\n            const [, , , width, height] = /viewBox=\"([0-9-]+) ([0-9-]+) ([0-9]+) ([0-9]+)\"/.exec(src);\n            src = src.replace('<svg', `<svg width=\"${width}px\" height=\"${height}px\"`);\n        }\n\n        const src64 = `data:image/svg+xml;base64,${window.btoa(src)}`;\n        image.src = src64;\n    }\n\n    return image;\n}\n\nexport function getImageHtml(src: string): string {\n    if (!src) {\n        return '';\n    } else if (!src.includes('<svg')) {\n        return `<img src=\"${src}\">`;\n    } else {\n        return src;\n    }\n}\n\nexport function getStyle(defaultStyle: MapHotspotStyle, style: MapHotspotStyle, isHover: boolean) {\n    return {\n        image: isHover\n            ? style.hoverImage ?? style.image ?? defaultStyle.hoverImage ?? defaultStyle.image\n            : style.image ?? defaultStyle.image,\n        size: isHover\n            ? style.hoverSize ?? style.size ?? defaultStyle.hoverSize ?? defaultStyle.size\n            : style.size ?? defaultStyle.size,\n        color: isHover\n            ? style.hoverColor ?? style.color ?? defaultStyle.hoverColor ?? defaultStyle.color\n            : style.color ?? defaultStyle.color,\n        borderColor: isHover\n            ? style.hoverBorderColor ?? style.borderColor ?? defaultStyle.hoverBorderColor ?? defaultStyle.borderColor\n            : style.borderColor ?? defaultStyle.borderColor,\n        borderSize: isHover\n            ? style.hoverBorderSize ?? style.borderSize ?? defaultStyle.hoverBorderSize ?? defaultStyle.borderSize\n            : style.borderSize ?? defaultStyle.borderSize,\n    };\n}\n\nexport function unprojectPoint(pt: Point, yaw: number, zoom: number): Point {\n    return {\n        x: (Math.cos(yaw) * pt.x - Math.sin(yaw) * pt.y) / zoom,\n        y: (Math.sin(yaw) * pt.x + Math.cos(yaw) * pt.y) / zoom,\n    };\n}\n\nexport function projectPoint(pt: Point, yaw: number, zoom: number): Point {\n    return {\n        x: (Math.cos(-yaw) * pt.x - Math.sin(-yaw) * pt.y) * zoom,\n        y: (Math.sin(-yaw) * pt.x + Math.cos(-yaw) * pt.y) * zoom,\n    };\n}\n\nexport type ImageSource = HTMLImageElement | HTMLCanvasElement;\n\n/**\n * Setup the canvas drop shadow\n */\nexport function canvasShadow(\n    context: CanvasRenderingContext2D,\n    offsetX: number,\n    offsetY: number,\n    blur: number,\n    color = 'black',\n) {\n    context.shadowOffsetX = offsetX * SYSTEM.pixelRatio;\n    context.shadowOffsetY = offsetY * SYSTEM.pixelRatio;\n    context.shadowBlur = blur * SYSTEM.pixelRatio;\n    context.shadowColor = color;\n}\n\n/**\n * Draw an image centered\n */\nexport function drawImageCentered(context: CanvasRenderingContext2D, image: ImageSource, size: number) {\n    const w = image.width;\n    const h = image.height;\n\n    drawImageHighDpi(\n        context,\n        image,\n        -size / 2,\n        -((h / w) * size) / 2,\n        size,\n        (h / w) * size,\n    );\n}\n\n/**\n * Standard \"drawImage\" using devicePixelRatio\n */\nexport function drawImageHighDpi(\n    context: CanvasRenderingContext2D,\n    image: ImageSource,\n    x: number,\n    y: number,\n    w: number,\n    h: number,\n) {\n    context.drawImage(\n        image,\n        0, 0,\n        image.width, image.height,\n        x * SYSTEM.pixelRatio, y * SYSTEM.pixelRatio,\n        w * SYSTEM.pixelRatio, h * SYSTEM.pixelRatio,\n    );\n}\n\n/**\n * Adds the \"a\" to your \"rgb\"\n */\nexport function rgbToRgba(rgb: string, alpha: number): string {\n    return `rgba(${rgb.slice(4, -1)},${alpha})`;\n}\n","import { CONSTANTS } from '@photo-sphere-viewer/core';\nimport icon from '../icons/map.svg';\nimport { AbstractMapButton, ButtonPosition } from './AbstractMapButton';\nimport type { MapComponent } from './MapComponent';\n\nexport class MapCloseButton extends AbstractMapButton {\n    constructor(map: MapComponent) {\n        super(map, ButtonPosition.DEFAULT);\n\n        this.container.addEventListener('click', (e) => {\n            map.toggleCollapse();\n            e.stopPropagation();\n        });\n    }\n\n    override applyConfig(): void {\n        super.applyConfig();\n        this.container.classList.add('psv-map__button-close');\n    }\n\n    override update() {\n        this.container.innerHTML = this.map.collapsed ? icon : CONSTANTS.ICONS.close;\n        this.container.title = this.map.collapsed ? this.viewer.config.lang['map'] : this.viewer.config.lang.close;\n    }\n}\n","<svg viewBox=\"114 45 472 472\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"currentColor\"><path d=\"M383.6 196a67.3 67.3 0 1 0-134.5.1 67.3 67.3 0 0 0 134.5-.1zm-100.8 0a33.6 33.6 0 1 1 67.3 0 33.6 33.6 0 0 1-67.3 0z\"/><path d=\"M584 340.8a16.8 16.8 0 0 0-15.6-10.4H403.8c25.2-40.2 47-88 47-133.4A135 135 0 0 0 316.4 61.6 135 135 0 0 0 182 197c0 55.8 33 115.3 64.7 159.8L120.4 469a16.8 16.8 0 0 0 11.2 29.4H434c4.5 0 8.7-1.8 11.9-5l134.4-134.3c4.8-4.8 6.2-12 3.6-18.3zM215.5 197c0-56.1 45.2-101.8 100.8-101.8 55.6 0 100.8 45.6 100.8 101.8 0 65-57.1 144.2-100.8 192.8C273 341.7 215.6 262.3 215.6 197zM427 464.8H175.8l91.3-81.1a575.6 575.6 0 0 0 37.4 42.6 16.8 16.8 0 0 0 23.8 0c2.2-2.2 26.3-26.7 52.6-62.3h147z\"/></g><!-- Created by Ayub Irawan from Noun Project --></svg>","import { AbstractComponent } from '@photo-sphere-viewer/core';\nimport { MapComponent } from './MapComponent';\n\nexport const enum ButtonPosition {\n    DEFAULT,\n    DIAGONAL,\n    HORIZONTAL,\n    VERTICAL,\n}\n\nconst INVERT_POSITIONS: Record<string, string> = {\n    top: 'bottom',\n    bottom: 'top',\n    left: 'right',\n    right: 'left',\n};\n\nfunction getButtonPosition(mapPosition: [string, string], direction: ButtonPosition): [string, string] {\n    switch (direction) {\n        case ButtonPosition.DIAGONAL:\n            return [INVERT_POSITIONS[mapPosition[0]], INVERT_POSITIONS[mapPosition[1]]];\n        case ButtonPosition.HORIZONTAL:\n            return [mapPosition[0], INVERT_POSITIONS[mapPosition[1]]];\n        case ButtonPosition.VERTICAL:\n            return [INVERT_POSITIONS[mapPosition[0]], mapPosition[1]];\n        default:\n            return mapPosition;\n    }\n}\n\nexport abstract class AbstractMapButton extends AbstractComponent {\n    constructor(\n        protected map: MapComponent,\n        private position: ButtonPosition,\n    ) {\n        super(map, {});\n    }\n\n    applyConfig() {\n        this.container.className = `psv-map__button psv-map__button--${getButtonPosition(this.map.config.position, this.position).join('-')}`;\n        this.update();\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    update() {}\n}\n","<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M50,0L70,50L50,100L30,50Z M50,86L64,50L36,50Z\" fill=\"currentColor\"/></svg>","import icon from '../icons/compass.svg';\nimport { AbstractMapButton, ButtonPosition } from './AbstractMapButton';\nimport type { MapComponent } from './MapComponent';\n\nexport class MapCompassButton extends AbstractMapButton {\n    constructor(map: MapComponent) {\n        super(map, ButtonPosition.VERTICAL);\n\n        this.container.innerHTML = icon;\n        this.container.querySelector('svg').style.width = '80%';\n\n        this.container.addEventListener('click', (e) => {\n            this.viewer.dynamics.position.goto({ yaw: -map.config.rotation }, 2);\n            e.stopPropagation();\n        });\n    }\n\n    rotate(angle: number) {\n        this.container.querySelector('svg').style.transform = `rotate3d(0, 0, 1, ${-angle}rad)`;\n    }\n\n    override update() {\n        this.container.title = this.viewer.config.lang['mapNorth'];\n    }\n}\n","<svg viewBox=\"95 25 510 510\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M604.2 39.8v481c0 7.8-6.1 14-14 14H358.4c-7.8 0-14-6.2-14-14s6.2-14 14-14h217.8v-453H123.8v216.7c0 7.8-6.2 14-14 14-7.9 0-14-6.2-14-14V39.8c0-7.9 6.1-14 14-14h481c7.3 0 13.4 6.1 13.4 14zm-304 304v176.4c0 7.9-6.2 14-14 14H109.8c-7.9 0-14-6.1-14-14V343.8c0-7.8 6.1-14 14-14h176.4c7.2 0 14 6.8 14 14zm-28 14H123.8v148.4h148.4zm215.6-195.4v79.5c0 7.9 6.1 14 14 14 7.8 0 14-6.1 14-14V128.2c0-7.8-6.2-14-14-14H388.6c-7.8 0-14 6.2-14 14 0 7.9 6.2 14 14 14h79L326.5 283.4a13.5 13.5 0 0 0 0 19.6c2.8 2.8 6.1 3.9 10 3.9 4 0 7.3-1.1 10.1-4z\" fill=\"currentColor\"/><!-- Created by Gregor Cresnar from Noun Project --></svg>","<svg viewBox=\"95 25 510 510\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M109.8 25.8h481c7.8 0 14 6.1 14 14v481c0 7.8-6.2 14-14 14H358.4c-7.8 0-14-6.2-14-14s6.2-14 14-14h217.8v-453H123.8v216.7c0 7.8-6.2 14-14 14-7.9 0-14-6.2-14-14V39.8c0-7.9 6.1-14 14-14zm176.4 508.4H109.8c-7.9 0-14-6.1-14-14V343.8c0-7.8 6.1-14 14-14h176.4c7.8 0 14 6.2 14 14v176.4c0 7.9-6.8 14-14 14zm-14-176.4H123.8v148.4h148.4zm64.4-191.5c-7.9 0-14 6.2-14 14v113.1c0 7.9 6.1 14 14 14h113c8 0 14-6.1 14-14s-6-14-14-14h-79.4l141-141a13.5 13.5 0 0 0 0-19.7 13.5 13.5 0 0 0-19.5 0L350.6 259.8v-79.5c0-7.8-6.2-14-14-14z\" fill=\"currentColor\"/><!-- Created by Gregor Cresnar from Noun Project --></svg>","import maximize from '../icons/maximize.svg';\nimport minimize from '../icons/minimize.svg';\nimport { AbstractMapButton, ButtonPosition } from './AbstractMapButton';\nimport type { MapComponent } from './MapComponent';\n\nconst ROTATION: Record<string, number> = {\n    'bottom-left': 0,\n    'bottom-right': -90,\n    'top-right': 180,\n    'top-left': 90,\n};\n\nexport class MapMaximizeButton extends AbstractMapButton {\n    constructor(map: MapComponent) {\n        super(map, ButtonPosition.DIAGONAL);\n\n        this.container.addEventListener('click', (e) => {\n            map.toggleMaximized();\n            e.stopPropagation();\n        });\n    }\n\n    override update() {\n        this.container.innerHTML = this.map.maximized ? minimize : maximize;\n        this.container.querySelector('svg').style.transform = `rotate3d(0, 0, 1, ${ROTATION[this.map.config.position.join('-')]}deg)`;\n        this.container.title = this.map.maximized\n            ? this.viewer.config.lang['mapMinimize']\n            : this.viewer.config.lang['mapMaximize'];\n    }\n}\n","<svg viewBox=\"170 100 360 360\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"currentColor\"><path d=\"M518.6 269h-18.5a150.8 150.8 0 0 0-138-137.9v-20.9c0-5.8-4.7-10.6-10.5-10.6h-3.2c-5.8 0-10.6 4.8-10.6 10.6v21A150.8 150.8 0 0 0 200 269h-18.5c-5.9 0-10.6 4.7-10.6 10.6v3.2c0 5.8 4.7 10.5 10.6 10.5h18.5c6 73.4 64.6 132 138 138v18.5c0 5.8 4.7 10.6 10.5 10.6h3.2c5.8 0 10.6-4.8 10.6-10.6v-18.6c73.3-5.9 132-64.5 137.9-137.9h18.5c5.9 0 10.6-4.7 10.6-10.5v-3.2c0-5.9-4.7-10.6-10.6-10.6zM362.2 414.4v-9.8c0-5.9-4.8-10.6-10.6-10.6h-3.2c-5.8 0-10.6 4.7-10.6 10.6v9.8a134 134 0 0 1-121-121h9.8c5.9 0 10.6-4.8 10.6-10.6v-3.2c0-5.9-4.7-10.6-10.6-10.6h-9.8a134 134 0 0 1 121-121v7.5c0 5.8 4.8 10.5 10.6 10.5h3.2c5.8 0 10.6-4.7 10.6-10.5V148a134 134 0 0 1 121 121h-9.8c-5.9 0-10.6 4.7-10.6 10.6v3.2c0 5.8 4.7 10.5 10.6 10.5h9.8a134 134 0 0 1-121 121z\"/><path d=\"M355.4 222a6 6 0 0 0-10.7 0L291 320a8.3 8.3 0 0 0 9.7 12l39.2-11.7c6.6-2 13.6-2 20.2 0l39.2 11.7a8.3 8.3 0 0 0 9.7-12z\"/></g><!-- Created by muhammad benani from Noun Project --></svg>","import reset from '../icons/reset.svg';\nimport { AbstractMapButton, ButtonPosition } from './AbstractMapButton';\nimport type { MapComponent } from './MapComponent';\n\nexport class MapResetButton extends AbstractMapButton {\n    constructor(map: MapComponent) {\n        super(map, ButtonPosition.HORIZONTAL);\n\n        this.container.innerHTML = reset;\n        this.container.querySelector('svg').style.width = '80%';\n\n        this.container.addEventListener('click', (e) => {\n            map.reset();\n            e.stopPropagation();\n        });\n    }\n\n    override update() {\n        this.container.title = this.viewer.config.lang['mapReset'];\n    }\n}\n","import { AbstractComponent, utils } from '@photo-sphere-viewer/core';\nimport minus from '../icons/minus.svg';\nimport plus from '../icons/plus.svg';\nimport type { MapComponent } from './MapComponent';\n\nexport class MapZoomToolbar extends AbstractComponent {\n    private readonly zoomIndicator: HTMLElement;\n    private readonly handler = new utils.PressHandler(100);\n    private time: number;\n    private animation?: ReturnType<typeof requestAnimationFrame>;\n\n    constructor(private map: MapComponent) {\n        super(map, {\n            className: 'psv-map__toolbar',\n        });\n\n        this.container.innerHTML = `${minus}<span class=\"psv-map__toolbar-text\">100%</span>${plus}`;\n\n        this.zoomIndicator = this.container.querySelector('.psv-map__toolbar-text');\n\n        const zoomButtons = this.container.querySelectorAll('svg');\n        zoomButtons[0].dataset['delta'] = '-1';\n        zoomButtons[1].dataset['delta'] = '1';\n\n        this.container.addEventListener('mousedown', this);\n        window.addEventListener('mouseup', this);\n        this.container.addEventListener('touchstart', this);\n        window.addEventListener('touchend', this);\n    }\n\n    override destroy(): void {\n        window.removeEventListener('mouseup', this);\n        window.removeEventListener('touchend', this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case 'mousedown':\n            case 'touchstart': {\n                const button = utils.getMatchingTarget(e, 'svg[data-delta]');\n                const delta: string = button?.dataset['delta'];\n                if (delta) {\n                    cancelAnimationFrame(this.animation);\n                    this.handler.down();\n                    this.time = performance.now();\n                    this.animateZoom(parseInt(delta, 10));\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n                break;\n            }\n            case 'mouseup':\n            case 'touchend':\n                if (this.animation) {\n                    this.handler.up(() => {\n                        cancelAnimationFrame(this.animation);\n                        this.animation = null;\n                    });\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n                break;\n            default:\n                break;\n        }\n    }\n\n    setText(zoom: number) {\n        this.zoomIndicator.innerText = `${Math.round(Math.exp(zoom) * 100)}%`;\n    }\n\n    private animateZoom(delta: number) {\n        this.animation = requestAnimationFrame((t) => {\n            this.map.zoom((delta * (t - this.time)) / 1000);\n            this.time = t;\n            this.animateZoom(delta);\n        });\n    }\n}\n","<svg viewBox=\"128 58 444 444\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"currentColor\" d=\"M350 58.2a221.8 221.8 0 1 0 0 443.6 221.8 221.8 0 0 0 0-443.6zm130.3 252.7H219.7a31 31 0 1 1 0-61.8h260.6a31 31 0 1 1 0 61.8z\"/><!-- Created by Iconika from Noun Project --></svg>","<svg viewBox=\"143.8 73.8 412.5 412.5\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"currentColor\" d=\"M350 73.8a206.2 206.2 0 1 0 0 412.4 206.2 206.2 0 0 0 0-412.4zm117.3 234H378v89.5a27.9 27.9 0 1 1-55.8 0V308h-89.4a27.9 27.9 0 1 1 0-55.8H322v-89.5a27.9 27.9 0 1 1 55.8 0v89.5h89.5a27.9 27.9 0 1 1 0 55.8z\"/><!-- Created by Iconika from Noun Project --></svg>","<svg viewBox=\"0 0 500 500\" xmlns=\"http://www.w3.org/2000/svg\">\n    <defs>\n        <radialGradient id=\"gradient\">\n            <stop offset=\"80%\" stop-color=\"rgba(255, 255, 255, 0)\"/>\n            <stop offset=\"90%\" stop-color=\"rgba(255, 255, 255, .5)\"/>\n        </radialGradient>\n    </defs>\n    <circle cx=\"250\" cy=\"250\" r=\"250\" fill=\"url(#gradient)\"/>\n    <circle cx=\"250\" cy=\"250\" r=\"245\" fill=\"none\" stroke=\"rgba(255, 255, 255, 0.8)\" stroke-width=\"10\"/>\n    <g fill=\"#222\">\n        <rect x=\"1\" y=\"248\" width=\"18\" height=\"4\"/>\n        <rect x=\"481\" y=\"248\" width=\"18\" height=\"4\"/>\n        <rect x=\"248\" y=\"1\" width=\"4\" height=\"18\"/>\n        <rect x=\"248\" y=\"481\" width=\"4\" height=\"18\"/>\n    </g>\n</svg>","<svg viewBox=\"0 0 500 500\" xmlns=\"http://www.w3.org/2000/svg\">\n    <defs>\n        <linearGradient id=\"gradient\">\n            <stop offset=\"5%\" stop-color=\"rgba(255, 255, 255, .5)\"/>\n            <stop offset=\"10%\" stop-color=\"rgba(255, 255, 255, 0)\"/>\n            <stop offset=\"90%\" stop-color=\"rgba(255, 255, 255, 0)\"/>\n            <stop offset=\"95%\" stop-color=\"rgba(255, 255, 255, .5)\"/>\n        </linearGradient>\n        <linearGradient id=\"gradient2\" x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\">\n            <stop offset=\"5%\" stop-color=\"rgba(255, 255, 255, .5)\"/>\n            <stop offset=\"10%\" stop-color=\"rgba(255, 255, 255, 0)\"/>\n            <stop offset=\"90%\" stop-color=\"rgba(255, 255, 255, 0)\"/>\n            <stop offset=\"95%\" stop-color=\"rgba(255, 255, 255, .5)\"/>\n        </linearGradient>\n    </defs>=\n    <rect x=\"0\" y=\"0\" width=\"500\" height=\"500\" fill=\"url(#gradient)\"/>\n    <rect x=\"0\" y=\"0\" width=\"500\" height=\"500\" fill=\"url(#gradient2)\"/>\n    <rect x=\"5\" y=\"5\" width=\"490\" height=\"490\" fill=\"none\" stroke=\"rgba(255, 255, 255, 0.8)\" stroke-width=\"10\"/>\n    <g fill=\"#222\">\n        <rect x=\"1\" y=\"248\" width=\"18\" height=\"4\"/>\n        <rect x=\"481\" y=\"248\" width=\"18\" height=\"4\"/>\n        <rect x=\"248\" y=\"1\" width=\"4\" height=\"18\"/>\n        <rect x=\"248\" y=\"481\" width=\"4\" height=\"18\"/>\n    </g>\n</svg>","<svg viewBox=\"-20 -20 740 740\" xmlns=\"http://www.w3.org/2000/svg\">\n    <circle cx=\"350\" cy=\"350\" r=\"190\" fill=\"white\"/>\n    <circle cx=\"350\" cy=\"350\" r=\"150\" fill=\"#1E78E6\"/>\n</svg>\n"],"mappings":"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","names":["import_core","import_core","import_three","import_core","import_core","import_core","import_core","import_core"]}