{"version":3,"sources":["src/index.ts","src/events.ts","src/MarkersButton.ts","src/icons/pin.svg","src/MarkersListButton.ts","src/constants.ts","src/icons/pin-list.svg","src/MarkersPlugin.ts","src/CSS3DContainer.ts","../node_modules/three/examples/jsm/renderers/CSS3DRenderer.js","src/MarkerType.ts","src/markers/AbstractStandardMarker.ts","src/markers/AbstractDomMarker.ts","src/markers/Marker.ts","src/markers/Marker3D.ts","../shared/ChromaKeyMaterial.ts","../shared/shaders/chromaKey.fragment.glsl","../shared/shaders/chromaKey.vertex.glsl","../shared/video-utils.ts","src/utils.ts","src/markers/MarkerCSS3D.ts","src/markers/MarkerNormal.ts","src/markers/MarkerPolygon.ts","src/markers/MarkerSvg.ts"],"sourcesContent":["import { DEFAULTS, registerButton } from '@photo-sphere-viewer/core';\nimport * as events from './events';\nimport { MarkersButton } from './MarkersButton';\nimport { MarkersListButton } from './MarkersListButton';\n\nDEFAULTS.lang[MarkersButton.id] = 'Markers';\nDEFAULTS.lang[MarkersListButton.id] = 'Markers list';\nregisterButton(MarkersButton, 'caption:left');\nregisterButton(MarkersListButton, 'caption:left');\n\nexport type { Marker } from './markers/Marker';\nexport type { MarkerType } from './MarkerType';\nexport { MarkersPlugin } from './MarkersPlugin';\nexport * from './model';\nexport { events };\n\n/** @internal  */\nimport './styles/index.scss';\n","import { TypedEvent } from '@photo-sphere-viewer/core';\nimport type { Marker } from './markers/Marker';\nimport type { MarkersPlugin } from './MarkersPlugin';\n\n/**\n * Base class for events dispatched by {@link MarkersPlugin}\n */\nexport abstract class MarkersPluginEvent extends TypedEvent<MarkersPlugin> {}\n\n/**\n * @event Triggered when the visibility of a marker changes\n */\nexport class MarkerVisibilityEvent extends MarkersPluginEvent {\n    static override readonly type = 'marker-visibility';\n    override type: 'marker-visibility';\n\n    /** @internal */\n    constructor(\n        public readonly marker: Marker,\n        public readonly visible: boolean,\n    ) {\n        super(MarkerVisibilityEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the animation to a marker is done\n */\nexport class GotoMarkerDoneEvent extends MarkersPluginEvent {\n    static override readonly type = 'goto-marker-done';\n    override type: 'goto-marker-done';\n\n    /** @internal */\n    constructor(public readonly marker: Marker) {\n        super(GotoMarkerDoneEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the user puts the cursor away from a marker\n */\nexport class LeaveMarkerEvent extends MarkersPluginEvent {\n    static override readonly type = 'leave-marker';\n    override type: 'leave-marker';\n\n    /** @internal */\n    constructor(public readonly marker: Marker) {\n        super(LeaveMarkerEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the user puts the cursor hover a marker\n */\nexport class EnterMarkerEvent extends MarkersPluginEvent {\n    static override readonly type = 'enter-marker';\n    override type: 'enter-marker';\n\n    /** @internal */\n    constructor(public readonly marker: Marker) {\n        super(EnterMarkerEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the user clicks on a marker\n */\nexport class SelectMarkerEvent extends MarkersPluginEvent {\n    static override readonly type = 'select-marker';\n    override type: 'select-marker';\n\n    /** @internal */\n    constructor(\n        public readonly marker: Marker,\n        public readonly doubleClick: boolean,\n        public readonly rightClick: boolean,\n    ) {\n        super(SelectMarkerEvent.type);\n    }\n}\n\n/**\n * @event Triggered when a marker is selected from the side panel\n */\nexport class SelectMarkerListEvent extends MarkersPluginEvent {\n    static override readonly type = 'select-marker-list';\n    override type: 'select-marker-list';\n\n    /** @internal */\n    constructor(public readonly marker: Marker) {\n        super(SelectMarkerListEvent.type);\n    }\n}\n\n/**\n * @event Triggered when a marker was selected and the user clicks elsewhere\n */\nexport class UnselectMarkerEvent extends MarkersPluginEvent {\n    static override readonly type = 'unselect-marker';\n    override type: 'unselect-marker';\n\n    /** @internal */\n    constructor(public readonly marker: Marker) {\n        super(UnselectMarkerEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the markers are hidden\n */\nexport class HideMarkersEvent extends MarkersPluginEvent {\n    static override readonly type = 'hide-markers';\n    override type: 'hide-markers';\n\n    /** @internal */\n    constructor() {\n        super(HideMarkersEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the markers change\n */\nexport class SetMarkersEvent extends MarkersPluginEvent {\n    static override readonly type = 'set-markers';\n    override type: 'set-markers';\n\n    /** @internal */\n    constructor(public readonly markers: Marker[]) {\n        super(SetMarkersEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the markers are shown\n */\nexport class ShowMarkersEvent extends MarkersPluginEvent {\n    static override readonly type = 'show-markers';\n    override type: 'show-markers';\n\n    /** @internal */\n    constructor() {\n        super(ShowMarkersEvent.type);\n    }\n}\n\n/**\n * @event Used to alter the list of markers displayed in the side-panel\n */\nexport class RenderMarkersListEvent extends MarkersPluginEvent {\n    static override readonly type = 'render-markers-list';\n    override type: 'render-markers-list';\n\n    /** @internal */\n    constructor(\n        /** the list of markers to display, can be modified */\n        public markers: Marker[],\n    ) {\n        super(RenderMarkersListEvent.type);\n    }\n}\n\nexport type MarkersPluginEvents =\n    | MarkerVisibilityEvent\n    | GotoMarkerDoneEvent\n    | LeaveMarkerEvent\n    | EnterMarkerEvent\n    | SelectMarkerEvent\n    | SelectMarkerListEvent\n    | UnselectMarkerEvent\n    | HideMarkersEvent\n    | SetMarkersEvent\n    | ShowMarkersEvent\n    | RenderMarkersListEvent;\n","import type { Navbar } from '@photo-sphere-viewer/core';\nimport { AbstractButton } from '@photo-sphere-viewer/core';\nimport { HideMarkersEvent, ShowMarkersEvent } from './events';\nimport type { MarkersPlugin } from './MarkersPlugin';\nimport pin from './icons/pin.svg';\n\nexport class MarkersButton extends AbstractButton {\n    static override readonly id = 'markers';\n\n    private readonly plugin: MarkersPlugin;\n\n    constructor(navbar: Navbar) {\n        super(navbar, {\n            className: 'psv-markers-button',\n            icon: pin,\n            hoverScale: true,\n            collapsable: true,\n            tabbable: true,\n        });\n\n        this.plugin = this.viewer.getPlugin('markers');\n\n        if (this.plugin) {\n            this.plugin.addEventListener(ShowMarkersEvent.type, this);\n            this.plugin.addEventListener(HideMarkersEvent.type, this);\n\n            this.toggleActive(true);\n        }\n    }\n\n    override destroy() {\n        if (this.plugin) {\n            this.plugin.removeEventListener(ShowMarkersEvent.type, this);\n            this.plugin.removeEventListener(HideMarkersEvent.type, this);\n        }\n\n        super.destroy();\n    }\n\n    override isSupported() {\n        return !!this.plugin;\n    }\n\n    handleEvent(e: Event) {\n        if (e instanceof ShowMarkersEvent) {\n            this.toggleActive(true);\n        } else if (e instanceof HideMarkersEvent) {\n            this.toggleActive(false);\n        }\n    }\n\n    onClick() {\n        this.plugin.toggleAllMarkers();\n    }\n}\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"10 9 81 81\"><path fill=\"currentColor\" d=\"M50.5 90S22.9 51.9 22.9 36.6 35.2 9 50.5 9s27.6 12.4 27.6 27.6S50.5 90 50.5 90zm0-66.3c-6.1 0-11 4.9-11 11s4.9 11 11 11 11-4.9 11-11-4.9-11-11-11z\"/><!--Created by Rohith M S from the Noun Project--></svg>\n","import type { Navbar } from '@photo-sphere-viewer/core';\nimport { AbstractButton, events } from '@photo-sphere-viewer/core';\nimport { ID_PANEL_MARKERS_LIST } from './constants';\nimport type { MarkersPlugin } from './MarkersPlugin';\nimport pinList from './icons/pin-list.svg';\n\nexport class MarkersListButton extends AbstractButton {\n    static override readonly id = 'markersList';\n\n    private readonly plugin: MarkersPlugin;\n\n    constructor(navbar: Navbar) {\n        super(navbar, {\n            className: ' psv-markers-list-button',\n            icon: pinList,\n            hoverScale: true,\n            collapsable: true,\n            tabbable: true,\n        });\n\n        this.plugin = this.viewer.getPlugin('markers');\n\n        if (this.plugin) {\n            this.viewer.addEventListener(events.ShowPanelEvent.type, this);\n            this.viewer.addEventListener(events.HidePanelEvent.type, this);\n        }\n    }\n\n    override destroy() {\n        this.viewer.removeEventListener(events.ShowPanelEvent.type, this);\n        this.viewer.removeEventListener(events.HidePanelEvent.type, this);\n\n        super.destroy();\n    }\n\n    override isSupported() {\n        return !!this.plugin;\n    }\n\n    handleEvent(e: Event) {\n        if (e instanceof events.ShowPanelEvent) {\n            this.toggleActive(e.panelId === ID_PANEL_MARKERS_LIST);\n        } else if (e instanceof events.HidePanelEvent) {\n            this.toggleActive(false);\n        }\n    }\n\n    onClick() {\n        this.plugin.toggleMarkersList();\n    }\n}\n","import { utils } from '@photo-sphere-viewer/core';\nimport type { Marker } from './markers/Marker';\nimport icon from './icons/pin-list.svg';\n\n/**\n * Namespace for SVG creation\n * @internal\n */\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\n\n/**\n * Property name added to marker elements\n * @internal\n */\nexport const MARKER_DATA = 'psvMarker';\n\n/**\n * Property name added to marker elements (dash-case)\n * @internal\n */\nexport const MARKER_DATA_KEY = utils.dasherize(MARKER_DATA);\n\n/**\n * Panel identifier for marker content\n * @internal\n */\nexport const ID_PANEL_MARKER = 'marker';\n\n/**\n * Panel identifier for markers list\n * @internal\n */\nexport const ID_PANEL_MARKERS_LIST = 'markersList';\n\n/**\n * Default configuration for the \"hoverScale\" parameters\n * @internal\n */\nexport const DEFAULT_HOVER_SCALE = {\n    amount: 2,\n    duration: 100,\n    easing: 'linear',\n};\n\n/**\n * Markers list template\n * @internal\n */\nexport const MARKERS_LIST_TEMPLATE = (markers: Marker[], title: string) => `\n<div class=\"psv-panel-menu psv-panel-menu--stripped\">\n    <h1 class=\"psv-panel-menu-title\">${icon} ${title}</h1>\n    <ul class=\"psv-panel-menu-list\">\n    ${markers.map(marker => `\n        <li data-${MARKER_DATA_KEY}=\"${marker.id}\" class=\"psv-panel-menu-item\" tabindex=\"0\">\n          ${marker.type === 'image' ? `<span class=\"psv-panel-menu-item-icon\"><img src=\"${marker.definition}\"/></span>` : ''}\n          <span class=\"psv-panel-menu-item-label\">${marker.getListContent()}</span>\n        </li>\n    `).join('')}\n    </ul>\n</div>\n`;\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"9 9 81 81\"><path fill=\"currentColor\" d=\"M37.5 90S9.9 51.9 9.9 36.6 22.2 9 37.5 9s27.6 12.4 27.6 27.6S37.5 90 37.5 90zm0-66.3c-6.1 0-11 4.9-11 11s4.9 11 11 11 11-4.9 11-11-4.9-11-11-11zM86.7 55H70c-1.8 0-3.3-1.5-3.3-3.3s1.5-3.3 3.3-3.3h16.7c1.8 0 3.3 1.5 3.3 3.3S88.5 55 86.7 55zm0-25h-15a3.3 3.3 0 0 1-3.3-3.3c0-1.8 1.5-3.3 3.3-3.3h15c1.8 0 3.3 1.5 3.3 3.3 0 1.8-1.5 3.3-3.3 3.3zM56.5 73h30c1.8 0 3.3 1.5 3.3 3.3 0 1.8-1.5 3.3-3.3 3.3h-30a3.3 3.3 0 0 1-3.3-3.3 3.2 3.2 0 0 1 3.3-3.3z\"/><!--Created by Rohith M S from the Noun Project--></svg>\n","import type { Point, Viewer } from '@photo-sphere-viewer/core';\nimport { AbstractConfigurablePlugin, PSVError, events, utils } from '@photo-sphere-viewer/core';\nimport { Object3D } from 'three';\nimport { CSS3DContainer } from './CSS3DContainer';\nimport { getMarkerType } from './MarkerType';\nimport { MarkersButton } from './MarkersButton';\nimport { MarkersListButton } from './MarkersListButton';\nimport {\n    DEFAULT_HOVER_SCALE,\n    ID_PANEL_MARKER,\n    ID_PANEL_MARKERS_LIST,\n    MARKERS_LIST_TEMPLATE,\n    MARKER_DATA,\n    SVG_NS,\n} from './constants';\nimport {\n    EnterMarkerEvent,\n    GotoMarkerDoneEvent,\n    HideMarkersEvent,\n    LeaveMarkerEvent,\n    MarkerVisibilityEvent,\n    MarkersPluginEvents,\n    RenderMarkersListEvent,\n    SelectMarkerEvent,\n    SelectMarkerListEvent,\n    SetMarkersEvent,\n    ShowMarkersEvent,\n    UnselectMarkerEvent,\n} from './events';\nimport { AbstractStandardMarker } from './markers/AbstractStandardMarker';\nimport { Marker } from './markers/Marker';\nimport { Marker3D } from './markers/Marker3D';\nimport { MarkerCSS3D } from './markers/MarkerCSS3D';\nimport { MarkerNormal } from './markers/MarkerNormal';\nimport { MarkerPolygon } from './markers/MarkerPolygon';\nimport { MarkerSvg } from './markers/MarkerSvg';\nimport { MarkerConfig, MarkersPluginConfig, ParsedMarkersPluginConfig, UpdatableMarkersPluginConfig } from './model';\n\nconst getConfig = utils.getConfigParser<MarkersPluginConfig, ParsedMarkersPluginConfig>(\n    {\n        clickEventOnMarker: false,\n        gotoMarkerSpeed: '8rpm',\n        markers: null,\n        defaultHoverScale: null,\n    },\n    {\n        defaultHoverScale(defaultHoverScale) {\n            if (!defaultHoverScale) {\n                return null;\n            }\n            if (defaultHoverScale === true) {\n                defaultHoverScale = DEFAULT_HOVER_SCALE;\n            }\n            if (typeof defaultHoverScale === 'number') {\n                defaultHoverScale = { amount: defaultHoverScale };\n            }\n            return {\n                ...DEFAULT_HOVER_SCALE,\n                ...defaultHoverScale,\n            };\n        },\n    },\n);\n\nfunction getMarkerCtor(config: MarkerConfig): typeof Marker {\n    const type = getMarkerType(config, false);\n\n    switch (type) {\n        case 'image':\n        case 'html':\n        case 'element':\n            return MarkerNormal;\n        case 'imageLayer':\n        case 'videoLayer':\n            return Marker3D;\n        case 'elementLayer':\n            return MarkerCSS3D;\n        case 'polygon':\n        case 'polyline':\n        case 'polygonPixels':\n        case 'polylinePixels':\n            return MarkerPolygon;\n        case 'square':\n        case 'rect':\n        case 'circle':\n        case 'ellipse':\n        case 'path':\n            return MarkerSvg;\n        default:\n            throw new PSVError('invalid marker type');\n    }\n}\n\n/**\n * Displays various markers on the viewer\n */\nexport class MarkersPlugin extends AbstractConfigurablePlugin<\n    MarkersPluginConfig,\n    ParsedMarkersPluginConfig,\n    UpdatableMarkersPluginConfig,\n    MarkersPluginEvents\n> {\n    static override readonly id = 'markers';\n    static override readonly VERSION = PKG_VERSION;\n    static override readonly configParser = getConfig;\n    static override readonly readonlyOptions: Array<keyof MarkersPluginConfig> = ['markers'];\n\n    private readonly markers: Record<string, Marker> = {};\n\n    private readonly state = {\n        allVisible: true,\n        showAllTooltips: false,\n        currentMarker: null as Marker,\n        hoveringMarker: null as Marker,\n        // require a 2nd render (only the scene) when 3d markers visibility changes\n        needsReRender: false,\n        // use when updating a polygon marker in order to keep the current position\n        lastClientX: null as number,\n        lastClientY: null as number,\n    };\n\n    private readonly container: HTMLElement;\n    private readonly svgContainer: SVGElement;\n    private readonly css3DContainer: CSS3DContainer;\n\n    constructor(viewer: Viewer, config: MarkersPluginConfig) {\n        super(viewer, config);\n\n        this.container = document.createElement('div');\n        this.container.className = 'psv-markers';\n        this.viewer.container.appendChild(this.container);\n\n        this.container.addEventListener('contextmenu', e => e.preventDefault());\n\n        this.svgContainer = document.createElementNS(SVG_NS, 'svg');\n        this.svgContainer.setAttribute('class', 'psv-markers-svg-container');\n        this.container.appendChild(this.svgContainer);\n\n        this.css3DContainer = new CSS3DContainer(viewer);\n        this.container.appendChild(this.css3DContainer.element);\n\n        // Markers events via delegation\n        this.container.addEventListener('mouseenter', this, true);\n        this.container.addEventListener('mouseleave', this, true);\n        this.container.addEventListener('mousemove', this, true);\n    }\n\n    /**\n     * @internal\n     */\n    override init() {\n        super.init();\n\n        utils.checkStylesheet(this.viewer.container, 'markers-plugin');\n\n        // Viewer events\n        this.viewer.addEventListener(events.ClickEvent.type, this);\n        this.viewer.addEventListener(events.DoubleClickEvent.type, this);\n        this.viewer.addEventListener(events.RenderEvent.type, this);\n        this.viewer.addEventListener(events.ConfigChangedEvent.type, this);\n        this.viewer.addEventListener(events.ObjectEnterEvent.type, this);\n        this.viewer.addEventListener(events.ObjectHoverEvent.type, this);\n        this.viewer.addEventListener(events.ObjectLeaveEvent.type, this);\n        this.viewer.addEventListener(events.ReadyEvent.type, this, { once: true });\n    }\n\n    /**\n     * @internal\n     */\n    override destroy() {\n        this.clearMarkers(false);\n\n        this.viewer.unobserveObjects(MARKER_DATA);\n\n        this.viewer.removeEventListener(events.ClickEvent.type, this);\n        this.viewer.removeEventListener(events.DoubleClickEvent.type, this);\n        this.viewer.removeEventListener(events.RenderEvent.type, this);\n        this.viewer.removeEventListener(events.ObjectEnterEvent.type, this);\n        this.viewer.removeEventListener(events.ObjectHoverEvent.type, this);\n        this.viewer.removeEventListener(events.ObjectLeaveEvent.type, this);\n        this.viewer.removeEventListener(events.ReadyEvent.type, this);\n\n        this.css3DContainer.destroy();\n        this.viewer.container.removeChild(this.container);\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case events.ReadyEvent.type:\n                if (this.config.markers) {\n                    this.setMarkers(this.config.markers);\n                    delete this.config.markers;\n                }\n                break;\n\n            case events.RenderEvent.type:\n                this.renderMarkers();\n                break;\n\n            case events.ClickEvent.type:\n                this.__onClick(e as events.ClickEvent, false);\n                break;\n\n            case events.DoubleClickEvent.type:\n                this.__onClick(e as events.DoubleClickEvent, true);\n                break;\n\n            case events.ObjectEnterEvent.type:\n            case events.ObjectLeaveEvent.type:\n            case events.ObjectHoverEvent.type:\n                if ((e as events.ObjectEvent).userDataKey === MARKER_DATA) {\n                    const event = (e as events.ObjectEvent).originalEvent;\n                    const marker: Marker = (e as events.ObjectEvent).object.userData[MARKER_DATA];\n                    switch (e.type) {\n                        case events.ObjectEnterEvent.type:\n                            if (marker.config.style?.cursor) {\n                                this.viewer.setCursor(marker.config.style.cursor);\n                            } else if (marker.config.tooltip || marker.config.content) {\n                                this.viewer.setCursor('pointer');\n                            }\n                            this.__onEnterMarker(event, marker);\n                            break;\n                        case events.ObjectLeaveEvent.type:\n                            this.viewer.setCursor(null);\n                            this.__onLeaveMarker(marker);\n                            break;\n                        case events.ObjectHoverEvent.type:\n                            this.__onHoverMarker(event, marker);\n                            break;\n                    }\n                }\n                break;\n\n            case 'mouseenter': {\n                const marker = this.__getTargetMarker(utils.getEventTarget(e));\n                this.__onEnterMarker(e as MouseEvent, marker);\n                break;\n            }\n\n            case 'mouseleave': {\n                const marker = this.__getTargetMarker(utils.getEventTarget(e));\n                this.__onLeaveMarker(marker);\n                break;\n            }\n\n            case 'mousemove': {\n                const marker = this.__getTargetMarker(utils.getEventTarget(e), true);\n                this.__onHoverMarker(e as MouseEvent, marker);\n                break;\n            }\n        }\n    }\n\n    /**\n     * Toggles all markers\n     */\n    toggleAllMarkers() {\n        if (this.state.allVisible) {\n            this.hideAllMarkers();\n        } else {\n            this.showAllMarkers();\n        }\n    }\n\n    /**\n     * Shows all markers\n     */\n    showAllMarkers() {\n        this.state.allVisible = true;\n        Object.values(this.markers).forEach((marker) => {\n            marker.config.visible = true;\n        });\n        this.renderMarkers();\n        this.dispatchEvent(new ShowMarkersEvent());\n    }\n\n    /**\n     * Hides all markers\n     */\n    hideAllMarkers() {\n        this.state.allVisible = false;\n        Object.values(this.markers).forEach((marker) => {\n            marker.config.visible = false;\n        });\n        this.renderMarkers();\n        this.dispatchEvent(new HideMarkersEvent());\n    }\n\n    /**\n     * Toggles the visibility of all tooltips\n     */\n    toggleAllTooltips() {\n        if (this.state.showAllTooltips) {\n            this.hideAllTooltips();\n        } else {\n            this.showAllTooltips();\n        }\n    }\n\n    /**\n     *  Displays all tooltips\n     */\n    showAllTooltips() {\n        this.state.showAllTooltips = true;\n        Object.values(this.markers).forEach((marker) => {\n            marker.state.staticTooltip = true;\n            marker.showTooltip();\n        });\n    }\n\n    /**\n     * Hides all tooltips\n     */\n    hideAllTooltips() {\n        this.state.showAllTooltips = false;\n        Object.values(this.markers).forEach((marker) => {\n            marker.state.staticTooltip = false;\n            marker.hideTooltip();\n        });\n    }\n\n    /**\n     * Returns the total number of markers\n     */\n    getNbMarkers(): number {\n        return Object.keys(this.markers).length;\n    }\n\n    /**\n     * Returns all the markers\n     */\n    getMarkers(): Marker[] {\n        return Object.values(this.markers);\n    }\n\n    /**\n     * Adds a new marker to viewer\n     * @throws {@link PSVError} when the marker's id is missing or already exists\n     */\n    addMarker(config: MarkerConfig, render = true) {\n        if (this.markers[config.id]) {\n            throw new PSVError(`marker \"${config.id}\" already exists`);\n        }\n\n        // @ts-ignore\n        const marker: Marker = new (getMarkerCtor(config))(this.viewer, this, config);\n\n        if (marker.isPoly()) {\n            this.svgContainer.appendChild(marker.domElement);\n        } else if (marker.isCss3d()) {\n            this.css3DContainer.addObject(marker as MarkerCSS3D);\n        } else if (marker.is3d()) {\n            this.viewer.renderer.addObject(marker.threeElement);\n        } else {\n            this.container.appendChild(marker.domElement);\n        }\n\n        this.markers[marker.id] = marker;\n\n        if (this.state.showAllTooltips) {\n            marker.state.staticTooltip = true;\n        }\n\n        if (render) {\n            this.__afterChangeMarkers();\n        }\n    }\n\n    /**\n     * Returns the internal marker object for a marker id\n     * @throws {@link PSVError} when the marker cannot be found\n     */\n    getMarker(markerId: string | MarkerConfig): Marker {\n        const id = typeof markerId === 'object' ? markerId.id : markerId;\n\n        if (!this.markers[id]) {\n            throw new PSVError(`cannot find marker \"${id}\"`);\n        }\n\n        return this.markers[id];\n    }\n\n    /**\n     * Returns the last marker selected by the user\n     */\n    getCurrentMarker(): Marker {\n        return this.state.currentMarker;\n    }\n\n    /**\n     * Updates the existing marker with the same id\n     * Every property can be changed but you can't change its type (Eg: `image` to `html`)\n     */\n    updateMarker(config: MarkerConfig, render = true) {\n        const marker = this.getMarker(config.id);\n\n        marker.update(config);\n\n        if (render) {\n            this.__afterChangeMarkers();\n\n            if (\n                (marker === this.state.hoveringMarker && marker.config.tooltip?.trigger === 'hover')\n                || marker.state.staticTooltip\n            ) {\n                marker.showTooltip(this.state.lastClientX, this.state.lastClientY, true);\n            }\n        }\n    }\n\n    /**\n     * Removes a marker from the viewer\n     */\n    removeMarker(markerId: string | MarkerConfig, render = true) {\n        const marker = this.getMarker(markerId);\n\n        if (marker.isPoly()) {\n            this.svgContainer.removeChild(marker.domElement);\n        } else if (marker.isCss3d()) {\n            this.css3DContainer.removeObject(marker as MarkerCSS3D);\n        } else if (marker.is3d()) {\n            this.viewer.renderer.removeObject(marker.threeElement);\n        } else {\n            this.container.removeChild(marker.domElement);\n        }\n\n        if (this.state.hoveringMarker === marker) {\n            this.state.hoveringMarker = null;\n        }\n\n        if (this.state.currentMarker === marker) {\n            this.state.currentMarker = null;\n        }\n\n        marker.destroy();\n        delete this.markers[marker.id];\n\n        if (render) {\n            this.__afterChangeMarkers();\n        }\n    }\n\n    /**\n     * Removes multiple markers\n     */\n    removeMarkers(markerIds: string[], render = true) {\n        markerIds.forEach(markerId => this.removeMarker(markerId, false));\n\n        if (render) {\n            this.__afterChangeMarkers();\n        }\n    }\n\n    /**\n     * Replaces all markers\n     */\n    setMarkers(markers: MarkerConfig[] | null, render = true) {\n        this.clearMarkers(false);\n\n        markers?.forEach((marker) => {\n            this.addMarker(marker, false);\n        });\n\n        if (render) {\n            this.__afterChangeMarkers();\n        }\n    }\n\n    /**\n     * Removes all markers\n     */\n    clearMarkers(render = true) {\n        Object.keys(this.markers).forEach((markerId) => {\n            this.removeMarker(markerId, false);\n        });\n\n        if (render) {\n            this.__afterChangeMarkers();\n        }\n    }\n\n    /**\n     * Rotate the view to face the marker\n     */\n    gotoMarker(markerId: string | MarkerConfig, speed: string | number = this.config.gotoMarkerSpeed): Promise<void> {\n        const marker = this.getMarker(markerId);\n\n        if (!speed) {\n            this.viewer.rotate(marker.state.position);\n            if (!utils.isNil(marker.config.zoomLvl)) {\n                this.viewer.zoom(marker.config.zoomLvl);\n            }\n            this.dispatchEvent(new GotoMarkerDoneEvent(marker));\n            return Promise.resolve();\n        } else {\n            return this.viewer\n                .animate({\n                    ...marker.state.position,\n                    zoom: marker.config.zoomLvl,\n                    speed: speed,\n                })\n                .then(() => {\n                    this.dispatchEvent(new GotoMarkerDoneEvent(marker));\n                });\n        }\n    }\n\n    /**\n     * Hides a marker\n     */\n    hideMarker(markerId: string | MarkerConfig) {\n        this.toggleMarker(markerId, false);\n    }\n\n    /**\n     * Shows a marker\n     */\n    showMarker(markerId: string | MarkerConfig) {\n        this.toggleMarker(markerId, true);\n    }\n\n    /**\n     * Forces the display of the tooltip of a marker\n     */\n    showMarkerTooltip(markerId: string | MarkerConfig) {\n        const marker = this.getMarker(markerId);\n        marker.state.staticTooltip = true;\n        marker.showTooltip();\n    }\n\n    /**\n     * Hides the tooltip of a marker\n     */\n    hideMarkerTooltip(markerId: string | MarkerConfig) {\n        const marker = this.getMarker(markerId);\n        marker.state.staticTooltip = false;\n        marker.hideTooltip();\n    }\n\n    /**\n     * Toggles a marker visibility\n     */\n    toggleMarker(markerId: string | MarkerConfig, visible?: boolean) {\n        const marker = this.getMarker(markerId);\n        marker.config.visible = utils.isNil(visible) ? !marker.config.visible : visible;\n        this.renderMarkers();\n    }\n\n    /**\n     * Opens the panel with the content of the marker\n     */\n    showMarkerPanel(markerId: string | MarkerConfig) {\n        const marker = this.getMarker(markerId);\n\n        if (marker.config.content) {\n            this.viewer.panel.show({\n                id: ID_PANEL_MARKER,\n                content: marker.config.content,\n            });\n        } else {\n            this.hideMarkerPanel();\n        }\n    }\n\n    /**\n     * Closes the panel if currently showing the content of a marker\n     */\n    hideMarkerPanel() {\n        this.viewer.panel.hide(ID_PANEL_MARKER);\n    }\n\n    /**\n     * Toggles the visibility of the list of markers\n     */\n    toggleMarkersList() {\n        if (this.viewer.panel.isVisible(ID_PANEL_MARKERS_LIST)) {\n            this.hideMarkersList();\n        } else {\n            this.showMarkersList();\n        }\n    }\n\n    /**\n     * Opens side panel with the list of markers\n     */\n    showMarkersList() {\n        let markers: Marker[] = [];\n        Object.values(this.markers).forEach((marker) => {\n            if (marker.config.visible && !marker.config.hideList) {\n                markers.push(marker);\n            }\n        });\n\n        const e = new RenderMarkersListEvent(markers);\n        this.dispatchEvent(e);\n        markers = e.markers;\n\n        this.viewer.panel.show({\n            id: ID_PANEL_MARKERS_LIST,\n            content: MARKERS_LIST_TEMPLATE(markers, this.viewer.config.lang[MarkersButton.id]),\n            noMargin: true,\n            clickHandler: (target) => {\n                const li = utils.getClosest(target, '.psv-panel-menu-item');\n                const markerId = li ? li.dataset[MARKER_DATA] : undefined;\n\n                if (markerId) {\n                    const marker = this.getMarker(markerId);\n\n                    this.dispatchEvent(new SelectMarkerListEvent(marker));\n\n                    this.gotoMarker(marker.id);\n                    this.hideMarkersList();\n                }\n            },\n        });\n    }\n\n    /**\n     * Closes side panel if it contains the list of markers\n     */\n    hideMarkersList() {\n        this.viewer.panel.hide(ID_PANEL_MARKERS_LIST);\n    }\n\n    /**\n     * Updates the visibility and the position of all markers\n     */\n    renderMarkers() {\n        if (this.state.needsReRender) {\n            this.state.needsReRender = false;\n            return;\n        }\n\n        const zoomLevel = this.viewer.getZoomLevel();\n        const viewerPosition = this.viewer.getPosition();\n        const hoveringMarker = this.state.hoveringMarker;\n\n        Object.values(this.markers).forEach((marker) => {\n            let isVisible = marker.config.visible;\n            let visibilityChanged = false;\n            let position: Point = null;\n\n            if (isVisible) {\n                position = marker.render({ viewerPosition, zoomLevel, hoveringMarker });\n                isVisible = !!position;\n            }\n\n            visibilityChanged = marker.state.visible !== isVisible;\n            marker.state.visible = isVisible;\n            marker.state.position2D = position;\n\n            if (marker.domElement) {\n                utils.toggleClass(marker.domElement, 'psv-marker--visible', isVisible);\n            }\n\n            if (!isVisible) {\n                marker.hideTooltip();\n            } else if (marker.state.staticTooltip) {\n                marker.showTooltip();\n            } else if (marker !== this.state.hoveringMarker) {\n                marker.hideTooltip();\n            }\n\n            if (visibilityChanged) {\n                this.dispatchEvent(new MarkerVisibilityEvent(marker, isVisible));\n\n                if (marker.is3d() || marker.isCss3d()) {\n                    this.state.needsReRender = true;\n                }\n            }\n        });\n\n        if (this.state.needsReRender) {\n            this.viewer.needsUpdate();\n        }\n    }\n\n    /**\n     * Returns the marker associated to an event target\n     */\n    private __getTargetMarker(target: HTMLElement, closest?: boolean): Marker;\n    private __getTargetMarker(target: Object3D[]): Marker;\n    private __getTargetMarker(target: HTMLElement | Object3D[], closest = false): Marker {\n        if (target instanceof Node) {\n            const target2 = closest ? utils.getClosest(target, '.psv-marker') : target;\n            return target2 ? (target2 as any)[MARKER_DATA] : undefined;\n        } else if (Array.isArray(target)) {\n            return target\n                .map(o => o.userData[MARKER_DATA] as Marker)\n                .filter(m => !!m)\n                .sort((a, b) => b.config.zIndex - a.config.zIndex)[0];\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * Handles mouse enter events, show the tooltip for non polygon markers\n     */\n    private __onEnterMarker(e: MouseEvent, marker?: Marker) {\n        if (marker) {\n            this.state.hoveringMarker = marker;\n            this.state.lastClientX = e.clientX;\n            this.state.lastClientY = e.clientY;\n\n            this.dispatchEvent(new EnterMarkerEvent(marker));\n\n            if (marker instanceof AbstractStandardMarker) {\n                marker.applyScale({\n                    zoomLevel: this.viewer.getZoomLevel(),\n                    viewerPosition: this.viewer.getPosition(),\n                    mouseover: true,\n                });\n            }\n\n            if (!marker.state.staticTooltip && marker.config.tooltip?.trigger === 'hover') {\n                marker.showTooltip(e.clientX, e.clientY);\n            }\n        }\n    }\n\n    /**\n     * Handles mouse leave events, hide the tooltip\n     */\n    private __onLeaveMarker(marker?: Marker) {\n        if (marker) {\n            this.dispatchEvent(new LeaveMarkerEvent(marker));\n\n            if (marker instanceof AbstractStandardMarker) {\n                marker.applyScale({\n                    zoomLevel: this.viewer.getZoomLevel(),\n                    viewerPosition: this.viewer.getPosition(),\n                    mouseover: false,\n                });\n            }\n\n            this.state.hoveringMarker = null;\n\n            if (!marker.state.staticTooltip && marker.config.tooltip?.trigger === 'hover') {\n                marker.hideTooltip();\n            } else if (marker.state.staticTooltip) {\n                marker.showTooltip();\n            }\n        }\n    }\n\n    /**\n     * Handles mouse move events, refresh the tooltip for polygon markers\n     */\n    private __onHoverMarker(e: MouseEvent, marker?: Marker) {\n        if (marker) {\n            this.state.lastClientX = e.clientX;\n            this.state.lastClientY = e.clientY;\n\n            if (marker.isPoly() || marker.is3d() || marker.isCss3d()) {\n                if (marker.config.tooltip?.trigger === 'hover') {\n                    marker.showTooltip(e.clientX, e.clientY);\n                }\n            }\n        }\n    }\n\n    /**\n     * Handles mouse click events, select the marker and open the panel if necessary\n     */\n    private __onClick(e: events.ClickEvent | events.DoubleClickEvent, dblclick: boolean) {\n        const threeMarker = this.__getTargetMarker(e.data.objects);\n        const stdMarker = this.__getTargetMarker(e.data.target, true);\n\n        // give priority to standard markers which are always on top of Three markers\n        const marker = stdMarker || threeMarker;\n\n        if (this.state.currentMarker && this.state.currentMarker !== marker) {\n            this.dispatchEvent(new UnselectMarkerEvent(this.state.currentMarker));\n\n            this.viewer.panel.hide(ID_PANEL_MARKER);\n\n            if (!this.state.showAllTooltips && this.state.currentMarker.config.tooltip?.trigger === 'click') {\n                this.hideMarkerTooltip(this.state.currentMarker.id);\n            }\n\n            this.state.currentMarker = null;\n        }\n\n        if (marker) {\n            this.state.currentMarker = marker;\n\n            this.dispatchEvent(new SelectMarkerEvent(marker, dblclick, e.data.rightclick));\n\n            if (this.config.clickEventOnMarker) {\n                // add the marker to event data\n                e.data.marker = marker;\n            } else {\n                e.stopImmediatePropagation();\n            }\n\n            // the marker could have been deleted in an event handler\n            if (this.markers[marker.id] && !e.data.rightclick) {\n                if (marker.config.tooltip?.trigger === 'click') {\n                    if (marker.tooltip) {\n                        this.hideMarkerTooltip(marker.id);\n                    } else {\n                        this.showMarkerTooltip(marker.id);\n                    }\n                } else {\n                    this.showMarkerPanel(marker.id);\n                }\n            }\n        }\n    }\n\n    private __afterChangeMarkers() {\n        this.__refreshUi();\n        this.__checkObjectsObserver();\n        this.viewer.needsUpdate();\n        this.dispatchEvent(new SetMarkersEvent(this.getMarkers()));\n    }\n\n    /**\n     * Updates the visiblity of the panel and the buttons\n     */\n    private __refreshUi() {\n        const nbMarkers = Object.values(this.markers).filter(m => !m.config.hideList).length;\n\n        if (nbMarkers === 0) {\n            this.viewer.panel.hide(ID_PANEL_MARKER);\n            this.viewer.panel.hide(ID_PANEL_MARKERS_LIST);\n        } else {\n            if (this.viewer.panel.isVisible(ID_PANEL_MARKERS_LIST)) {\n                this.showMarkersList();\n            } else if (this.viewer.panel.isVisible(ID_PANEL_MARKER)) {\n                this.state.currentMarker ? this.showMarkerPanel(this.state.currentMarker.id) : this.viewer.panel.hide();\n            }\n        }\n\n        this.viewer.navbar.getButton(MarkersButton.id, false)?.toggle(nbMarkers > 0);\n        this.viewer.navbar.getButton(MarkersListButton.id, false)?.toggle(nbMarkers > 0);\n    }\n\n    /**\n     * Adds or remove the objects observer if there are 3D markers\n     */\n    private __checkObjectsObserver() {\n        const has3d = Object.values(this.markers).some(marker => marker.is3d());\n\n        if (has3d) {\n            this.viewer.observeObjects(MARKER_DATA);\n        } else {\n            this.viewer.unobserveObjects(MARKER_DATA);\n        }\n    }\n}\n","import { events, type Viewer } from '@photo-sphere-viewer/core';\nimport { Scene } from 'three';\nimport { CSS3DRenderer } from 'three/examples/jsm/renderers/CSS3DRenderer.js';\nimport { MARKER_DATA } from './constants';\nimport { MarkerCSS3D } from './markers/MarkerCSS3D';\n\n/**\n * @internal\n */\nexport class CSS3DContainer {\n    element: HTMLElement;\n\n    private readonly renderer: CSS3DRenderer;\n    private readonly scene: Scene;\n    private readonly intersectionObserver: IntersectionObserver;\n\n    constructor(\n        private viewer: Viewer,\n    ) {\n        this.element = document.createElement('div');\n        this.element.className = 'psv-markers-css3d-container';\n\n        this.renderer = new CSS3DRenderer({ element: this.element });\n        this.scene = new Scene();\n\n        this.intersectionObserver = new IntersectionObserver((entries) => {\n            entries.forEach((entry) => {\n                const marker = (entry.target as any)[MARKER_DATA] as MarkerCSS3D;\n                if (marker.config.visible) {\n                    marker.viewportIntersection = entry.isIntersecting;\n                }\n            });\n        }, {\n            root: this.element,\n        });\n\n        viewer.addEventListener(events.ReadyEvent.type, this, { once: true });\n        viewer.addEventListener(events.SizeUpdatedEvent.type, this);\n        viewer.addEventListener(events.RenderEvent.type, this);\n    }\n\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case events.ReadyEvent.type:\n            case events.SizeUpdatedEvent.type:\n                this.updateSize();\n                break;\n            case events.RenderEvent.type:\n                this.render();\n                break;\n        }\n    }\n\n    destroy(): void {\n        this.viewer.removeEventListener(events.ReadyEvent.type, this);\n        this.viewer.removeEventListener(events.SizeUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.RenderEvent.type, this);\n\n        this.intersectionObserver.disconnect();\n    }\n\n    private updateSize() {\n        const size = this.viewer.getSize();\n        this.renderer.setSize(size.width, size.height);\n    }\n\n    private render() {\n        this.renderer.render(this.scene, this.viewer.renderer.camera);\n    }\n\n    addObject(marker: MarkerCSS3D) {\n        this.scene.add(marker.threeElement);\n        this.intersectionObserver.observe(marker.domElement);\n    }\n\n    removeObject(marker: MarkerCSS3D) {\n        this.scene.remove(marker.threeElement);\n        this.intersectionObserver.unobserve(marker.domElement);\n    }\n}\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 */\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 */\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 */\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","import { PSVError } from '@photo-sphere-viewer/core';\nimport { MarkerConfig } from './model';\n\nexport enum MarkerType {\n    image = 'image',\n    html = 'html',\n    element = 'element',\n    imageLayer = 'imageLayer',\n    videoLayer = 'videoLayer',\n    elementLayer = 'elementLayer',\n    polygon = 'polygon',\n    polygonPixels = 'polygonPixels',\n    polyline = 'polyline',\n    polylinePixels = 'polylinePixels',\n    square = 'square',\n    rect = 'rect',\n    circle = 'circle',\n    ellipse = 'ellipse',\n    path = 'path',\n}\n\n/**\n * Determines the type of a marker by the available properties\n * @throws {@link PSVError} when the marker's type cannot be found\n */\nexport function getMarkerType(config: MarkerConfig, allowNone = false): MarkerType {\n    const found: MarkerType[] = [];\n\n    Object.keys(MarkerType).forEach((type) => {\n        if ((config as any)[type]) {\n            found.push(type as MarkerType);\n        }\n    });\n\n    if (found.length === 0 && !allowNone) {\n        throw new PSVError(`missing marker content, either ${Object.keys(MarkerType).join(', ')}`);\n    } else if (found.length > 1) {\n        throw new PSVError(`multiple marker content, either ${Object.keys(MarkerType).join(', ')}`);\n    }\n\n    return found[0];\n}\n","import { CONSTANTS, Point, Position, PSVError, utils, type Viewer } from '@photo-sphere-viewer/core';\nimport { MathUtils } from 'three';\nimport { DEFAULT_HOVER_SCALE } from '../constants';\nimport { type MarkersPlugin } from '../MarkersPlugin';\nimport { MarkerType } from '../MarkerType';\nimport { MarkerConfig } from '../model';\nimport { AbstractDomMarker } from './AbstractDomMarker';\nimport { Marker } from './Marker';\n\n/**\n * Base class for standard markers\n * @internal\n */\nexport abstract class AbstractStandardMarker extends AbstractDomMarker {\n    protected needsUpdateSize: boolean;\n\n    constructor(viewer: Viewer, plugin: MarkersPlugin, config: MarkerConfig) {\n        super(viewer, plugin, config);\n    }\n\n    protected override afterCreateElement(): void {\n        super.afterCreateElement();\n\n        this.domElement.addEventListener('transitionend', () => {\n            // the transition \"scale\" is only applied manually on mouseover\n            // because it must not be present when the scale changes on zoom/move\n            this.domElement.style.transition = '';\n        });\n    }\n\n    override render({\n        viewerPosition,\n        zoomLevel,\n        hoveringMarker,\n    }: {\n        viewerPosition: Position;\n        zoomLevel: number;\n        hoveringMarker: Marker;\n    }): Point {\n        this.__updateSize();\n\n        const position = this.viewer.dataHelper.vector3ToViewerCoords(this.state.positions3D[0]);\n        position.x -= this.state.size.width * this.state.anchor.x;\n        position.y -= this.state.size.height * this.state.anchor.y;\n\n        // It tests if the point is in the general direction of the camera, then check if it's in the viewport\n        const isVisible = (\n            this.state.positions3D[0].dot(this.viewer.state.direction) > 0\n            && position.x + this.state.size.width >= 0\n            && position.x - this.state.size.width <= this.viewer.state.size.width\n            && position.y + this.state.size.height >= 0\n            && position.y - this.state.size.height <= this.viewer.state.size.height\n        );\n\n        if (isVisible) {\n            this.domElement.style.translate = `${position.x}px ${position.y}px 0px`;\n\n            this.applyScale({\n                zoomLevel,\n                viewerPosition,\n                mouseover: this === hoveringMarker,\n            });\n\n            return position;\n        } else {\n            return null;\n        }\n    }\n\n    override update(config: MarkerConfig): void {\n        super.update(config);\n\n        if (!utils.isExtendedPosition(this.config.position)) {\n            throw new PSVError(`missing marker ${this.id} position`);\n        }\n\n        // convert texture coordinates to spherical coordinates\n        try {\n            this.state.position = this.viewer.dataHelper.cleanPosition(this.config.position);\n        } catch (e) {\n            throw new PSVError(`invalid marker ${this.id} position`, e);\n        }\n\n        // compute x/y/z position\n        this.state.positions3D = [this.viewer.dataHelper.sphericalCoordsToVector3(this.state.position)];\n\n        const element = this.domElement;\n\n        element.classList.add('psv-marker--normal');\n\n        if (this.config.scale && Array.isArray(this.config.scale)) {\n            this.config.scale = { zoom: this.config.scale as any };\n        }\n        if (typeof this.config.hoverScale === 'boolean') {\n            this.config.hoverScale = this.config.hoverScale\n                ? this.plugin.config.defaultHoverScale || DEFAULT_HOVER_SCALE\n                : null;\n        } else if (typeof this.config.hoverScale === 'number') {\n            this.config.hoverScale = { amount: this.config.hoverScale } as any;\n        } else if (!this.config.hoverScale) {\n            this.config.hoverScale = this.plugin.config.defaultHoverScale;\n        }\n        if (this.config.hoverScale) {\n            this.config.hoverScale = {\n                ...this.plugin.config.defaultHoverScale,\n                ...this.config.hoverScale,\n            };\n        }\n\n        // set rotation\n        element.style.rotate = this.config.rotation.roll !== 0 ? MathUtils.radToDeg(this.config.rotation.roll) + 'deg' : null;\n\n        // set anchor\n        element.style.transformOrigin = `${this.state.anchor.x * 100}% ${this.state.anchor.y * 100}%`;\n    }\n\n    /**\n     * Computes the real size of a marker\n     * @description This is done by removing all it's transformations (if any) and making it visible\n     * before querying its bounding rect\n     */\n    private __updateSize() {\n        if (!this.needsUpdateSize) {\n            return;\n        }\n\n        const element = this.domElement;\n        const makeTransparent = !this.state.visible || !this.state.size;\n\n        if (makeTransparent) {\n            element.classList.add('psv-marker--transparent');\n        }\n\n        if (this.isSvg()) {\n            const rect = (element.firstElementChild as SVGElement).getBoundingClientRect();\n            this.state.size = {\n                width: rect.width,\n                height: rect.height,\n            };\n        } else {\n            this.state.size = {\n                width: (element as HTMLElement).offsetWidth,\n                height: (element as HTMLElement).offsetHeight,\n            };\n        }\n\n        if (makeTransparent) {\n            element.classList.remove('psv-marker--transparent');\n        }\n\n        if (this.isSvg()) {\n            // the real size must be declared on the SVG root\n            element.style.width = this.state.size.width + 'px';\n            element.style.height = this.state.size.height + 'px';\n        }\n\n        // custom element HTML marker remain dynamic\n        if (this.type !== MarkerType.element) {\n            this.needsUpdateSize = false;\n        }\n    }\n\n    /**\n     * Computes and applies the scale to the marker\n     */\n    applyScale({\n        zoomLevel,\n        viewerPosition,\n        mouseover,\n    }: {\n        zoomLevel: number;\n        viewerPosition: Position;\n        mouseover: boolean;\n    }) {\n        if (mouseover !== null && this.config.hoverScale) {\n            this.domElement.style.transition = `scale ${this.config.hoverScale.duration}ms ${this.config.hoverScale.easing}`;\n        }\n\n        let scale = 1;\n        if (typeof this.config.scale === 'function') {\n            scale = this.config.scale(zoomLevel, viewerPosition);\n        } else if (this.config.scale) {\n            if (Array.isArray(this.config.scale.zoom)) {\n                const [min, max] = this.config.scale.zoom;\n                scale *= min + (max - min) * CONSTANTS.EASINGS.inQuad(zoomLevel / 100);\n            }\n            if (Array.isArray(this.config.scale.yaw)) {\n                const [min, max] = this.config.scale.yaw;\n                const halfFov = MathUtils.degToRad(this.viewer.state.hFov) / 2;\n                const arc = Math.abs(utils.getShortestArc(this.state.position.yaw, viewerPosition.yaw));\n                scale *= max + (min - max) * CONSTANTS.EASINGS.outQuad(Math.max(0, (halfFov - arc) / halfFov));\n            }\n        }\n        if (mouseover && this.config.hoverScale) {\n            scale *= this.config.hoverScale.amount;\n        }\n\n        this.domElement.style.scale = `${scale}`;\n    }\n}\n","import { utils, type Viewer } from '@photo-sphere-viewer/core';\nimport { MARKER_DATA } from '../constants';\nimport { type MarkersPlugin } from '../MarkersPlugin';\nimport { MarkerConfig } from '../model';\nimport { Marker } from './Marker';\n\n/**\n * Base class for markers added in the DOM\n * @internal\n */\nexport abstract class AbstractDomMarker extends Marker {\n    override get domElement(): HTMLElement | SVGElement {\n        return this.element;\n    }\n\n    constructor(viewer: Viewer, plugin: MarkersPlugin, config: MarkerConfig) {\n        super(viewer, plugin, config);\n    }\n\n    protected afterCreateElement(): void {\n        this.element[MARKER_DATA] = this;\n    }\n\n    override destroy(): void {\n        delete this.element[MARKER_DATA];\n\n        super.destroy();\n    }\n\n    override update(config: MarkerConfig): void {\n        super.update(config);\n\n        const element = this.domElement;\n\n        element.id = `psv-marker-${this.config.id}`;\n\n        // reset CSS class\n        element.setAttribute('class', 'psv-marker');\n        if (this.state.visible) {\n            element.classList.add('psv-marker--visible');\n        }\n        if (this.config.tooltip) {\n            element.classList.add('psv-marker--has-tooltip');\n        }\n        if (this.config.content) {\n            element.classList.add('psv-marker--has-content');\n        }\n        if (this.config.className) {\n            utils.addClasses(element, this.config.className);\n        }\n\n        // apply style\n        element.style.opacity = `${this.config.opacity}`;\n        element.style.zIndex = `${30 + this.config.zIndex}`; // 30 is the base z-index in the stylesheet\n        if (this.config.style) {\n            Object.assign(element.style, this.config.style);\n        }\n    }\n}\n","import { PSVError, Point, Position, Size, Tooltip, TooltipConfig, utils, type Viewer } from '@photo-sphere-viewer/core';\nimport { Object3D, Vector3 } from 'three';\nimport { MarkerType, getMarkerType } from '../MarkerType';\nimport { type MarkersPlugin } from '../MarkersPlugin';\nimport { MarkerConfig, ParsedMarkerConfig } from '../model';\n\n/**\n * Base class for all markers\n */\nexport abstract class Marker {\n    readonly type: MarkerType;\n\n    protected element: any;\n\n    /**\n     * The final description of the marker. Either text content, image, url, SVG attributes, etc.\n     */\n    definition: any;\n\n    /** @internal */\n    tooltip?: Tooltip;\n\n    config: ParsedMarkerConfig;\n\n    get id(): string {\n        return this.config.id;\n    }\n\n    get data(): any {\n        return this.config.data;\n    }\n\n    get domElement(): HTMLElement | SVGElement {\n        return null;\n    }\n\n    get threeElement(): Object3D {\n        return null;\n    }\n\n    get video(): HTMLVideoElement {\n        return null;\n    }\n\n    /** @internal */\n    readonly state = {\n        anchor: null as Point,\n        visible: false,\n        staticTooltip: false,\n        position: null as Position,\n        position2D: null as Point,\n        positions3D: null as Vector3[],\n        size: null as Size,\n    };\n\n    constructor(\n        protected viewer: Viewer,\n        protected plugin: MarkersPlugin,\n        config: MarkerConfig,\n    ) {\n        if (!config.id) {\n            throw new PSVError('missing marker id');\n        }\n\n        this.type = getMarkerType(config);\n        this.createElement();\n        this.update(config);\n    }\n\n    /**\n     * @internal\n     */\n    abstract createElement(): void;\n\n    /**\n     * @internal\n     * Returns the 2D position if the marker is visible\n     */\n    abstract render(params: {\n        viewerPosition: Position;\n        zoomLevel: number;\n        hoveringMarker: Marker;\n    }): Point;\n\n    /**\n     * @internal\n     */\n    destroy() {\n        delete this.viewer;\n        delete this.plugin;\n        delete this.element;\n\n        this.hideTooltip();\n    }\n\n    /**\n     * Checks if it is a 3D marker (imageLayer, videoLayer)\n     */\n    is3d(): boolean {\n        return false;\n    }\n\n    /**\n     * Checks if it is a normal marker (image, html, element)\n     */\n    isNormal(): boolean {\n        return false;\n    }\n\n    /**\n     * Checks if it is a polygon/polyline marker\n     */\n    isPoly(): boolean {\n        return false;\n    }\n\n    /**\n     * Checks if it is an SVG marker\n     */\n    isSvg(): boolean {\n        return false;\n    }\n\n    /**\n     * Checks if it is an CSS3D marker\n     */\n    isCss3d(): boolean {\n        return false;\n    }\n\n    /**\n     * Updates the marker with new properties\n     * @throws {@link PSVError} if the configuration is invalid\n     * @internal\n     */\n    update(config: MarkerConfig) {\n        const newType = getMarkerType(config, true);\n\n        if (newType !== undefined && newType !== this.type) {\n            throw new PSVError(`cannot change marker ${config.id} type`);\n        }\n\n        this.config = utils.deepmerge(this.config, config as any);\n        if (typeof this.config.tooltip === 'string') {\n            this.config.tooltip = { content: this.config.tooltip };\n        }\n        if (this.config.tooltip && !this.config.tooltip.trigger) {\n            this.config.tooltip.trigger = 'hover';\n        }\n        if (utils.isNil(this.config.visible)) {\n            this.config.visible = true;\n        }\n        if (utils.isNil(this.config.zIndex)) {\n            this.config.zIndex = 1;\n        }\n        if (utils.isNil(this.config.opacity)) {\n            this.config.opacity = 1;\n        }\n\n        if (this.config.rotation) {\n            const rot = this.config.rotation;\n            if (typeof rot === 'object') {\n                this.config.rotation = {\n                    yaw: rot.yaw ? utils.parseAngle(rot.yaw, true, false) : 0,\n                    pitch: rot.pitch ? utils.parseAngle(rot.pitch, true, false) : 0,\n                    roll: rot.roll ? utils.parseAngle(rot.roll, true, false) : 0,\n                };\n            } else {\n                this.config.rotation = {\n                    yaw: 0,\n                    pitch: 0,\n                    roll: utils.parseAngle(rot, true, false),\n                };\n            }\n        } else {\n            this.config.rotation = { yaw: 0, pitch: 0, roll: 0 };\n        }\n\n        this.state.anchor = utils.parsePoint(this.config.anchor);\n    }\n\n    /**\n     * Returns the markers list content for the marker, it can be either :\n     * - the `listContent`\n     * - the `tooltip`\n     * - the `html`\n     * - the `id`\n     * @internal\n     */\n    getListContent(): string {\n        if (this.config.listContent) {\n            return this.config.listContent;\n        } else if (this.config.tooltip?.content) {\n            return this.config.tooltip.content;\n        } else if (this.config.html) {\n            return this.config.html;\n        } else {\n            return this.id;\n        }\n    }\n\n    /**\n     * Display the tooltip of this marker\n     * @internal\n     */\n    showTooltip(clientX?: number, clientY?: number, forceUpdate = false) {\n        if (this.state.visible && this.config.tooltip?.content && this.state.position2D) {\n            const config: TooltipConfig = {\n                ...this.config.tooltip,\n                style: {\n                    // prevents conflicts with tooltip tracking\n                    pointerEvents: this.state.staticTooltip ? 'auto' : 'none',\n                },\n                data: this,\n                top: 0,\n                left: 0,\n            };\n\n            if (this.isPoly() || this.is3d() || this.isCss3d()) {\n                if (clientX || clientY) {\n                    const viewerPos = utils.getPosition(this.viewer.container);\n                    config.top = clientY - viewerPos.y + 10;\n                    config.left = clientX - viewerPos.x;\n                    config.box = {\n                        // separate the tooltip from the cursor\n                        width: 20,\n                        height: 20,\n                    };\n                } else {\n                    config.top = this.state.position2D.y;\n                    config.left = this.state.position2D.x;\n                }\n            } else {\n                // note: state.position2D already has the anchor applied with the default size\n                const position = this.viewer.dataHelper.vector3ToViewerCoords(this.state.positions3D[0]);\n                let width = this.state.size.width;\n                let height = this.state.size.height;\n\n                // only apply scaling for \"temporary\" tooltips\n                if (this.config.hoverScale && !this.state.staticTooltip) {\n                    width *= this.config.hoverScale.amount;\n                    height *= this.config.hoverScale.amount;\n                }\n\n                config.top = position.y - height * this.state.anchor.y + height / 2;\n                config.left = position.x - width * this.state.anchor.x + width / 2;\n                config.box = { width, height };\n            }\n\n            if (this.tooltip) {\n                if (forceUpdate) {\n                    this.tooltip.update(this.config.tooltip.content, config);\n                } else {\n                    this.tooltip.move(config);\n                }\n            } else {\n                this.tooltip = this.viewer.createTooltip(config);\n            }\n        }\n    }\n\n    /**\n     * Hides the tooltip of this marker\n     * @internal\n     */\n    hideTooltip() {\n        if (this.tooltip) {\n            this.tooltip.hide();\n            this.tooltip = null;\n        }\n    }\n}\n","import { ExtendedPosition, PSVError, Point, Position, Size, utils, type Viewer } from '@photo-sphere-viewer/core';\nimport {\n    Group,\n    Mesh,\n    Object3D,\n    PlaneGeometry,\n    Texture,\n    Vector3,\n    VideoTexture,\n} from 'three';\nimport { ChromaKeyMaterial } from '../../../shared/ChromaKeyMaterial';\nimport { createVideo } from '../../../shared/video-utils';\nimport { MarkerType } from '../MarkerType';\nimport { type MarkersPlugin } from '../MarkersPlugin';\nimport { MARKER_DATA } from '../constants';\nimport { MarkerConfig } from '../model';\nimport { getPolygonCenter } from '../utils';\nimport { Marker } from './Marker';\n\n/**\n * @internal\n */\nexport class Marker3D extends Marker {\n    override get threeElement(): Group {\n        return this.element;\n    }\n\n    get threeMesh(): Mesh<PlaneGeometry, ChromaKeyMaterial> {\n        return this.threeElement.children[0] as any;\n    }\n\n    override get video(): HTMLVideoElement {\n        if (this.type === MarkerType.videoLayer) {\n            return this.threeMesh.material.map.image;\n        } else {\n            return null;\n        }\n    }\n\n    constructor(viewer: Viewer, plugin: MarkersPlugin, config: MarkerConfig) {\n        super(viewer, plugin, config);\n    }\n\n    override is3d(): boolean {\n        return true;\n    }\n\n    override createElement(): void {\n        const material = new ChromaKeyMaterial({ alpha: 0 });\n        const geometry = new PlaneGeometry(1, 1);\n        const mesh = new Mesh(geometry, material);\n        mesh.userData = { [MARKER_DATA]: this };\n\n        // overwrite the visible property to be tied to the Marker instance\n        // and do it without context bleed\n        Object.defineProperty(mesh, 'visible', {\n            enumerable: true,\n            get: function (this: Object3D) {\n                return (this.userData[MARKER_DATA] as Marker).config.visible;\n            },\n            set: function (this: Object3D, visible: boolean) {\n                (this.userData[MARKER_DATA] as Marker).config.visible = visible;\n            },\n        });\n\n        this.element = new Group().add(mesh);\n\n        if (this.type === MarkerType.videoLayer) {\n            this.viewer.needsContinuousUpdate(true);\n        }\n    }\n\n    override destroy(): void {\n        delete this.threeMesh.userData[MARKER_DATA];\n\n        if (this.type === MarkerType.videoLayer) {\n            this.video.pause();\n            this.viewer.needsContinuousUpdate(false);\n        }\n\n        super.destroy();\n    }\n\n    override render(): Point {\n        if (this.viewer.renderer.isObjectVisible(this.threeMesh)) {\n            return this.viewer.dataHelper.sphericalCoordsToViewerCoords(this.state.position);\n        } else {\n            return null;\n        }\n    }\n\n    override update(config: MarkerConfig): void {\n        super.update(config);\n\n        const mesh = this.threeMesh;\n        const group = mesh.parent;\n        const material = mesh.material;\n\n        if (utils.isExtendedPosition(this.config.position)) {\n            try {\n                this.state.position = this.viewer.dataHelper.cleanPosition(this.config.position);\n            } catch (e) {\n                throw new PSVError(`invalid marker ${this.id} position`, e);\n            }\n\n            if (!this.config.size) {\n                throw new PSVError(`missing marker ${this.id} size`);\n            }\n\n            this.state.size = this.config.size;\n\n            // 100 is magic number that gives a coherent size at default zoom level\n            mesh.scale.set(this.config.size.width / 100, this.config.size.height / 100, 1);\n            mesh.position.set(mesh.scale.x * (0.5 - this.state.anchor.x), mesh.scale.y * (this.state.anchor.y - 0.5), 0);\n            mesh.rotation.set(0, 0, 0);\n            this.viewer.dataHelper.sphericalCoordsToVector3(this.state.position, group.position);\n\n            group.lookAt(0, group.position.y, 0);\n            mesh.rotateY(-this.config.rotation.yaw);\n            mesh.rotateX(-this.config.rotation.pitch);\n            mesh.rotateZ(-this.config.rotation.roll);\n\n            const p = mesh.geometry.getAttribute('position');\n            this.state.positions3D = [0, 1, 3, 2].map((i) => {\n                const v3 = new Vector3();\n                v3.fromBufferAttribute(p, i);\n                return mesh.localToWorld(v3);\n            });\n        } else {\n            if (this.config.position?.length !== 4) {\n                throw new PSVError(`missing marker ${this.id} position`);\n            }\n\n            let positions: Position[];\n            try {\n                positions = this.config.position.map(p => this.viewer.dataHelper.cleanPosition(p));\n            } catch (e) {\n                throw new PSVError(`invalid marker ${this.id} position`, e);\n            }\n\n            const positions3D = positions.map(p => this.viewer.dataHelper.sphericalCoordsToVector3(p));\n\n            const centroid = getPolygonCenter(positions.map(({ yaw, pitch }) => [yaw, pitch]));\n            this.state.position = { yaw: centroid[0], pitch: centroid[1] };\n\n            this.state.positions3D = positions3D;\n\n            const p = mesh.geometry.getAttribute('position');\n            [\n                positions3D[0],\n                positions3D[1],\n                positions3D[3], // not a mistake!\n                positions3D[2],\n            ].forEach((v, i) => {\n                p.setX(i, v.x);\n                p.setY(i, v.y);\n                p.setZ(i, v.z);\n            });\n            p.needsUpdate = true;\n\n            this.__setTextureWrap(material);\n        }\n\n        switch (this.type) {\n            case MarkerType.videoLayer:\n                if (this.definition !== this.config.videoLayer) {\n                    material.map?.dispose();\n\n                    const video = createVideo({\n                        src: this.config.videoLayer,\n                        withCredentials: this.viewer.config.withCredentials(this.config.videoLayer),\n                        muted: true,\n                        autoplay: this.config.autoplay ?? true,\n                    });\n\n                    const texture = new VideoTexture(video);\n                    material.map = texture;\n                    material.alpha = 0;\n\n                    video.addEventListener('loadedmetadata', () => {\n                        if (!this.viewer) {\n                            return; // the marker has been removed\n                        }\n\n                        material.alpha = this.config.opacity;\n\n                        if (!utils.isExtendedPosition(this.config.position)) {\n                            mesh.material.userData[MARKER_DATA] = { width: video.videoWidth, height: video.videoHeight };\n                            this.__setTextureWrap(material);\n                        }\n                    }, { once: true });\n\n                    if (video.autoplay) {\n                        video.play();\n                    }\n\n                    this.definition = this.config.videoLayer;\n                } else {\n                    material.alpha = this.config.opacity;\n                }\n                break;\n\n            case MarkerType.imageLayer:\n                if (this.definition !== this.config.imageLayer) {\n                    material.map?.dispose();\n\n                    const texture = new Texture();\n                    material.map = texture;\n                    material.alpha = 0;\n\n                    this.viewer.textureLoader.loadImage(this.config.imageLayer).then((image) => {\n                        if (!this.viewer) {\n                            return; // the marker has been removed\n                        }\n\n                        if (!utils.isExtendedPosition(this.config.position)) {\n                            mesh.material.userData[MARKER_DATA] = { width: image.width, height: image.height };\n                            this.__setTextureWrap(material);\n                        }\n\n                        texture.image = image;\n                        texture.anisotropy = 4;\n                        texture.needsUpdate = true;\n                        material.alpha = this.config.opacity;\n\n                        this.viewer.needsUpdate();\n                    });\n\n                    this.definition = this.config.imageLayer;\n                } else {\n                    material.alpha = this.config.opacity;\n                }\n                break;\n\n            // no default\n        }\n\n        material.chromaKey = this.config.chromaKey;\n        mesh.renderOrder = 1000 + this.config.zIndex;\n        mesh.geometry.boundingBox = null; // reset box for Renderer.isObjectVisible\n    }\n\n    /**\n     * For layers positionned by corners, applies offset to the texture in order to keep its proportions\n     */\n    private __setTextureWrap(material: ChromaKeyMaterial) {\n        const imageSize: Size = material.userData[MARKER_DATA];\n\n        if (!imageSize || !imageSize.height || !imageSize.width) {\n            material.repeat.set(1, 1);\n            material.offset.set(0, 0);\n            return;\n        }\n\n        const positions = (this.config.position as ExtendedPosition[]).map((p) => {\n            return this.viewer.dataHelper.cleanPosition(p);\n        });\n\n        const w1 = utils.greatArcDistance(\n            [positions[0].yaw, positions[0].pitch],\n            [positions[1].yaw, positions[1].pitch],\n        );\n        const w2 = utils.greatArcDistance(\n            [positions[3].yaw, positions[3].pitch],\n            [positions[2].yaw, positions[2].pitch],\n        );\n        const h1 = utils.greatArcDistance(\n            [positions[1].yaw, positions[1].pitch],\n            [positions[2].yaw, positions[2].pitch],\n        );\n        const h2 = utils.greatArcDistance(\n            [positions[0].yaw, positions[0].pitch],\n            [positions[3].yaw, positions[3].pitch],\n        );\n\n        const layerRatio = (w1 + w2) / (h1 + h2);\n        const imageRatio = imageSize.width / imageSize.height;\n\n        let hMargin = 0;\n        let vMargin = 0;\n        if (layerRatio < imageRatio) {\n            hMargin = imageRatio - layerRatio;\n        } else {\n            vMargin = 1 / imageRatio - 1 / layerRatio;\n        }\n\n        material.repeat.set(1 - hMargin, 1 - vMargin);\n        material.offset.set(hMargin / 2, vMargin / 2);\n    }\n}\n","import { Color, ColorRepresentation, ShaderMaterial, Texture, Vector2 } from 'three';\nimport chromaKeyFragment from './shaders/chromaKey.fragment.glsl';\nimport chromaKeyVertex from './shaders/chromaKey.vertex.glsl';\n\ntype ShaderUniforms = {\n    map: { value: Texture };\n    repeat: { value: Vector2 };\n    offset: { value: Vector2 };\n    alpha: { value: number };\n    keying: { value: boolean };\n    color: { value: Color };\n    similarity: { value: number };\n    smoothness: { value: number };\n    spill: { value: number };\n};\n\ntype ChromaKey = {\n    /** @default false */\n    enabled: boolean;\n    /** @default 0x00ff00 */\n    color?: ColorRepresentation | { r: number; g: number; b: number };\n    /** @default 0.2 */\n    similarity?: number;\n    /** @default 0.2 */\n    smoothness?: number;\n};\n\nexport class ChromaKeyMaterial extends ShaderMaterial {\n    override uniforms: ShaderUniforms;\n\n    get map(): Texture {\n        return this.uniforms.map.value;\n    }\n\n    set map(map: Texture) {\n        this.uniforms.map.value = map;\n    }\n\n    set alpha(alpha: number) {\n        this.uniforms.alpha.value = alpha;\n    }\n\n    get offset(): Vector2 {\n        return this.uniforms.offset.value;\n    }\n\n    get repeat(): Vector2 {\n        return this.uniforms.repeat.value;\n    }\n\n    set chromaKey(chromaKey: ChromaKey) {\n        this.uniforms.keying.value = chromaKey?.enabled === true;\n        if (chromaKey?.enabled) {\n            if (typeof chromaKey.color === 'object' && 'r' in chromaKey.color) {\n                this.uniforms.color.value.set(\n                    chromaKey.color.r / 255,\n                    chromaKey.color.g / 255,\n                    chromaKey.color.b / 255,\n                );\n            } else {\n                this.uniforms.color.value.set(chromaKey.color ?? 0x00ff00);\n            }\n            this.uniforms.similarity.value = chromaKey.similarity ?? 0.2;\n            this.uniforms.smoothness.value = chromaKey.smoothness ?? 0.2;\n        }\n    }\n\n    constructor(params?: {\n        map?: Texture;\n        alpha?: number;\n        chromaKey?: ChromaKey;\n    }) {\n        super({\n            transparent: true,\n            depthTest: false,\n            depthWrite: false,\n            uniforms: {\n                map: { value: params?.map },\n                repeat: { value: new Vector2(1, 1) },\n                offset: { value: new Vector2(0, 0) },\n                alpha: { value: params?.alpha ?? 1 },\n                keying: { value: false },\n                color: { value: new Color(0x00ff00) },\n                similarity: { value: 0.2 },\n                smoothness: { value: 0.2 },\n                spill: { value: 0.1 },\n            } satisfies ShaderUniforms,\n            vertexShader: chromaKeyVertex,\n            fragmentShader: chromaKeyFragment,\n        });\n\n        this.chromaKey = params?.chromaKey;\n    }\n}\n","// https://www.8thwall.com/playground/chromakey-threejs\n\nuniform sampler2D map;\nuniform float alpha;\nuniform bool keying;\nuniform vec3 color;\nuniform float similarity;\nuniform float smoothness;\nuniform float spill;\n\nvarying vec2 vUv;\n\nvec2 RGBtoUV(vec3 rgb) {\n    return vec2(\n        rgb.r * -0.169 + rgb.g * -0.331 + rgb.b *  0.5    + 0.5,\n        rgb.r *  0.5   + rgb.g * -0.419 + rgb.b * -0.081  + 0.5\n    );\n}\n\nvoid main(void) {\n    gl_FragColor = texture2D(map, vUv);\n\n    if (keying) {\n        float chromaDist = distance(RGBtoUV(gl_FragColor.rgb), RGBtoUV(color));\n\n        float baseMask = chromaDist - similarity;\n        float fullMask = pow(clamp(baseMask / smoothness, 0., 1.), 1.5);\n        gl_FragColor.a *= fullMask * alpha;\n\n        float spillVal = pow(clamp(baseMask / spill, 0., 1.), 1.5);\n        float desat = clamp(gl_FragColor.r * 0.2126 + gl_FragColor.g * 0.7152 + gl_FragColor.b * 0.0722, 0., 1.);\n        gl_FragColor.rgb = mix(vec3(desat, desat, desat), gl_FragColor.rgb, spillVal);\n    } else {\n        gl_FragColor.a *= alpha;\n    }\n}\n","varying vec2 vUv;\nuniform vec2 repeat;\nuniform vec2 offset;\n\nvoid main() {\n    vUv = uv * repeat + offset;\n    gl_Position = projectionMatrix *  modelViewMatrix * vec4( position, 1.0 );\n}\n","/**\n * Create a standard video element\n */\nexport function createVideo({\n    src,\n    withCredentials,\n    muted,\n    autoplay,\n}: {\n    src: string | MediaStream;\n    withCredentials: boolean;\n    muted: boolean;\n    autoplay: boolean;\n}): HTMLVideoElement {\n    const video = document.createElement('video');\n    video.crossOrigin = withCredentials ? 'use-credentials' : 'anonymous';\n    video.loop = true;\n    video.playsInline = true;\n    video.autoplay = autoplay;\n    video.muted = muted;\n    video.preload = 'metadata';\n    if (src instanceof MediaStream) {\n        video.srcObject = src;\n    } else {\n        video.src = src;\n    }\n    return video;\n}\n","import { CONSTANTS, utils } from '@photo-sphere-viewer/core';\nimport { Vector3 } from 'three';\n\n/**\n * Returns intermediary point between two points on the sphere\n * {@link http://www.movable-type.co.uk/scripts/latlong.html}\n */\nfunction greatArcIntermediaryPoint(p1: [number, number], p2: [number, number], f: number): [number, number] {\n    const [λ1, φ1] = p1;\n    const [λ2, φ2] = p2;\n\n    // note: \"r\" should be the angular distance, see \"intermediatePointTo\" in the above article\n    // but \"greatArcDistance\" gives identiqual results up to 0.00001 radians and is faster\n    const r = utils.greatArcDistance(p1, p2);\n    const a = Math.sin((1 - f) * r) / Math.sin(r);\n    const b = Math.sin(f * r) / Math.sin(r);\n    const x = a * Math.cos(φ1) * Math.cos(λ1) + b * Math.cos(φ2) * Math.cos(λ2);\n    const y = a * Math.cos(φ1) * Math.sin(λ1) + b * Math.cos(φ2) * Math.sin(λ2);\n    const z = a * Math.sin(φ1) + b * Math.sin(φ2);\n\n    return [Math.atan2(y, x), Math.atan2(z, Math.sqrt(x * x + y * y))];\n}\n\n/**\n * Given a list of spherical points, offsets yaws in order to have only coutinuous values\n * eg: [0.2, 6.08] is transformed to [0.2, -0.2]\n */\nfunction getPolygonCoherentPoints(points: Array<[number, number]>) {\n    const workPoints = [points[0]];\n\n    let k = 0;\n    for (let i = 1; i < points.length; i++) {\n        const d = points[i - 1][0] - points[i][0];\n        if (d > Math.PI) {\n            // crossed the origin left to right\n            k += 1;\n        } else if (d < -Math.PI) {\n            // crossed the origin right to left\n            k -= 1;\n        }\n        workPoints.push([points[i][0] + k * 2 * Math.PI, points[i][1]]);\n    }\n\n    return workPoints;\n}\n\n/**\n * Computes the center point of a polygon\n * @todo Get \"visual center\" (https://blog.mapbox.com/a-new-algorithm-for-finding-a-visual-center-of-a-polygon-7c77e6492fbc)\n * @internal\n */\nexport function getPolygonCenter(polygon: Array<[number, number]>): [number, number] {\n    const points = getPolygonCoherentPoints(polygon);\n\n    const sum = points.reduce((intermediary, point) => [intermediary[0] + point[0], intermediary[1] + point[1]]);\n    return [utils.parseAngle(sum[0] / polygon.length), sum[1] / polygon.length];\n}\n\n/**\n * Computes the middle point of a polyline\n * @internal\n */\nexport function getPolylineCenter(polyline: Array<[number, number]>): [number, number] {\n    const points = getPolygonCoherentPoints(polyline);\n\n    // compute each segment length + total length\n    let length = 0;\n    const lengths = [];\n\n    for (let i = 0; i < points.length - 1; i++) {\n        const l = utils.greatArcDistance(points[i], points[i + 1]) * CONSTANTS.SPHERE_RADIUS;\n\n        lengths.push(l);\n        length += l;\n    }\n\n    // iterate until length / 2\n    let consumed = 0;\n\n    for (let j = 0; j < points.length - 1; j++) {\n        // once the segment containing the middle point is found, computes the intermediary point\n        if (consumed + lengths[j] > length / 2) {\n            const r = (length / 2 - consumed) / lengths[j];\n            return greatArcIntermediaryPoint(points[j], points[j + 1], r);\n        }\n\n        consumed += lengths[j];\n    }\n\n    // this never happens\n    return points[Math.round(points.length / 2)];\n}\n\nconst C = new Vector3();\nconst N = new Vector3();\nconst V = new Vector3();\nconst X = new Vector3();\nconst Y = new Vector3();\nconst A = new Vector3();\n\n/**\n * Given one point in the same direction of the camera and one point behind the camera,\n * computes an intermediary point on the great circle delimiting the half sphere visible by the camera.\n * The point is shifted by .01 rad because the projector cannot handle points exactly on this circle.\n * @todo : does not work with fisheye view (must not use the great circle)\n * @link http://math.stackexchange.com/a/1730410/327208\n */\nexport function getGreatCircleIntersection(P1: Vector3, P2: Vector3, direction: Vector3): Vector3 {\n    C.copy(direction).normalize();\n    N.crossVectors(P1, P2).normalize();\n    V.crossVectors(N, P1).normalize();\n    X.copy(P1).multiplyScalar(-C.dot(V));\n    Y.copy(V).multiplyScalar(C.dot(P1));\n    const H = new Vector3().addVectors(X, Y).normalize();\n    A.crossVectors(H, C);\n    return H.applyAxisAngle(A, 0.01).multiplyScalar(CONSTANTS.SPHERE_RADIUS);\n}\n","import { PSVError, Point, Position, utils, type Viewer } from '@photo-sphere-viewer/core';\nimport { Object3D } from 'three';\nimport { CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js';\nimport { type MarkersPlugin } from '../MarkersPlugin';\nimport { MARKER_DATA } from '../constants';\nimport { MarkerConfig } from '../model';\nimport { AbstractDomMarker } from './AbstractDomMarker';\nimport { Marker } from './Marker';\n\n/**\n * @internal\n */\nexport class MarkerCSS3D extends AbstractDomMarker {\n    private object: CSS3DObject;\n\n    /**\n     * @internal\n     */\n    viewportIntersection = false;\n\n    override get threeElement() {\n        return this.object;\n    }\n\n    constructor(viewer: Viewer, plugin: MarkersPlugin, config: MarkerConfig) {\n        super(viewer, plugin, config);\n    }\n\n    override isCss3d(): boolean {\n        return true;\n    }\n\n    override createElement(): void {\n        this.element = document.createElement('div');\n\n        this.object = new CSS3DObject(this.element);\n        this.object.userData = { [MARKER_DATA]: this };\n\n        // overwrite the visible property to be tied to the Marker instance\n        // and do it without context bleed\n        Object.defineProperty(this.object, 'visible', {\n            enumerable: true,\n            get: function (this: Object3D) {\n                return (this.userData[MARKER_DATA] as Marker).config.visible;\n            },\n            set: function (this: Object3D, visible: boolean) {\n                (this.userData[MARKER_DATA] as Marker).config.visible = visible;\n            },\n        });\n\n        this.afterCreateElement();\n    }\n\n    override destroy(): void {\n        delete this.object.userData[MARKER_DATA];\n        delete this.object;\n\n        super.destroy();\n    }\n\n    override render({\n        viewerPosition,\n        zoomLevel,\n    }: {\n        viewerPosition: Position;\n        zoomLevel: number;\n    }): Point {\n        const element = this.domElement;\n\n        this.state.size = {\n            width: (element as HTMLElement).offsetWidth,\n            height: (element as HTMLElement).offsetHeight,\n        };\n\n        const isVisible = this.state.positions3D[0].dot(this.viewer.state.direction) > 0 && this.viewportIntersection;\n\n        if (isVisible) {\n            const position = this.viewer.dataHelper.sphericalCoordsToViewerCoords(this.state.position);\n\n            this.config.elementLayer.updateMarker?.({\n                marker: this,\n                position,\n                viewerPosition,\n                zoomLevel,\n                viewerSize: this.viewer.state.size,\n            });\n\n            return position;\n        } else {\n            return null;\n        }\n    }\n\n    override update(config: MarkerConfig): void {\n        super.update(config);\n\n        if (!utils.isExtendedPosition(this.config.position)) {\n            throw new PSVError(`missing marker ${this.id} position`);\n        }\n\n        // convert texture coordinates to spherical coordinates\n        try {\n            this.state.position = this.viewer.dataHelper.cleanPosition(this.config.position);\n        } catch (e) {\n            throw new PSVError(`invalid marker ${this.id} position`, e);\n        }\n\n        // compute x/y/z position\n        this.state.positions3D = [this.viewer.dataHelper.sphericalCoordsToVector3(this.state.position)];\n\n        const object = this.threeElement;\n        const element = this.domElement;\n\n        element.classList.add('psv-marker--css3d');\n\n        element.childNodes.forEach(n => n.remove());\n        element.appendChild(this.config.elementLayer);\n        this.config.elementLayer.style.display = 'block';\n\n        object.position.copy(this.state.positions3D[0]).multiplyScalar(100);\n        object.lookAt(0, this.state.positions3D[0].y * 100, 0);\n        object.rotateY(-this.config.rotation.yaw);\n        object.rotateX(-this.config.rotation.pitch);\n        object.rotateZ(-this.config.rotation.roll);\n    }\n}\n","import { PSVError, Point, Position, type Viewer } from '@photo-sphere-viewer/core';\nimport { MarkerType } from '../MarkerType';\nimport { type MarkersPlugin } from '../MarkersPlugin';\nimport { MarkerConfig } from '../model';\nimport { AbstractStandardMarker } from './AbstractStandardMarker';\nimport { Marker } from './Marker';\n\n/**\n * @internal\n */\nexport class MarkerNormal extends AbstractStandardMarker {\n    constructor(viewer: Viewer, plugin: MarkersPlugin, config: MarkerConfig) {\n        super(viewer, plugin, config);\n    }\n\n    override isNormal(): boolean {\n        return true;\n    }\n\n    override createElement(): void {\n        this.element = document.createElement('div');\n        this.afterCreateElement();\n    }\n\n    override render(params: {\n        viewerPosition: Position;\n        zoomLevel: number;\n        hoveringMarker: Marker;\n    }): Point {\n        const position = super.render(params);\n\n        if (position && this.type === MarkerType.element) {\n            this.config.element.updateMarker?.({\n                marker: this,\n                position,\n                viewerPosition: params.viewerPosition,\n                zoomLevel: params.zoomLevel,\n                viewerSize: this.viewer.state.size,\n            });\n        }\n\n        return position;\n    }\n\n    override update(config: MarkerConfig): void {\n        super.update(config);\n\n        const element = this.domElement;\n\n        if (this.config.image && !this.config.size) {\n            throw new PSVError(`missing marker ${this.id} size`);\n        }\n\n        if (this.config.size) {\n            this.needsUpdateSize = false;\n            this.state.size = this.config.size;\n            element.style.width = this.config.size.width + 'px';\n            element.style.height = this.config.size.height + 'px';\n        } else {\n            this.needsUpdateSize = true;\n        }\n\n        switch (this.type) {\n            case MarkerType.image:\n                this.definition = this.config.image;\n                element.style.backgroundImage = `url(\"${this.config.image}\")`;\n                break;\n            case MarkerType.html:\n                this.definition = this.config.html;\n                element.innerHTML = this.config.html;\n                break;\n            case MarkerType.element:\n                if (this.definition !== this.config.element) {\n                    this.definition = this.config.element;\n                    element.childNodes.forEach(n => n.remove());\n                    element.appendChild(this.config.element);\n                    this.config.element.style.display = 'block';\n                }\n                break;\n        }\n    }\n}\n","import {\n    PSVError,\n    PanoramaPosition,\n    Point,\n    Position,\n    SphericalPosition,\n    Viewer,\n    utils,\n} from '@photo-sphere-viewer/core';\nimport { Vector3 } from 'three';\nimport { MarkerType } from '../MarkerType';\nimport { MarkersPlugin } from '../MarkersPlugin';\nimport { MARKER_DATA, SVG_NS } from '../constants';\nimport { MarkerConfig } from '../model';\nimport { getGreatCircleIntersection, getPolygonCenter, getPolylineCenter } from '../utils';\nimport { AbstractDomMarker } from './AbstractDomMarker';\n\n/**\n * @internal\n */\nexport class MarkerPolygon extends AbstractDomMarker {\n    private positions3D: Vector3[][];\n\n    constructor(viewer: Viewer, plugin: MarkersPlugin, config: MarkerConfig) {\n        super(viewer, plugin, config);\n    }\n\n    override createElement(): void {\n        this.element = document.createElementNS(SVG_NS, 'path');\n        this.element[MARKER_DATA] = this;\n    }\n\n    override isPoly(): boolean {\n        return true;\n    }\n\n    /**\n     * Checks if it is a polygon/polyline using pixel coordinates\n     */\n    private get isPixels(): boolean {\n        return this.type === MarkerType.polygonPixels || this.type === MarkerType.polylinePixels;\n    }\n\n    /**\n     * Checks if it is a polygon marker\n     */\n    private get isPolygon(): boolean {\n        return this.type === MarkerType.polygon || this.type === MarkerType.polygonPixels;\n    }\n\n    /**\n     * Checks if it is a polyline marker\n     */\n    private get isPolyline(): boolean {\n        return this.type === MarkerType.polyline || this.type === MarkerType.polylinePixels;\n    }\n\n    private get coords(): Array<Array<[number, number]>> {\n        return this.definition;\n    }\n\n    override render(): Point {\n        const positions = this.__getAllPolyPositions();\n        const isVisible = positions[0].length > (this.isPolygon ? 2 : 1);\n\n        if (isVisible) {\n            const position = this.viewer.dataHelper.sphericalCoordsToViewerCoords(this.state.position);\n\n            const points = positions\n                .filter(innerPos => innerPos.length > 0)\n                .map((innerPos) => {\n                    let innerPoints = 'M';\n                    innerPoints += innerPos\n                        .map(pos => `${pos.x - position.x},${pos.y - position.y}`)\n                        .join('L');\n                    if (this.isPolygon) {\n                        innerPoints += 'Z';\n                    }\n                    return innerPoints;\n                })\n                .join(' ');\n\n            this.domElement.setAttributeNS(null, 'd', points);\n            this.domElement.setAttributeNS(null, 'transform', `translate(${position.x} ${position.y})`);\n\n            return position;\n        } else {\n            return null;\n        }\n    }\n\n    override update(config: MarkerConfig): void {\n        super.update(config);\n\n        const element = this.domElement;\n\n        element.classList.add('psv-marker--poly');\n\n        // set style\n        if (this.config.svgStyle) {\n            Object.entries(this.config.svgStyle).forEach(([prop, value]) => {\n                element.setAttributeNS(null, utils.dasherize(prop), value);\n            });\n\n            if (this.isPolyline && !this.config.svgStyle.fill) {\n                element.setAttributeNS(null, 'fill', 'none');\n            }\n        } else if (this.isPolygon) {\n            element.setAttributeNS(null, 'fill', 'rgba(0,0,0,0.5)');\n        } else if (this.isPolyline) {\n            element.setAttributeNS(null, 'fill', 'none');\n            element.setAttributeNS(null, 'stroke', 'rgb(0,0,0)');\n        }\n\n        try {\n            // (retrocompat) fold arrays: [1,2,3,4] => [[1,2],[3,4]]\n            let actualPoly: any = this.config[this.type];\n            if (!Array.isArray(actualPoly[0]) && typeof actualPoly[0] !== 'object') {\n                for (let i = 0; i < actualPoly.length; i++) {\n                    // @ts-ignore\n                    actualPoly.splice(i, 2, [actualPoly[i], actualPoly[i + 1]]);\n                }\n            }\n\n            // make nested array for holes\n            if (!Array.isArray(actualPoly[0][0]) && typeof actualPoly[0][0] !== 'object') {\n                actualPoly = [actualPoly];\n            }\n\n            if (this.isPolyline && actualPoly.length > 1) {\n                throw new PSVError(`polylines cannot have holes`);\n            }\n\n            if (this.isPixels) {\n                // convert texture coordinates to spherical coordinates\n                this.definition = (actualPoly as Array<Array<[number, number] | PanoramaPosition>>).map((coords) => {\n                    return coords.map((coord) => {\n                        let sphericalCoord: Position;\n                        if (utils.isExtendedPosition(coord)) {\n                            sphericalCoord = this.viewer.dataHelper.cleanPosition(coord);\n                        } else {\n                            sphericalCoord = this.viewer.dataHelper.textureCoordsToSphericalCoords({\n                                textureX: coord[0],\n                                textureY: coord[1],\n                            });\n                        }\n                        return [sphericalCoord.yaw, sphericalCoord.pitch];\n                    });\n                });\n            } else {\n                // clean angles\n                this.definition = (actualPoly as Array<Array<[number, number] | [string, string] | SphericalPosition>>).map((coords) => {\n                    return coords.map((coord) => {\n                        let sphericalCoord: Position;\n                        if (utils.isExtendedPosition(coord)) {\n                            sphericalCoord = this.viewer.dataHelper.cleanPosition(coord);\n                        } else {\n                            sphericalCoord = this.viewer.dataHelper.cleanPosition({\n                                yaw: coord[0],\n                                pitch: coord[1],\n                            });\n                        }\n                        return [sphericalCoord.yaw, sphericalCoord.pitch];\n                    });\n                });\n            }\n        } catch (e) {\n            throw new PSVError(`invalid marker ${this.id} position`, e);\n        }\n\n        const centroid = this.isPolygon ? getPolygonCenter(this.coords[0]) : getPolylineCenter(this.coords[0]);\n        this.state.position = { yaw: centroid[0], pitch: centroid[1] };\n\n        // compute x/y/z positions\n        this.positions3D = this.coords.map((coords) => {\n            return coords.map((coord) => {\n                return this.viewer.dataHelper.sphericalCoordsToVector3({ yaw: coord[0], pitch: coord[1] });\n            });\n        });\n\n        this.state.positions3D = this.positions3D[0];\n    }\n\n    private __getAllPolyPositions(): Point[][] {\n        return this.positions3D.map((positions) => {\n            return this.__getPolyPositions(positions);\n        });\n    }\n\n    /**\n     * Computes viewer coordinates of each point of a polygon/polyline<br>\n     * It handles points behind the camera by creating intermediary points suitable for the projector\n     */\n    private __getPolyPositions(positions: Vector3[]): Point[] {\n        const nbVectors = positions.length;\n\n        // compute if each vector is visible\n        const positions3D = positions.map((vector) => {\n            return {\n                vector: vector,\n                visible: vector.dot(this.viewer.state.direction) > 0,\n            };\n        });\n\n        // get pairs of visible/invisible vectors for each invisible vector connected to a visible vector\n        const toBeComputed: Array<{ visible: Vector3; invisible: Vector3; index: number }> = [];\n        positions3D.forEach((pos, i) => {\n            if (!pos.visible) {\n                const neighbours = [\n                    i === 0 ? positions3D[nbVectors - 1] : positions3D[i - 1],\n                    i === nbVectors - 1 ? positions3D[0] : positions3D[i + 1],\n                ];\n\n                neighbours.forEach((neighbour) => {\n                    if (neighbour.visible) {\n                        toBeComputed.push({\n                            visible: neighbour.vector,\n                            invisible: pos.vector,\n                            index: i,\n                        });\n                    }\n                });\n            }\n        });\n\n        // compute intermediary vector for each pair (the loop is reversed for splice to insert at the right place)\n        toBeComputed.reverse().forEach((pair) => {\n            positions3D.splice(pair.index, 0, {\n                vector: getGreatCircleIntersection(pair.visible, pair.invisible, this.viewer.state.direction),\n                visible: true,\n            });\n        });\n\n        // translate vectors to screen pos\n        return positions3D\n            .filter(pos => pos.visible)\n            .map(pos => this.viewer.dataHelper.vector3ToViewerCoords(pos.vector));\n    }\n}\n","import { utils, type Viewer } from '@photo-sphere-viewer/core';\nimport { SVG_NS } from '../constants';\nimport { type MarkersPlugin } from '../MarkersPlugin';\nimport { MarkerType } from '../MarkerType';\nimport { MarkerConfig } from '../model';\nimport { AbstractStandardMarker } from './AbstractStandardMarker';\n\n/**\n * @internal\n */\nexport class MarkerSvg extends AbstractStandardMarker {\n    get svgElement(): SVGElement {\n        return this.domElement.firstElementChild as any;\n    }\n\n    constructor(viewer: Viewer, plugin: MarkersPlugin, config: MarkerConfig) {\n        super(viewer, plugin, config);\n    }\n\n    override isSvg(): boolean {\n        return true;\n    }\n\n    override createElement(): void {\n        const svgType = this.type === MarkerType.square ? 'rect' : this.type;\n        const elt = document.createElementNS(SVG_NS, svgType);\n        this.element = document.createElementNS(SVG_NS, 'svg');\n        this.element.appendChild(elt);\n        this.afterCreateElement();\n    }\n\n    override update(config: MarkerConfig): void {\n        super.update(config);\n\n        const svgElement = this.svgElement;\n\n        this.needsUpdateSize = true;\n\n        // set content\n        switch (this.type) {\n            case MarkerType.square:\n                this.definition = {\n                    x: 0,\n                    y: 0,\n                    width: this.config.square,\n                    height: this.config.square,\n                };\n                break;\n\n            case MarkerType.rect:\n                if (Array.isArray(this.config.rect)) {\n                    this.definition = {\n                        x: 0,\n                        y: 0,\n                        width: this.config.rect[0],\n                        height: this.config.rect[1],\n                    };\n                } else {\n                    this.definition = {\n                        x: 0,\n                        y: 0,\n                        width: this.config.rect.width,\n                        height: this.config.rect.height,\n                    };\n                }\n                break;\n\n            case MarkerType.circle:\n                this.definition = {\n                    cx: this.config.circle,\n                    cy: this.config.circle,\n                    r: this.config.circle,\n                };\n                break;\n\n            case MarkerType.ellipse:\n                if (Array.isArray(this.config.ellipse)) {\n                    this.definition = {\n                        cx: this.config.ellipse[0],\n                        cy: this.config.ellipse[1],\n                        rx: this.config.ellipse[0],\n                        ry: this.config.ellipse[1],\n                    };\n                } else {\n                    this.definition = {\n                        cx: this.config.ellipse.rx,\n                        cy: this.config.ellipse.ry,\n                        rx: this.config.ellipse.rx,\n                        ry: this.config.ellipse.ry,\n                    };\n                }\n                break;\n\n            case MarkerType.path:\n                this.definition = {\n                    d: this.config.path,\n                };\n                break;\n\n            // no default\n        }\n\n        Object.entries(this.definition).forEach(([prop, value]) => {\n            svgElement.setAttributeNS(null, prop, value as string);\n        });\n\n        // set style\n        if (this.config.svgStyle) {\n            Object.entries(this.config.svgStyle).forEach(([prop, value]) => {\n                svgElement.setAttributeNS(null, utils.dasherize(prop), value);\n            });\n        } else {\n            svgElement.setAttributeNS(null, 'fill', 'rgba(0,0,0,0.5)');\n        }\n    }\n}\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core","import_core","import_core","import_three","import_core","MarkerType","import_core","import_three","import_core","import_core","import_core","import_three","import_three","import_core","import_three","p","import_core","import_core","import_core","import_core"]}