{"version":3,"sources":["src/index.ts","src/events.ts","src/VirtualTourPlugin.ts","src/ArrowsRenderer.ts","../node_modules/three/examples/jsm/renderers/CSS2DRenderer.js","../node_modules/three/examples/jsm/renderers/CSS3DRenderer.js","src/arrow.svg","src/constants.ts","src/datasources/ClientSideDatasource.ts","src/datasources/AbstractDataSource.ts","src/datasources/ServerSideDatasource.ts","src/utils.ts"],"sourcesContent":["import * as events from './events';\n\nexport * from './model';\nexport { VirtualTourPlugin } from './VirtualTourPlugin';\nexport { events };\n\n/** @internal  */\nimport './styles/index.scss';\n","import { Position, TypedEvent } from '@photo-sphere-viewer/core';\nimport { VirtualTourLink, VirtualTourNode } from './model';\nimport type { VirtualTourPlugin } from './VirtualTourPlugin';\n\n/**\n * @event Triggered when the current node changes\n */\nexport class NodeChangedEvent extends TypedEvent<VirtualTourPlugin> {\n    static override readonly type = 'node-changed';\n    override type: 'node-changed';\n\n    /** @internal */\n    constructor(\n        public readonly node: VirtualTourNode,\n        public readonly data: {\n            fromNode: VirtualTourNode;\n            fromLink: VirtualTourLink;\n            fromLinkPosition: Position;\n        },\n    ) {\n        super(NodeChangedEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the user puts the cursor hover a marker\n */\nexport class EnterArrowEvent extends TypedEvent<VirtualTourPlugin> {\n    static override readonly type = 'enter-arrow';\n    override type: 'enter-arrow';\n\n    /** @internal */\n    constructor(\n        public readonly link: VirtualTourLink,\n        public readonly node: VirtualTourNode,\n    ) {\n        super(EnterArrowEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the user puts the cursor away from an arrow\n */\nexport class LeaveArrowEvent extends TypedEvent<VirtualTourPlugin> {\n    static override readonly type = 'leave-arrow';\n    override type: 'leave-arrow';\n\n    /** @internal */\n    constructor(\n        public readonly link: VirtualTourLink,\n        public readonly node: VirtualTourNode,\n    ) {\n        super(LeaveArrowEvent.type);\n    }\n}\n\nexport type VirtualTourEvents =\n    | NodeChangedEvent\n    | EnterArrowEvent\n    | LeaveArrowEvent;\n","import type { CompassPlugin } from '@photo-sphere-viewer/compass-plugin';\nimport type { PluginConstructor, Point, Position, Tooltip, Viewer } from '@photo-sphere-viewer/core';\nimport { AbstractConfigurablePlugin, PSVError, events, utils } from '@photo-sphere-viewer/core';\nimport type { GalleryPlugin } from '@photo-sphere-viewer/gallery-plugin';\nimport type { MapPlugin, events as mapEvents } from '@photo-sphere-viewer/map-plugin';\nimport type { MarkersPlugin } from '@photo-sphere-viewer/markers-plugin';\nimport type { PlanPlugin, events as planEvents } from '@photo-sphere-viewer/plan-plugin';\nimport { MathUtils } from 'three';\nimport { ArrowsRenderer } from './ArrowsRenderer';\nimport { DEFAULT_ARROW, LINK_DATA, LINK_ID, LOADING_TOOLTIP } from './constants';\nimport { AbstractDatasource } from './datasources/AbstractDataSource';\nimport { ClientSideDatasource } from './datasources/ClientSideDatasource';\nimport { ServerSideDatasource } from './datasources/ServerSideDatasource';\nimport { EnterArrowEvent, LeaveArrowEvent, NodeChangedEvent, VirtualTourEvents } from './events';\nimport {\n    GpsPosition,\n    VirtualTourLink,\n    VirtualTourNode,\n    VirtualTourPluginConfig,\n    VirtualTourTransitionOptions,\n} from './model';\nimport { gpsToSpherical } from './utils';\n\nconst getConfig = utils.getConfigParser<VirtualTourPluginConfig>(\n    {\n        dataMode: 'client',\n        positionMode: 'manual',\n        renderMode: '3d',\n        nodes: null,\n        getNode: null,\n        startNodeId: null,\n        preload: false,\n        transitionOptions: {\n            showLoader: true,\n            speed: '20rpm',\n            effect: 'fade',\n            rotation: true,\n        },\n        linksOnCompass: true,\n        showLinkTooltip: true,\n        getLinkTooltip: null,\n        arrowStyle: DEFAULT_ARROW,\n        arrowsPosition: {\n            minPitch: 0.3,\n            maxPitch: Math.PI / 2,\n            linkOverlapAngle: Math.PI / 4,\n            linkPitchOffset: -0.1,\n        },\n        map: null,\n    },\n    {\n        dataMode(dataMode) {\n            if (dataMode !== 'client' && dataMode !== 'server') {\n                throw new PSVError('VirtualTourPlugin: invalid dataMode');\n            }\n            return dataMode;\n        },\n        positionMode(positionMode) {\n            if (positionMode !== 'gps' && positionMode !== 'manual') {\n                throw new PSVError('VirtualTourPlugin: invalid positionMode');\n            }\n            return positionMode;\n        },\n        renderMode(renderMode) {\n            if (renderMode !== '3d' && renderMode !== '2d') {\n                throw new PSVError('VirtualTourPlugin: invalid renderMode');\n            }\n            return renderMode;\n        },\n        arrowsPosition(arrowsPosition, { defValue }) {\n            return { ...defValue, ...arrowsPosition };\n        },\n        arrowStyle(arrowStyle, { defValue }) {\n            return { ...defValue, ...arrowStyle };\n        },\n        map(map, { rawConfig }) {\n            if (map) {\n                if (rawConfig.dataMode === 'server') {\n                    utils.logWarn('VirtualTourPlugin: The map cannot be used in server side mode');\n                    return null;\n                }\n                if (!map.imageUrl) {\n                    utils.logWarn('VirtualTourPlugin: configuring the map requires at least \"imageUrl\"');\n                    return null;\n                }\n                if (!('recenter' in map)) {\n                    map.recenter = true;\n                }\n            }\n            return map;\n        },\n    },\n);\n\n/**\n * Creates virtual tours by linking multiple panoramas\n */\nexport class VirtualTourPlugin extends AbstractConfigurablePlugin<\n    VirtualTourPluginConfig,\n    VirtualTourPluginConfig,\n    never,\n    VirtualTourEvents\n> {\n    static override readonly id = 'virtual-tour';\n    static override readonly VERSION = PKG_VERSION;\n    static override readonly configParser = getConfig;\n    static override readonly readonlyOptions = Object.keys(getConfig.defaults);\n\n    private readonly state = {\n        currentNode: null as VirtualTourNode,\n        currentTooltip: null as Tooltip,\n        loadingNode: null as string,\n        preload: {} as Record<string, boolean | Promise<any>>,\n    };\n\n    private datasource: AbstractDatasource;\n    private arrowsRenderer: ArrowsRenderer;\n\n    private map?: MapPlugin;\n    private plan?: PlanPlugin;\n    private markers?: MarkersPlugin;\n    private compass?: CompassPlugin;\n    private gallery?: GalleryPlugin;\n\n    get is3D(): boolean {\n        return this.config.renderMode === '3d';\n    }\n\n    get isServerSide(): boolean {\n        return this.config.dataMode === 'server';\n    }\n\n    get isGps(): boolean {\n        return this.config.positionMode === 'gps';\n    }\n\n    static withConfig(config: VirtualTourPluginConfig): [PluginConstructor, any] {\n        return [VirtualTourPlugin, config];\n    }\n\n    constructor(viewer: Viewer, config: VirtualTourPluginConfig) {\n        super(viewer, config);\n\n        this.arrowsRenderer = new ArrowsRenderer(this.viewer, this);\n    }\n\n    /**\n     * @internal\n     */\n    override init() {\n        super.init();\n\n        this.arrowsRenderer.init();\n\n        utils.checkStylesheet(this.viewer.container, 'virtual-tour-plugin');\n\n        this.markers = this.viewer.getPlugin('markers');\n        this.compass = this.viewer.getPlugin('compass');\n\n        if (this.markers?.config.markers) {\n            utils.logWarn(\n                'No default markers can be configured on the MarkersPlugin when using the VirtualTourPlugin. '\n                + 'Consider defining `markers` on each tour node.',\n            );\n            delete this.markers.config.markers;\n        }\n\n        if (this.isGps) {\n            this.plan = this.viewer.getPlugin('plan');\n        }\n\n        if (!this.isServerSide) {\n            this.gallery = this.viewer.getPlugin('gallery');\n            this.map = this.viewer.getPlugin('map');\n\n            if (this.config.map && !this.map) {\n                utils.logWarn('The map is configured on the VirtualTourPlugin but the MapPlugin is not loaded.');\n            }\n        }\n\n        this.datasource = this.isServerSide\n            ? new ServerSideDatasource(this, this.viewer)\n            : new ClientSideDatasource(this, this.viewer);\n\n        if (this.map) {\n            this.map.addEventListener('select-hotspot', this);\n            this.map.setImage(this.config.map.imageUrl);\n        }\n\n        this.plan?.addEventListener('select-hotspot', this);\n\n        if (this.isServerSide) {\n            if (this.config.startNodeId) {\n                this.setCurrentNode(this.config.startNodeId);\n            }\n        } else if (this.config.nodes) {\n            this.setNodes(this.config.nodes, this.config.startNodeId);\n            delete this.config.nodes;\n        }\n    }\n\n    /**\n     * @internal\n     */\n    override destroy() {\n        this.map?.removeEventListener('select-hotspot', this);\n        this.plan?.removeEventListener('select-hotspot', this);\n\n        this.datasource.destroy();\n        this.arrowsRenderer.destroy();\n\n        delete this.datasource;\n        delete this.markers;\n        delete this.compass;\n        delete this.gallery;\n        delete this.arrowsRenderer;\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        if (e instanceof events.ClickEvent) {\n            const link = e.data.objects.find(o => o.userData[LINK_DATA])?.userData[LINK_DATA];\n            if (link) {\n                this.setCurrentNode(link.nodeId, null, link);\n            }\n        } else if (e.type === 'select-hotspot') {\n            const id = (e as mapEvents.SelectHotspot | planEvents.SelectHotspot).hotspotId;\n            if (id.startsWith(LINK_ID)) {\n                this.setCurrentNode(id.substring(LINK_ID.length));\n            }\n        }\n    }\n\n    /**\n     * Returns the current node\n     */\n    getCurrentNode(): VirtualTourNode {\n        return this.state.currentNode;\n    }\n\n    /**\n     * Sets the nodes (client mode only)\n     * @throws {@link PSVError} if not in client mode\n     */\n    setNodes(nodes: VirtualTourNode[], startNodeId?: string) {\n        if (this.isServerSide) {\n            throw new PSVError('Cannot set nodes in server side mode');\n        }\n\n        this.__hideTooltip();\n        this.state.currentNode = null;\n\n        (this.datasource as ClientSideDatasource).setNodes(nodes);\n\n        if (!startNodeId) {\n            startNodeId = nodes[0].id;\n        } else if (!this.datasource.nodes[startNodeId]) {\n            startNodeId = nodes[0].id;\n            utils.logWarn(`startNodeId not found is provided nodes, resetted to ${startNodeId}`);\n        }\n        this.setCurrentNode(startNodeId);\n\n        this.__setGalleryItems();\n        this.__setMapHotspots();\n        this.__setPlanHotspots();\n    }\n\n    /**\n     * Changes the current node\n     * @returns {Promise<boolean>} resolves false if the loading was aborted by another call\n     */\n    setCurrentNode(\n        nodeId: string,\n        options?: VirtualTourTransitionOptions & {\n            /**\n             * reload the node even if already loaded\n             */\n            forceUpdate?: boolean;\n        },\n        fromLink?: VirtualTourLink,\n    ): Promise<boolean> {\n        if (nodeId === this.state.currentNode?.id && !options?.forceUpdate) {\n            return Promise.resolve(true);\n        }\n\n        if (options?.forceUpdate && this.isServerSide) {\n            (this.datasource as ServerSideDatasource).clearCache();\n        }\n\n        this.viewer.hideError();\n\n        this.state.loadingNode = nodeId;\n\n        const fromNode = this.state.currentNode;\n        const fromLinkPosition = fromNode && fromLink ? this.__getLinkPosition(fromNode, fromLink) : null;\n\n        // if this node is already preloading, wait for it\n        return Promise.resolve(this.state.preload[nodeId])\n            .then(() => {\n                if (this.state.loadingNode !== nodeId) {\n                    throw utils.getAbortError();\n                }\n\n                return this.datasource.loadNode(nodeId);\n            })\n            .then((node) => {\n                if (this.state.loadingNode !== nodeId) {\n                    throw utils.getAbortError();\n                }\n\n                const transitionOptions: VirtualTourTransitionOptions = {\n                    ...getConfig.defaults.transitionOptions,\n                    rotateTo: fromLinkPosition,\n                    zoomTo: fromLinkPosition ? this.viewer.getZoomLevel() : null, // prevents the adapter to apply InitialHorizontalFOVDegrees\n                    ...(typeof this.config.transitionOptions === 'function'\n                        ? this.config.transitionOptions(node, fromNode, fromLink)\n                        : this.config.transitionOptions),\n                    ...options,\n                };\n\n                if (!transitionOptions.effect) {\n                    transitionOptions.effect = 'none';\n                }\n\n                this.viewer.panel.hide('description');\n\n                this.__hideTooltip();\n\n                this.arrowsRenderer.clear();\n\n                if (this.gallery?.config.hideOnClick) {\n                    this.gallery.hide();\n                }\n                if (this.map?.config.minimizeOnHotspotClick) {\n                    this.map.minimize();\n                }\n                if (this.plan?.config.minimizeOnHotspotClick) {\n                    this.plan.minimize();\n                }\n\n                if (transitionOptions.rotation && transitionOptions.effect === 'none') {\n                    return this.viewer\n                        .animate({\n                            ...transitionOptions.rotateTo,\n                            zoom: transitionOptions.zoomTo,\n                            speed: transitionOptions.speed,\n                        })\n                        .then(() => [node, transitionOptions] as [VirtualTourNode, VirtualTourTransitionOptions]);\n                } else {\n                    return Promise.resolve([node, transitionOptions] as [VirtualTourNode, VirtualTourTransitionOptions]);\n                }\n            })\n            .then(([node, transitionOptions]) => {\n                if (this.state.loadingNode !== nodeId) {\n                    throw utils.getAbortError();\n                }\n\n                this.markers?.clearMarkers();\n\n                if (this.config.linksOnCompass) {\n                    this.compass?.clearHotspots();\n                }\n\n                return this.viewer\n                    .setPanorama(node.panorama, {\n                        caption: node.caption,\n                        description: node.description,\n                        panoData: node.panoData,\n                        sphereCorrection: node.sphereCorrection,\n                        showLoader: transitionOptions.showLoader,\n                        position: transitionOptions.rotateTo,\n                        zoom: transitionOptions.zoomTo,\n                        transition: transitionOptions.effect === 'none'\n                            ? false\n                            : {\n                                    effect: transitionOptions.effect,\n                                    rotation: transitionOptions.rotation,\n                                    speed: transitionOptions.speed,\n                                },\n                    })\n                    .then((completed) => {\n                        if (!completed) {\n                            throw utils.getAbortError();\n                        }\n\n                        return node;\n                    });\n            })\n            .then((node) => {\n                if (this.state.loadingNode !== nodeId) {\n                    throw utils.getAbortError();\n                }\n\n                this.state.currentNode = node;\n\n                if (this.map) {\n                    // if the node is not visible in the map, we don't know where to center the map\n                    // so we keep the current center\n                    this.map.setCenter(this.__getNodeMapPosition(node) ?? this.map.config.center, this.config.map.recenter);\n                }\n                this.plan?.setCoordinates(node.gps);\n\n                this.__addNodeMarkers(node);\n                this.__renderLinks(node);\n                this.__preload(node);\n\n                this.state.loadingNode = null;\n\n                this.dispatchEvent(\n                    new NodeChangedEvent(node, {\n                        fromNode,\n                        fromLink,\n                        fromLinkPosition,\n                    }),\n                );\n\n                this.viewer.resetIdleTimer();\n\n                return true;\n            })\n            .catch((err) => {\n                if (utils.isAbortError(err)) {\n                    return false;\n                }\n\n                this.viewer.showError(this.viewer.config.lang.loadError);\n\n                this.viewer.loader.hide();\n                this.viewer.navbar.setCaption('');\n\n                this.state.loadingNode = null;\n\n                throw err;\n            });\n    }\n\n    /**\n     * Rotate the view to face the link\n     */\n    async gotoLink(nodeId: string, speed: string | number = '8rpm'): Promise<void> {\n        const position = this.getLinkPosition(nodeId);\n\n        if (!speed) {\n            this.viewer.rotate(position);\n        } else {\n            await this.viewer.animate({\n                ...position,\n                speed,\n            });\n        }\n    }\n\n    /**\n     * Returns the position of a link in the viewer\n     */\n    getLinkPosition(nodeId: string): Position {\n        const link = this.state.currentNode?.links.find(link => link.nodeId === nodeId);\n\n        if (!link) {\n            throw new PSVError(`Cannot find link \"${nodeId}\"`);\n        }\n\n        return this.__getLinkPosition(this.state.currentNode, link);\n    }\n\n    /**\n     * Updates a node (client mode only)\n     * All properties but \"id\" are optional, the new config will be merged with the previous\n     * @throws {@link PSVError} if not in client mode\n     */\n    updateNode(newNode: Partial<VirtualTourNode> & { id: VirtualTourNode['id'] }) {\n        if (this.isServerSide) {\n            throw new PSVError('Cannot update node in server side mode');\n        }\n\n        const node = (this.datasource as ClientSideDatasource).updateNode(newNode);\n\n        if (newNode.name || newNode.thumbnail || newNode.panorama) {\n            this.__setGalleryItems();\n        }\n        if (newNode.name || newNode.gps || newNode.map) {\n            this.__setMapHotspots();\n        }\n        if (newNode.name || newNode.gps || newNode.plan) {\n            this.__setPlanHotspots();\n        }\n\n        if (this.state.currentNode?.id === node.id) {\n            this.__hideTooltip();\n\n            if (newNode.panorama || newNode.panoData || newNode.sphereCorrection) {\n                this.setCurrentNode(node.id, { forceUpdate: true });\n                return;\n            }\n\n            if (newNode.caption) {\n                this.viewer.setOption('caption', node.caption);\n            }\n            if (newNode.description) {\n                this.viewer.setOption('description', node.description);\n            }\n\n            if (newNode.links || newNode.gps) {\n                this.__renderLinks(node);\n            }\n\n            if (newNode.gps) {\n                this.plan?.setCoordinates(node.gps);\n            }\n\n            if (newNode.map || newNode.gps) {\n                this.map?.setCenter(this.__getNodeMapPosition(node));\n            }\n\n            if (newNode.markers || newNode.gps) {\n                this.__addNodeMarkers(node);\n            }\n        }\n    }\n\n    /**\n     * Updates the gallery plugin\n     */\n    private __setGalleryItems() {\n        if (this.gallery) {\n            this.gallery.setItems(\n                Object.values(this.datasource.nodes)\n                    .filter(node => node.showInGallery !== false)\n                    .map(node => ({\n                        id: node.id,\n                        panorama: node.panorama,\n                        name: node.name,\n                        thumbnail: node.thumbnail,\n                    })),\n                (id) => {\n                    this.setCurrentNode(id as string);\n                },\n            );\n        }\n    }\n\n    /**\n     * Update the map plugin\n     */\n    private __setMapHotspots() {\n        if (this.map) {\n            this.map.setHotspots(\n                Object.values(this.datasource.nodes)\n                    .filter(node => node.map !== false)\n                    .map(node => ({\n                        tooltip: node.name,\n                        ...(node.map || {}),\n                        ...this.__getNodeMapPosition(node),\n                        id: LINK_ID + node.id,\n                    })),\n            );\n        }\n    }\n\n    /**\n     * Updates the plan plugin\n     */\n    private __setPlanHotspots() {\n        if (this.plan) {\n            this.plan.setHotspots(\n                Object.values(this.datasource.nodes)\n                    .filter(node => node.plan !== false)\n                    .map(node => ({\n                        tooltip: node.name,\n                        ...(node.plan || {}),\n                        coordinates: node.gps,\n                        id: LINK_ID + node.id,\n                    })),\n            );\n        }\n    }\n\n    /**\n     * Adds the links for the node\n     */\n    private __renderLinks(node: VirtualTourNode) {\n        this.arrowsRenderer.clear();\n\n        const positions: Position[] = [];\n\n        node.links.forEach((link) => {\n            const position = this.__getLinkPosition(node, link);\n            position.yaw += link.linkOffset?.yaw ?? 0;\n            position.pitch += link.linkOffset?.pitch ?? 0;\n\n            if (this.isGps && !this.is3D) {\n                position.pitch += this.config.arrowsPosition.linkPitchOffset;\n            }\n\n            positions.push(position);\n\n            this.arrowsRenderer.addLinkArrow(link, position, link.linkOffset?.depth);\n        });\n\n        this.arrowsRenderer.render();\n\n        if (this.config.linksOnCompass) {\n            this.compass?.setHotspots(positions);\n        }\n    }\n\n    /**\n     * Computes the marker position for a link\n     */\n    private __getLinkPosition(node: VirtualTourNode, link: VirtualTourLink): Position {\n        if (this.isGps) {\n            return gpsToSpherical(node.gps, link.gps);\n        } else {\n            return this.viewer.dataHelper.cleanPosition(link.position);\n        }\n    }\n\n    /**\n     * Returns the complete tootlip content for a node\n     */\n    private async __getTooltipContent(link: VirtualTourLink): Promise<string> {\n        const node = await this.datasource.loadNode(link.nodeId);\n        const elements: string[] = [];\n\n        if (node.name || node.thumbnail || node.caption) {\n            if (node.name) {\n                elements.push(`<h3>${node.name}</h3>`);\n            }\n            if (node.thumbnail) {\n                elements.push(`<img src=\"${node.thumbnail}\">`);\n            }\n            if (node.caption) {\n                elements.push(`<p>${node.caption}</p>`);\n            }\n        }\n\n        let content = elements.join('');\n        if (this.config.getLinkTooltip) {\n            content = this.config.getLinkTooltip(content, link, node);\n        }\n        return content;\n    }\n\n    /** @internal */\n    __onEnterArrow(link: VirtualTourLink, evt: MouseEvent) {\n        const viewerPos = utils.getPosition(this.viewer.container);\n\n        const viewerPoint: Point = {\n            x: evt.clientX - viewerPos.x,\n            y: evt.clientY - viewerPos.y,\n        };\n\n        if (this.config.showLinkTooltip) {\n            this.state.currentTooltip = this.viewer.createTooltip({\n                ...LOADING_TOOLTIP,\n                left: viewerPoint.x,\n                top: viewerPoint.y,\n                box: {\n                    // separate the tooltip from the cursor\n                    width: 20,\n                    height: 20,\n                },\n            });\n\n            this.__getTooltipContent(link).then((content) => {\n                if (content) {\n                    this.state.currentTooltip.update(content);\n                } else {\n                    this.__hideTooltip();\n                }\n            });\n        }\n\n        this.map?.setActiveHotspot(LINK_ID + link.nodeId);\n        this.plan?.setActiveHotspot(LINK_ID + link.nodeId);\n\n        this.dispatchEvent(new EnterArrowEvent(link, this.state.currentNode));\n    }\n\n    /** @internal */\n    __onHoverArrow(evt: MouseEvent) {\n        const viewerPos = utils.getPosition(this.viewer.container);\n\n        const viewerPoint: Point = {\n            x: evt.clientX - viewerPos.x,\n            y: evt.clientY - viewerPos.y,\n        };\n\n        this.state.currentTooltip?.move({\n            left: viewerPoint.x,\n            top: viewerPoint.y,\n        });\n    }\n\n    /** @internal */\n    __onLeaveArrow(link: VirtualTourLink) {\n        this.__hideTooltip();\n\n        this.map?.setActiveHotspot(null);\n        this.plan?.setActiveHotspot(null);\n\n        this.dispatchEvent(new LeaveArrowEvent(link, this.state.currentNode));\n    }\n\n    /**\n     * Hides the tooltip\n     */\n    private __hideTooltip() {\n        this.state.currentTooltip?.hide();\n        this.state.currentTooltip = null;\n    }\n\n    /**\n     * Manage the preload of the linked panoramas\n     */\n    private __preload(node: VirtualTourNode) {\n        if (!this.config.preload) {\n            return;\n        }\n\n        this.state.preload[node.id] = true;\n\n        this.state.currentNode.links\n            .filter(link => !this.state.preload[link.nodeId])\n            .filter((link) => {\n                if (typeof this.config.preload === 'function') {\n                    return this.config.preload(this.state.currentNode, link);\n                } else {\n                    return true;\n                }\n            })\n            .forEach((link) => {\n                this.state.preload[link.nodeId] = this.datasource\n                    .loadNode(link.nodeId)\n                    .then((linkNode) => {\n                        return this.viewer.textureLoader.preloadPanorama(linkNode.panorama);\n                    })\n                    .then(() => {\n                        this.state.preload[link.nodeId] = true;\n                    })\n                    .catch(() => {\n                        delete this.state.preload[link.nodeId];\n                    });\n            });\n    }\n\n    /**\n     * Changes the markers to the ones defined on the node\n     */\n    private __addNodeMarkers(node: VirtualTourNode) {\n        if (node.markers) {\n            if (this.markers) {\n                this.markers.setMarkers(\n                    node.markers.map((marker) => {\n                        if (marker.gps && this.isGps) {\n                            marker.position = gpsToSpherical(node.gps, marker.gps);\n                            if (marker.data?.['map']) {\n                                Object.assign(marker.data['map'], this.__getGpsMapPosition(marker.gps));\n                            }\n                            if (marker.data?.['plan']) {\n                                marker.data['plan'].coordinates = marker.gps;\n                            }\n                        }\n                        return marker;\n                    }),\n                );\n            } else {\n                utils.logWarn(`Node ${node.id} markers ignored because the plugin is not loaded.`);\n            }\n        }\n    }\n\n    /**\n     * Gets the position of a node on the map, if applicable\n     */\n    private __getNodeMapPosition(node: VirtualTourNode): Point {\n        const fromGps = this.__getGpsMapPosition(node.gps);\n        if (fromGps) {\n            return fromGps;\n        } else if (node.map) {\n            return { x: node.map.x, y: node.map.y };\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * Gets a gps position on the map\n     */\n    private __getGpsMapPosition(gps: GpsPosition): Point {\n        const map = this.config.map;\n        if (this.isGps && map && map.extent && map.size) {\n            return {\n                x: MathUtils.mapLinear(gps[0], map.extent[0], map.extent[2], 0, map.size.width),\n                y: MathUtils.mapLinear(gps[1], map.extent[1], map.extent[3], 0, map.size.height),\n            };\n        } else {\n            return null;\n        }\n    }\n}\n","import { AbstractComponent, events, Position, utils, type Viewer } from '@photo-sphere-viewer/core';\nimport type { GalleryPlugin, events as GalleryEvents } from '@photo-sphere-viewer/gallery-plugin';\nimport { MathUtils, PerspectiveCamera, Scene } from 'three';\nimport { CSS2DObject, CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\nimport { CSS3DObject, CSS3DRenderer } from 'three/examples/jsm/renderers/CSS3DRenderer.js';\nimport { LINK_DATA } from './constants';\nimport { VirtualTourArrowStyle, VirtualTourLink } from './model';\nimport { type VirtualTourPlugin } from './VirtualTourPlugin';\n\nconst ARROW_DATA = 'arrow';\n\ntype ArrowData = {\n    yaw: number;\n    conflict: boolean;\n};\n\n/**\n * @internal\n */\nexport class ArrowsRenderer extends AbstractComponent {\n    private renderer: CSS3DRenderer | CSS2DRenderer;\n    private scene: Scene;\n    private camera: PerspectiveCamera;\n\n    private gallery?: GalleryPlugin;\n\n    get is3D() {\n        return this.plugin.is3D;\n    }\n\n    get arrowsPosition() {\n        return this.plugin.config.arrowsPosition;\n    }\n\n    get arrowStyle() {\n        return this.plugin.config.arrowStyle;\n    }\n\n    constructor(parent: Viewer, private plugin: VirtualTourPlugin) {\n        super(parent, {\n            className: 'psv-virtual-tour-arrows',\n        });\n\n        this.renderer = this.is3D\n            ? new CSS3DRenderer({\n                element: this.container,\n            })\n            : new CSS2DRenderer({\n                element: this.container,\n            });\n\n        this.camera = this.is3D ? new PerspectiveCamera(30, 1) : null;\n        this.scene = new Scene();\n\n        this.viewer.addEventListener(events.ReadyEvent.type, this, { once: true });\n        this.viewer.addEventListener(events.PositionUpdatedEvent.type, this);\n        this.viewer.addEventListener(events.SizeUpdatedEvent.type, this);\n        this.viewer.addEventListener(events.RenderEvent.type, this);\n        this.viewer.addEventListener(events.ClickEvent.type, this);\n\n        this.container.addEventListener('mouseenter', this, true);\n        this.container.addEventListener('mouseleave', this, true);\n        this.container.addEventListener('mousemove', this, true);\n\n        this.container.addEventListener('contextmenu', e => e.preventDefault());\n    }\n\n    init() {\n        if (this.is3D) {\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\n    override destroy(): void {\n        this.viewer.removeEventListener(events.ReadyEvent.type, this);\n        this.viewer.removeEventListener(events.PositionUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.SizeUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.RenderEvent.type, this);\n        this.viewer.removeEventListener(events.ClickEvent.type, this);\n\n        this.gallery?.removeEventListener('show-gallery', this);\n        this.gallery?.removeEventListener('hide-gallery', this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case events.ReadyEvent.type:\n            case events.SizeUpdatedEvent.type:\n            case events.PositionUpdatedEvent.type:\n                this.__updateCamera();\n                break;\n            case events.RenderEvent.type:\n                this.render();\n                break;\n            case events.ClickEvent.type: {\n                if ((e as events.ClickEvent).data.rightclick) {\n                    break;\n                }\n                const link = this.__getTargetLink((e as events.ClickEvent).data.target, true);\n                if (link) {\n                    this.plugin.setCurrentNode(link.nodeId, null, link);\n                }\n                break;\n            }\n            case 'mouseenter': {\n                const link = this.__getTargetLink(utils.getEventTarget(e));\n                if (link) {\n                    this.plugin.__onEnterArrow(link, e as MouseEvent);\n                }\n                break;\n            }\n            case 'mouseleave': {\n                const link = this.__getTargetLink(utils.getEventTarget(e));\n                if (link) {\n                    this.plugin.__onLeaveArrow(link);\n                }\n                break;\n            }\n            case 'mousemove': {\n                const link = this.__getTargetLink(utils.getEventTarget(e), true);\n                if (link) {\n                    this.plugin.__onHoverArrow(e as MouseEvent);\n                }\n                break;\n            }\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    private __updateCamera() {\n        const size = this.viewer.getSize();\n        this.renderer.setSize(size.width, size.height);\n\n        if (this.is3D) {\n            const position = this.viewer.getPosition();\n            position.pitch = MathUtils.clamp(position.pitch, -this.arrowsPosition.maxPitch, -this.arrowsPosition.minPitch);\n\n            this.viewer.dataHelper.sphericalCoordsToVector3(\n                position,\n                this.camera.position,\n                size.height * 2,\n            ).negate();\n\n            this.camera.lookAt(0, 0, 0);\n            this.camera.translateY(size.height / 3);\n            this.camera.updateProjectionMatrix();\n        }\n    }\n\n    render() {\n        if (this.is3D) {\n            const position = this.viewer.getPosition();\n\n            const objectsAndDist: Array<[CSS3DObject, number]> = [];\n            let minDist = Number.MAX_SAFE_INTEGER;\n            this.scene.children\n                .forEach((object) => {\n                    const data = object.userData[ARROW_DATA] as ArrowData;\n                    if (data.conflict) {\n                        const distance = Math.abs(utils.getShortestArc(position.yaw, data.yaw));\n                        minDist = Math.min(minDist, distance);\n                        objectsAndDist.push([object as CSS3DObject, distance]);\n                    }\n                });\n\n            objectsAndDist.forEach(([object, distance]) => {\n                const fade = distance !== minDist;\n                object.element.style.opacity = fade ? '0.5' : null;\n                object.element.style.zIndex = fade ? '-1' : null;\n            });\n\n            this.renderer.render(this.scene, this.camera);\n        } else {\n            this.renderer.render(this.scene, this.viewer.renderer.camera);\n        }\n    }\n\n    clear() {\n        this.scene.clear();\n    }\n\n    private __buildArrowElement(link: VirtualTourLink, style?: VirtualTourArrowStyle): HTMLElement {\n        if (style?.image) {\n            const image = document.createElement('img');\n            image.src = style.image;\n            return image;\n        } else if (style?.element) {\n            if (typeof style.element === 'function') {\n                return style.element(link);\n            } else {\n                return style.element;\n            }\n        }\n    }\n\n    addLinkArrow(link: VirtualTourLink, position: Position, depth = 1) {\n        let element = this.__buildArrowElement(link, link.arrowStyle);\n        if (!element) {\n            element = this.__buildArrowElement(link, this.arrowStyle);\n        }\n        (element as any)[LINK_DATA] = link;\n\n        const conf = {\n            ...this.arrowStyle,\n            ...link.arrowStyle,\n        };\n\n        element.classList.add('psv-virtual-tour-link');\n        if (conf.className) {\n            utils.addClasses(element, conf.className);\n        }\n        if (conf.style) {\n            Object.assign(element.style, conf.style);\n        }\n\n        if (this.is3D) {\n            // 1.5 ratio is arbitrary\n            element.style.width = conf.size.width * 1.5 + 'px';\n            element.style.height = conf.size.height * 1.5 + 'px';\n\n            let conflict = false;\n            this.scene.children.forEach((object) => {\n                const data = object.userData[ARROW_DATA] as ArrowData;\n                if (Math.abs(utils.getShortestArc(data.yaw, position.yaw)) < this.arrowsPosition.linkOverlapAngle) {\n                    data.conflict = true;\n                    conflict = true;\n                }\n            });\n\n            const object = new CSS3DObject(element);\n            object.userData[ARROW_DATA] = { yaw: position.yaw, conflict } as ArrowData;\n\n            object.rotation.set(-Math.PI / 2, 0, Math.PI - position.yaw);\n\n            this.viewer.dataHelper.sphericalCoordsToVector3(\n                { yaw: position.yaw, pitch: 0 },\n                object.position,\n                depth * 100,\n            );\n\n            this.scene.add(object);\n        } else {\n            element.style.width = conf.size.width + 'px';\n            element.style.height = conf.size.height + 'px';\n            element.style.pointerEvents = 'auto'; // CSS2DObject does not do it...\n\n            const object = new CSS2DObject(element);\n\n            this.viewer.dataHelper.sphericalCoordsToVector3(\n                position,\n                object.position,\n            );\n\n            this.scene.add(object);\n        }\n    }\n\n    private __getTargetLink(target: HTMLElement, closest = false): VirtualTourLink {\n        const target2 = closest ? utils.getClosest(target, '.psv-virtual-tour-link') : target;\n        return target2 ? (target2 as any)[LINK_DATA] : undefined;\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) + 'px';\n        }\n    }\n}\n","import {\n\tMatrix4,\n\tObject3D,\n\tVector2,\n\tVector3\n} from 'three';\n\n/**\n * The only type of 3D object that is supported by {@link CSS2DRenderer}.\n *\n * @augments Object3D\n * @three_import import { CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js';\n */\nclass CSS2DObject extends Object3D {\n\n\t/**\n\t * Constructs a new CSS2D object.\n\t *\n\t * @param {DOMElement} [element] - The DOM element.\n\t */\n\tconstructor( element = document.createElement( 'div' ) ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCSS2DObject = true;\n\n\t\t/**\n\t\t * The DOM element which defines the appearance of this 3D object.\n\t\t *\n\t\t * @type {DOMElement}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.element = element;\n\n\t\tthis.element.style.position = 'absolute';\n\t\tthis.element.style.userSelect = 'none';\n\n\t\tthis.element.setAttribute( 'draggable', false );\n\n\t\t/**\n\t\t * The 3D objects center point.\n\t\t * `( 0, 0 )` is the lower left, `( 1, 1 )` is the top right.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\tthis.addEventListener( 'removed', function () {\n\n\t\t\tthis.traverse( function ( object ) {\n\n\t\t\t\tif (\n\t\t\t\t\tobject.element instanceof object.element.ownerDocument.defaultView.Element &&\n\t\t\t\t\tobject.element.parentNode !== null\n\t\t\t\t) {\n\n\t\t\t\t\tobject.element.remove();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.element = source.element.cloneNode( true );\n\n\t\tthis.center = source.center;\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nconst _vector = new Vector3();\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _a = new Vector3();\nconst _b = new Vector3();\n\n/**\n * This renderer is a simplified version of {@link CSS3DRenderer}. The only transformation that is\n * supported is translation.\n *\n * The renderer is very useful if you want to combine HTML based labels with 3D objects. Here too,\n * the respective DOM elements are wrapped into an instance of {@link CSS2DObject} and added to the\n * scene graph. All other types of renderable 3D objects (like meshes or point clouds) are ignored.\n *\n * `CSS2DRenderer` only supports 100% browser and display zoom.\n *\n * @three_import import { CSS2DRenderer } from 'three/addons/renderers/CSS2DRenderer.js';\n */\nclass CSS2DRenderer {\n\n\t/**\n\t * Constructs a new CSS2D renderer.\n\t *\n\t * @param {CSS2DRenderer~Parameters} [parameters] - The parameters.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst _this = this;\n\n\t\tlet _width, _height;\n\t\tlet _widthHalf, _heightHalf;\n\n\t\tconst cache = {\n\t\t\tobjects: new WeakMap()\n\t\t};\n\n\t\tconst domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' );\n\n\t\tdomElement.style.overflow = 'hidden';\n\n\t\t/**\n\t\t * The DOM where the renderer appends its child-elements.\n\t\t *\n\t\t * @type {DOMElement}\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Returns an object containing the width and height of the renderer.\n\t\t *\n\t\t * @return {{width:number,height:number}} The size of the renderer.\n\t\t */\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\t/**\n\t\t * Renders the given scene using the given camera.\n\t\t *\n\t\t * @param {Object3D} scene - A scene or any other type of 3D object.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_viewMatrix.copy( camera.matrixWorldInverse );\n\t\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\n\n\t\t\trenderObject( scene, scene, camera );\n\t\t\tzOrder( scene );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the renderer to the given width and height.\n\t\t *\n\t\t * @param {number} width - The width of the renderer.\n\t\t * @param {number} height - The height of the renderer.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\n\t\t};\n\n\t\tfunction hideObject( object ) {\n\n\t\t\tif ( object.isCSS2DObject ) object.element.style.display = 'none';\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\thideObject( object.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera ) {\n\n\t\t\tif ( object.visible === false ) {\n\n\t\t\t\thideObject( object );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( object.isCSS2DObject ) {\n\n\t\t\t\t_vector.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t_vector.applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\tconst visible = ( _vector.z >= - 1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true );\n\n\t\t\t\tconst element = object.element;\n\t\t\t\telement.style.display = visible === true ? '' : 'none';\n\n\t\t\t\tif ( visible === true ) {\n\n\t\t\t\t\tobject.onBeforeRender( _this, scene, camera );\n\n\t\t\t\t\telement.style.transform = 'translate(' + ( - 100 * object.center.x ) + '%,' + ( - 100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)';\n\n\t\t\t\t\tif ( element.parentNode !== domElement ) {\n\n\t\t\t\t\t\tdomElement.appendChild( element );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.onAfterRender( _this, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t\tconst objectData = {\n\t\t\t\t\tdistanceToCameraSquared: getDistanceToSquared( camera, object )\n\t\t\t\t};\n\n\t\t\t\tcache.objects.set( object, objectData );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( object.children[ i ], scene, camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getDistanceToSquared( object1, object2 ) {\n\n\t\t\t_a.setFromMatrixPosition( object1.matrixWorld );\n\t\t\t_b.setFromMatrixPosition( object2.matrixWorld );\n\n\t\t\treturn _a.distanceToSquared( _b );\n\n\t\t}\n\n\t\tfunction filterAndFlatten( scene ) {\n\n\t\t\tconst result = [];\n\n\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isCSS2DObject ) result.push( object );\n\n\t\t\t} );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction zOrder( scene ) {\n\n\t\t\tconst sorted = filterAndFlatten( scene ).sort( function ( a, b ) {\n\n\t\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\t\treturn b.renderOrder - a.renderOrder;\n\n\t\t\t\t}\n\n\t\t\t\tconst distanceA = cache.objects.get( a ).distanceToCameraSquared;\n\t\t\t\tconst distanceB = cache.objects.get( b ).distanceToCameraSquared;\n\n\t\t\t\treturn distanceA - distanceB;\n\n\t\t\t} );\n\n\t\t\tconst zMax = sorted.length;\n\n\t\t\tfor ( let i = 0, l = sorted.length; i < l; i ++ ) {\n\n\t\t\t\tsorted[ i ].element.style.zIndex = zMax - i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Constructor parameters of `CSS2DRenderer`.\n *\n * @typedef {Object} CSS2DRenderer~Parameters\n * @property {DOMElement} [element] - A DOM element where the renderer appends its child-elements.\n * If not passed in here, a new div element will be created.\n **/\n\nexport { CSS2DObject, CSS2DRenderer };\n","import {\n\tMatrix4,\n\tObject3D,\n\tQuaternion,\n\tVector3\n} from 'three';\n\n// Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n\nconst _position = new Vector3();\nconst _quaternion = new Quaternion();\nconst _scale = new Vector3();\n\n/**\n * The base 3D object that is supported by {@link CSS3DRenderer}.\n *\n * @augments Object3D\n * @three_import import { CSS3DObject } from 'three/addons/renderers/CSS3DRenderer.js';\n */\nclass CSS3DObject extends Object3D {\n\n\t/**\n\t * Constructs a new CSS3D object.\n\t *\n\t * @param {DOMElement} [element] - The DOM element.\n\t */\n\tconstructor( element = document.createElement( 'div' ) ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCSS3DObject = true;\n\n\t\t/**\n\t\t * The DOM element which defines the appearance of this 3D object.\n\t\t *\n\t\t * @type {DOMElement}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.element = element;\n\t\tthis.element.style.position = 'absolute';\n\t\tthis.element.style.pointerEvents = 'auto';\n\t\tthis.element.style.userSelect = 'none';\n\n\t\tthis.element.setAttribute( 'draggable', false );\n\n\t\tthis.addEventListener( 'removed', function () {\n\n\t\t\tthis.traverse( function ( object ) {\n\n\t\t\t\tif (\n\t\t\t\t\tobject.element instanceof object.element.ownerDocument.defaultView.Element &&\n\t\t\t\t\tobject.element.parentNode !== null\n\t\t\t\t) {\n\n\t\t\t\t\tobject.element.remove();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.element = source.element.cloneNode( true );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A specialized version of {@link CSS3DObject} that represents\n * DOM elements as sprites.\n *\n * @augments CSS3DObject\n * @three_import import { CSS3DSprite } from 'three/addons/renderers/CSS3DRenderer.js';\n */\nclass CSS3DSprite extends CSS3DObject {\n\n\t/**\n\t * Constructs a new CSS3D sprite object.\n\t *\n\t * @param {DOMElement} [element] - The DOM element.\n\t */\n\tconstructor( element ) {\n\n\t\tsuper( element );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCSS3DSprite = true;\n\n\t\t/**\n\t\t * The sprite's rotation in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation2D = 0;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.rotation2D = source.rotation2D;\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nconst _matrix = new Matrix4();\nconst _matrix2 = new Matrix4();\n\n/**\n * This renderer can be used to apply hierarchical 3D transformations to DOM elements\n * via the CSS3 [transform]{@link https://www.w3schools.com/cssref/css3_pr_transform.asp} property.\n * `CSS3DRenderer` is particularly interesting if you want to apply 3D effects to a website without\n * canvas based rendering. It can also be used in order to combine DOM elements with WebGLcontent.\n *\n * There are, however, some important limitations:\n *\n * - It's not possible to use the material system of *three.js*.\n * - It's also not possible to use geometries.\n * - The renderer only supports 100% browser and display zoom.\n *\n * So `CSS3DRenderer` is just focused on ordinary DOM elements. These elements are wrapped into special\n * 3D objects ({@link CSS3DObject} or {@link CSS3DSprite}) and then added to the scene graph.\n *\n * @three_import import { CSS3DRenderer } from 'three/addons/renderers/CSS3DRenderer.js';\n */\nclass CSS3DRenderer {\n\n\t/**\n\t * Constructs a new CSS3D renderer.\n\t *\n\t * @param {CSS3DRenderer~Parameters} [parameters] - The parameters.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst _this = this;\n\n\t\tlet _width, _height;\n\t\tlet _widthHalf, _heightHalf;\n\n\t\tconst cache = {\n\t\t\tcamera: { style: '' },\n\t\t\tobjects: new WeakMap()\n\t\t};\n\n\t\tconst domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' );\n\n\t\tdomElement.style.overflow = 'hidden';\n\n\t\t/**\n\t\t * The DOM where the renderer appends its child-elements.\n\t\t *\n\t\t * @type {DOMElement}\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\tconst viewElement = document.createElement( 'div' );\n\t\tviewElement.style.transformOrigin = '0 0';\n\t\tviewElement.style.pointerEvents = 'none';\n\t\tdomElement.appendChild( viewElement );\n\n\t\tconst cameraElement = document.createElement( 'div' );\n\n\t\tcameraElement.style.transformStyle = 'preserve-3d';\n\n\t\tviewElement.appendChild( cameraElement );\n\n\t\t/**\n\t\t * Returns an object containing the width and height of the renderer.\n\t\t *\n\t\t * @return {{width:number,height:number}} The size of the renderer.\n\t\t */\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\t/**\n\t\t * Renders the given scene using the given camera.\n\t\t *\n\t\t * @param {Object3D} scene - A scene or any other type of 3D object.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tconst fov = camera.projectionMatrix.elements[ 5 ] * _heightHalf;\n\n\t\t\tif ( camera.view && camera.view.enabled ) {\n\n\t\t\t\t// view offset\n\t\t\t\tviewElement.style.transform = `translate( ${ - camera.view.offsetX * ( _width / camera.view.width ) }px, ${ - camera.view.offsetY * ( _height / camera.view.height ) }px )`;\n\n\t\t\t\t// view fullWidth and fullHeight, view width and height\n\t\t\t\tviewElement.style.transform += `scale( ${ camera.view.fullWidth / camera.view.width }, ${ camera.view.fullHeight / camera.view.height } )`;\n\n\t\t\t} else {\n\n\t\t\t\tviewElement.style.transform = '';\n\n\t\t\t}\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tlet tx, ty;\n\n\t\t\tif ( camera.isOrthographicCamera ) {\n\n\t\t\t\ttx = - ( camera.right + camera.left ) / 2;\n\t\t\t\tty = ( camera.top + camera.bottom ) / 2;\n\n\t\t\t}\n\n\t\t\tconst scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1;\n\t\t\tconst cameraCSSMatrix = camera.isOrthographicCamera ?\n\t\t\t\t`scale( ${ scaleByViewOffset } )` + 'scale(' + fov + ')' + 'translate(' + epsilon( tx ) + 'px,' + epsilon( ty ) + 'px)' + getCameraCSSMatrix( camera.matrixWorldInverse ) :\n\t\t\t\t`scale( ${ scaleByViewOffset } )` + 'translateZ(' + fov + 'px)' + getCameraCSSMatrix( camera.matrixWorldInverse );\n\t\t\tconst perspective = camera.isPerspectiveCamera ? 'perspective(' + fov + 'px) ' : '';\n\n\t\t\tconst style = perspective + cameraCSSMatrix +\n\t\t\t\t'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)';\n\n\t\t\tif ( cache.camera.style !== style ) {\n\n\t\t\t\tcameraElement.style.transform = style;\n\n\t\t\t\tcache.camera.style = style;\n\n\t\t\t}\n\n\t\t\trenderObject( scene, scene, camera, cameraCSSMatrix );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the renderer to the given width and height.\n\t\t *\n\t\t * @param {number} width - The width of the renderer.\n\t\t * @param {number} height - The height of the renderer.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\n\t\t\tviewElement.style.width = width + 'px';\n\t\t\tviewElement.style.height = height + 'px';\n\n\t\t\tcameraElement.style.width = width + 'px';\n\t\t\tcameraElement.style.height = height + 'px';\n\n\t\t};\n\n\t\tfunction epsilon( value ) {\n\n\t\t\treturn Math.abs( value ) < 1e-10 ? 0 : value;\n\n\t\t}\n\n\t\tfunction getCameraCSSMatrix( matrix ) {\n\n\t\t\tconst elements = matrix.elements;\n\n\t\t\treturn 'matrix3d(' +\n\t\t\t\tepsilon( elements[ 0 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 1 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 2 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 3 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 4 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 5 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 6 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 7 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 8 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 9 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 10 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 11 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 12 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 13 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 14 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 15 ] ) +\n\t\t\t')';\n\n\t\t}\n\n\t\tfunction getObjectCSSMatrix( matrix ) {\n\n\t\t\tconst elements = matrix.elements;\n\t\t\tconst matrix3d = 'matrix3d(' +\n\t\t\t\tepsilon( elements[ 0 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 1 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 2 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 3 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 4 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 5 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 6 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 7 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 8 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 9 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 10 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 11 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 12 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 13 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 14 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 15 ] ) +\n\t\t\t')';\n\n\t\t\treturn 'translate(-50%,-50%)' + matrix3d;\n\n\t\t}\n\n\t\tfunction hideObject( object ) {\n\n\t\t\tif ( object.isCSS3DObject ) object.element.style.display = 'none';\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\thideObject( object.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, cameraCSSMatrix ) {\n\n\t\t\tif ( object.visible === false ) {\n\n\t\t\t\thideObject( object );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( object.isCSS3DObject ) {\n\n\t\t\t\tconst visible = ( object.layers.test( camera.layers ) === true );\n\n\t\t\t\tconst element = object.element;\n\t\t\t\telement.style.display = visible === true ? '' : 'none';\n\n\t\t\t\tif ( visible === true ) {\n\n\t\t\t\t\tobject.onBeforeRender( _this, scene, camera );\n\n\t\t\t\t\tlet style;\n\n\t\t\t\t\tif ( object.isCSS3DSprite ) {\n\n\t\t\t\t\t\t// http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\n\t\t\t\t\t\t_matrix.copy( camera.matrixWorldInverse );\n\t\t\t\t\t\t_matrix.transpose();\n\n\t\t\t\t\t\tif ( object.rotation2D !== 0 ) _matrix.multiply( _matrix2.makeRotationZ( object.rotation2D ) );\n\n\t\t\t\t\t\tobject.matrixWorld.decompose( _position, _quaternion, _scale );\n\t\t\t\t\t\t_matrix.setPosition( _position );\n\t\t\t\t\t\t_matrix.scale( _scale );\n\n\t\t\t\t\t\t_matrix.elements[ 3 ] = 0;\n\t\t\t\t\t\t_matrix.elements[ 7 ] = 0;\n\t\t\t\t\t\t_matrix.elements[ 11 ] = 0;\n\t\t\t\t\t\t_matrix.elements[ 15 ] = 1;\n\n\t\t\t\t\t\tstyle = getObjectCSSMatrix( _matrix );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstyle = getObjectCSSMatrix( object.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cachedObject = cache.objects.get( object );\n\n\t\t\t\t\tif ( cachedObject === undefined || cachedObject.style !== style ) {\n\n\t\t\t\t\t\telement.style.transform = style;\n\n\t\t\t\t\t\tconst objectData = { style: style };\n\t\t\t\t\t\tcache.objects.set( object, objectData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( element.parentNode !== cameraElement ) {\n\n\t\t\t\t\t\tcameraElement.appendChild( element );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.onAfterRender( _this, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( object.children[ i ], scene, camera, cameraCSSMatrix );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Constructor parameters of `CSS3DRenderer`.\n *\n * @typedef {Object} CSS3DRenderer~Parameters\n * @property {DOMElement} [element] - A DOM element where the renderer appends its child-elements.\n * If not passed in here, a new div element will be created.\n **/\n\nexport { CSS3DObject, CSS3DSprite, CSS3DRenderer };\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">\n    <path fill-rule=\"even-odd\" fill=\"currentColor\" d=\"\n        M50,50 m45,0\n        a45,45 0 1,0 -90,0\n        a45,45 0 1,0  90,0\n\n        M50,50 m38,0\n        a38,38 0 0,1 -76,0\n        a38,38 0 0,1  76,0\n\n        M50,50 m30,0\n        a30,30 0 1,0 -60,0\n        a30,30 0 1,0  60,0\n        \n        M50,40 m2.5,-2.5\n        l17.5,17.5\n        a 2.5,2.5 0 0 1 -5,5\n        l-15,-15\n        l-15,15\n        a 2.5,2.5 0 0 1 -5,-5\n        l17.5,-17.5\n        a 3.5,3.5 0 0 1 5,0\n    \"/>\n</svg>","import arrowIconSvg from './arrow.svg';\nimport { VirtualTourArrowStyle } from './model';\n\nexport const LINK_DATA = 'tourLink';\nexport const LINK_ID = '__tour-link__';\n\nexport const LOADING_TOOLTIP = {\n    className: 'psv-virtual-tour-tooltip',\n    content: `<div class=\"psv-virtual-tour-loader\"><div></div><div></div><div></div></div>`,\n};\n\n/**\n * Default style of the link arrow\n */\nexport const DEFAULT_ARROW: VirtualTourArrowStyle = {\n    element: () => {\n        const button = document.createElement('button');\n        button.className = 'psv-virtual-tour-arrow';\n        button.innerHTML = arrowIconSvg;\n        return button;\n    },\n    size: { width: 80, height: 80 },\n};\n","import { PSVError, utils } from '@photo-sphere-viewer/core';\nimport { VirtualTourNode } from '../model';\nimport { AbstractDatasource } from './AbstractDataSource';\n\nexport class ClientSideDatasource extends AbstractDatasource {\n    async loadNode(nodeId: string) {\n        if (this.nodes[nodeId]) {\n            return this.nodes[nodeId];\n        } else {\n            throw new PSVError(`Node ${nodeId} not found`);\n        }\n    }\n\n    setNodes(rawNodes: VirtualTourNode[]) {\n        if (!rawNodes?.length) {\n            throw new PSVError('No nodes provided');\n        }\n\n        const nodes: Record<string, VirtualTourNode> = {};\n        const linkedNodes: Record<string, boolean> = {};\n\n        rawNodes.forEach((node) => {\n            this.checkNode(node);\n\n            if (nodes[node.id]) {\n                throw new PSVError(`Duplicate node ${node.id}`);\n            }\n\n            nodes[node.id] = node;\n        });\n\n        rawNodes.forEach((node) => {\n            this.__checkLinks(node, nodes);\n\n            node.links.forEach((link) => {\n                linkedNodes[link.nodeId] = true;\n            });\n        });\n\n        rawNodes.forEach((node) => {\n            if (!linkedNodes[node.id]) {\n                utils.logWarn(`Node ${node.id} is never linked to`);\n            }\n        });\n\n        this.nodes = nodes;\n    }\n\n    updateNode(rawNode: Partial<VirtualTourNode> & { id: VirtualTourNode['id'] }) {\n        if (!rawNode.id) {\n            throw new PSVError('No id given for node');\n        }\n\n        const node = this.nodes[rawNode.id];\n        if (!node) {\n            throw new PSVError(`Node ${rawNode.id} does not exist`);\n        }\n\n        Object.assign(node, rawNode);\n\n        this.checkNode(node);\n\n        this.__checkLinks(node, this.nodes);\n\n        return node;\n    }\n\n    private __checkLinks(node: VirtualTourNode, nodes: Record<string, VirtualTourNode>) {\n        node.links.forEach((link) => {\n            if (!nodes[link.nodeId]) {\n                throw new PSVError(`Target node ${link.nodeId} of node ${node.id} does not exists`);\n            }\n\n            link.gps = link.gps || nodes[link.nodeId].gps;\n\n            this.checkLink(node, link);\n        });\n    }\n}\n","import type { Viewer } from '@photo-sphere-viewer/core';\nimport { PSVError, utils } from '@photo-sphere-viewer/core';\nimport { VirtualTourLink, VirtualTourNode } from '../model';\nimport type { VirtualTourPlugin } from '../VirtualTourPlugin';\n\nexport abstract class AbstractDatasource {\n    nodes: Record<string, VirtualTourNode> = {};\n\n    constructor(\n        protected readonly plugin: VirtualTourPlugin,\n        protected readonly viewer: Viewer,\n    ) {}\n\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    destroy() {}\n\n    /**\n     * Loads a node\n     */\n    abstract loadNode(nodeId: string): Promise<VirtualTourNode>;\n\n    /**\n     * Checks the configuration of a node\n     */\n    protected checkNode(node: VirtualTourNode) {\n        if (!node.id) {\n            throw new PSVError('No id given for node');\n        }\n        if (!node.panorama) {\n            throw new PSVError(`No panorama provided for node ${node.id}`);\n        }\n        if (this.plugin.isGps && !(node.gps?.length >= 2)) {\n            throw new PSVError(`No GPS position provided for node ${node.id}`);\n        }\n        if (!this.plugin.isGps && node.markers?.some(marker => marker.gps && !marker.position)) {\n            throw new PSVError(`Cannot use GPS positioning for markers in manual mode`);\n        }\n        if (!node.links) {\n            utils.logWarn(`Node ${node.id} has no links`);\n            node.links = [];\n        }\n    }\n\n    /**\n     * Checks the configuration of a link\n     */\n    protected checkLink(node: VirtualTourNode, link: VirtualTourLink) {\n        if (!link.nodeId) {\n            throw new PSVError(`Link of node ${node.id} has no target id`);\n        }\n        if (link.nodeId === node.id) {\n            throw new PSVError(`Node ${node.id} links to itself`);\n        }\n        if (!this.plugin.isGps && !utils.isExtendedPosition(link.position)) {\n            throw new PSVError(`No position provided for link ${link.nodeId} of node ${node.id}`);\n        }\n        if (this.plugin.isGps && !link.gps) {\n            throw new PSVError(`No GPS position provided for link ${link.nodeId} of node ${node.id}`);\n        }\n    }\n}\n","import type { Viewer } from '@photo-sphere-viewer/core';\nimport { PSVError } from '@photo-sphere-viewer/core';\nimport { VirtualTourPluginConfig } from '../model';\nimport type { VirtualTourPlugin } from '../VirtualTourPlugin';\nimport { AbstractDatasource } from './AbstractDataSource';\n\nexport class ServerSideDatasource extends AbstractDatasource {\n    private readonly nodeResolver: VirtualTourPluginConfig['getNode'];\n\n    constructor(plugin: VirtualTourPlugin, viewer: Viewer) {\n        super(plugin, viewer);\n\n        if (!plugin.config.getNode) {\n            throw new PSVError('Missing getNode() option.');\n        }\n\n        this.nodeResolver = plugin.config.getNode;\n    }\n\n    async loadNode(nodeId: string) {\n        if (this.nodes[nodeId]) {\n            return this.nodes[nodeId];\n        } else {\n            const node = await this.nodeResolver(nodeId);\n\n            this.checkNode(node);\n\n            node.links.forEach((link) => {\n                this.checkLink(node, link);\n            });\n\n            this.nodes[nodeId] = node;\n\n            return node;\n        }\n    }\n\n    clearCache(): void {\n        this.nodes = {};\n    }\n}\n","import { Position, utils } from '@photo-sphere-viewer/core';\nimport { MathUtils } from 'three';\nimport { GpsPosition } from './model';\n\n/**\n * Returns the difference between two WS84 GPS points as yaw+pitch on the viewer\n */\nexport function gpsToSpherical(gps1: GpsPosition, gps2: GpsPosition): Position {\n    const p1 = gpsDegToRad(gps1);\n    const p2 = gpsDegToRad(gps2);\n    const h1 = gps1[2] ?? 0;\n    const h2 = gps2[2] ?? 0;\n\n    let pitch = 0;\n    if (h1 !== h2) {\n        pitch = Math.atan((h2 - h1) / distance(p1, p2));\n    }\n\n    const yaw = bearing(p1, p2);\n\n    return { yaw, pitch };\n}\n\nfunction gpsDegToRad(gps: GpsPosition): [number, number] {\n    return [MathUtils.degToRad(gps[0]), MathUtils.degToRad(gps[1])];\n}\n\n/**\n * Returns the distance between two GPS points\n */\nfunction distance(p1: [number, number], p2: [number, number]): number {\n    return utils.greatArcDistance(p1, p2) * 6371e3;\n}\n\n/**\n * Returns the bearing between two GPS points\n * @link http://www.movable-type.co.uk/scripts/latlong.html\n */\nfunction bearing(p1: [number, number], p2: [number, number]): number {\n    const [long1, lat1] = p1;\n    const [long2, lat2] = p2;\n\n    const y = Math.sin(long2 - long1) * Math.cos(lat2);\n    const x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(long2 - long1);\n    return Math.atan2(y, x);\n}\n"],"mappings":"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","names":["import_core","import_three","import_core","import_three","import_three","distance","object","import_core","import_core","import_core","import_core","import_three","link"]}