{"version":3,"file":"assets/js/chunks/521.35187ba5c4f41c65f6a0.js","mappings":"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","sources":["webpack://frontend-setup/./src/components/atoms/label/label.tsx","webpack://frontend-setup/./src/components/atoms/marker/marker.tsx","webpack://frontend-setup/./src/features/virtual-tour/constants/pointer-events.ts","webpack://frontend-setup/./src/features/virtual-tour/virtual-tour.tsx","webpack://frontend-setup/./src/features/virtual-tour/components/vr-tour-krpano-view/vr-tour-krpano-view.tsx","webpack://frontend-setup/./src/features/virtual-tour/utilities/interactive-image/element-from-pointer.tsx","webpack://frontend-setup/./src/features/virtual-tour/components/vr-tour-image-view/vr-tour-image-view.tsx","webpack://frontend-setup/./src/features/virtual-tour/utilities/hooks/use-image-pointers.ts","webpack://frontend-setup/./src/features/virtual-tour/components/virtual-tour-wrapper.tsx","webpack://frontend-setup/./src/features/virtual-tour/store/store.ts","webpack://frontend-setup/./src/features/virtual-tour/utilities/hooks/use-mouse-position.ts","webpack://frontend-setup/./src/features/virtual-tour/utilities/interactive-image/image-swap.tsx","webpack://frontend-setup/./src/features/virtual-tour/utilities/hooks/use-panning-image.ts","webpack://frontend-setup/./src/features/virtual-tour/utilities/interactive-image/image-resize.ts","webpack://frontend-setup/./src/features/virtual-tour/utilities/hooks/use-resizing-viewport.ts","webpack://frontend-setup/./src/features/virtual-tour/components/vr-tour-image-view/vr-tour-image-view.scss","webpack://frontend-setup/./src/features/virtual-tour/components/vr-tour-krpano-view/vr-tour-krpano-view.scss","webpack://frontend-setup/./src/features/virtual-tour/virtual-tour.scss"],"sourcesContent":["import { h } from '@atomify/jsx';\nimport { StatusColor } from '@source/utilities/api-formatters';\n\nexport interface LabelProps {\n classes?: string;\n color?: string; // Color class\n formattedStatusColor?: StatusColor; // FormattedStatusColor\n text: string | Text;\n highlighted?: boolean;\n}\n\nconst formattedStatusColorClass: { [key in StatusColor]: string } = {\n green: 'label--positive',\n orange: 'label--attention',\n grey: '',\n purple: 'label--progression',\n red: 'label--urgent',\n};\n\nconst Label = (data: LabelProps) => {\n let color = data.color ? `label--${data.color}` : '';\n\n if (data.formattedStatusColor) {\n color = formattedStatusColorClass[data.formattedStatusColor];\n }\n\n let className = 'c-label';\n className += ` ${color}`;\n if (data.classes) className += ` ${data.classes}`;\n if (data.highlighted) className += ` is-highlighted`;\n\n return {data.text};\n};\n\nexport { Label };\n","import { h } from '@atomify/jsx';\nimport { Label } from '@atoms/label/label';\n\nimport { BPDFunctionalSvg } from '../svg/svg';\n\ntype MarkerVariant =\n | 'eye'\n | '360'\n | 'entrance'\n | 'exit'\n | 'stair'\n | 'generic'\n | 'number'\n | 'house'\n | string;\n\ninterface MarkerGenericProps {\n variant: MarkerVariant;\n icon?: string;\n element?: string;\n url?: string | null;\n onClick?: Function;\n eyeDirection?: string | null;\n tooltip?: string | null;\n classes?: string;\n style?: Object;\n size?: 'small' | 'large';\n}\n\ninterface MarkerBaseProps extends MarkerGenericProps {\n pin?: boolean;\n children?: ChildNode[];\n}\n\ninterface MarkerProps extends MarkerGenericProps {\n number?: string | number;\n}\n\nconst MarkerBase = (data: MarkerBaseProps) => {\n const attributes: { [key: string]: any } = {\n class: `c-marker marker--${data.variant} marker--${data.size || 'large'}`,\n };\n\n if (data.url) attributes.href = data.url;\n if (data.pin) attributes.class += ' marker--pin';\n if (data.classes) attributes.class += ` ${data.classes}`;\n if (data.eyeDirection)\n attributes.class += ` marker--direction-${data.eyeDirection.toLowerCase()}`;\n if (data.onClick) attributes.onClick = data.onClick;\n if (data.style) attributes.style = data.style;\n\n const Tag = data.url ? 'a' : data.element || 'button';\n\n return (\n \n {data.pin && (\n \n \n \n )}\n \n {data.children && data.children}\n {data.icon && }\n {data.tooltip && }\n \n \n );\n};\n\nconst Marker = (data: MarkerProps) => {\n switch (data.variant) {\n case 'eye':\n return (\n \n \n \n \n \n );\n case '360':\n return 360°;\n case 'entrance':\n return ;\n case 'exit':\n return ;\n case 'stair':\n return ;\n case 'generic':\n return ;\n case 'number':\n return {data.number || ''};\n }\n};\n\nexport { Marker, MarkerProps, MarkerVariant };\n","export const virtualView3dPointerEvents = {\n REQUEST_2D_SCENE: 'virtual-view::request2dScene',\n};\n\nexport const virtualView2dPointerEvents = {\n LABEL_FOCUS: 'virtual-view::cnLabelFocus',\n LABEL_HOVER: 'virtual-view::cnLabelHover',\n};\n","import {\n Component,\n defineElement,\n FC,\n useBindMethod,\n useElement,\n useListen,\n useProp,\n} from '@atomify/hooks';\nimport { h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { ButtonSquare } from '@atoms/button-square/button-square';\nimport { virtualView3dPointerEvents } from '@features/virtual-tour/constants';\nimport {\n getViewInStore,\n popView,\n pushView,\n VirtualTourState,\n virtualTourStore,\n} from '@features/virtual-tour/store';\nimport {\n VirtualTourMinimap,\n VirtualTourPointer,\n VirtualView,\n VRTourImageInterface,\n VRTourKRPanoInterface,\n VRTourPointerFilter,\n} from '@features/virtual-tour/types';\nimport { krpanoEmittedEvents } from '@molecules/krpano/constants';\nimport { getPrefixedUrl } from '@utilities/get-prefixed-url';\nimport { useStylesheet } from '@utilities/hooks';\n\nimport style from './virtual-tour.scss';\n\nconst KRPANO_GO_BACK_HOOK = 'krpano-go-back-button';\nconst KRPANO_ZOOM_IN_HOOK = 'krpano-zoom-in-button';\nconst KRPANO_ZOOM_OUT_HOOK = 'krpano-zoom-out-button';\nconst MINIMAP_CONTAINER_HOOK = 'virtual-tour-minimap-container';\n\nconst VIRTUAL_TOUR_2D = 'virtual-tour--2d';\nconst VIRTUAL_TOUR_3D = 'virtual-tour--3d';\nconst VIRTUAL_TOUR_MINIMAP = 'virtual-tour--has-minimap';\n\nconst warn = (data: any) => console.warn('[virtual-tour]: Missing view data >>>> ', data);\n\nexport interface VirtualTourElement extends Component {\n focusPointer: (isHighlighted: VRTourPointerFilter) => void;\n setMinimap: (minimap: VirtualTourMinimap, currentView: VirtualView) => void;\n}\n\nconst VirtualTour: FC = ({ element }) => {\n useStylesheet(style);\n const [onMissingData] = useProp<(sceneId: string) => void>('onMissingData', warn);\n const [onClose] = useProp('onClose', null);\n const [pointerHighlighted] = useProp('pointerHighlighted', null);\n\n const [vrStore, subscribe] = useStore(virtualTourStore);\n\n const krPanoContainer = useElement('vr-tour-krpano-view');\n const imageContainer = useElement('vr-tour-image-view');\n\n const goBackButton = useElement(`[js-hook-${KRPANO_GO_BACK_HOOK}]`);\n const zoomInButton = useElement(`[js-hook-${KRPANO_ZOOM_IN_HOOK}]`);\n const zoomOutButton = useElement(`[js-hook-${KRPANO_ZOOM_OUT_HOOK}]`);\n\n const minimapContainer = useElement(`[js-hook-${MINIMAP_CONTAINER_HOOK}]`);\n\n subscribe(\n async ({ [element.id]: { viewStack, currentView, minimap } }) => {\n if (!viewStack.length || !currentView) return;\n\n currentViewType = currentView.type;\n\n if (currentViewType === '3d') {\n element.classList.remove(VIRTUAL_TOUR_2D);\n element.classList.add(VIRTUAL_TOUR_3D);\n } else {\n element.classList.remove(VIRTUAL_TOUR_3D);\n element.classList.add(VIRTUAL_TOUR_2D);\n }\n element.classList[minimap ? 'add' : 'remove'](VIRTUAL_TOUR_MINIMAP);\n minimap && setMinimap(minimap, currentView);\n\n if (viewStack.length === 1) {\n goBackButton.current!.setAttribute('disabled', 'true');\n } else {\n goBackButton.current!.removeAttribute('disabled');\n }\n },\n [element.id],\n );\n\n function onPointerClick(pointer: VirtualTourPointer) {\n if (!pointer.sceneId) return;\n const viewInStore = getViewInStore(element.id, pointer.sceneId);\n const isSameScene = viewInStore?.id === vrStore[element.id].currentView?.id;\n\n if (viewInStore) {\n !isSameScene && pushView(element.id, pointer.sceneId);\n return;\n }\n\n onMissingData(pointer.sceneId);\n }\n\n useBindMethod('focusPointer', (isHighlighted: VRTourPointerFilter) => {\n imageContainer.current?.highlightPointers(isHighlighted);\n });\n\n let krpanoBackDisabled = true;\n let currentViewType: '2d' | '3d';\n\n useListen(document, virtualView3dPointerEvents.REQUEST_2D_SCENE, (e) => {\n if (e.detail.tourId !== element.id) return;\n pushView(element.id, e.detail.sceneId);\n });\n\n useListen(krPanoContainer, krpanoEmittedEvents.TOGGLE_GO_BACK, (e) => {\n const { viewStack } = vrStore[`${element.id}`];\n krpanoBackDisabled = e.detail.disabled;\n\n if (viewStack.length === 1 && krpanoBackDisabled) {\n goBackButton.current!.setAttribute('disabled', 'true');\n } else {\n goBackButton.current!.removeAttribute('disabled');\n }\n });\n\n useListen(krPanoContainer, krpanoEmittedEvents.TOGGLE_ZOOM_IN, (e) => {\n if (e.detail.disabled) {\n zoomInButton.current!.setAttribute('disabled', 'true');\n } else {\n zoomInButton.current!.removeAttribute('disabled');\n }\n });\n\n useListen(krPanoContainer, krpanoEmittedEvents.TOGGLE_ZOOM_OUT, (e) => {\n if (e.detail.disabled) {\n zoomOutButton.current!.setAttribute('disabled', 'true');\n } else {\n zoomOutButton.current!.removeAttribute('disabled');\n }\n });\n\n const onBack = () => {\n if (currentViewType == '2d' || krpanoBackDisabled) popView(element.id);\n else krPanoContainer.current?.goBack();\n };\n const onZoomIn = () => krPanoContainer.current?.zoomIn();\n const onZoomOut = () => krPanoContainer.current?.zoomOut();\n\n function setMinimap(minimap: VirtualTourMinimap, currentView: VirtualView) {\n if (!minimapContainer.current) return;\n minimapContainer.current.innerHTML = '';\n\n minimapContainer.current.append(\n \n \n {minimap.pointers.map((p) => (\n onPointerClick(p)}\n />\n ))}\n ,\n );\n }\n\n useBindMethod('setMinimap', setMinimap);\n\n return (\n \n \n \n \n \n \n \n {onClose && (\n \n )}\n \n \n \n \n \n );\n};\n\nVirtualTour.props = {\n onMissingData: {\n type: Function,\n },\n onClose: {\n type: Function,\n },\n pointerHighlighted: {\n type: Function,\n },\n};\n\ndefineElement('virtual-tour', VirtualTour);\n","import { defineElement, FC, onDidLoad, useBindMethod, useElement, useProp } from '@atomify/hooks';\nimport { h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { VirtualTourState, virtualTourStore } from '@features/virtual-tour/store';\nimport { VRTourKRPanoInterface } from '@features/virtual-tour/types/view';\nimport { KrpanoElement } from '@molecules/krpano';\nimport { updateSelectedPano } from '@store/krpano';\nimport { useStylesheet } from '@utilities/hooks';\n\nimport style from './vr-tour-krpano-view.scss';\n\nconst SCENE_PREFIX = 'scene_';\n\nconst VRTourKRPanoView: FC = () => {\n const [krpanoId] = useProp('krpanoId');\n const [vrTourId] = useProp('vrTourId');\n const krpano = useElement('bpd-krpano');\n const [vrStore, subscribe] = useStore(virtualTourStore);\n\n useStylesheet(style);\n\n onDidLoad(() => {\n handleView(vrStore);\n });\n\n subscribe(handleView, [vrTourId]);\n\n function handleView(state: VirtualTourState) {\n const currentView = state[vrTourId]?.currentView;\n\n if (currentView?.type === '3d') {\n const sceneId = !currentView.apartmentBuildingId\n ? SCENE_PREFIX + currentView.id\n : undefined;\n updateSelectedPano(vrTourId, currentView.source, sceneId);\n }\n }\n\n const goBack = () => krpano.current?.goBack();\n const zoomIn = () => krpano.current?.zoomIn();\n const zoomOut = () => krpano.current?.zoomOut();\n\n useBindMethod('zoomIn', zoomIn);\n useBindMethod('zoomOut', zoomOut);\n useBindMethod('goBack', goBack);\n\n return (\n \n \n \n );\n};\n\nVRTourKRPanoView.props = {\n krpanoId: {\n type: String,\n required: true,\n reflectToAttr: true,\n },\n vrTourId: {\n type: String,\n required: true,\n },\n};\n\ndefineElement('vr-tour-krpano-view', VRTourKRPanoView);\n","import { h } from '@atomify/jsx';\nimport { Label } from '@atoms/label/label';\nimport { Marker } from '@atoms/marker/marker';\nimport { VirtualTourPointer } from '@features/virtual-tour/types';\n\nexport const elementFromPointer = (\n pointer: VirtualTourPointer,\n onPointerClick: (pointer: VirtualTourPointer) => void,\n onPointerHover: (id: string, active: boolean) => void,\n): Element => {\n if (pointer.type === 'text') {\n return (\n \n \n \n );\n } else if (pointer.type === 'label' && pointer.constructionNumber) {\n const { id, status, url, identifier } = pointer.constructionNumber;\n return (\n url && (window.location.href = url)}\n onMouseEnter={() => onPointerHover(id!, true)}\n onMouseLeave={() => onPointerHover(id!, false)}>\n \n \n );\n } else {\n const [type, eyeDirection = null] = pointer.type.split('-');\n return (\n onPointerClick(pointer)}\n eyeDirection={eyeDirection}\n style={{\n left: `${pointer.position?.[1]}%`,\n top: `${pointer.position?.[0]}%`,\n }}\n />\n );\n }\n};\n","import {\n defineElement,\n FC,\n onDidLoad,\n useBindMethod,\n useElement,\n useEvent,\n useListen,\n useProp,\n} from '@atomify/hooks';\nimport { h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { debounce, Procedure } from '@bpd-library/utilities';\nimport { virtualView2dPointerEvents } from '@features/virtual-tour/constants';\nimport { VirtualTourState, virtualTourStore } from '@features/virtual-tour/store';\nimport {\n ScreenCoordinates,\n VirtualTourImageView,\n VRTourImageInterface,\n VRTourPointerFilter,\n} from '@features/virtual-tour/types';\nimport {\n useMousePosition,\n usePanningImage,\n useResizableViewport,\n} from '@features/virtual-tour/utilities/hooks';\nimport { useImagePointers } from '@features/virtual-tour/utilities/hooks/use-image-pointers';\nimport { useStylesheet } from '@utilities/hooks';\nimport { deviceWidth, useMedia } from '@utilities/media-query';\n\nimport style from './vr-tour-image-view.scss';\n\nconst VIEWPORT_MOUSE_AWAY_CLASS = 'vr-tour-image-view__viewport--mouse-away';\n\nconst VRTourImageView: FC = () => {\n useStylesheet(style);\n const [onPointerClick] = useProp('onPointerClick');\n const [vrTourId] = useProp('vrTourId', '');\n const [pointerHighlighted] = useProp('pointerHighlighted', null);\n\n const [vrStore, subscribe] = useStore(virtualTourStore);\n\n const viewport = useElement('[js-hook-vr-tour-image-view-viewport]');\n const imageContainer = useElement('[js-hook-vr-tour-image-view-image-container]');\n\n const pointerHover = useEvent({ eventName: virtualView2dPointerEvents.LABEL_HOVER });\n const onPointerHover = (id: string, active: boolean) => {\n pointerHover.emit({ id, active });\n };\n\n const panningImage = usePanningImage({\n imageContainer,\n viewport,\n });\n\n const imagePointers = useImagePointers({\n imageContainer,\n onPointerClick,\n onPointerHover,\n });\n\n const {\n dimensions: viewportDimensions,\n position: viewportPosition,\n refresh,\n } = useResizableViewport({\n viewport,\n onResize: panningImage.resize,\n });\n\n const { updatePosition } = useMousePosition({\n viewport,\n onUpdate: panningImage.pan,\n });\n\n const onDimensionsChanged = debounce(refresh, 100);\n\n useListen(window, 'resize', onDimensionsChanged);\n useListen(window, 'scroll', onDimensionsChanged);\n useListen(document, 'properties-view::map-resized', onDimensionsChanged);\n\n const onMouseEnter = (e: MouseEvent) => {\n updatePosition(e, viewportDimensions, viewportPosition);\n viewport.current?.classList.remove(VIEWPORT_MOUSE_AWAY_CLASS);\n };\n const onMouseMove = (e: MouseEvent) => {\n window.requestAnimationFrame(() => updatePosition(e, viewportDimensions, viewportPosition));\n };\n const onMouseLeave = () => {\n viewport.current?.classList.add(VIEWPORT_MOUSE_AWAY_CLASS);\n };\n\n const setupViewportBehavior = () => {\n const behavior = deviceWidth.isLaptopAndBigger() ? 'track-mouse' : 'scroll';\n panningImage.setInteractionBehavior(behavior);\n\n if (behavior === 'track-mouse') {\n viewport.current?.addEventListener('mousemove', onMouseMove);\n viewport.current?.addEventListener('mouseenter', onMouseEnter);\n viewport.current?.addEventListener('mouseleave', onMouseLeave);\n } else {\n viewport.current?.removeEventListener('mousemove', onMouseMove);\n viewport.current?.removeEventListener('mouseenter', onMouseEnter);\n viewport.current?.removeEventListener('mouseleave', onMouseLeave);\n }\n };\n\n onDidLoad(() => {\n refresh();\n handleView(vrStore);\n setupViewportBehavior();\n useMedia(setupViewportBehavior);\n });\n\n subscribe(handleView, [vrTourId]);\n\n function handleView(state: VirtualTourState) {\n const currentView = state[vrTourId]?.currentView;\n\n if (currentView?.type === '2d') {\n setView(currentView);\n }\n }\n\n const setView = async (view: VirtualTourImageView) => {\n if (!imageContainer.current) return;\n const { pointers, source } = view;\n\n await panningImage.setSource(source);\n panningImage.resize(viewportDimensions);\n\n imagePointers.setPointers(pointers);\n pointerHighlighted && highlightPointers(pointerHighlighted);\n };\n\n const highlightPointers = (filter: VRTourPointerFilter) => {\n const highlighted = imagePointers.highlight(filter);\n if (!highlighted.length) return;\n\n const focus = highlighted.reduce(\n (accumulatedCoordinates, currentPointer, index) => {\n const [y, x] = currentPointer.pointer.position;\n const retVal: ScreenCoordinates = {\n x: accumulatedCoordinates.x + x,\n y: accumulatedCoordinates.y + y,\n };\n if (index < highlighted.length - 1) return retVal;\n return {\n x: retVal.x / highlighted.length,\n y: retVal.y / highlighted.length,\n };\n },\n { x: 0, y: 0 },\n );\n panningImage.focusPoint(focus);\n };\n\n useBindMethod('highlightPointers', highlightPointers);\n\n return (\n \n \n \n );\n};\n\nVRTourImageView.props = {\n onPointerClick: {\n type: Function,\n required: true,\n },\n pointerHighlighted: {\n type: Function,\n },\n vrTourId: {\n type: String,\n required: true,\n },\n};\n\ndefineElement('vr-tour-image-view', VRTourImageView);\n","import { createHook } from '@atomify/hooks';\nimport { VirtualTourPointer, VRTourPointerFilter } from '@features/virtual-tour/types';\nimport { elementFromPointer } from '@features/virtual-tour/utilities/interactive-image/element-from-pointer';\n\nexport interface ImagePointersHookProps {\n imageContainer: { current: HTMLElement | null };\n onPointerClick: (pointer: VirtualTourPointer) => void;\n onPointerHover: (id: string, active: boolean) => void;\n}\n\ntype ImagePointer = {\n pointer: VirtualTourPointer;\n pointerHTML: Element;\n};\n\nconst IS_HIGHLIGHTED_CLASS = 'is-highlighted';\n\nexport const useImagePointers = ({\n imageContainer,\n onPointerClick,\n onPointerHover,\n}: ImagePointersHookProps) => {\n let imagePointers: ImagePointer[];\n\n return createHook({\n onDidLoad: () => ({\n setPointers: (pointers: VirtualTourPointer[]) => {\n imagePointers = pointers.map((pointer) => ({\n pointer,\n pointerHTML: elementFromPointer(pointer, onPointerClick, onPointerHover),\n }));\n imagePointers.forEach(({ pointerHTML }) =>\n imageContainer.current?.append(pointerHTML),\n );\n },\n highlight: (test: VRTourPointerFilter): ImagePointer[] => {\n const highlighted = imagePointers.filter(({ pointer }) => test(pointer));\n imagePointers.forEach((pointerItem: ImagePointer) => {\n const pointerHighlighted = highlighted.includes(pointerItem);\n pointerItem.pointerHTML.classList[pointerHighlighted ? 'add' : 'remove'](\n IS_HIGHLIGHTED_CLASS,\n );\n });\n return highlighted;\n },\n }),\n });\n};\n","import { Component, defineElement, FC, onDidLoad, useElement, useProp } from '@atomify/hooks';\nimport { h } from '@atomify/jsx';\nimport { setData } from '@features/virtual-tour/store';\nimport { VirtualView } from '@features/virtual-tour/types';\n\nconst VirtualTourWrapper: FC = () => {\n const [viewsJSON] = useProp('views');\n const [firstViewId] = useProp('firstSceneId', null);\n\n const [vrTourId] = useProp('vrTourId');\n const [controls] = useProp('controls', false);\n\n const virtualTour = useElement('virtual-tour');\n\n let views: VirtualView[];\n\n try {\n views = JSON.parse(viewsJSON) as VirtualView[];\n } catch (e) {\n console.log('Invalid JSON', e);\n }\n\n onDidLoad(async () => {\n if (!views) return;\n await virtualTour.current?.componentOnReady();\n setData(vrTourId, { views, firstViewId });\n });\n\n return ;\n};\n\nVirtualTourWrapper.props = {\n views: {\n type: String,\n required: true,\n reflectToAttr: true,\n },\n firstSceneId: {\n type: String,\n reflectToAttr: true,\n },\n vrTourId: {\n type: String,\n required: true,\n reflectToAttr: true,\n },\n controls: {\n type: Boolean,\n },\n};\n\ndefineElement('virtual-tour-wrapper', VirtualTourWrapper);\n","import {\n VirtualTourImageView,\n VirtualTourMinimap,\n VirtualView,\n VRTourPointerFilter,\n VRTourViewFilter,\n} from '@features/virtual-tour/types/view';\nimport createStore from '@utilities/store';\n\ninterface VirtualTourStateItem {\n viewStack: string[];\n views: VirtualView[];\n currentView?: VirtualView;\n minimap?: VirtualTourMinimap;\n}\n\nexport interface VirtualTourState {\n [id: string]: VirtualTourStateItem;\n}\n\nconst ADD_VIRTUAL_TOUR_DATA = 'addVirtualTourData';\nconst UPDATE_VIRTUAL_TOUR_DATA = 'updateVirtualTourData';\nconst PUSH_VIEW = 'pushView';\nconst POP_VIEW = 'popView';\n\nconst initialState: VirtualTourState = {};\n\nconst getLastView = (tour: VirtualTourStateItem) => {\n const viewId = tour.viewStack[tour.viewStack.length - 1];\n const view = tour.views.find((v) => v.id === viewId);\n\n return view;\n};\n\nconst actions = {\n [ADD_VIRTUAL_TOUR_DATA]: (\n state: VirtualTourState,\n data: {\n tourId: string;\n views: VirtualView[];\n viewId?: string;\n minimap?: VirtualTourMinimap;\n },\n ) => {\n const { tourId, views, viewId, minimap } = data;\n const tour: VirtualTourStateItem = { views, viewStack: [viewId || views[0].id], minimap };\n tour.currentView = getLastView(tour);\n\n state[tourId] = tour;\n return state;\n },\n [UPDATE_VIRTUAL_TOUR_DATA]: (\n state: VirtualTourState,\n data: {\n tourId: string;\n views: VirtualView[];\n viewId?: string;\n minimap?: VirtualTourMinimap;\n },\n ) => {\n const { tourId, views: newViews, viewId, minimap } = data;\n const filteredViews = newViews.filter(\n ({ id }) => !state[tourId].views.find((v) => v.id === id),\n );\n const tour: VirtualTourStateItem = {\n views: [...state[tourId].views, ...filteredViews],\n viewStack:\n viewId && viewId !== state[tourId].currentView?.id\n ? [...state[tourId].viewStack, viewId]\n : state[tourId].viewStack,\n minimap,\n };\n tour.currentView = getLastView(tour);\n\n state[tourId] = tour;\n return state;\n },\n [PUSH_VIEW]: (\n state: VirtualTourState,\n { tourId, viewId }: { tourId: string; viewId: string },\n ) => {\n const tour = { ...state[tourId] };\n tour.viewStack = [...tour.viewStack, viewId];\n tour.currentView = getLastView(tour);\n\n state[tourId] = tour;\n return state;\n },\n [POP_VIEW]: (state: VirtualTourState, tourId: string) => {\n const tour = { ...state[tourId] };\n tour.viewStack = tour.viewStack.slice(0, -1);\n tour.currentView = getLastView(tour);\n\n state[tourId] = tour;\n return state;\n },\n};\n\nexport const pushView = (tourId: string, viewId: string) => {\n virtualTourStore.dispatch(PUSH_VIEW, { tourId, viewId });\n};\n\nexport const popView = (tourId: string) => {\n virtualTourStore.dispatch(POP_VIEW, tourId);\n};\n\nexport const setData = (\n tourId: string,\n data: { views: VirtualView[]; firstViewId?: string | null; minimap?: VirtualTourMinimap },\n) => {\n const { views, firstViewId, minimap } = data;\n const action = virtualTourStore.getState()[tourId]\n ? UPDATE_VIRTUAL_TOUR_DATA\n : ADD_VIRTUAL_TOUR_DATA;\n virtualTourStore.dispatch(action, {\n tourId,\n views,\n viewId: firstViewId,\n minimap,\n });\n};\n\nexport const getViewInStore = (tourId: string, viewId: string) => {\n const vrState = virtualTourStore.getState();\n return vrState[tourId] && vrState[tourId].views.find((v) => v.id === viewId);\n};\n\nexport const findPointerInCurrentView = (tourId: string, filter: VRTourPointerFilter) => {\n const currentView = virtualTourStore.getState()[tourId].currentView as VirtualTourImageView;\n if (currentView?.type !== '2d') return;\n return currentView.pointers.find(filter);\n};\n\nexport const findView = (tourId: string, filter: VRTourViewFilter) => {\n const views = virtualTourStore.getState()[tourId].views;\n return views.find(filter);\n};\n\nexport const virtualTourStore = createStore({ initialState, actions });\n","import { createHook } from '@atomify/hooks';\nimport {\n Dimensions,\n InteractionState,\n ScreenCoordinates,\n} from '@features/virtual-tour/types/interaction';\n\nexport interface MousePositionHookProps {\n viewport: { current: HTMLElement | null };\n onUpdate: (position: InteractionState) => void;\n ignoredElements?: string[];\n}\n\nexport const useMousePosition = ({ viewport, onUpdate }: MousePositionHookProps) => {\n const interactionState: InteractionState = { inputMode: 'mouse' };\n\n function updatePosition(\n e: MouseEvent | TouchEvent,\n viewportDimensions: Dimensions,\n viewportPosition: ScreenCoordinates,\n ) {\n\n // if (e instanceof AppTouchEvent) return; NOTE this is STILL a bug in Safari desktop anno jan 2024. Instead of instanceof AppTouchEvent, we use 'touches' in e\n if ('touches' in e) return;\n\n if (!viewport.current || interactionState.ignoreTouch) return;\n\n const { x: viewportX, y: viewportY } = viewportPosition;\n const { width, height } = viewportDimensions;\n\n const { clientX: mouseX, clientY: mouseY } = e;\n\n // mouse coordinate system translated to top left corner of viewport\n const translated: ScreenCoordinates = {\n x: mouseX - viewportX,\n y: mouseY - viewportY,\n };\n\n // mouse offset from the viewport center\n interactionState.centerOffset = {\n x: translated.x / width - 0.5,\n y: translated.y / height - 0.5,\n };\n\n interactionState.position = translated;\n\n return onUpdate(interactionState);\n }\n\n return createHook({\n onDidLoad: () => ({ interactionState, updatePosition }),\n });\n};\n","import { h } from '@atomify/jsx';\nimport { Image } from '@bpd-library/components';\nimport { nextEvent } from '@utilities/next-event';\n\nexport const imageSwap = async (\n imageContainer: HTMLElement,\n source: string,\n): Promise => {\n const imageElement = (\n \n );\n const image = imageElement.querySelector('img') as HTMLImageElement;\n\n if (imageContainer.querySelector('.vr-tour-image-view__image')) {\n imageContainer.innerHTML = '';\n }\n\n imageContainer.append(imageElement);\n await nextEvent(image, 'load');\n\n return image;\n};\n","import { createHook } from '@atomify/hooks';\nimport {\n CenterOffset,\n Dimensions,\n InteractionBehavior,\n InteractionState,\n ScreenCoordinates,\n} from '@features/virtual-tour/types';\nimport { imageResize, imageSwap } from '@features/virtual-tour/utilities/interactive-image';\n\nexport interface InteractiveImageHookProps {\n imageContainer: { current: HTMLElement | null };\n viewport: { current: HTMLElement | null };\n onResize?: (dimensions: Dimensions) => void;\n}\n\nexport const usePanningImage = ({\n imageContainer,\n viewport,\n onResize,\n}: InteractiveImageHookProps) => {\n const imageMovement: ScreenCoordinates = { x: 0, y: 0 };\n let naturalDimensions: Dimensions;\n let interactionBehavior: InteractionBehavior;\n\n return createHook({\n onDidLoad: () => {\n return {\n setInteractionBehavior: (behavior: InteractionBehavior) => {\n if (interactionBehavior === behavior) return;\n interactionBehavior = behavior;\n\n if (!imageContainer.current) return;\n if (behavior === 'scroll') {\n imageContainer.current.style.transform = 'none';\n } else if (behavior === 'track-mouse' && viewport.current) {\n imageContainer.current.style.transform = 'translate(-50%, -50%)';\n viewport.current.scrollLeft = 0;\n viewport.current.scrollTop = 0;\n }\n },\n setSource: async (source: string) => {\n if (!imageContainer.current || !viewport.current) return;\n\n viewport.current.scrollLeft = 0;\n viewport.current.scrollTop = 0;\n const image = await imageSwap(imageContainer.current, source);\n\n naturalDimensions = {\n width: image?.naturalWidth || 0,\n height: image?.naturalHeight || 0,\n };\n\n return image;\n },\n pan: ({ centerOffset }: InteractionState) => {\n if (!imageContainer.current) return;\n\n const imageTranslate: CenterOffset = {\n x: centerOffset!.x * imageMovement.x * 100 + 50,\n y: centerOffset!.y * imageMovement.y * 100 + 50,\n };\n\n imageContainer.current.style.transform = `translate(-${imageTranslate.x}%, -${imageTranslate.y}%)`;\n },\n focusPoint: ({ x, y }: ScreenCoordinates) => {\n if (interactionBehavior === 'track-mouse' && imageContainer.current) {\n const pointOffset: CenterOffset = {\n x: x - 50,\n y: y - 50,\n };\n\n const imageTranslate: CenterOffset = {\n x: pointOffset!.x * imageMovement.x + 50,\n y: pointOffset!.y * imageMovement.y + 50,\n };\n imageContainer.current.style.transform = `translate(-${imageTranslate.x}%, -${imageTranslate.y}%)`;\n } else if (interactionBehavior === 'scroll' && viewport.current) {\n const imageScroll: ScreenCoordinates = {\n x: (x / 100) * imageMovement.x * naturalDimensions.width,\n y: (y / 100) * imageMovement.y * naturalDimensions.height,\n };\n\n viewport.current.scrollTo({\n left: imageMovement.x > 0.01 ? imageScroll.x : 0,\n top: imageMovement.y > 0.01 ? imageScroll.y : 0,\n behavior: 'smooth',\n });\n }\n },\n resize: (viewportDimensions: Dimensions) => {\n if (!imageContainer.current || !naturalDimensions) return;\n\n const { width = 0, height = 0 } =\n imageResize(naturalDimensions, viewportDimensions) || {};\n\n naturalDimensions = { width, height };\n\n imageContainer.current.style.width = `${width}px`;\n imageContainer.current.style.height = `${height}px`;\n\n imageMovement.x = (width - viewportDimensions.width) / width;\n imageMovement.y = (height - viewportDimensions.height) / height;\n\n if (interactionBehavior === 'scroll' && viewport.current) {\n const imageScroll: ScreenCoordinates = {\n x: (imageMovement.x * width) / 2,\n y: (imageMovement.y * height) / 2,\n };\n\n viewport.current.scrollTo({\n left: imageMovement.x > 0.01 ? imageScroll.x : 0,\n top: imageMovement.y > 0.01 ? imageScroll.y : 0,\n behavior: 'smooth',\n });\n }\n onResize && onResize({ width, height });\n },\n imageMovement,\n naturalDimensions,\n };\n },\n });\n};\n","import { Dimensions } from '@features/virtual-tour/types';\n\nexport const imageResize = (\n { width: naturalWidth, height: naturalHeight }: Dimensions,\n { width: viewportWidth, height: viewportHeight }: Dimensions,\n): Dimensions | null => {\n const imageRatio = naturalWidth / naturalHeight;\n const viewportRatio = viewportWidth / viewportHeight;\n if (isNaN(imageRatio) || isNaN(viewportRatio) || imageRatio * viewportRatio === 0) return null;\n\n const dimensions: Dimensions =\n imageRatio < viewportRatio\n ? { width: viewportWidth, height: Math.round(viewportWidth / imageRatio) }\n : { width: Math.round(viewportHeight * imageRatio), height: viewportHeight };\n\n return dimensions;\n};\n","import { onDidLoad } from '@atomify/hooks';\nimport { Dimensions, ScreenCoordinates } from '@features/virtual-tour/types';\n\nexport interface ResizingViewportHookProps {\n viewport: { current: HTMLElement | null };\n onResize: (dimensions: Dimensions) => void;\n}\n\nexport const useResizableViewport = ({ viewport, onResize }: ResizingViewportHookProps) => {\n const dimensions: Dimensions = {\n width: 0,\n height: 0,\n };\n\n const position: ScreenCoordinates = {\n x: 0,\n y: 0,\n };\n\n const getViewportElementRect = () => {\n const { width, height, x, y } = viewport.current!.getBoundingClientRect();\n const widthFloored = Math.floor(width);\n const heightFloored = Math.floor(height);\n\n return { width: widthFloored, height: heightFloored, x, y };\n };\n\n const refresh = () => {\n const { width, height, x, y } = getViewportElementRect();\n position.x = x;\n position.y = y;\n\n if (dimensions.width !== width || dimensions.height !== height) {\n dimensions.width = width;\n dimensions.height = height;\n onResize(dimensions);\n }\n };\n\n onDidLoad(() => {\n if (!viewport.current) return;\n refresh();\n });\n\n return { dimensions, position, refresh };\n};\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"vr-tour-image-view{height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:100%}.virtual-tour--2d vr-tour-image-view{opacity:1;pointer-events:inherit}.vr-tour-image-view__viewport{height:100%;overflow:scroll;position:relative;width:100%}.vr-tour-image-view__image-container{left:0;position:absolute;top:0}.vr-tour-image-view__viewport--mouse-away .vr-tour-image-view__image-container{-webkit-transition:-webkit-transform 60ms ease;transition:-webkit-transform 60ms ease;transition:transform 60ms ease;transition:transform 60ms ease,-webkit-transform 60ms ease}.vr-tour-image-view__pointer{position:absolute;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}html.is-touch--with-mouse .vr-tour-image-view__pointer:hover,html:not(.is-touch) .vr-tour-image-view__pointer:hover{-webkit-transform:translate(-50%,-50%) translateY(-.5rem);transform:translate(-50%,-50%) translateY(-.5rem)}.vr-tour-image-view__pointer--label{background-color:transparent}@media only screen and (min-width:77.5em){.vr-tour-image-view__viewport{overflow:hidden}.vr-tour-image-view__image-container{left:50%;top:50%}}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"vr-tour-krpano-view{height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;width:100%}.virtual-tour--3d vr-tour-krpano-view{opacity:1;pointer-events:inherit}.vr-tour-krpano-view__wrapper{height:100%;position:relative;width:100%}.vr-tour-krpano-view__krpano{height:100%;left:0;position:absolute;top:0;width:100%}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".c-virtual-tour{height:100%;position:relative;width:100%}.virtual-tour__navigation{position:absolute;right:0;top:0;z-index:10}.has--transparent-header .hero-vr__vr-view .virtual-tour__navigation{padding-top:6.5rem;z-index:100}.virtual-tour__controls{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.virtual-tour__control--3d-only{display:none;opacity:0;pointer-events:none;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.virtual-tour--3d .virtual-tour__control--3d-only{display:block;opacity:1;pointer-events:inherit}.virtual-tour__minimap-container{background-color:var(--color-white);height:auto;position:absolute;right:0;top:5.4rem;width:17.6rem;z-index:2}.virtual-tour__minimap{height:100%;margin:3px;width:100%}.virtual-tour__minimap-image{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.virtual-tour__minimap-pointer{background-color:var(--color-grey-90);border:2px solid var(--color-white);border-radius:50%;display:block;height:1.6rem;position:absolute;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);-webkit-transition:-webkit-transform .1s ease-out;transition:-webkit-transform .1s ease-out;transition:transform .1s ease-out;transition:transform .1s ease-out,-webkit-transform .1s ease-out;width:1.6rem}.virtual-tour__minimap-pointer.is--selected{background-color:var(--color-selected)}html.is-touch--with-mouse .virtual-tour__minimap-pointer:hover,html:not(.is-touch) .virtual-tour__minimap-pointer:hover{-webkit-transform:translate(-50%,-50%) scale(1.2);transform:translate(-50%,-50%) scale(1.2)}@media only screen and (min-width:48em){.has--transparent-header .hero-vr__vr-view .virtual-tour__navigation{margin-top:7.2rem;padding-top:0}.virtual-tour--has-minimap .virtual-tour__controls{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.virtual-tour--has-minimap.virtual-tour--3d .virtual-tour__controls{margin-right:-50%}}@media only screen and (max-width:47.96875em){.virtual-tour__minimap{display:none}}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n"],"names":["formattedStatusColorClass","green","orange","grey","purple","red","Label","data","color","formattedStatusColor","className","classes","highlighted","class","text","MarkerBase","attributes","variant","size","url","href","pin","eyeDirection","toLowerCase","onClick","style","Tag","element","name","children","icon","tooltip","Marker","number","virtualView3dPointerEvents","REQUEST_2D_SCENE","virtualView2dPointerEvents","LABEL_FOCUS","LABEL_HOVER","KRPANO_GO_BACK_HOOK","KRPANO_ZOOM_IN_HOOK","KRPANO_ZOOM_OUT_HOOK","VIRTUAL_TOUR_2D","VIRTUAL_TOUR_3D","warn","console","VirtualTour","onMissingData","onClose","pointerHighlighted","vrStore","subscribe","useStore","krPanoContainer","imageContainer","goBackButton","zoomInButton","zoomOutButton","minimapContainer","onPointerClick","pointer","sceneId","viewInStore","id","isSameScene","currentView","async","viewStack","minimap","length","currentViewType","type","classList","remove","add","setMinimap","current","setAttribute","removeAttribute","isHighlighted","highlightPointers","krpanoBackDisabled","document","e","detail","tourId","disabled","innerHTML","append","src","source","alt","pointers","map","p","left","position","top","goBack","svg","ariaLabel","hook","zoomIn","zoomOut","props","Function","VRTourKRPanoView","krpanoId","vrTourId","krpano","handleView","state","apartmentBuildingId","undefined","String","required","reflectToAttr","elementFromPointer","onPointerHover","label","constructionNumber","status","identifier","window","location","onMouseEnter","onMouseLeave","split","amount","VIEWPORT_MOUSE_AWAY_CLASS","VRTourImageView","viewport","pointerHover","eventName","panningImage","imagePointers","onDidLoad","setPointers","pointerHTML","forEach","highlight","test","filter","pointerItem","includes","useImagePointers","active","emit","dimensions","viewportDimensions","viewportPosition","refresh","onResize","resize","updatePosition","onUpdate","pan","onDimensionsChanged","onMouseMove","requestAnimationFrame","setupViewportBehavior","behavior","setInteractionBehavior","addEventListener","removeEventListener","setView","view","setSource","focus","reduce","accumulatedCoordinates","currentPointer","index","y","x","retVal","focusPoint","VirtualTourWrapper","viewsJSON","firstViewId","controls","virtualTour","views","JSON","parse","log","componentOnReady","firstSceneId","Boolean","ADD_VIRTUAL_TOUR_DATA","UPDATE_VIRTUAL_TOUR_DATA","PUSH_VIEW","POP_VIEW","getLastView","tour","viewId","find","v","actions","newViews","filteredViews","slice","pushView","virtualTourStore","dispatch","popView","setData","action","getState","getViewInStore","vrState","findPointerInCurrentView","findView","initialState","useMousePosition","interactionState","inputMode","ignoreTouch","viewportX","viewportY","width","height","clientX","mouseX","clientY","mouseY","translated","centerOffset","usePanningImage","imageMovement","naturalDimensions","interactionBehavior","transform","scrollLeft","scrollTop","image","imageElement","preload","settings","querySelector","imageSwap","naturalWidth","naturalHeight","imageTranslate","pointOffset","imageScroll","scrollTo","viewportWidth","viewportHeight","imageRatio","viewportRatio","isNaN","Math","round","imageResize","useResizableViewport","getBoundingClientRect","floor","getViewportElementRect","___CSS_LOADER_EXPORT___","push","module","toString"],"sourceRoot":""}