{"version":3,"file":"js/6679-8e2e23daa0734e9e443e.chunk.js","mappings":"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","sources":["webpack://nodalview/./app/javascript/src/react/components/controlled_dropdown/controlled_dropdown.styled.jsx","webpack://nodalview/./app/javascript/src/react/components/controlled_dropdown/controlled_dropdown.jsx","webpack://nodalview/./app/javascript/src/react/components/field_phone/field_phone.styled.jsx","webpack://nodalview/./app/javascript/src/react/components/field_phone/field_phone.jsx","webpack://nodalview/./app/javascript/src/react/components/user_business_card/user_business_card.jsx","webpack://nodalview/./app/javascript/src/react/helpers/colors.js","webpack://nodalview/./app/javascript/src/react/helpers/log.js","webpack://nodalview/./app/javascript/src/react/helpers/money.js","webpack://nodalview/./app/javascript/src/react/helpers/property.js","webpack://nodalview/./app/javascript/src/react/hooks/use_breakpoint.js","webpack://nodalview/./app/javascript/src/react/hooks/use_dialog.js","webpack://nodalview/./app/javascript/src/react/hooks/use_media_queries.js","webpack://nodalview/./app/javascript/src/react/hooks/use_storage_state.js","webpack://nodalview/./app/javascript/src/react/hooks/use_tracker.js","webpack://nodalview/./app/javascript/src/react/hooks/use_web_rest_api.js","webpack://nodalview/./app/javascript/src/react/integrations/constants.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/api/matterport_api.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery_preview_image/asset_gallery_preview_image.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery_preview_image/asset_gallery_preview_image.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery_preview_video/asset_gallery_preview_video.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery_preview_video/asset_gallery_preview_video.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery_thumbnail_image/asset_gallery_thumbnail_image.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery_thumbnail_image/asset_gallery_thumbnail_image.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery_thumbnail_video/asset_gallery_thumbnail_video.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery_thumbnail_video/asset_gallery_thumbnail_video.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/base_button/base_button.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/base_button/base_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery/asset_gallery.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/asset_gallery/asset_gallery.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/assets_gallery_provider/assets_gallery_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/errors_state/errors_state.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/errors_state/errors_state.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/interactive_gallery_provider/interactive_gallery_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/layout/interactive_gallery_layout.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/loading_state/loading_state.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/loading_state/loading_state.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/matterport_provider/matterport_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_matterport.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/matterport/matterport.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/matterport/matterport.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/matterport_tour/matterport_tour.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/krpano_information_box_dialog/krpano_information_box_dialog.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/krpano_information_box_dialog/krpano_information_box_dialog.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/krpano/krpano.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/krpano/krpano.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/nodalview_tour/nodalview_tour.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/api/krpano_api.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/nodalview_tour_provider/krpano_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/organisation_logo/organisation_logo.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/organisation_logo/organisation_logo.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/powered_by/powered_by.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/powered_by/powered_by.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/provider_modules/modules_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/provider_property/property_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/provider_views/views_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/tabs_button/tabs_button.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/tabs_button/tabs_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/tabs_button_list/tabs_button_list.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/tabs_button_list/tabs_button_list.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extension_provider/view_extension_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/base_extension_button/base_extension_button.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/base_extension_button/base_extension_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/base_extension_overlay/base_extension_overlay.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/base_extension_overlay/base_extension_overlay.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/business_card_overlay/business_card_overlay.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/business_card_button/business_card_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/floorplans_hotspot/floorplans_hotspot.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/floorplans_hotspot/floorplans_hotspot.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/floorplans_list_item/floorplans_list_item.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/floorplans_list_item/floorplans_list_item.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/floorplans_list/floorplans_list.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/floorplans_button/floorplans_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/krpano_controls/krpano_controls.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/krpano_controls/krpano_controls.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/panoramas_list_item/panoramas_list_item.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/panoramas_list_item/panoramas_list_item.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/panoramas_list/panoramas_list.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/panoramas_list/panoramas_list.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/panoramas_button/panoramas_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/property_features_item/property_features_item.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/property_features_item/property_features_item.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/property_features_list/property_features_list.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/property_features_list/property_features_list.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/property_features_list/property_features_list_legacy.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_extensions/property_features_button/property_features_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_floorplans_button/floorplans_view_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_krpano_tour_button/view_krpano_tour_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_map/map_view.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_map/map_view.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_map_button/map_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_matterport_tours_button/matterport_tours_view_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_photos_button/photos_view_button.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_toolbar/view_toolbar.styled.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/components/view_toolbar/view_toolbar.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/config.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/entities/base_entity.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hoc/with_active_view.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hoc/with_module_registration.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hoc/with_registered_view.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hoc/with_view_extension_provider.jsx","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_assets_gallery_context.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_interactive_gallery_context.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_krpano_context.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_matterport_context.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_modules_context.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_property_context.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_view_extension_context.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/hooks/use_views_context.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/entities/module.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/reducers/modules_reducer.js","webpack://nodalview/./app/javascript/src/react/interactive_gallery/reducers/views_reducer.js","webpack://nodalview/./app/javascript/src/react/properties/config.js","webpack://nodalview/./app/javascript/src/react/property_gallery/components/get_in_touch_form_header/get_in_touch_form_header.jsx","webpack://nodalview/./app/javascript/src/react/property_gallery/components/get_in_touch_dialog/get_in_touch_dialog.jsx","webpack://nodalview/./app/javascript/src/react/property_gallery/hooks/use_get_in_touch_form_handler.js","webpack://nodalview/./app/javascript/src/react/hooks/web_rest/smartlinks/use_lead_capture.js","webpack://nodalview/./app/javascript/src/react/property_gallery/components/get_in_touch_form/get_in_touch_form.styled.jsx","webpack://nodalview/./app/javascript/src/react/property_gallery/components/get_in_touch_form/get_in_touch_form.jsx","webpack://nodalview/./app/javascript/src/react/property_gallery/components/lead_forms_layout/lead_forms_layout.styled.jsx","webpack://nodalview/./config/amplitude_dict.yml"],"sourcesContent":["import styled, {css} from 'styled-components';\n\nexport const Dropdown = styled.div(\n () => css`\n display: inline-block;\n position: relative;\n `,\n);\n\nexport const Backdrop = styled.div(\n ({theme: {utils}}) => css`\n background-color: ${utils.color('neutral.800')};\n inset: 0;\n opacity: 0.2;\n position: fixed;\n `,\n);\n\nexport const Menu = styled.div(\n ({theme: {utils, breakpoint}, x, y, width}) => css`\n border: none;\n box-shadow: 0px 0px 4px rgba(81, 81, 81, 0.25);\n left: ${utils.rem(x)};\n margin: 0;\n min-width: ${width && utils.rem(width)};\n position: absolute;\n top: ${utils.rem(y)};\n transition: ${utils.transition('opacity')};\n width: calc(100% - ${utils.spacing(12)});\n z-index: 1;\n\n ${breakpoint.up('md')`\n width: max-content;\n `}\n `,\n);\n\nexport const MenuContainer = styled.div(\n ({theme: {utils}, zIndex}) => css`\n inset: 0;\n opacity: 0;\n position: fixed;\n transition: ${utils.transition('opacity')};\n z-index: ${zIndex || 100};\n\n &.active {\n opacity: 1;\n }\n `,\n);\n","import { Card, KeypressListener, Transition } from '@nodalview/nodes-web';\nimport { debounce } from 'lodash';\nimport { useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport * as Styled from './controlled_dropdown.styled';\n\nfunction getAnchorCoordinates(coordinates, anchorPoint, offset) {\n const { x: offsetX, y: offsetY } = offset;\n\n let x = 0;\n let y = 0;\n\n switch (anchorPoint) {\n case 'top-left':\n x = coordinates.x - offsetX;\n y = coordinates.y - offsetY;\n break;\n case 'top-center':\n x = coordinates.x + coordinates.width / 2;\n y = coordinates.y - offsetY;\n break;\n case 'top-right':\n x = coordinates.x + coordinates.width + offsetX;\n y = coordinates.y - offsetY;\n break;\n case 'center-left':\n x = coordinates.x - offsetX;\n y = coordinates.y + coordinates.height / 2;\n break;\n case 'center-right':\n x = coordinates.x + coordinates.width + offsetX;\n y = coordinates.y + coordinates.height / 2;\n break;\n case 'bottom-left':\n x = coordinates.x - offsetX;\n y = coordinates.y + coordinates.height + offsetY;\n break;\n case 'bottom-center':\n x = coordinates.x + coordinates.width / 2;\n y = coordinates.y + coordinates.height + offsetY;\n break;\n case 'bottom-right':\n x = coordinates.x + coordinates.width + offsetX;\n y = coordinates.y + coordinates.height + offsetY;\n break;\n default:\n x = 0;\n y = 0;\n break;\n }\n\n return { x, y };\n}\n\nfunction getElementCoordinates(element, alignment, anchorX, anchorY) {\n const { height, width } = element.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n const windowWidth = window.innerWidth;\n\n let x = anchorX;\n let y = anchorY;\n\n switch (alignment) {\n case 'top-left':\n x -= width;\n y -= height;\n break;\n case 'top-center':\n x -= width / 2;\n y -= height;\n break;\n case 'top-right':\n y -= height;\n break;\n case 'center-left':\n x -= width;\n y -= height / 2;\n break;\n case 'center-center':\n x -= width / 2;\n y -= height / 2;\n break;\n case 'center-right':\n y -= height / 2;\n break;\n case 'bottom-left':\n x -= width;\n break;\n case 'bottom-center':\n x -= width / 2;\n break;\n case 'bottom-right':\n break;\n default:\n break;\n }\n\n x = Math.max(0, Math.min(windowWidth - width, x));\n y = Math.max(0, Math.min(windowHeight - height, y));\n\n return { x, y };\n}\n\nfunction generateCoordinates(coordinates, dropdownRef, options) {\n if (!dropdownRef) return coordinates;\n\n const { alignment, anchorPoint, offset } = options;\n const anchorCoords = getAnchorCoordinates(coordinates, anchorPoint, offset);\n return getElementCoordinates(dropdownRef, alignment, anchorCoords.x, anchorCoords.y);\n}\n\nfunction getTargetCoordinates(targetRef) {\n const { left, top, width, height } = targetRef.getBoundingClientRect();\n return { x: left, y: top, width, height };\n}\n\nexport const ControlledDropdown = ({\n children,\n isOpen,\n onClose,\n targetRef,\n containerRef,\n anchorPoint,\n alignment,\n offset,\n disabledClose,\n ...props\n}) => {\n const [dropdownRef, setDropdownRef] = useState(null);\n const [targetCoords, setTargetCoords] = useState({ x: 0, y: 0 });\n\n const coords = useMemo(\n () =>\n generateCoordinates(targetCoords, dropdownRef, {\n alignment: alignment ?? anchorPoint,\n anchorPoint,\n offset,\n }),\n [dropdownRef, targetCoords, offset, alignment, anchorPoint],\n );\n\n const handleClose = () => {\n if (disabledClose) return;\n onClose?.();\n };\n\n useEffect(() => {\n if (isOpen) {\n setTargetCoords(getTargetCoordinates(targetRef));\n\n const debouncedHandleResize = debounce(() => {\n setTargetCoords(getTargetCoordinates(targetRef));\n }, 250);\n\n window.addEventListener('resize', debouncedHandleResize);\n document.body.style.setProperty('overflow', 'hidden');\n\n return () => {\n window.removeEventListener('resize', debouncedHandleResize);\n document.body.style.removeProperty('overflow');\n };\n }\n }, [isOpen, targetRef]);\n\n return createPortal(\n <Transition as={Styled.MenuContainer} visible={isOpen} onClick={handleClose}>\n <KeypressListener keyPressed=\"esc\" action={handleClose} />\n <Styled.Backdrop />\n <Styled.Menu\n as={Card}\n {...props}\n {...coords}\n ref={(element) => setDropdownRef(element)}\n onClick={(event) => event.stopPropagation()}\n >\n {children}\n </Styled.Menu>\n </Transition>,\n containerRef ?? document.body,\n );\n};\n","import styled, { css } from 'styled-components';\n\nexport const Container = styled.div(\n ({ theme: { utils } }) => css`\n position: relative;\n\n .iti--container {\n left: 0 !important;\n top: 100% !important;\n }\n\n .iti__country-list {\n border-radius: ${utils.radius('md')};\n box-shadow: ${utils.shadow('md')};\n }\n\n .iti__divider {\n border-color: ${utils.color('neutral.200')};\n }\n `,\n);\n\nexport const TelInput = styled.input(\n () => css`\n background-color: transparent;\n width: 100%;\n `,\n);\n","import { InputField } from '@nodalview/nodes-web';\nimport intlTelInput from 'intl-tel-input';\nimport libphonenumbers from 'libphonenumber-js';\nimport PropTypes from 'prop-types';\nimport { useEffect, useRef, useState } from 'react';\nimport { useController, useFormContext } from 'react-hook-form';\nimport { mergeRefs } from '@react/helpers';\nimport * as Styled from './field_phone.styled';\n\nexport const FieldPhone = ({ initialCountry, name, defaultValue, onCountryChange, ...props }) => {\n const containerRef = useRef(null);\n const telRef = useRef(null);\n const inputRef = useRef(null);\n const [value, setValue] = useState(defaultValue);\n\n const { control } = useFormContext();\n const {\n field: { onChange, onBlur, ...field },\n fieldState,\n } = useController({ control, name, defaultValue });\n\n const handleChange = (rawValue, event) => {\n const iti = telRef.current;\n const nextValue = iti.getNumber();\n\n setValue(rawValue);\n onChange(nextValue);\n props.onChange?.(nextValue, event);\n };\n\n const handleBlur = (event) => {\n onBlur(event);\n props.onBlur?.(event);\n };\n\n useEffect(() => {\n telRef.current = intlTelInput(inputRef.current, {\n initialCountry,\n preferredCountries: ['fr', 'es', 'pt', 'be', 'it', 'us'],\n dropdownContainer: containerRef.current,\n utilsScript: libphonenumbers,\n });\n\n return () => telRef.current.destroy();\n }, [initialCountry]);\n\n useEffect(() => {\n if (!onCountryChange) return;\n\n const input = inputRef.current;\n\n const handleCountryChange = () => {\n const country = telRef.current.getSelectedCountryData()?.iso2;\n onCountryChange(country);\n };\n\n input?.addEventListener('countrychange', handleCountryChange);\n return () => {\n input?.removeEventListener('countrychange', handleCountryChange);\n };\n }, [onCountryChange]);\n\n return (\n <Styled.Container ref={containerRef}>\n <InputField\n as={Styled.TelInput}\n {...props}\n {...field}\n type=\"tel\"\n value={value}\n ref={mergeRefs(inputRef, field.ref)}\n onChange={handleChange}\n onBlur={handleBlur}\n error={fieldState.error?.message}\n />\n </Styled.Container>\n );\n};\n\nFieldPhone.propTypes = {\n initialCountry: PropTypes.string,\n name: PropTypes.string.isRequired,\n defaultValue: PropTypes.string,\n onCountryChange: PropTypes.func,\n onBlur: PropTypes.func,\n onFocus: PropTypes.func,\n onChange: PropTypes.func,\n};\n\nFieldPhone.defaultProps = {\n initialCountry: null,\n defaultValue: null,\n onCountryChange: undefined,\n onBlur: undefined,\n onFocus: undefined,\n onChange: undefined,\n};\n","import { BusinessCard, useTranslation } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { useMemo } from 'react';\nimport { getContrastColor } from '@react/helpers';\nimport { INTEGRATION_ICONS } from '@react/integrations';\n\nexport const UserBusinessCard = ({\n name,\n email,\n phoneNumber,\n photo,\n rating,\n branding,\n withBranding,\n logoUrl,\n canContact,\n onContact,\n ...props\n}) => {\n const { t } = useTranslation('business_card.rating');\n\n const providerRating = useMemo(() => {\n if (!rating) return null;\n\n const { provider, score, reviewsCount, profileUrl } = rating;\n\n return {\n score,\n review: t(`integrations:list.${provider}.review`, {\n count: reviewsCount,\n }),\n profileUrl,\n providerLogoUrl: INTEGRATION_ICONS[provider],\n };\n }, [rating, t]);\n\n const userBranding = useMemo(() => {\n const backgroundColor = withBranding ? branding?.mainColor : null;\n const foregroundColor = withBranding ? getContrastColor(backgroundColor) : null;\n\n return {\n logoUrl,\n backgroundColor,\n foregroundColor,\n };\n }, [withBranding, logoUrl, branding]);\n\n return (\n <BusinessCard\n {...props}\n fullName={name}\n email={email}\n phoneNumber={phoneNumber}\n pictureUrl={photo}\n rating={providerRating}\n branding={userBranding}\n onContact={canContact ? onContact : undefined}\n />\n );\n};\n\nUserBusinessCard.propTypes = {\n name: PropTypes.string.isRequired,\n email: PropTypes.string,\n phoneNumber: PropTypes.string,\n photo: PropTypes.string,\n rating: PropTypes.shape({\n score: PropTypes.number.isRequired,\n reviewsCount: PropTypes.number,\n profileUrl: PropTypes.string,\n provider: PropTypes.string,\n }),\n logoUrl: PropTypes.string,\n branding: PropTypes.shape({\n mainColor: PropTypes.string.isRequired,\n }),\n withBranding: PropTypes.bool,\n canContact: PropTypes.bool,\n onContact: PropTypes.func,\n};\n\nUserBusinessCard.defaultProps = {\n email: null,\n phoneNumber: null,\n photo: null,\n rating: null,\n logoUrl: null,\n branding: null,\n withBranding: false,\n canContact: false,\n onContact: undefined,\n};\n","import chroma from 'chroma-js';\n\nconst COLOR_KEYS = [25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900];\nconst BASE_COLOR = 500;\n\nexport const transparentizeColor = (color, opacity = 0.1) => chroma(color).alpha(opacity).css();\n\nexport const generateColorRange = (count, scale = ['white', 'black']) =>\n chroma.scale(scale).mode('lab').domain([0, 1]).colors(count);\n\nexport const generateColorRangeFromLuminance = (\n refColor,\n colorKeys = COLOR_KEYS,\n baseColor = BASE_COLOR,\n) => {\n if (!refColor) return [];\n\n const numColors = colorKeys.length;\n const baseColorIndex = colorKeys.indexOf(baseColor) + 1;\n const baseColorScalePosition = baseColorIndex / numColors;\n const colorOffset = 0.15;\n\n const color = chroma(refColor);\n const luminance = color.luminance();\n const lightColor = color.luminance(\n Math.max(0.05, luminance + 6 * colorOffset), // Only 6 colors lighter: 25-400\n 'lab',\n );\n const darkColor = color.luminance(\n Math.min(0.95, luminance - 4 * colorOffset), // Only 4 colors darker: 600-900\n 'lab',\n );\n\n const colors = [lightColor.hex(), refColor, darkColor.hex()];\n const domain = [0, baseColorScalePosition, 1];\n\n if (luminance > 0.5) {\n colors.reverse();\n domain.reverse();\n }\n\n return chroma.scale(colors).mode('lab').domain(domain).colors(numColors);\n};\n\nexport const getThemeColors = (refColor) => {\n const colors = generateColorRangeFromLuminance(refColor);\n\n return colors.reduce((acc, current, index) => {\n const currentColorKey = COLOR_KEYS[index];\n return { ...acc, [currentColorKey]: current };\n }, {});\n};\n\nexport const getContrastColor = (color, [lightColor, darkColor] = ['white', 'black']) => {\n if (!color) return null;\n\n const lightContrast = chroma.contrast(color, lightColor);\n const darkContrast = chroma.contrast(color, darkColor);\n\n return lightContrast > darkContrast ? lightColor : darkColor;\n};\n","// eslint-disable-next-line no-undef\nconst ENVIRONMENT = NodalviewEnvironment.rails_env;\n\nconst log =\n (type) =>\n (...args) => {\n if (!['development', 'staging'].includes(ENVIRONMENT)) return false;\n // eslint-disable-next-line no-console\n return console[type](...args);\n };\n\nexport const Logger = {\n info: log('info'),\n warn: log('warn'),\n error: log('error'),\n log: log('log'),\n};\n","export function unitToCent(amount) {\n return Math.round(amount * 100);\n}\n\nexport function centToUnit(amount) {\n return Math.round(amount) / 100;\n}\n\nexport const toCurrency = (amount, { locale = 'fr-BE', currency = 'EUR', ...options } = {}) => {\n const formatter = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...options,\n });\n\n return formatter.format(amount);\n};\n\nexport function centToCurrency(amount, options) {\n return toCurrency(centToUnit(amount), options);\n}\n","export function FindDescription(\n locale,\n descriptions,\n order = ['en', 'fr', 'es', 'pt', 'nl', 'it', 'ja'],\n) {\n const description = descriptions.find((desc) => desc.language.toLowerCase() === locale);\n\n if (!description) {\n return [...descriptions]\n .sort(\n (a, b) => order.indexOf(a.language.toLowerCase()) - order.indexOf(b.language.toLowerCase()),\n )\n .shift();\n }\n\n return description;\n}\n","import { useTheme } from 'styled-components';\nimport { useMediaQueries } from './use_media_queries';\n\n/**\n *\n * @param breakpointName: xs | sm | md | lg | xl | xxl\n * @returns boolean\n */\nexport const useBreakpoint = (breakpointName) => {\n const theme = useTheme();\n const screens = theme.breakpoint.list;\n\n const breakpointDefinition = screens[breakpointName];\n const breakpointQuery = `(min-width: ${breakpointDefinition?.breakpoint ?? 0}px)`;\n\n return useMediaQueries(breakpointQuery);\n};\n","import {useState} from \"react\";\n\nexport const useDialog = (initialState = false) => {\n const {isDialogOpen, openDialog, closeDialog} = useStatedDialog(initialState);\n\n return {\n isDialogOpen: !!isDialogOpen,\n openDialog: () => openDialog(true),\n closeDialog: () => closeDialog(false),\n }\n}\n\nexport const useStatedDialog = (initialState = false) => {\n const [dialogState, setDialogState] = useState(initialState);\n\n return {\n dialogState,\n isDialogOpen: !!dialogState,\n openDialog: (state) => setDialogState(state !== undefined ? state : true),\n closeDialog: () => setDialogState(false),\n }\n}","import {useEffect, useMemo, useState} from \"react\";\n\nexport function useMediaQueries(query) {\n const mediaQueryList = useMemo(() => {\n return window.matchMedia(query)\n }, [query])\n\n const [matchedQuery, setMatchedQuery] = useState(mediaQueryList?.matches ?? false)\n\n useEffect(() => {\n if (!mediaQueryList) return;\n\n const checkMediaQuery = (event) => {\n setMatchedQuery(event.matches);\n }\n\n mediaQueryList.addEventListener('change', checkMediaQuery)\n return () => {\n mediaQueryList.removeEventListener('change', checkMediaQuery)\n }\n }, [mediaQueryList])\n\n return matchedQuery;\n}","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage(key, initialState, initialise) {\n const [storedState, setStoredState] = useState(() => {\n if (typeof window === 'undefined') {\n return initialState;\n }\n try {\n const initialComputedState =\n typeof initialState === 'function' ? initialState() : initialState;\n const item = window.localStorage.getItem(key);\n const state = item ? JSON.parse(item) : initialComputedState;\n\n return initialise ? initialise(state) : state;\n } catch (error) {\n console.error(error);\n return initialState;\n }\n });\n\n const storeState = useCallback(\n (freshState) => {\n try {\n const valueToStore = freshState instanceof Function ? freshState(storedState) : freshState;\n setStoredState(valueToStore);\n\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch (error) {\n console.error(error);\n }\n },\n [key, storedState],\n );\n\n const clearState = useCallback(\n (value = '') => {\n try {\n setStoredState(value);\n\n if (typeof window !== 'undefined') {\n window.localStorage.removeItem(key);\n }\n } catch (error) {\n console.error(error);\n }\n },\n [key],\n );\n\n return [storedState, storeState, clearState];\n}\n","import { get } from 'lodash';\nimport { useCallback, useMemo } from 'react';\nimport EVENTS_LIST from '../../../../../config/amplitude_dict.yml';\n\n/**\n * @DEPRECATED Should be replaced by useTrackerContext from @nodalview/nodes-web package\n *\n * @param eventKey\n * @param defaultEventProperties\n * @return {(function({}=): (boolean|undefined))|*}\n */\nexport const useTracker = (eventKey, defaultEventProperties) => {\n const eventName = useMemo(() => get(EVENTS_LIST, `events.${eventKey}`), [eventKey]);\n\n return useCallback(\n (eventProperties = {}) => {\n const isSupported = 'eventsManager' in window;\n\n if (!isSupported) {\n console.warn('EventsManager is not supported');\n return false;\n }\n if (!eventName || typeof eventName !== 'string') {\n console.warn('Invalid tracking event key (%s), got:', eventKey, eventName);\n return false;\n }\n\n window.eventsManager.logEvent(eventName, { ...defaultEventProperties, ...eventProperties });\n },\n [defaultEventProperties, eventKey, eventName],\n );\n};\n","import { responseToJson, webRestClientApi } from '@shared/api/client';\nimport { inRange } from 'lodash';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nfunction formatBody(type, rawBody) {\n switch (type) {\n case 'json':\n return JSON.stringify(rawBody);\n default:\n return rawBody;\n }\n}\n\nexport const useLazyWebRestApi = (\n url,\n { onCompleted, onError, method = 'get', type = 'json', ...defaultOptions },\n initialState,\n) => {\n const [loading, setLoading] = useState(initialState?.loading ?? false);\n const [error, setError] = useState(null);\n const [data, setData] = useState(null);\n\n const request = useCallback(\n async (params, localOptions) => {\n const options = { ...defaultOptions, ...localOptions, method };\n const body = method === 'get' ? undefined : formatBody(type, params);\n\n try {\n setLoading(true);\n const response = await webRestClientApi(url, { body, ...options });\n const resData = await responseToJson(response);\n\n if (!inRange(response.status, 200, 300)) {\n throw new Error(resData?.error ?? resData?.message ?? resData);\n }\n\n onCompleted?.(resData);\n setData(resData);\n return resData;\n } catch (err) {\n onError?.(err);\n setError(err);\n throw err;\n } finally {\n setLoading(false);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [url, method],\n );\n\n const state = useMemo(() => ({ data, loading, error }), [data, loading, error]);\n\n return [request, state];\n};\n\nexport const useWebRestApi = (url, options, initialState) => {\n const [request, state] = useLazyWebRestApi(url, options, initialState);\n\n useEffect(() => {\n const controller = new AbortController();\n const signal = controller?.signal;\n\n request({}, { signal });\n return () => controller?.abort();\n }, [request]);\n\n return state;\n};\n","import EmailForwardingIcon from '@images/integrations/email_forwarding_icon.svg';\nimport ImmodvisorIcon from '@images/integrations/immodvisor_icon.svg';\nimport OpinionSystemIcon from '@images/integrations/opinion_system_icon.svg';\n\nexport const INTEGRATION_TYPES = {\n CRM: 'crm',\n SOCIAL_MEDIA: 'social_media',\n CUSTOMER_RATINGS: 'customer_ratings',\n EMAIL: 'email',\n PRODUCTIVITY: 'productivity',\n};\n\nexport const INTEGRATION_NAMES = {\n FACEBOOK: 'facebook',\n GOOGLE: 'google',\n INSTAGRAM: 'instagram',\n IMMODVISOR: 'immodvisor',\n OPINION_SYSTEM: 'opinion_system',\n WHISE: 'whise',\n YOUTUBE: 'youtube',\n EMAIL_FORWARDING: 'email_forwarding',\n};\n\nexport const INTEGRATION_STATES = {\n DISABLED: 'disabled',\n OVERVIEW: 'overview',\n CONFIGURE: 'configure',\n CONNECTED: 'connected',\n};\n\nexport const INTEGRATION_ICONS = {\n [INTEGRATION_NAMES.IMMODVISOR]: ImmodvisorIcon,\n [INTEGRATION_NAMES.OPINION_SYSTEM]: OpinionSystemIcon,\n [INTEGRATION_NAMES.EMAIL_FORWARDING]: EmailForwardingIcon,\n};\n","import {isEqual, round} from \"lodash\";\n\nexport const MATTERPORT_SCRIPT = 'https://static.matterport.com/showcase-sdk/latest.js';\n\nconst MODE_OUTSIDE = 'mode.outside';\nconst MODE_INSIDE = 'mode.inside';\n\nexport class MatterportApi {\n constructor(mpInstance) {\n this.interface = mpInstance;\n\n this.appState = null;\n this.lastReceivedPose = null;\n this.mode = null;\n this.position = {x: 0, y: 0, z: 0};\n this.rotation = {x: 0, y: 0};\n this.zoom = null;\n this.sweep = \"\";\n\n this.transitioning = false;\n this.rotating = false;\n\n this.bindEvents();\n }\n\n view() {\n const {position, rotation, zoom, mode, sweep} = this;\n\n return {\n mode,\n sweep,\n position: this._roundPosition(position),\n rotation: this._roundRotation(rotation),\n zoom: this._roundZoom(zoom),\n }\n }\n\n bindEvents() {\n const {Sweep, Mode} = this.interface;\n\n // this.interface.on(Mode.Event.CHANGE_START, (_, mode) => this._setMode(mode)) // Change mode\n this.interface.on(Sweep.Event.EXIT, (_, sweep) => this._setSweep(sweep)) // Change position\n this.interface.Sweep.current.subscribe((s) => s.sid && this._setSweep(s.sid))\n this.interface.App.state.subscribe(this._setAppState.bind(this)) // Change state\n this.interface.Camera.pose.subscribe(this._setCameraPose.bind(this)) // Change view\n this.interface.Camera.zoom.subscribe(this._setCameraZoom.bind(this)) // Change zoom\n }\n\n async changeView(pose) {\n if (!pose) return;\n\n const {sweep, position, rotation, mode} = pose ?? {};\n this.lastReceivedPose = pose;\n\n if (this._isTransitioning(mode) || this._isRotating()) return;\n\n const modeChanged = this.mode !== mode;\n const sweepChanged = this.sweep !== sweep;\n const positionChanged = !isEqual(this.position, position);\n const rotationChanged = !isEqual(this.rotation, rotation);\n\n if (modeChanged) {\n await this.moveTo({mode, position, rotation})\n } else if (sweepChanged) {\n await this.changeSweep(sweep, rotation)\n } else if (positionChanged) {\n await this.moveTo({mode, position, rotation})\n } else if (rotationChanged) {\n await this.rotateTo(rotation)\n }\n }\n\n async changeMode(mode) {\n if (this._isTransitioning(mode)) return;\n\n try {\n this._startTransition()\n await this.interface.Mode.moveTo(mode, {})\n this._setMode(mode);\n } catch (error) {\n console.error('Matterport changeMode Error', error);\n } finally {\n this._endTransition()\n }\n }\n\n async changeSweep(sweep, rotation = null) {\n if (this._isTransitioning(this.mode)) return;\n\n const {Sweep} = this.interface\n\n try {\n this._startTransition()\n await Sweep.moveTo(sweep, {\n transition: Sweep.Transition.FLY,\n rotation,\n })\n this.sweep = sweep;\n } finally {\n this._endTransition()\n // this.changeView(this.lastReceivedPose)\n }\n }\n\n async zoomTo(zoom) {\n const {Camera, Mode} = this.interface;\n\n if (this._isTransitioning(this.mode) || this.mode !== Mode.Mode.INSIDE) return;\n\n try {\n await Camera.zoomTo(zoom.level)\n } catch (error) {\n console.error('Matterport zoomTo Error', error);\n }\n }\n\n async rotateTo(rotation) {\n if (this._isRotating()) return;\n\n try {\n this._startRotation()\n await this.interface.Camera.setRotation(rotation, {speed: 120})\n } catch (error) {\n console.error('Matterport rotateTo Error', error);\n } finally {\n this._endRotation()\n }\n\n }\n\n async moveTo({mode, position, rotation}) {\n const {Mode} = this.interface;\n\n if (this._isTransitioning(mode)) return;\n\n try {\n this._startTransition()\n await Mode.moveTo(mode, {\n position,\n rotation,\n transition: Mode.TransitionType.INSTANT\n })\n this._setMode(mode)\n this.position = this._roundPosition(position)\n this.rotation = this._roundRotation(rotation)\n } catch (error) {\n console.error('Matterport moveTo Error', error);\n } finally {\n this._endTransition()\n }\n }\n\n //-- private\n\n _isPlaying() {\n return this.interface && this.appState?.phase === this.interface.App.Phase.PLAYING;\n }\n\n _isTransitioning(mode) {\n return (this.transitioning === true || mode === this.interface.Mode.Mode.TRANSITIONING) && !this._isPlaying();\n }\n\n _startTransition() {\n this.transitioning = true\n }\n\n _endTransition() {\n this.transitioning = false;\n }\n\n _isRotating() {\n return this.rotating === true && !this._isPlaying();\n }\n\n _startRotation() {\n this.rotating = true\n }\n\n _endRotation() {\n this.rotating = false;\n }\n\n _setCameraPose(pose) {\n this.position = this._roundPosition(pose.position)\n this.rotation = this._roundRotation(pose.rotation)\n }\n\n _setCameraZoom(zoom) {\n this.zoom = this._roundZoom(zoom.level);\n }\n\n _setAppState(state) {\n this.appState = state;\n }\n\n _setSweep(sweep) {\n if (!sweep) return;\n this.sweep = sweep;\n }\n\n _setMode(mode) {\n // 20230503 ETO\n // It seems moveTo doesn't work with mode.outside, so we force mode.inside instead\n // It needs more investigation and understanding of the difference between inside and outside\n this.mode = mode === MODE_OUTSIDE ? MODE_INSIDE : mode;\n }\n\n _roundPosition({x, y, z}) {\n return {\n x: round(x, 2),\n y: round(y, 2),\n z: round(z, 2),\n }\n }\n\n _roundRotation({x, y}) {\n return {\n x: round(x, 3),\n y: round(y, 3),\n }\n }\n\n _roundZoom({level}) {\n return {\n level: round(level, 4)\n }\n }\n}","import styled, {css} from \"styled-components\";\n\nexport const MainImage = styled.img(\n ({theme: {borderRadius}}) => css`\n background: black;\n border-radius: ${borderRadius.default};\n height: 100%;\n object-fit: scale-down;\n width: 100%;\n `\n)\n","import PropTypes from \"prop-types\";\nimport * as Styled from \"./asset_gallery_preview_image.styled\";\n\nexport const AssetGalleryPreviewImage = ({selectedImage, onLoad, onError, ...props}) => {\n return (\n <Styled.MainImage\n alt={selectedImage.name}\n src={selectedImage?.assetPath}\n onLoad={onLoad}\n onError={onError}\n tabIndex={0}\n {...props}\n />\n );\n}\n\nAssetGalleryPreviewImage.propTypes = {\n selectedImage: PropTypes.shape({\n src: PropTypes.string.isRequired,\n name: PropTypes.string,\n }).isRequired,\n onLoad: PropTypes.func,\n onError: PropTypes.func,\n}","import styled, {css} from \"styled-components\";\n\nexport const MainVideo = styled.video(\n ({theme: {borderRadius}}) => css`\n background: black;\n border-radius: ${borderRadius.default};\n height: 100%;\n object-fit: scale-down;\n width: 100%;\n `\n)\n","import PropTypes from \"prop-types\";\nimport * as Styled from \"./asset_gallery_preview_video.styled\";\n\nexport const AssetGalleryPreviewVideo = ({selectedImage, onLoad, onError, ...props}) => {\n return (\n <Styled.MainVideo\n alt={selectedImage.name}\n src={selectedImage?.assetPath}\n preload=\"auto\"\n onLoadedMetadata={onLoad}\n onError={onError}\n tabIndex={0}\n controls\n {...props}\n />\n );\n}\n\nAssetGalleryPreviewVideo.propTypes = {\n selectedImage: PropTypes.shape({\n src: PropTypes.string.isRequired,\n name: PropTypes.string,\n }).isRequired,\n onLoad: PropTypes.func,\n onError: PropTypes.func,\n}","import styled, {css} from \"styled-components\";\n\nexport const ThumbImage = styled.img(\n ({theme: {utils}}) => css`\n height: 100%;\n object-fit: cover;\n transition: ${utils.transition('transform')};\n width: 100%;\n\n &:hover {\n transform: scale(1.1);\n }\n `\n)","import {LazyLoadImage} from \"@react/components\";\nimport PropTypes from \"prop-types\";\nimport * as Styled from \"./asset_gallery_thumbnail_image.styled\";\n\nexport const AssetGalleryThumbnailImage = ({image, ...props}) => {\n return (\n <Styled.ThumbImage\n as={LazyLoadImage}\n src={image.thumbnailPath}\n alt={image.name}\n {...props}\n />\n );\n}\n\nAssetGalleryThumbnailImage.propTypes = {\n image: PropTypes.shape({\n thumbnailPath: PropTypes.string.isRequired,\n name: PropTypes.string,\n }).isRequired,\n}","import styled, {css} from \"styled-components\";\n\nexport const Thumbnail = styled.img(\n ({theme: {utils}}) => css`\n height: 100%;\n object-fit: cover;\n transition: ${utils.transition('transform')};\n width: 100%;\n\n &:hover {\n transform: scale(1.1);\n }\n `\n)","import {LoadingState} from \"@react/interactive_gallery\";\nimport PropTypes from \"prop-types\";\nimport {useState} from \"react\";\nimport * as Styled from \"./asset_gallery_thumbnail_video.styled\";\n\nexport const AssetGalleryThumbnailVideo = ({video, ...props}) => {\n const [loaded, setLoaded] = useState(false);\n\n return (\n <>\n <Styled.Thumbnail\n as=\"video\"\n src={video.thumbnailPath}\n alt={video.name}\n onLoadedMetaData={() => setLoaded(true)}\n preload=\"metadata\"\n {...props}\n />\n {loaded && <LoadingState/>}\n </>\n );\n}\n\nAssetGalleryThumbnailVideo.propTypes = {\n video: PropTypes.shape({\n thumbnailPath: PropTypes.string.isRequired,\n name: PropTypes.string,\n }).isRequired,\n}","import styled, {css} from \"styled-components\";\n\nexport const Button = styled.button(\n ({theme: {utils}, $active, disabled}) => css`\n background: ${utils.color('neutral.white')};\n box-shadow: 0px 2px 4px rgba(15, 25, 39, 0.3);\n border: none;\n border-radius: 50%;\n color: ${utils.color('neutral.500')};\n display: flex;\n font-size: ${utils.rem(20)};\n padding: ${utils.rem(14)};\n position: relative;\n \n &:hover {\n background-color: ${utils.color('neutral.100')};\n cursor: pointer;\n }\n \n ${$active && css`\n color: ${utils.color('primary.500')};\n `}\n \n ${disabled && css`\n opacity: .6;\n pointer-events: none;\n `}\n `\n)","import { Icon } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport * as Styled from './base_button.styled';\n\nexport const BaseButton = ({ icon, active, disabled, ...props }) => (\n <Styled.Button $active={active} disabled={disabled} {...props}>\n <Icon name={icon} />\n </Styled.Button>\n);\n\nBaseButton.propTypes = {\n icon: PropTypes.string,\n active: PropTypes.bool,\n disabled: PropTypes.bool,\n};\n\nBaseButton.defaultProps = {\n icon: null,\n active: false,\n disabled: false,\n};\n","import styled, {css} from \"styled-components\";\n\nexport const Gallery = styled.div(\n ({theme: {utils}}) => css`\n align-items: center;\n display: flex;\n flex-direction: row-reverse;\n width: 100%;\n height: 100%;\n gap: ${utils.rem(8)};\n `\n)\n\nexport const ImageView = styled.div(\n () => css`\n flex: 1;\n height: 100%;\n position: relative;\n `\n)\n\nexport const Loader = styled.div(\n () => css`\n height: 100%;\n inset: 0;\n width: 100%;\n position: absolute;\n z-index: 10;\n `\n)\nexport const Overlay = styled.div(\n () => css`\n height: 100%;\n inset: 0;\n width: 100%;\n pointer-events: none;\n position: absolute;\n z-index: 1;\n\n &:empty {\n display: none;\n }\n `\n)\n\nexport const NavigationButton = styled.button(\n ({theme: {utils}, $position}) => css`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 5;\n\n ${$position === 'left' && css`\n left: ${utils.spacing(4)};\n `}\n ${$position === 'right' && css`\n right: ${utils.spacing(4)};\n `}\n `\n)\n\nexport const ThumbsList = styled.div(\n ({theme: {utils, breakpoint, borderRadius}}) => css`\n border-radius: ${borderRadius.default};\n display: none;\n flex-direction: column;\n gap: ${utils.rem(8)};\n justify-content: flex-start;\n max-height: 100%;\n overflow-y: auto;\n\n ${breakpoint.up('md')`\n display: flex\n `}\n `\n)\n\nexport const Thumbnail = styled.div(\n ({theme: {utils, borderRadius}, $active}) => css`\n border-radius: ${borderRadius.default};\n flex: 0 0 ${utils.rem(120)};\n height: ${utils.rem(120)};\n overflow: hidden;\n position: relative;\n transition: ${utils.transition('box-shadow')};\n width: ${utils.rem(160)};\n\n &:hover {\n cursor: pointer;\n }\n\n &:after {\n border: 3px solid transparent;\n border-radius: ${borderRadius.default};\n content: '';\n display: block;\n inset: 0;\n pointer-events: none;\n position: absolute;\n }\n\n ${$active && css`\n &:after {\n border-color: ${utils.color('primary.500')};\n }\n `}\n `\n)\n\nexport const ThumbImage = styled.img(\n ({theme: {utils}}) => css`\n height: 100%;\n object-fit: cover;\n transition: ${utils.transition('transform')};\n width: 100%;\n\n &:hover {\n transform: scale(1.1);\n }\n `\n)","import {KeypressListener} from '@nodalview/nodes-web';\nimport PropTypes from \"prop-types\";\nimport {useEffect, useRef, useState} from \"react\";\nimport {useAssetsGalleryContext} from \"../../hooks\";\nimport {AssetGalleryPreviewImage} from \"../asset_gallery_preview_image\";\nimport {AssetGalleryPreviewVideo} from \"../asset_gallery_preview_video\";\nimport {AssetGalleryThumbnailImage} from \"../asset_gallery_thumbnail_image\";\nimport {AssetGalleryThumbnailVideo} from \"../asset_gallery_thumbnail_video\";\nimport {BaseButton} from \"../base_button\";\nimport {LoadingState} from \"../loading_state\";\nimport * as Styled from \"./asset_gallery.styled\";\n\nexport const AssetGallery = ({canControl, overlay, type, ...props}) => {\n const listRef = useRef();\n const {\n assets,\n selectedAsset,\n selectAsset\n } = useAssetsGalleryContext()\n\n const [loading, setLoading] = useState(false);\n\n const currentAssetIndex = assets.findIndex(asset => asset.id === selectedAsset?.id);\n const firstIndex = 0;\n const lastIndex = assets.length - 1;\n const hasNextAsset = currentAssetIndex < lastIndex;\n const hasPreviousAsset = currentAssetIndex > firstIndex;\n\n const handleAssetSelection = (assetIndex) => {\n const asset = assets[assetIndex];\n selectAsset(asset)\n }\n const nextAsset = () => {\n if (!hasNextAsset) return;\n handleAssetSelection(currentAssetIndex + 1)\n }\n const previousAsset = () => {\n if (!hasPreviousAsset) return;\n handleAssetSelection(currentAssetIndex - 1)\n }\n const isSelected = (asset) => selectedAsset.id === asset.id;\n\n useEffect(() => setLoading(true), [selectedAsset]);\n\n useEffect(() => {\n if (!listRef.current) return;\n\n const itemPosition = (currentAssetIndex ?? 0) + 1;\n const currentThumbnail = listRef.current.querySelector(`:nth-child(${itemPosition})`);\n\n if (!currentThumbnail) return;\n\n const timeout = setTimeout(() => {\n currentThumbnail.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n behavior: 'smooth',\n })\n }, 0);\n\n return () => clearTimeout(timeout);\n }, [currentAssetIndex])\n\n return (\n <Styled.Gallery {...purposeAttributes('asset_gallery')} {...props}>\n {hasPreviousAsset && <KeypressListener keyPressed=\"leftarrow\" action={previousAsset}/>}\n {hasNextAsset && <KeypressListener keyPressed=\"rightarrow\" action={nextAsset}/>}\n\n <Styled.ImageView>\n {selectedAsset && (\n <>\n {type === 'video' && (\n <AssetGalleryPreviewVideo\n selectedImage={selectedAsset}\n onLoad={() => setLoading(false)}\n onError={() => setLoading(false)}\n autoPlay\n {...purposeAttributes('main_asset')}\n />\n )}\n {type === 'image' && (\n <AssetGalleryPreviewImage\n selectedImage={selectedAsset}\n onLoad={() => setLoading(false)}\n onError={() => setLoading(false)}\n {...purposeAttributes('main_asset')}\n />\n )}\n </>\n )}\n {loading && (\n <Styled.Loader {...purposeAttributes('main_asset_loader')}>\n <LoadingState unit=\"percent\" noBackground/>\n </Styled.Loader>\n )}\n {overlay && (\n <Styled.Overlay>{overlay}</Styled.Overlay>\n )}\n {canControl && (\n <>\n <Styled.NavigationButton\n as={BaseButton}\n icon=\"chevron_left\"\n disabled={!hasPreviousAsset}\n onClick={previousAsset}\n $position=\"left\"\n {...purposeAttributes('previous_asset_button')}\n />\n <Styled.NavigationButton\n as={BaseButton}\n icon=\"chevron_right\"\n disabled={!hasNextAsset}\n onClick={nextAsset}\n $position=\"right\"\n {...purposeAttributes('next_asset_button')}\n />\n </>\n )}\n </Styled.ImageView>\n\n {canControl && (\n <Styled.ThumbsList ref={listRef} {...purposeAttributes('thumbnails')}>\n {assets.map((asset, index) => (\n <Styled.Thumbnail\n key={asset.id}\n role=\"button\"\n aria-pressed={isSelected(asset)}\n $active={isSelected(asset)}\n onClick={() => handleAssetSelection(index)}\n {...purposeAttributes('thumbnail')}\n >\n {type === 'image' && (\n <AssetGalleryThumbnailImage image={asset}/>\n )}\n {type === 'video' && (\n <AssetGalleryThumbnailVideo video={asset}/>\n )}\n </Styled.Thumbnail>\n ))}\n </Styled.ThumbsList>\n )}\n </Styled.Gallery>\n );\n}\n\nAssetGallery.propTypes = {\n canControl: PropTypes.bool,\n overlay: PropTypes.node,\n type: PropTypes.oneOf(['image', 'video'])\n}\n\nAssetGallery.defaultProps = {\n type: 'image'\n}","import PropTypes from \"prop-types\";\nimport {createContext, useMemo, useState} from 'react'\n\nexport const AssetsGalleryContext = createContext({\n assets: [],\n selectedAsset: null,\n selectAsset: () => null,\n})\n\nexport const AssetsGalleryProvider = ({children, assets = [], initialAsset = null}) => {\n const [selectedAsset, selectAsset] = useState(initialAsset ?? assets[0] ?? null)\n\n const context = useMemo(() => {\n return {\n assets,\n selectedAsset,\n selectAsset\n }\n }, [assets, selectedAsset])\n\n return (\n <AssetsGalleryContext.Provider value={context}>\n {children}\n </AssetsGalleryContext.Provider>\n )\n}\n\nAssetsGalleryProvider.propTypes = {\n assets: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n assetPath: PropTypes.string,\n thumbnailPath: PropTypes.string,\n })).isRequired,\n initialAsset: PropTypes.shape({\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n assetPath: PropTypes.string,\n thumbnailPath: PropTypes.string,\n }),\n}","import styled, {css} from \"styled-components\";\n\nexport const Page = styled.div(\n ({theme: {utils}}) => css`\n background: ${utils.color('neutral.900')};\n color: ${utils.color('neutral.white')};\n font-family: ${utils.fontFamily('default')};\n display: flex;\n height: 100vh;\n transition: ${utils.transition('padding')};\n width: 100vw;\n `\n)\n\nexport const Errors = styled(Page)(\n () => css`\n align-items: center;\n justify-content: center;\n `\n)\n","import {ErrorState} from \"@react/components\";\nimport * as Styled from \"./errors_state.styled\";\n\nexport const ErrorsState = ({title, errors = []}) => {\n return (\n <Styled.Errors>\n <ErrorState>\n <ErrorState.Picture/>\n {title && <ErrorState.Title>{title}</ErrorState.Title>}\n <ErrorState.Message>\n {errors.map(error => <code key={error}>{error?.message}</code>)}\n </ErrorState.Message>\n </ErrorState>\n </Styled.Errors>\n )\n}","import PropTypes from \"prop-types\";\nimport {createContext} from 'react'\n\nexport const InteractiveGalleryContext = createContext({\n accessType: 'public',\n blocking: false,\n branding: true,\n contactBar: false,\n name: null,\n organisation: null,\n timeToAuthenticate: 0,\n viewerCountry: null,\n});\n\nexport const InteractiveGalleryProvider = ({settings, children}) => {\n return (\n <InteractiveGalleryContext.Provider value={settings}>\n {children}\n </InteractiveGalleryContext.Provider>\n )\n}\n\nInteractiveGalleryProvider.propTypes = {\n settings: PropTypes.shape({\n accessType: PropTypes.oneOf(['public', 'private', 'gated']),\n blocking: PropTypes.bool,\n branding: PropTypes.bool,\n contactBar: PropTypes.bool,\n name: PropTypes.string,\n organisation: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n logoUrl: PropTypes.string,\n }),\n timeToAuthenticate: PropTypes.number,\n viewerCountry: PropTypes.string,\n })\n}","import styled, {css, keyframes} from \"styled-components\";\n\nconst animation = (keyFrames, delay = 0) => {\n return css`${keyFrames} .5s ${.2 + delay}s ease-out both`;\n}\n\nconst SlideDownAnimation = keyframes`\n 0% {\n opacity: 0;\n transform: translateY(-100%);\n }\n 100% {\n opacity: 1;\n transform: translateY(0%);\n }\n`\nconst SlideUpAnimation = keyframes`\n 0% {\n opacity: 0;\n transform: translateY(100%);\n }\n 100% {\n opacity: 1;\n transform: translateY(0%);\n }\n`\nconst ScaleUpAnimation = keyframes`\n 0% {\n opacity: 0;\n transform: scale(.9);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n`\n\nexport const ScaleUpElement = styled.div(\n () => css`\n animation: ${animation(ScaleUpAnimation)};\n `\n)\nexport const SlideUpElement = styled.div(\n () => css`\n animation: ${animation(SlideUpAnimation)};\n `\n)\nexport const SlideDownElement = styled.div(\n () => css`\n animation: ${animation(SlideDownAnimation)};\n `\n)\n\nexport const Page = styled.div(\n ({theme: {utils}}) => css`\n background: ${utils.color('neutral.900')};\n color: ${utils.color('neutral.white')};\n font-family: ${utils.fontFamily('default')};\n display: flex;\n height: 100vh;\n transition: ${utils.transition('padding')};\n width: 100vw;\n `\n)\n\nexport const Wrapper = styled(Page)(\n () => css`\n align-items: center;\n justify-content: center;\n `\n)\n\nexport const Body = styled.section(\n ({theme: {utils}}) => css`\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n `\n)\n\nexport const Content = styled.div(\n ({theme: {utils}}) => css`\n align-items: stretch;\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: ${utils.rem(8)};\n height: calc(100% + ${utils.rem(64 + 72)});\n overflow: hidden;\n padding: ${utils.spacing(0, 4)};\n `\n)\n\nexport const Header = styled(SlideDownElement)(\n ({theme: {utils}}) => css`\n align-items: center;\n display: flex;\n gap: ${utils.rem(8)};\n height: ${utils.rem(64)};\n justify-content: space-between;\n padding: ${utils.spacing(2, 4)};\n\n &:empty {\n height: 0;\n }\n `\n )\n\nexport const View = styled(ScaleUpElement)(\n ({theme: {utils}}) => css`\n align-items: center;\n border-radius: ${utils.radius('md')};\n display: flex;\n flex: 1;\n justify-content: center;\n min-height: 0;\n position: relative;\n overflow: hidden;\n z-index: 1;\n `\n)\n\nexport const Footer = styled(SlideUpElement)(\n ({theme: {utils}}) => css`\n align-items: center;\n display: flex;\n gap: ${utils.spacing(2)};\n justify-content: space-between;\n padding: ${utils.spacing(4)};\n z-index: 1;\n \n &:empty {\n padding-top: 0;\n }\n\n > * {\n flex: 1;\n }\n `\n )","import styled, {css} from \"styled-components\";\n\nexport const Page = styled.div(\n ({theme: {utils}, $unit = 'viewport', $noBackground}) => css`\n background: ${$noBackground ? 'transparent' : utils.color('neutral.900')};\n color: ${utils.color('neutral.white')};\n font-family: ${utils.fontFamily('default')};\n display: flex;\n height: 100${$unit === 'viewport' ? 'vh' : '%'};\n transition: ${utils.transition('padding')};\n width: 100${$unit === 'viewport' ? 'vw' : '%'};\n `\n)\n\nexport const Loader = styled(Page)(\n () => css`\n align-items: center;\n justify-content: center;\n `\n)\n","import PropTypes from 'prop-types';\nimport { LoadingSpinner } from '@react/components';\nimport * as Styled from './loading_state.styled';\n\nexport const LoadingState = ({ unit, noBackground }) => (\n <Styled.Loader $unit={unit} $noBackground={noBackground}>\n <LoadingSpinner size={48} />\n </Styled.Loader>\n);\n\nLoadingState.propTypes = {\n unit: PropTypes.string,\n noBackground: PropTypes.bool,\n};\n\nLoadingState.defaultProps = {\n unit: undefined,\n noBackground: false,\n};\n","import {createContext, useMemo, useState} from 'react'\nimport {MatterportApi} from \"../../api\";\n\nexport const MatterportContext = createContext()\n\nexport const MatterportProvider = ({children, initialMatterportId}) => {\n const [matterport, setMatterport] = useState(null);\n const [matterportId, setMatterportId] = useState(initialMatterportId)\n\n const context = useMemo(() => {\n return {\n matterport,\n setMatterport: (mp) => setMatterport(new MatterportApi(mp)),\n matterportId,\n setMatterportId,\n\n changeSweep: (sweep) => matterport?.changeSweep(sweep),\n changeMode: (mode) => matterport?.changeMode(mode),\n moveTo: (pose) => matterport?.changeView(pose),\n zoomTo: (zoom) => matterport?.zoomTo(zoom),\n getView: () => matterport?.view(),\n }\n }, [matterport, matterportId]);\n\n return (\n <MatterportContext.Provider value={context}>\n {children}\n </MatterportContext.Provider>\n )\n}","import { useEffect, useRef, useState } from 'react';\nimport { useKrpanoScript } from '@react/hooks';\nimport { MATTERPORT_SCRIPT } from '../api';\n\n/**\n * See options: https://support.matterport.com/s/article/URL-Parameters\n */\nconst MatterportParams = (uid, options) => {\n const params = {\n m: uid, // Matterport uid\n play: 1, // Auto load current tour\n qs: 0, // Disable quick start\n gt: 0, // Disable Guided tour button\n hr: 0, // Disable highlight reel\n tourcta: 0, // Disable call to action at the end of the guided tour\n mls: 2, // Disable branding, links in Mattertag Posts and VR,\n help: 0, // Disable help\n brand: 0, // Remove branding\n search: 0, // Disabled search button\n vr: 0, // Hide VR button\n ...options,\n };\n\n return new URLSearchParams(params);\n};\n\nexport const useMatterport = ({ matterportId, onReady, onError, matterportParams }) => {\n const iframeRef = useRef(null);\n const [scriptLoaded, scriptError] = useKrpanoScript(MATTERPORT_SCRIPT, {\n async: false,\n checkLoaded: () => !!window.MP_SDK,\n });\n\n const [matterport, setMatterport] = useState(null);\n\n const iframeUrl = matterportId\n ? `https://my.matterport.com/show/?${MatterportParams(matterportId, matterportParams)}`\n : null;\n\n useEffect(() => {\n if (scriptError) {\n onError?.(scriptError);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scriptError]);\n\n useEffect(() => () => matterport?.disconnect(), [matterport]);\n\n useEffect(() => {\n if (!iframeRef.current || !scriptLoaded) return;\n\n if (!window.MP_SDK) {\n return onError?.('Matterport script not loaded');\n }\n\n // eslint-disable-next-line no-undef\n window.MP_SDK.connect(iframeRef.current, MATTERPORT_API_KEY, '')\n .then((mp) => {\n setMatterport(mp);\n onReady?.(mp);\n })\n .catch((error) => {\n setMatterport(null);\n onError?.(error);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [matterportId, iframeRef.current, scriptLoaded]);\n\n return {\n iframeRef,\n scriptLoaded,\n scriptError,\n matterport,\n iframeUrl,\n };\n};\n","import styled, {css} from 'styled-components'\n\nexport const Iframe = styled.iframe(\n ({disabled}) => css`\n height: 100%;\n width: 100%;\n\n ${disabled && css`\n pointer-events: none;\n `}\n `\n)","import {throttle} from \"lodash\";\nimport {memo, useEffect} from \"react\";\nimport {useMatterport} from \"../../hooks\";\nimport * as Styled from \"./matterport.styled\";\n\nconst defaultFunc = () => null;\n\nexport const Matterport = memo((\n {\n matterportId,\n onReady = defaultFunc,\n onError = defaultFunc,\n onCameraMove = defaultFunc,\n onCameraZoom = defaultFunc,\n onAppStateChange = defaultFunc,\n onSweepChange = defaultFunc,\n onModeChange = defaultFunc,\n matterportParams,\n disabled = false,\n ...props\n }\n) => {\n const {iframeRef, iframeUrl, matterport} = useMatterport({\n matterportId,\n matterportParams,\n onReady,\n onError,\n });\n\n useEffect(() => {\n if (!matterport) return;\n\n const throttledCameraMove = throttle(onCameraMove, 1000 / 12, {trailing: true});\n const throttledCameraZoom = throttle(onCameraZoom, 1000 / 12, {trailing: true});\n\n matterport.App.state.subscribe(onAppStateChange)\n matterport.Camera.pose.subscribe(throttledCameraMove)\n matterport.Camera.zoom.subscribe(throttledCameraZoom)\n matterport.on(matterport.Sweep.Event.EXIT, onSweepChange)\n matterport.on(matterport.Mode.Event.CHANGE_START, onModeChange)\n }, [matterport, onCameraMove, onCameraZoom, onAppStateChange, onModeChange, onSweepChange]\n )\n\n if (!iframeUrl) return null;\n\n return (\n <Styled.Iframe\n {...props}\n ref={iframeRef}\n src={iframeUrl}\n disabled={disabled}\n frameBorder={0}\n />\n )\n})","import {useCallback} from \"react\";\nimport {useMatterportContext} from \"../../hooks\";\nimport {Matterport} from \"../matterport\";\n\nexport const MatterportTour = ({onInit, ...props}) => {\n const {matterportId, setMatterport} = useMatterportContext()\n\n const handleReady = useCallback((mp) => {\n setMatterport(mp)\n onInit?.();\n }, []);\n\n return (\n <Matterport\n {...props}\n key={matterportId}\n matterportId={matterportId}\n onReady={handleReady}\n {...purposeAttributes('matterport_tour')}\n />\n )\n}","import styled, {css} from 'styled-components';\n\nexport const Image = styled.img(\n () => css`\n display: block;\n margin: auto;\n max-width: 100%;\n max-height: 66vh;\n `\n)\n\nexport const Text = styled.div(\n ({theme: {utils}}) => css`\n color: ${utils.color('neutral.800')};\n text-align:center;\n width: 100%;\n \n p { margin: ${utils.rem(0, 0, 8)}; }\n `\n)","import { Dialog, Flex } from '@nodalview/nodes-web';\nimport { flowRight } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { usePrevious } from 'react-use';\nimport { LazyLoadImage } from '@react/components';\nimport { replaceYoutubeUrl, sanitizeText } from '@react/helpers';\nimport { useKrpanoContext } from '../../hooks';\nimport * as Styled from './krpano_information_box_dialog.styled';\n\nexport const KrpanoInformationBoxDialog = ({ onClose, ...props }) => {\n const { activeInfoHotspot, closeInfoBox } = useKrpanoContext();\n\n const cachedActiveInfoHotspot = usePrevious(activeInfoHotspot);\n const infoHotspot = activeInfoHotspot ?? cachedActiveInfoHotspot;\n\n const hasImage = !!infoHotspot?.imageUrl;\n const hasText = !!infoHotspot?.text;\n\n const transform = flowRight([replaceYoutubeUrl, sanitizeText]);\n const safeHtml = transform(infoHotspot?.text);\n\n const handleClose = () => {\n closeInfoBox();\n onClose?.();\n };\n\n return (\n <Dialog.Root open={!!activeInfoHotspot} onClose={handleClose} {...props}>\n <Dialog.Content>\n <Flex align=\"stretch\" direction=\"column\" gap=\"4\">\n {hasImage && <Styled.Image as={LazyLoadImage} src={infoHotspot.imageUrl} />}\n {hasText && <Styled.Text dangerouslySetInnerHTML={{ __html: safeHtml }} />}\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\nKrpanoInformationBoxDialog.propTypes = {\n onClose: PropTypes.func,\n};\n\nKrpanoInformationBoxDialog.defaultProps = {\n onClose: undefined,\n};\n","import styled, {css} from 'styled-components'\n\nexport const Viewer = styled.div(\n () => css`\n height: 100%;\n width: 100%;\n `\n)","import { isEqual, pick, throttle } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { memo, useEffect, useRef } from 'react';\nimport { useKrpano } from '@react/hooks';\nimport { KRPANO_EVENTS } from '../../config';\nimport { useKrpanoContext } from '../../hooks';\nimport { KrpanoInformationBoxDialog } from '../krpano_information_box_dialog';\nimport * as Styled from './krpano.styled';\n\nconst defaultFunc = () => null;\n\nexport const Krpano = memo(\n ({\n xml,\n onReady,\n onError,\n onViewChanged,\n onLoadComplete,\n onLoadError,\n onNewScene,\n onOpenInformationBox,\n onCloseInformationBox,\n options,\n ...props\n }) => {\n const { openInfoBox } = useKrpanoContext();\n const previousView = useRef(null);\n\n const handleOpenInfoBox = (hotspotId) => {\n openInfoBox(hotspotId);\n onOpenInformationBox?.(hotspotId);\n };\n\n const handleCloseInfoBox = () => {\n onCloseInformationBox?.();\n };\n\n const { containerRef, krpanoInstance } = useKrpano({\n ...options,\n xml,\n onReady,\n onError,\n globalVarName: 'nodalviewKrpano',\n globalFunctions: {\n openInformationBox: handleOpenInfoBox,\n },\n });\n\n useEffect(() => {\n if (!krpanoInstance) return;\n\n const throttledViewChanged = throttle(onViewChanged, 1000 / 24, { trailing: true });\n\n const handleViewChanged = () => {\n const view = pick(krpanoInstance.view, ['hlookat', 'vlookat', 'fov']);\n\n if (!isEqual(previousView.current, view)) {\n previousView.current = view;\n throttledViewChanged(view);\n }\n };\n\n const handleSceneChanged = () => {\n const scene = krpanoInstance.get('xml.scene');\n onNewScene?.(scene);\n };\n\n krpanoInstance.events.addListener(KRPANO_EVENTS.ON_VIEW_CHANGED, handleViewChanged);\n krpanoInstance.events.addListener(KRPANO_EVENTS.ON_LOAD_COMPLETE, onLoadComplete);\n krpanoInstance.events.addListener(KRPANO_EVENTS.ON_LOAD_ERROR, onLoadError);\n krpanoInstance.events.addListener(KRPANO_EVENTS.ON_NEW_SCENE, handleSceneChanged);\n\n return () => {\n krpanoInstance.events.removeListener(KRPANO_EVENTS.ON_VIEW_CHANGED, handleViewChanged);\n krpanoInstance.events.removeListener(KRPANO_EVENTS.ON_LOAD_COMPLETE, onLoadComplete);\n krpanoInstance.events.removeListener(KRPANO_EVENTS.ON_LOAD_ERROR, onLoadError);\n krpanoInstance.events.removeListener(KRPANO_EVENTS.ON_NEW_SCENE, handleSceneChanged);\n };\n }, [krpanoInstance, onViewChanged, onLoadComplete, onLoadError, onNewScene]);\n\n return (\n <>\n <Styled.Viewer ref={containerRef} {...props} />\n <KrpanoInformationBoxDialog onClose={handleCloseInfoBox} />\n </>\n );\n },\n);\n\nKrpano.propTypes = {\n xml: PropTypes.string.isRequired,\n options: PropTypes.shape({}),\n onReady: PropTypes.func,\n onError: PropTypes.func,\n onViewChanged: PropTypes.func,\n onLoadComplete: PropTypes.func,\n onLoadError: PropTypes.func,\n onNewScene: PropTypes.func,\n onOpenInformationBox: PropTypes.func,\n onCloseInformationBox: PropTypes.func,\n};\n\nKrpano.defaultProps = {\n onReady: defaultFunc,\n options: {},\n onError: defaultFunc,\n onViewChanged: defaultFunc,\n onLoadComplete: defaultFunc,\n onLoadError: defaultFunc,\n onNewScene: defaultFunc,\n onOpenInformationBox: defaultFunc,\n onCloseInformationBox: defaultFunc,\n};\n","import {memo, useCallback} from \"react\";\nimport {useIGPropertyContext, useKrpanoContext} from \"../../hooks\";\nimport {Krpano} from \"../krpano\";\n\nexport const NodalviewTour = memo(({onInit, ...props}) => {\n const {property} = useIGPropertyContext();\n const {setKrpano} = useKrpanoContext();\n\n const xml = property.nodalviewTour?.xmlUrl\n\n const handleReady = useCallback((krpano) => {\n setKrpano(krpano);\n onInit?.();\n }, []);\n\n return (\n <Krpano\n key={xml}\n {...props}\n xml={xml}\n onReady={handleReady}\n {...purposeAttributes('nodalview_tour')}\n />\n )\n})","import {Logger} from \"@react/helpers\";\nimport {KRPANO_EVENTS} from \"../config\";\n\nexport class KrpanoApi {\n constructor(krpanoInterface) {\n this.interface = krpanoInterface;\n this.events = KRPANO_EVENTS;\n }\n\n get domElement() {\n return this.interface.display.htmltarget;\n }\n\n get currentPano() {\n return this.interface.get('xml.scene');\n }\n\n view() {\n const {hlookat, vlookat, fov} = this.interface.view;\n return {hlookat, vlookat, fov};\n }\n\n loadPano(sceneName) {\n if (sceneName === this.currentPano) return;\n\n this._log('loadPano', sceneName)\n return new Promise((resolve) => {\n this.interface.actions.loadscene(sceneName, {}, 'MERGE', 'BLEND(0.3, easeInCubic)', resolve);\n })\n }\n\n toggleAutoRotate() {\n const {autorotate} = this.interface;\n\n this._log('toggleAutoRotate')\n\n if (autorotate.isrotating) {\n autorotate.stop();\n } else {\n autorotate.start();\n }\n }\n\n startMove(direction, threshold = 1) {\n this._log('startMove', direction, threshold)\n\n switch (direction) {\n case 'left':\n this.interface.set('hlookat_moveforce', threshold * -1)\n break;\n case 'right':\n this.interface.set('hlookat_moveforce', threshold * 1)\n break;\n case 'up':\n this.interface.set('vlookat_moveforce', threshold * -1)\n break;\n case 'down':\n this.interface.set('vlookat_moveforce', threshold * 1)\n break;\n }\n }\n\n stopMove() {\n this._log('stopMove')\n this.interface.set('hlookat_moveforce', 0)\n this.interface.set('vlookat_moveforce', 0)\n }\n\n startZoom(direction, threshold = 1) {\n this._log('startZoom', direction, threshold)\n switch (direction) {\n case 'in':\n this.interface.set('fov_moveforce', threshold * -1);\n break;\n case 'out':\n this.interface.set('fov_moveforce', threshold * 1);\n break;\n }\n }\n\n stopZoom() {\n this._log('stopZoom')\n this.interface.set('fov_moveforce', 0)\n }\n\n lookAt({hlookat, vlookat, fov}) {\n this.interface.actions.lookat(hlookat, vlookat, fov);\n }\n\n enableControl() {\n this.domElement?.style.removeProperty('pointer-events');\n this._setHotspotsAlpha(1);\n }\n\n disableControl() {\n this.domElement?.style.setProperty('pointer-events', 'none');\n this._setHotspotsAlpha(0.4);\n }\n\n enterVr() {\n this._log('enterVr')\n // this.interface.call('webvr.enterVR()');\n }\n\n on(eventType, eventHandler) {\n this._log('on', eventType)\n this._checkInterface()\n this.interface.events.addListener(eventType, eventHandler.bind(this));\n }\n\n off(eventType, eventHandler) {\n this._log('off', eventType)\n this._checkInterface()\n this.interface.events.removeListener(eventType, eventHandler.bind(this));\n }\n\n\n //-- private\n\n _log(name, ...args) {\n Logger.info(`%cKrpanoApi:${name}`, 'background-color: #FCDF8A; color: white;', ...args);\n }\n\n _checkInterface() {\n if (!this.interface)\n throw new Error('Missing Krpano interface')\n }\n\n _setHotspotsAlpha(alpha) {\n const hotspots = this.interface.hotspot.getArray();\n\n hotspots.forEach((hotspot) => {\n hotspot.alpha = alpha;\n })\n }\n}","import PropTypes from \"prop-types\";\nimport {createContext, useMemo, useState} from \"react\";\nimport {useToggle} from \"react-use\";\nimport {KrpanoApi} from \"../../api\";\n\nexport const NodalviewTourContext = createContext({})\n\nexport const NodalviewTourProvider = ({children, informationHotspots = []}) => {\n const [krpano, setKrpano] = useState(null);\n const [scene, setScene] = useState(null);\n const [autoRotate, toggleAutoRotate] = useToggle(false);\n const [activeInfoHotspot, setActiveInfoHotspot] = useState(null);\n\n const context = useMemo(() => {\n return {\n krpano,\n setKrpano: (instance) => setKrpano(new KrpanoApi(instance)),\n activeInfoHotspot,\n autoRotate,\n\n scene,\n setScene,\n\n toggleAutoRotate: () => {\n toggleAutoRotate();\n krpano.toggleAutoRotate()\n },\n startRotatePano: (direction) => krpano.startMove(direction),\n stopRotatePano: () => krpano.stopMove(), // left | right | up | down\n startZoomPano: (direction) => krpano.startZoom(direction), // in | out\n stopZoomPano: () => krpano.stopZoom(),\n lookAt: (view) => krpano.lookAt(view), // {hlookat, vlookat, fov}\n enableControl: () => krpano.enableControl(),\n disableControl: () => krpano.disableControl(),\n openInfoBox: (hotspotId) => {\n const hotspot = informationHotspots.find(hs => hs.id === Number(hotspotId))\n setActiveInfoHotspot(hotspot);\n },\n closeInfoBox: () => setActiveInfoHotspot(null),\n loadPano: (sceneName) => {\n krpano.loadPano(sceneName);\n setScene(sceneName)\n },\n }\n }, [krpano, activeInfoHotspot, informationHotspots, autoRotate, scene]);\n\n return (\n <NodalviewTourContext.Provider value={context}>\n {children}\n </NodalviewTourContext.Provider>\n )\n}\n\nNodalviewTourProvider.propTypes = {\n informationHotspots: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n imageUrl: PropTypes.string,\n text: PropTypes.string,\n })\n )\n}","import styled, {css} from \"styled-components\";\n\nexport const Image = styled.img(\n ({theme: {utils}}) => css`\n max-height: ${utils.rem(64)};\n max-width: ${utils.rem(240)};\n object-fit: contain;\n `\n)\n\nexport const Link = styled.a(\n ({theme: {utils}}) => css`\n color: ${utils.color('neutral.white')};\n &:hover {\n color: ${utils.color('neutral.50')};\n }\n `\n)","import { purposeAttributes } from '@global';\nimport { Heading } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { useState } from 'react';\nimport { LazyLoadImage } from '@react/components';\nimport { useInteractiveGalleryContext } from '../../hooks';\nimport * as Styled from './organisation_logo.styled';\n\nexport const OrganisationLogo = ({ imageProps, nameProps }) => {\n const { organisation, branding } = useInteractiveGalleryContext();\n const { name, logoUrl, websiteUrl } = organisation ?? {};\n\n const [showName, setShowName] = useState(!logoUrl);\n\n if (!branding || (!name && !logoUrl)) return null;\n\n if (showName) {\n return (\n <Styled.Link href={websiteUrl} target=\"_blank\">\n <Heading\n level=\"md\"\n color=\"inherit\"\n {...nameProps}\n {...purposeAttributes('organisation_name')}\n >\n {name}\n </Heading>\n </Styled.Link>\n );\n }\n\n return (\n <Styled.Link href={websiteUrl} target=\"_blank\">\n <LazyLoadImage\n hidePlaceholder\n as={Styled.Image}\n {...purposeAttributes('organisation_logo')}\n {...imageProps}\n src={logoUrl}\n alt={name}\n onLoadComplete={() => setShowName(false)}\n onLoadError={() => setShowName(true)}\n />\n </Styled.Link>\n );\n};\n\nOrganisationLogo.propTypes = {\n imageProps: PropTypes.shape({}),\n nameProps: PropTypes.shape({}),\n};\n\nOrganisationLogo.defaultProps = {\n imageProps: {},\n nameProps: {},\n};\n","import styled, {css} from 'styled-components'\n\nexport const Container = styled.div(\n ({theme: {utils}, size}) => css`\n align-items: center;\n display: flex;\n flex: 1;\n gap: ${utils.spacing(1)};\n justify-content: flex-end;\n \n ${size === 'xs' && css`\n gap: ${utils.spacing(2)};\n `}\n ${size === 'sm' && css`\n gap: ${utils.spacing(2)};\n `}\n ${size === 'md' && css`\n gap: ${utils.spacing(3)};\n `}\n `\n)\n\nexport const Text = styled.span(\n ({theme: {utils}}) => css`\n font-size: 10px;\n color: ${utils.color('neutral.100')};\n `\n)\n","import { Text } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { NodalviewLogo } from '@react/components/nodalview_logo';\nimport * as Styled from './powered_by.styled';\n\nexport const PoweredBy = ({ size, mode, ...props }) => (\n <Styled.Container {...props} size={size}>\n <Text as={Styled.Text} strong>\n Powered by\n </Text>\n <a href=\"https://nodalview.com\" target=\"_blank\" rel=\"noreferrer\">\n <NodalviewLogo size={size} mode={mode} />\n </a>\n </Styled.Container>\n);\n\nPoweredBy.propTypes = {\n size: PropTypes.oneOf(['xs', 'sm', 'md']),\n mode: PropTypes.oneOf(['dark', 'light', 'white']),\n};\n\nPoweredBy.defaultProps = {\n size: 'sm',\n mode: 'dark',\n};\n","import {defaults} from \"lodash\";\nimport {createContext, memo, useReducer} from 'react';\nimport {IG_MODULES_INITIAL_STATE, IGModulesReducer} from \"../../reducers\";\n\nexport const IGModulesContext = createContext();\n\nexport const IGModulesProvider = memo(({children, ...options}) => {\n const initialState = defaults({}, options?.initialState, IG_MODULES_INITIAL_STATE);\n\n const context = useReducer(IGModulesReducer, initialState);\n\n return (\n <IGModulesContext.Provider value={context}>\n {children}\n </IGModulesContext.Provider>\n );\n})","import {toCamelCase} from \"@react/helpers\";\nimport {createContext, memo, useMemo, useState} from 'react';\n\nexport const IGPropertyContext = createContext();\n\nexport const IGPropertyProvider = memo((\n {children, initialProperty}\n) => {\n const property = useMemo(() => toCamelCase(initialProperty), [initialProperty])\n const [contextGetter, contextSetter] = useState(property);\n\n const transformValue = (property) => contextSetter(toCamelCase(property));\n\n return (\n <IGPropertyContext.Provider value={[contextGetter, transformValue]}>\n {children}\n </IGPropertyContext.Provider>\n );\n})","import {defaults} from \"lodash\";\nimport {createContext, memo, useReducer} from 'react';\nimport {IG_VIEWS_INITIAL_STATE, IGViewsReducer} from \"../../reducers\";\n\nexport const IGViewsContext = createContext();\n\nexport const IGViewsContextProvider = ({children, context}) => {\n return (\n <IGViewsContext.Provider value={context}>\n {children}\n </IGViewsContext.Provider>\n )\n}\n\nexport const IGViewsProvider = memo(({children, ...options}) => {\n const initialState = defaults({}, options?.initialState, IG_VIEWS_INITIAL_STATE)\n const context = useReducer(IGViewsReducer, initialState);\n\n return (\n <IGViewsContextProvider context={context}>\n {children}\n </IGViewsContextProvider>\n );\n})\n","import styled, {css} from \"styled-components\";\n\nexport const Button = styled.button(\n ({theme: {utils, borderRadius}, $active}) => css`\n background-color: ${$active ? utils.color('neutral.600') : 'transparent'};\n border: none;\n border-radius: ${borderRadius.default};\n color: ${utils.color('neutral.white')};\n font-size: ${utils.rem(14)};\n font-weight: 600;\n\n &:not(:disabled):hover {\n background-color: ${utils.color('neutral.600')};\n }\n `\n)","import { Button } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { useBreakpoint } from '@react/hooks';\nimport * as Styled from './tabs_button.styled';\n\nexport const TabsButton = ({ active, icon, children, ...props }) => {\n const gteMD = useBreakpoint('md');\n\n return (\n <Styled.Button as={Button} $active={active} leadingIcon={icon} {...props}>\n {gteMD && children}\n </Styled.Button>\n );\n};\n\nTabsButton.propTypes = {\n active: PropTypes.bool,\n icon: PropTypes.string,\n};\n\nTabsButton.defaultProps = {\n active: false,\n icon: undefined,\n};\n","import styled, {css} from 'styled-components'\n\nexport const Container = styled.div(\n ({theme: {utils}}) => css`\n align-items: center;\n display: flex;\n flex: 1;\n gap: ${utils.rem(8)};\n justify-content: center;\n `\n)","import {sortBy} from \"lodash\";\nimport {useIGViewsContext} from \"../../hooks\";\nimport * as Styled from './tabs_button_list.styled'\n\nexport const TabsButtonList = ({canControl, ...props}) => {\n const {registeredViews} = useIGViewsContext();\n\n const sortedViews = sortBy(registeredViews, ['order']);\n\n if (sortedViews.length <= 1) return null;\n\n return (\n <Styled.Container {...purposeAttributes('view_tabs')} {...props}>\n {sortedViews.map(({component: Component, ...view}) => (\n <Component\n key={view.name}\n view={view}\n disabled={!canControl}\n {...purposeAttributes(`${view.name}_view_tab`)}\n />\n ))}\n </Styled.Container>\n )\n}","import {createContext, useState} from 'react'\n\nexport const ViewExtensionContext = createContext({\n isOpen: undefined,\n actionData: null,\n scrollProgress: 0,\n disabled: false,\n onScroll: () => null,\n onOpen: () => null,\n onClose: () => null,\n onChange: () => null,\n});\n\nexport const ViewExtensionProvider = (\n {\n children,\n onScroll,\n onClose,\n onOpen,\n onChange,\n isOpen: controlledIsOpen,\n scrollProgress = 0,\n actionData = null,\n disabled = false,\n }\n) => {\n const [isOpenState, setIsOpenState] = useState(false);\n\n const handleOpen = () => {\n setIsOpenState(true)\n onOpen?.()\n }\n const handleClose = () => {\n setIsOpenState(false)\n onClose?.()\n }\n\n const context = {\n isOpen: controlledIsOpen ?? isOpenState,\n actionData,\n scrollProgress,\n disabled,\n onScroll,\n onClose: handleClose,\n onOpen: handleOpen,\n onChange\n }\n\n return (\n <ViewExtensionContext.Provider value={context}>{children}</ViewExtensionContext.Provider>\n )\n}","import styled, {css} from \"styled-components\";\n\nexport const Button = styled.button(\n ({theme: {utils}, $active, disabled}) => css`\n background: ${utils.color('neutral.white')};\n box-shadow: 0px 2px 4px rgba(15, 25, 39, 0.3);\n border: none;\n border-radius: 50%;\n color: #1C2939;\n display: flex;\n font-size: ${utils.rem(16)};\n padding: ${utils.rem(14)};\n position: relative;\n \n &:hover {\n background-color: ${utils.color('neutral.100')};\n cursor: pointer;\n }\n \n ${$active && css`\n color: ${utils.color('primary.500')};\n `}\n \n ${disabled && css`\n opacity: .4;\n pointer-events: none;\n `}\n `\n)","import { Icon } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { forwardRef } from 'react';\nimport * as Styled from './base_extension_button.styled';\n\nexport const BaseExtensionButton = forwardRef(({ icon, active, ...props }, ref) => (\n <Styled.Button $active={active} ref={ref} {...props}>\n <Icon name={icon} />\n </Styled.Button>\n));\n\nBaseExtensionButton.displayName = 'BaseExtensionButton';\n\nBaseExtensionButton.propTypes = {\n icon: PropTypes.string.isRequired,\n active: PropTypes.bool,\n};\n\nBaseExtensionButton.defaultProps = {\n active: false,\n};\n","import styled, {css} from 'styled-components';\n\nexport const Container = styled.section(\n ({theme: {utils, breakpoint}, $disabled}) => css`\n align-items: flex-start;\n display: flex;\n flex-direction: column;\n gap: ${utils.rem(16)};\n max-height: 66vh;\n overflow-y: auto;\n padding: ${utils.rem(8)};\n width: 100%;\n\n ${breakpoint.up('md')`\n width: ${utils.rem(400)};\n `}\n\n ${$disabled && css`\n pointer-events: none;\n `}\n `\n)\n\nexport const CloseButton = styled.button(\n ({theme: {utils}}) => css`\n position: absolute;\n right: ${utils.rem(4)};\n top: ${utils.rem(4)};\n\n &:hover {\n color: ${utils.color('primary.500')};\n }\n `\n)","import { purposeAttributes } from '@global';\nimport { Button } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { useEffect, useRef } from 'react';\nimport { useViewExtensionContext } from '../../../hooks';\nimport * as Styled from './base_extension_overlay.styled';\n\nexport const BaseExtensionOverlay = ({ children, withoutCloseButton, ...props }) => {\n const ref = useRef(null);\n const { onScroll, onClose, scrollProgress, disabled } = useViewExtensionContext();\n\n useEffect(() => {\n const element = ref.current;\n\n const { scrollHeight, offsetHeight } = element;\n const scrollTop = scrollProgress * (scrollHeight - offsetHeight);\n\n element.scrollTo({ top: scrollTop, behavior: 'auto' });\n }, [scrollProgress]);\n\n useEffect(() => {\n const container = ref.current;\n\n if (!container) return;\n\n container.addEventListener('scroll', onScroll);\n return () => {\n container.removeEventListener('scroll', onScroll);\n };\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, []);\n\n return (\n <Styled.Container\n ref={ref}\n $disabled={disabled}\n {...purposeAttributes('extension_overlay')}\n {...props}\n >\n {!disabled && !withoutCloseButton && (\n <Styled.CloseButton\n as={Button}\n leadingIcon=\"xmark\"\n variant=\"text\"\n onClick={onClose}\n {...purposeAttributes('close_button')}\n />\n )}\n {children}\n </Styled.Container>\n );\n};\n\nBaseExtensionOverlay.propTypes = {\n withoutCloseButton: PropTypes.bool,\n};\n\nBaseExtensionOverlay.defaultProps = {\n withoutCloseButton: false,\n};\n","import { purposeAttributes } from '@global';\nimport PropTypes from 'prop-types';\nimport { UserBusinessCard } from '@react/components';\nimport { useDialog } from '@react/hooks';\nimport { GetInTouchDialog } from '@react/property_gallery';\n\nexport const BusinessCardExtensionOverlay = ({\n businessCard,\n organisation,\n branding,\n canContact,\n}) => {\n const { isDialogOpen, openDialog, closeDialog } = useDialog();\n\n return (\n <>\n <UserBusinessCard\n {...businessCard}\n logoUrl={organisation?.logoUrl}\n branding={organisation?.branding}\n withBranding={branding}\n canContact={canContact}\n onContact={canContact ? () => openDialog() : undefined}\n {...purposeAttributes('business_card')}\n />\n <GetInTouchDialog isOpen={isDialogOpen} onClose={closeDialog} />\n </>\n );\n};\n\nBusinessCardExtensionOverlay.propTypes = {\n businessCard: PropTypes.shape({\n name: PropTypes.string,\n email: PropTypes.string,\n phoneNumber: PropTypes.string,\n photo: PropTypes.string,\n rating: PropTypes.shape({\n score: PropTypes.number.isRequired,\n reviewsCount: PropTypes.number,\n profileUrl: PropTypes.string,\n provider: PropTypes.string,\n }),\n }).isRequired,\n organisation: PropTypes.shape({\n branding: PropTypes.shape({\n mainColor: PropTypes.string.isRequired,\n }),\n logoUrl: PropTypes.string,\n }).isRequired,\n branding: PropTypes.bool,\n canContact: PropTypes.bool,\n};\n\nBusinessCardExtensionOverlay.defaultProps = {\n branding: false,\n canContact: false,\n};\n","import { purposeAttributes } from '@global';\nimport { useRef } from 'react';\nimport { ControlledDropdown } from '@react/components';\nimport { useBreakpoint } from '@react/hooks';\nimport { WithViewExtensionProvider } from '../../../hoc';\nimport { useViewExtensionContext } from '../../../hooks';\nimport { BaseExtensionButton } from '../base_extension_button';\nimport { BusinessCardExtensionOverlay } from '../business_card_overlay';\n\nexport const BusinessCardExtensionButton = WithViewExtensionProvider(\n ({\n businessCardOverride,\n dropdownProps,\n businessCard,\n organisation,\n branding,\n canContact,\n ...props\n }) => {\n const targetRef = useRef(null);\n\n const gteMD = useBreakpoint('md');\n\n const { isOpen, onClose, onOpen, disabled } = useViewExtensionContext();\n\n if (!businessCard) {\n return null;\n }\n\n return (\n <>\n <BaseExtensionButton\n {...props}\n ref={targetRef}\n icon=\"user\"\n onClick={onOpen}\n disabled={disabled}\n {...purposeAttributes('business_card_extension_button')}\n />\n <ControlledDropdown\n anchorPoint={gteMD ? 'top-left' : 'bottom-right'}\n alignment=\"bottom-left\"\n offset={gteMD ? { x: 8, y: 0 } : { x: 0, y: 8 }}\n {...dropdownProps}\n targetRef={targetRef.current}\n isOpen={isOpen}\n onOpen={onOpen}\n onClose={onClose}\n disabledClose={disabled}\n p=\"0\"\n >\n <BusinessCardExtensionOverlay\n businessCard={businessCard}\n organisation={organisation}\n branding={branding}\n canContact={canContact}\n />\n </ControlledDropdown>\n </>\n );\n },\n);\n","import styled, {css, keyframes} from \"styled-components\";\n\nconst ZoomIn = keyframes`\n0% {\n transform: scale(0);\n}\n100 {\n transform: scale(1);\n}\n`\n\nexport const Wrapper = styled.div(\n ({theme: {utils}, $top, $left}) => css`\n animation: ${ZoomIn} .3s .2s ease-out both; \n height: ${utils.rem(24)};\n left: ${$left}%;\n margin: ${utils.rem(-12)};\n position: absolute;\n top: ${$top}%;\n width: ${utils.rem(24)};\n `\n)\n\nexport const Hotspot = styled.div(\n ({theme: {utils}, $active}) => css`\n background-color: ${utils.color('success.500')};\n border-radius: 50%;\n height: 100%;\n transition: ${utils.transition('transform')};\n transform: scale(1);\n transform-origin: center center;\n width: 100%;\n \n &:hover {\n cursor: pointer;\n transform: scale(1.25);\n }\n \n ${$active && css`\n background-color: ${utils.color('primary.500')};\n `}\n `\n)","import * as Styled from './floorplans_hotspot.styled'\n\nexport const FloorplansExtensionHotspot = ({hotspot, active, ...props}) => {\n return (\n <Styled.Wrapper {...props} $left={hotspot.left} $top={hotspot.top}>\n <Styled.Hotspot $active={active}/>\n </Styled.Wrapper>\n )\n}","import styled, { css } from 'styled-components';\n\nexport const Plan = styled.div(\n () => css`\n margin: auto;\n min-height: 0;\n position: relative;\n `,\n);\n\nexport const Picture = styled.img(\n () => css`\n max-height: 100%;\n `,\n);\n","import { purposeAttributes } from '@global';\nimport PropTypes from 'prop-types';\nimport { forwardRef, useEffect, useState } from 'react';\nimport { LazyLoadImage } from '@react/components';\nimport { useKrpanoContext } from '../../../hooks';\nimport { FloorplansExtensionHotspot } from '../floorplans_hotspot';\nimport * as Styled from './floorplans_list_item.styled';\n\nexport const FloorplansExtensionListItem = forwardRef(\n ({ floorplan, onHotspotClick, ...props }, ref) => {\n const { krpano, loadPano } = useKrpanoContext();\n const [isLoaded, setIsLoaded] = useState(false);\n\n const handleHotspotClick = (hotspot) => async () => {\n await loadPano(hotspot.linkedScene);\n onHotspotClick?.();\n };\n\n const isCurrentScene = (hotspot) => krpano.currentPano === hotspot.linkedScene;\n\n useEffect(() => {\n setIsLoaded(false);\n }, [floorplan?.url]);\n\n if (!floorplan) {\n return null;\n }\n\n return (\n <Styled.Plan ref={ref} {...props}>\n <LazyLoadImage\n as={Styled.Picture}\n key={floorplan.url}\n src={floorplan.url}\n onLoadComplete={() => setIsLoaded(true)}\n />\n {isLoaded &&\n floorplan.hotspots.map((hotspot) => (\n <FloorplansExtensionHotspot\n key={hotspot.id}\n hotspot={hotspot}\n active={isCurrentScene(hotspot)}\n onClick={handleHotspotClick(hotspot)}\n {...purposeAttributes('hotspot')}\n />\n ))}\n </Styled.Plan>\n );\n },\n);\n\nFloorplansExtensionListItem.propTypes = {\n floorplan: PropTypes.shape({\n url: PropTypes.string,\n hotspots: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n }),\n ),\n }).isRequired,\n onHotspotClick: PropTypes.func,\n};\n\nFloorplansExtensionListItem.defaultProps = {\n onHotspotClick: undefined,\n};\n","import {Navbar} from \"@nodalview/nodes-web\";\nimport {useEffect, useState} from \"react\";\nimport {useViewExtensionContext} from \"../../../hooks\";\nimport {FloorplansExtensionListItem} from \"../floorplans_list_item\";\n\nexport const FloorplansExtensionList = ({floorplans}) => {\n const {onClose, onChange, actionData, disabled} = useViewExtensionContext();\n\n const [selectedFloorplan, selectFloorplan] = useState(floorplans[0])\n\n const handleSelectFloorplan = (floorplan) => () => {\n if (disabled) return;\n\n const floorplanIndex = floorplans.indexOf(floorplan);\n selectFloorplan(floorplans[floorplanIndex] ?? null);\n onChange?.({action: 'set_floorplan', payload: floorplanIndex})\n }\n\n useEffect(() => {\n if (!actionData) return\n if (actionData?.action !== 'set_floorplan') return;\n if (actionData?.payload === undefined) return;\n\n selectFloorplan(floorplans[actionData.payload])\n }, [actionData]);\n\n return (\n <>\n <Navbar variant=\"tab\" {...purposeAttributes('floorplans_tabs')}>\n {floorplans.map((floorplan) => (\n <Navbar.Item\n key={floorplan.uuid}\n active={floorplan === selectedFloorplan}\n disabled={disabled}\n onClick={handleSelectFloorplan(floorplan)}\n {...purposeAttributes('floorplan_tab')}\n >\n {floorplan.label}\n </Navbar.Item>\n ))}\n </Navbar>\n\n <FloorplansExtensionListItem\n floorplan={selectedFloorplan}\n onHotspotClick={onClose}\n {...purposeAttributes('selected_floorplan')}\n />\n </>\n )\n}","import { purposeAttributes } from '@global';\nimport { Dialog } from '@nodalview/nodes-web';\nimport { WithViewExtensionProvider } from '../../../hoc';\nimport { useIGPropertyContext, useViewExtensionContext } from '../../../hooks';\nimport { BaseExtensionButton } from '../base_extension_button';\nimport { FloorplansExtensionList } from '../floorplans_list';\n\nexport const FloorplansExtensionButton = WithViewExtensionProvider((props) => {\n const { property } = useIGPropertyContext();\n const { isOpen, onOpen, onClose, disabled } = useViewExtensionContext();\n const { floorplans = [] } = property;\n\n if (floorplans.length === 0) {\n return null;\n }\n\n return (\n <>\n <BaseExtensionButton\n {...props}\n icon=\"floorplan\"\n onClick={onOpen}\n disabled={disabled}\n {...purposeAttributes('floorplans_extension_button')}\n />\n <Dialog.Root open={isOpen} onClose={onClose} closable={!disabled}>\n <Dialog.Content\n size=\"xl\"\n style={{ height: '100%' }}\n {...purposeAttributes('floorplans_extension_dialog')}\n >\n <FloorplansExtensionList floorplans={floorplans} />\n </Dialog.Content>\n </Dialog.Root>\n </>\n );\n});\n","import styled, {css} from 'styled-components'\n\nconst AnimatedElement = styled.div(\n ({$active}) => css`\n opacity: 0;\n transition: opacity .3s, transform .3s, visibility 0s .3s;\n visibility: hidden;\n\n ${$active && css`\n opacity: 1;\n transition-delay: 0s;\n visibility: visible;\n `}\n `\n)\n\nexport const Container = styled.div(\n () => css`\n position: relative;\n `\n)\n\nexport const ControlsBar = styled(AnimatedElement)(\n ({theme: {utils}, $active}) => css`\n align-items: center;\n display: flex;\n gap: ${utils.rem(8)};\n justify-content: center;\n transform: translateY(100%);\n \n ${$active && css`\n transform: translateY(0%);\n `}\n `\n)\n\nexport const ShowControls = styled(AnimatedElement)(\n ({$active}) => css`\n bottom: 0;\n left: 50%;\n position: absolute;\n transform: translate(-50%, 100%);\n \n ${$active && css`\n transform: translate(-50%, 0%);\n `}\n `\n)\n\nexport const Spacer = styled.div(\n ({theme: {utils}}) => css`\n width: ${utils.rem(80)};\n `\n)","import {useToggle} from \"@nodalview/nodes-web\";\nimport {useBreakpoint} from \"@react/hooks\";\nimport {WithViewExtensionProvider} from \"../../../hoc\";\nimport {useKrpanoContext, useViewExtensionContext} from \"../../../hooks\";\nimport {BaseExtensionButton} from \"../base_extension_button\";\nimport * as Styled from \"./krpano_controls.styled\";\n\nexport const KrpanoControlsExtension = WithViewExtensionProvider((props) => {\n const {\n autoRotate,\n toggleAutoRotate,\n startRotatePano,\n stopRotatePano,\n startZoomPano,\n stopZoomPano,\n } = useKrpanoContext();\n const {disabled} = useViewExtensionContext();\n \n const gteMD = useBreakpoint('md');\n\n const [areControlsVisible, toggleControls] = useToggle(true);\n\n const startRotatePanoLeft = () => startRotatePano('left');\n const startRotatePanoRight = () => startRotatePano('right');\n const startRotatePanoUp = () => startRotatePano('up');\n const startRotatePanoDown = () => startRotatePano('down');\n const startZoomPanoIn = () => startZoomPano('in');\n const startZoomPanoOut = () => startZoomPano('out');\n\n if (disabled) return null;\n\n return (\n <Styled.Container {...props}>\n <Styled.ShowControls $active={!areControlsVisible}>\n <BaseExtensionButton icon=\"chevrons_up\" onClick={toggleControls}/>\n </Styled.ShowControls>\n\n <Styled.ControlsBar $active={areControlsVisible}>\n <BaseExtensionButton icon=\"arrows_rotate\" active={autoRotate} onClick={toggleAutoRotate}/>\n {gteMD ? (\n <>\n <Styled.Spacer/>\n <BaseExtensionButton icon=\"chevron_left\" onMouseDown={startRotatePanoLeft} onMouseUp={stopRotatePano}/>\n <BaseExtensionButton icon=\"chevron_right\" onMouseDown={startRotatePanoRight} onMouseUp={stopRotatePano}/>\n <BaseExtensionButton icon=\"chevron_up\" onMouseDown={startRotatePanoUp} onMouseUp={stopRotatePano}/>\n <BaseExtensionButton icon=\"chevron_down\" onMouseDown={startRotatePanoDown} onMouseUp={stopRotatePano}/>\n <BaseExtensionButton icon=\"plus\" onMouseDown={startZoomPanoIn} onMouseUp={stopZoomPano}/>\n <BaseExtensionButton icon=\"minus\" onMouseDown={startZoomPanoOut} onMouseUp={stopZoomPano}/>\n <Styled.Spacer/>\n </>\n ) : (\n <>\n <BaseExtensionButton icon=\"plus\" onMouseDown={startZoomPanoIn} onMouseUp={stopZoomPano}/>\n <BaseExtensionButton icon=\"minus\" onMouseDown={startZoomPanoOut} onMouseUp={stopZoomPano}/>\n </>\n )}\n <BaseExtensionButton icon=\"chevrons_down\" onClick={toggleControls}/>\n </Styled.ControlsBar>\n </Styled.Container>\n )\n})","import styled, {css} from \"styled-components\";\n\nexport const Container = styled.div(\n ({theme: {borderRadius}}) => css`\n aspect-ratio: 1;\n border-radius: ${borderRadius.default};\n overflow: hidden;\n position: relative;\n `\n)\n\nexport const Selected = styled.div(\n ({theme: {utils, borderRadius}}) => css`\n border-radius: ${borderRadius.default};\n box-shadow: inset 0 0 0 ${utils.rem(3)} ${utils.color('primary.500')};\n inset: 0;\n position: absolute;\n `\n)\n\nexport const Picture = styled.img(\n ({theme: {borderRadius}}) => css`\n border-radius: ${borderRadius.default};\n display: block;\n height: 100%;\n object-fit: cover;\n width: 100%;\n `\n)\n\nexport const Label = styled.div(\n ({theme: {utils}}) => css`\n align-items: center;\n background-color: rgba(0, 0, 0, .25);\n color: ${utils.color('neutral.100')};\n font-size: ${utils.rem(14)};\n font-weight: 600;\n display: flex;\n height: 100%;\n inset: 0;\n justify-content: center;\n position: absolute;\n text-align: center;\n transition: ${utils.transition('background-color')};\n width: 100%;\n\n &:hover {\n background-color: rgba(0, 0, 0, .75);\n cursor: pointer;\n }\n `\n)","import {LazyLoadImage} from \"@react/components\";\nimport * as Styled from './panoramas_list_item.styled'\n\nexport const PanoramaExtensionListItem = ({panorama, isActive, ...props}) => {\n return (\n <Styled.Container\n role=\"button\"\n aria-pressed={isActive}\n {...purposeAttributes('panorama_list_item')}\n {...props}\n >\n <LazyLoadImage as={Styled.Picture} src={panorama.thumbnailUrl} alt={panorama.sceneName}/>\n <Styled.Label>{panorama.sceneName}</Styled.Label>\n {isActive && (\n <Styled.Selected/>\n )}\n </Styled.Container>\n )\n}","import styled, {css} from 'styled-components';\n\nexport const List = styled.div(\n ({theme: {utils}}) => css`\n display: grid;\n gap: ${utils.rem(8)};\n grid-template-columns: repeat(3, 1fr);\n width: 100%;\n `\n)","import {Title, useTranslation} from \"@nodalview/nodes-web\";\nimport {forwardRef} from \"react\";\nimport {useKrpanoContext, useViewExtensionContext} from \"../../../hooks\";\nimport {BaseExtensionOverlay} from \"../base_extension_overlay\";\nimport {PanoramaExtensionListItem} from \"../panoramas_list_item\";\nimport * as Styled from './panoramas_list.styled'\n\nexport const PanoramaExtensionList = forwardRef(({panoramas, ...props}, ref) => {\n const {t} = useTranslation('nodalview_player.extensions.panoramas');\n const {loadPano, scene} = useKrpanoContext();\n\n const {onClose, disabled} = useViewExtensionContext();\n\n const handlePanoramaChange = (panorama) => () => {\n if (disabled) return;\n loadPano(panorama.sceneTitle)\n onClose();\n }\n\n return (\n <BaseExtensionOverlay\n ref={ref}\n {...purposeAttributes('panoramas_list_overlay')}\n {...props}\n >\n <Title level=\"4\" tag=\"h1\">{t('title')}</Title>\n <Styled.List>\n {panoramas.map(panorama => (\n <PanoramaExtensionListItem\n key={panorama.id}\n panorama={panorama}\n isActive={panorama.sceneTitle === scene}\n onClick={handlePanoramaChange(panorama)}\n />\n ))}\n </Styled.List>\n </BaseExtensionOverlay>\n )\n})","import {ControlledDropdown} from \"@react/components\";\nimport {useBreakpoint} from \"@react/hooks\";\nimport {useRef} from \"react\";\nimport {WithViewExtensionProvider} from \"../../../hoc\";\nimport {useIGPropertyContext, useViewExtensionContext} from \"../../../hooks\";\nimport {BaseExtensionButton,} from \"../base_extension_button\";\nimport {PanoramaExtensionList} from \"../panoramas_list\";\n\nexport const PanoramasExtensionButton = WithViewExtensionProvider((props) => {\n const targetRef = useRef(null);\n const {property} = useIGPropertyContext()\n const {panoramas = []} = property?.nodalviewTour ?? {};\n\n const gteMD = useBreakpoint('md');\n\n const {isOpen, onClose, onOpen, disabled} = useViewExtensionContext()\n\n if (panoramas.length === 0) {\n return null;\n }\n\n return (\n <>\n <BaseExtensionButton\n {...props}\n ref={targetRef}\n icon=\"grid\"\n onClick={onOpen}\n disabled={disabled}\n {...purposeAttributes('panoramas_extension_button')}\n />\n <ControlledDropdown\n anchorPoint={gteMD ? \"top-left\" : \"bottom-right\"}\n alignment=\"bottom-left\"\n offset={gteMD ? {x: 8, y: 0} : {x: 0, y: 8}}\n targetRef={targetRef.current}\n isOpen={isOpen}\n onOpen={onOpen}\n onClose={onClose}\n disabledClose={disabled}\n >\n <PanoramaExtensionList panoramas={panoramas}/>\n </ControlledDropdown>\n </>\n )\n})","import styled, {css} from \"styled-components\";\n\nexport const Item = styled.div(\n ({theme: {utils}}) => css`\n align-items: center;\n border-bottom: 1px solid ${utils.color('neutral.50')};\n display: flex;\n font-size: ${utils.rem(16)};\n line-height: ${utils.rem(24)};\n gap: ${utils.rem(8)};\n padding: ${utils.rem(16, 0)};\n `\n)\n\n\nexport const IconSpacer = styled.div(\n ({theme: {utils}}) => css`\n width: ${utils.rem(16)};\n `\n)\n\nexport const Label = styled.div(\n () => css`\n flex: 1;\n `\n)\n\nexport const Value = styled.div(\n () => css`\n\n `\n)","import { Icon, Text } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport * as Styled from './property_features_item.styled';\n\nexport const PropertyFeaturesExtensionItem = ({ icon, label, value, ...props }) => {\n if (!value) {\n return null;\n }\n\n return (\n <Styled.Item {...props}>\n {icon ? <Icon name={icon} /> : <Styled.IconSpacer />}\n <Text as={Styled.Label} size=\"sm\" strong>\n {label}\n </Text>\n <Text as={Styled.Value} size=\"sm\">\n {value}\n </Text>\n </Styled.Item>\n );\n};\n\nPropertyFeaturesExtensionItem.propTypes = {\n icon: PropTypes.string,\n label: PropTypes.node.isRequired,\n value: PropTypes.node,\n};\n\nPropertyFeaturesExtensionItem.defaultProps = {\n icon: null,\n value: null,\n};\n","import styled, {css} from \"styled-components\";\n\nexport const List = styled.div(\n () => css`\n width: 100%;\n `\n)\n\nexport const Description = styled.div(\n () => css`\n\n `\n)","import { Heading, Text, Title, useTranslation } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { forwardRef } from 'react';\nimport { FindDescription, toCurrency, withUnit } from '@react/helpers';\nimport { BaseExtensionOverlay } from '../base_extension_overlay';\nimport { PropertyFeaturesExtensionItem } from '../property_features_item';\nimport * as Styled from './property_features_list.styled';\n\nexport const PropertyFeaturesExtensionList = forwardRef(({ propertyDetails, ...props }, ref) => {\n const {\n t,\n i18n: { locale },\n } = useTranslation('nodalview_player.extensions.property_features');\n\n const {\n bathrooms,\n bedrooms,\n descriptions,\n energy,\n garden,\n livingArea,\n livingAreaUnit,\n parking,\n price,\n priceUnit,\n propertyType,\n toilets,\n transactionType,\n } = propertyDetails;\n\n const description = FindDescription(locale, descriptions);\n\n return (\n <BaseExtensionOverlay ref={ref} {...props}>\n <Title level=\"4\" tag=\"h1\">\n {t('title')}\n </Title>\n {description && (\n <Styled.Description>\n <Heading as=\"h2\" level=\"xs\">\n {description.title}\n </Heading>\n <Text size=\"sm\">{description.text}</Text>\n </Styled.Description>\n )}\n <Styled.List>\n <PropertyFeaturesExtensionItem\n icon=\"house\"\n label={t('features.property_type')}\n value={t(`properties:property_types.${propertyType}`)}\n />\n <PropertyFeaturesExtensionItem\n icon=\"tag\"\n label={t('features.transaction_type')}\n value={t(`properties:transaction_types.${transactionType}`)}\n />\n <PropertyFeaturesExtensionItem\n icon=\"euro\"\n label={t('features.price')}\n value={price && toCurrency(price, { currency: priceUnit })}\n />\n <PropertyFeaturesExtensionItem\n icon=\"ruler_combined\"\n label={t('features.liveable_surface')}\n value={withUnit(livingArea, livingAreaUnit)}\n />\n <PropertyFeaturesExtensionItem icon=\"bed\" label={t('features.bedrooms')} value={bedrooms} />\n <PropertyFeaturesExtensionItem\n icon=\"bath\"\n label={t('features.bath_rooms')}\n value={bathrooms}\n />\n <PropertyFeaturesExtensionItem\n icon=\"toilet\"\n label={t('features.toilets')}\n value={toilets}\n />\n <PropertyFeaturesExtensionItem\n icon=\"car\"\n label={t('features.parking')}\n value={t(`shared:adjectives.${parking ? 'yes' : 'no'}`)}\n />\n <PropertyFeaturesExtensionItem\n icon=\"tree_deciduous\"\n label={t('features.garden')}\n value={t(`shared:adjectives.${garden ? 'yes' : 'no'}`)}\n />\n <PropertyFeaturesExtensionItem\n icon=\"peb\"\n label={t('features.epc_reference')}\n value={energy}\n />\n </Styled.List>\n </BaseExtensionOverlay>\n );\n});\n\nPropertyFeaturesExtensionList.propTypes = {\n propertyDetails: PropTypes.shape({\n bathrooms: PropTypes.number,\n bedrooms: PropTypes.number,\n descriptions: PropTypes.arrayOf(\n PropTypes.shape({\n text: PropTypes.string,\n title: PropTypes.string,\n language: PropTypes.string.isRequired,\n }),\n ),\n energy: PropTypes.string,\n garden: PropTypes.bool,\n livingArea: PropTypes.number,\n livingAreaUnit: PropTypes.string,\n parking: PropTypes.bool,\n price: PropTypes.number,\n priceUnit: PropTypes.string,\n propertyType: PropTypes.string,\n toilets: PropTypes.number,\n transactionType: PropTypes.string,\n }).isRequired,\n};\n","import {Title, useTranslation} from \"@nodalview/nodes-web\";\nimport {withUnit} from \"@react/helpers\";\nimport {forwardRef} from \"react\";\nimport {BaseExtensionOverlay} from \"../base_extension_overlay\";\nimport {PropertyFeaturesExtensionItem} from \"../property_features_item\";\nimport * as Styled from './property_features_list.styled'\n\nexport const PropertyFeaturesExtensionListLegacy = forwardRef(({propertyDetails, ...props}, ref) => {\n const {t} = useTranslation('nodalview_player.extensions.property_features');\n\n const {\n bathRooms,\n bedrooms,\n co2Emisson,\n energyConsumption,\n epcReference,\n garages,\n gardenSurface,\n livableSurface,\n outdoorParking,\n showerRooms,\n storyNumber,\n terraceSurface,\n toilets,\n units,\n } = propertyDetails;\n\n return (\n <BaseExtensionOverlay ref={ref} {...props}>\n <Title level=\"4\" tag=\"h1\">{t('title')}</Title>\n <Styled.List>\n <PropertyFeaturesExtensionItem icon=\"ruler_combined\" label={t('features.liveable_surface')}\n value={withUnit(livableSurface, units)}/>\n <PropertyFeaturesExtensionItem icon=\"layer_group\" label={t('features.floor_number')} value={storyNumber}/>\n <PropertyFeaturesExtensionItem icon=\"bed\" label={t('features.bedrooms')} value={bedrooms}/>\n <PropertyFeaturesExtensionItem icon=\"shower\" label={t('features.shower_rooms')} value={showerRooms}/>\n <PropertyFeaturesExtensionItem icon=\"bath\" label={t('features.bath_rooms')} value={bathRooms}/>\n <PropertyFeaturesExtensionItem icon=\"toilet\" label={t('features.toilets')} value={toilets}/>\n <PropertyFeaturesExtensionItem icon=\"square_parking\" label={t('features.outdoor_parking')}\n value={outdoorParking}/>\n <PropertyFeaturesExtensionItem icon=\"car\" label={t('features.garages')} value={garages}/>\n <PropertyFeaturesExtensionItem icon=\"tree_deciduous\" label={t('features.garden_surface')}\n value={withUnit(gardenSurface, units)}/>\n <PropertyFeaturesExtensionItem icon=\"table_picnic\" label={t('features.terrace_surface')}\n value={withUnit(terraceSurface, units)}/>\n <PropertyFeaturesExtensionItem icon=\"sun\" label={t('features.co2_emisson')}\n value={withUnit(co2Emisson, 'CO²')}/>\n <PropertyFeaturesExtensionItem icon=\"lightbulb\" label={t('features.energy_consumption')}\n value={withUnit(energyConsumption, 'kWh')}/>\n <PropertyFeaturesExtensionItem icon=\"peb\" label={t('features.epc_reference')} value={epcReference}/>\n </Styled.List>\n </BaseExtensionOverlay>\n )\n})","import {ControlledDropdown} from \"@react/components\";\nimport {useBreakpoint} from \"@react/hooks\";\nimport {useRef} from \"react\";\nimport {WithViewExtensionProvider} from \"../../../hoc\";\nimport {useIGPropertyContext, useViewExtensionContext} from \"../../../hooks\";\nimport {BaseExtensionButton} from \"../base_extension_button\";\nimport {PropertyFeaturesExtensionList, PropertyFeaturesExtensionListLegacy} from \"../property_features_list\";\n\nexport const PropertyFeaturesExtensionButton = WithViewExtensionProvider((props) => {\n const targetRef = useRef(null);\n const {property} = useIGPropertyContext();\n const {description, details} = property;\n\n const gteMD = useBreakpoint('md');\n\n const {isOpen, onClose, onOpen, disabled} = useViewExtensionContext()\n\n if (!description && !details) {\n return null;\n }\n\n return (\n <>\n <BaseExtensionButton\n {...props}\n ref={targetRef}\n icon=\"circle_info\"\n onClick={onOpen}\n disabled={disabled}\n {...purposeAttributes('features_extension_button')}\n />\n <ControlledDropdown\n anchorPoint={gteMD ? \"top-left\" : \"bottom-right\"}\n alignment=\"bottom-left\"\n offset={gteMD ? {x: 8, y: 0} : {x: 0, y: 8}}\n targetRef={targetRef.current}\n isOpen={isOpen}\n onOpen={onOpen}\n onClose={onClose}\n disabledClose={disabled}\n >\n {details\n ? <PropertyFeaturesExtensionList propertyDetails={details}/>\n : <PropertyFeaturesExtensionListLegacy propertyDetails={description}/>\n }\n\n </ControlledDropdown>\n </>\n )\n})","import {useTranslation} from \"@nodalview/nodes-web\";\nimport {useTracker} from \"@react/hooks\";\nimport {TabsButton} from \"../tabs_button\";\n\nexport const FloorplansViewButton = ({view, isActive, onActivate, ...props}) => {\n const {t} = useTranslation(\"live_session.views.floorplans\");\n const trackFloorPlanTabButton = useTracker('live_session.floor_plan_tab.click');\n\n const handleActivate = () => {\n trackFloorPlanTabButton()\n onActivate();\n };\n\n return (\n <TabsButton\n icon=\"floorplan\"\n active={isActive}\n aria-pressed={isActive}\n onClick={handleActivate}\n {...props}\n >\n {t(\"button\")}\n </TabsButton>\n );\n};\n","import {useTranslation} from \"@nodalview/nodes-web\";\nimport {useTracker} from \"@react/hooks\";\nimport {TabsButton} from \"../tabs_button\";\n\nexport const VirtualTourButton = ({view, isActive, onActivate, ...props}) => {\n const {t} = useTranslation(\"live_session.views.virtual_tour\");\n const trackVirtualTourButton = useTracker('live_session.virtual_tour_tab.click');\n\n const handleActivate = () => {\n trackVirtualTourButton();\n onActivate();\n };\n\n return (\n <TabsButton\n icon=\"panorama\"\n active={isActive}\n aria-pressed={isActive}\n onClick={handleActivate}\n {...props}\n >\n {t(\"button\")}\n </TabsButton>\n );\n};\n","import styled, {css} from \"styled-components\";\n\nexport const Container = styled.div(\n () => css`\n height: 100%;\n position: relative;\n width: 100%;\n `\n)","import {Circle, GoogleMap, LoadScript, Marker, StreetViewPanorama} from '@react-google-maps/api';\nimport {useTheme} from \"styled-components\";\nimport {useIGPropertyContext} from \"../../hooks\";\nimport {LoadingState} from \"../loading_state\";\nimport * as Styled from './map_view.styled'\n\nconst MAP_TYPES = {\n AREA: 'area_location',\n POINTER: 'exact_location',\n}\n\nconst MAP_STYLES = {\n width: '100%',\n height: '100%',\n};\n\nconst AREA_OPTIONS = {\n strokeOpacity: 0.8,\n strokeWeight: 2,\n fillOpacity: 0.2,\n radius: 300,\n}\n\nexport const MapView = (\n {\n canControl,\n onLoaded,\n onZoom,\n onCenterChange,\n onStreetViewVisible,\n onStreetViewZoom,\n onStreetViewPov,\n onStreetViewPanoChange,\n onMapTypeChange,\n }\n) => {\n const theme = useTheme();\n const {property} = useIGPropertyContext()\n\n const {latitude, longitude, locationType, streetview, streetviewPov = []} = property.location;\n\n const [heading, pitch, zoom] = streetviewPov\n const pov = {heading, pitch, zoom};\n\n const mapContainerStyle = {\n ...MAP_STYLES,\n borderRadius: theme.utils.radius('md'),\n pointerEvents: canControl ? undefined : 'none'\n }\n\n const mapOptions = {\n fullscreenControl: false,\n rotateControl: false,\n disableDefaultUI: !canControl,\n enableCloseButton: canControl\n }\n\n const areaOptions = {\n ...AREA_OPTIONS,\n strokeColor: theme.utils.color('primary.500'),\n fillColor: theme.utils.color('primary.500'),\n }\n\n const center = {\n lat: parseFloat(latitude),\n lng: parseFloat(longitude)\n }\n\n return (\n <Styled.Container {...purposeAttributes('map')}>\n <LoadScript googleMapsApiKey={GOOGLE_MAP_API_KEY} loadingElement={<LoadingState unit=\"percent\"/>}>\n <GoogleMap\n mapContainerStyle={mapContainerStyle}\n options={mapOptions}\n center={center}\n zoom={16}\n tilt={0}\n onLoad={onLoaded}\n onZoomChanged={onZoom}\n onCenterChanged={onCenterChange}\n onMapTypeIdChanged={onMapTypeChange}\n >\n {locationType === MAP_TYPES.AREA && (\n <Circle options={areaOptions} center={center}/>\n )}\n {locationType === MAP_TYPES.POINTER && (\n <Marker position={center} title={property.name}/>\n )}\n <StreetViewPanorama\n options={mapOptions}\n visible={streetview}\n position={center}\n pov={pov}\n onVisibleChanged={onStreetViewVisible}\n onZoomChange={onStreetViewZoom}\n onPovChanged={onStreetViewPov}\n onPanoChanged={onStreetViewPanoChange}\n />\n </GoogleMap>\n </LoadScript>\n </Styled.Container>\n );\n}\n\n","import {useTranslation} from \"@nodalview/nodes-web\";\nimport {useTracker} from \"@react/hooks\";\nimport {TabsButton} from \"../tabs_button\";\n\nexport const MapButton = ({view, isActive, onActivate, ...props}) => {\n const {t} = useTranslation(\"live_session.views.map\");\n const trackMapButton = useTracker('live_session.map_tab.click');\n\n const handleActivate = () => {\n trackMapButton();\n onActivate();\n };\n\n return (\n <TabsButton\n icon=\"location_dot\"\n active={isActive}\n aria-pressed={isActive}\n onClick={handleActivate}\n {...props}\n >\n {t(\"button\")}\n </TabsButton>\n );\n};\n","import {useTranslation} from \"@nodalview/nodes-web\";\nimport {useTracker} from \"@react/hooks\";\nimport {TabsButton} from \"../tabs_button\";\n\nexport const MatterportToursViewButton = ({view, isActive, onActivate, ...props}) => {\n const {t} = useTranslation(\"live_session.views.matterport_tour\");\n const trackMatterPortTabButton = useTracker('live_session.matter_port_tab.click');\n\n const handleActivate = () => {\n trackMatterPortTabButton()\n onActivate();\n };\n\n return (\n <TabsButton\n icon=\"matterport\"\n active={isActive}\n aria-pressed={isActive}\n onClick={handleActivate}\n {...props}\n >\n {t(\"button\")}\n </TabsButton>\n );\n};\n","import {useTranslation} from \"@nodalview/nodes-web\";\nimport {useTracker} from \"@react/hooks\";\nimport {TabsButton} from \"../tabs_button\";\n\nexport const PhotosViewButton = ({view, isActive, onActivate, ...props}) => {\n const {t} = useTranslation(\"live_session.views.photo_gallery\");\n const trackPhotoTabButton = useTracker('live_session.photo_tab.click');\n\n const handleActivate = () => {\n trackPhotoTabButton()\n onActivate();\n };\n\n return (\n <TabsButton\n icon=\"image\"\n active={isActive}\n aria-pressed={isActive}\n onClick={handleActivate}\n {...props}\n >\n {t(\"button\")}\n </TabsButton>\n );\n};\n","import styled, {css, keyframes} from \"styled-components\";\nimport {IG_UI_LOCATION} from \"../../config\";\n\nconst {\n TOP_LEFT,\n TOP_CENTER,\n TOP_RIGHT,\n BOTTOM_LEFT,\n BOTTOM_CENTER,\n BOTTOM_RIGHT,\n CENTER_LEFT,\n CENTER_RIGHT,\n} = IG_UI_LOCATION;\n\nconst SlideFromVertically = (from = \"100%\", to = \"0%\", x = \"0%\") => keyframes`\n 0% {\n opacity: 0;\n transform: translate(${x}, ${from});\n }\n 100% {\n opacity: 1;\n transform: translate(${x}, ${to});\n }\n`;\n\nconst SlideFromHorizontally = (from = \"100%\", to = \"0%\", y = \"0%\") => keyframes`\n 0% {\n opacity: 0;\n transform: translate(${from}, ${y});\n }\n 100% {\n opacity: 1;\n transform: translate(${to}, ${y});\n }\n`;\n\nexport const Container = styled.div(\n ({$location}) => css`\n animation-duration: 0.5s;\n animation-fill-mode: both;\n animation-timing-function: ease-out;\n animation-delay: 0.5s;\n display: flex;\n gap: 1rem;\n pointer-events: auto;\n position: absolute;\n z-index: 3;\n\n ${![TOP_CENTER, BOTTOM_CENTER].includes($location) && css`\n flex-direction: column;\n `}\n\n ${[TOP_LEFT, BOTTOM_LEFT, CENTER_LEFT].includes($location) && css`\n left: 1rem;\n `}\n\n ${[TOP_RIGHT, BOTTOM_RIGHT, CENTER_RIGHT].includes($location) && css`\n right: 1rem;\n `}\n\n ${[TOP_CENTER, TOP_LEFT, TOP_RIGHT].includes($location) && css`\n top: 1rem;\n `}\n\n ${[BOTTOM_CENTER, BOTTOM_LEFT, BOTTOM_RIGHT].includes($location) && css`\n bottom: 1rem;\n `}\n\n ${[TOP_CENTER, BOTTOM_CENTER].includes($location) && css`\n left: 50%;\n `}\n\n ${[CENTER_LEFT, CENTER_RIGHT].includes($location) && css`\n top: 50%;\n `} // Animations \n ${[TOP_LEFT, BOTTOM_LEFT].includes($location) && css`\n animation-name: ${SlideFromHorizontally(\"-100%\", \"0%\", \"0%\")};\n `}\n ${[CENTER_LEFT].includes($location) && css`\n animation-name: ${SlideFromHorizontally(\"-100%\", \"0%\", \"-50%\")};\n `}\n ${[TOP_RIGHT, BOTTOM_RIGHT].includes($location) && css`\n animation-name: ${SlideFromHorizontally(\"100%\", \"0%\", \"0%\")};\n `}\n ${[CENTER_RIGHT].includes($location) && css`\n animation-name: ${SlideFromHorizontally(\"100%\", \"0%\", \"-50%\")};\n `}\n ${[TOP_CENTER].includes($location) && css`\n animation-name: ${SlideFromVertically(\"-100%\", \"0%\", \"-50%\")};\n `}\n ${[BOTTOM_CENTER].includes($location) && css`\n animation-name: ${SlideFromVertically(\"100%\", \"0%\", \"-50%\")};\n `}\n `\n);\n","import PropTypes from \"prop-types\";\nimport {IG_UI_LOCATION} from \"../../config\";\nimport * as Styled from \"./view_toolbar.styled\";\n\nexport const ViewToolbar = (\n {\n children,\n position = IG_UI_LOCATION.TOP_RIGHT,\n ...props\n }\n) => {\n return (\n <Styled.Container $location={position} {...props}>\n {children}\n </Styled.Container>\n );\n};\n\nViewToolbar.propTypes = {\n position: PropTypes.oneOf(Object.values(IG_UI_LOCATION)),\n};\n","export const IG_UI_LOCATION = {\n TOP_LEFT: 'TOP_LEFT',\n TOP_CENTER: 'TOP_CENTER',\n TOP_RIGHT: 'TOP_RIGHT',\n CENTER_LEFT: 'CENTER_LEFT',\n CENTER_RIGHT: 'CENTER_RIGHT',\n BOTTOM_LEFT: 'BOTTOM_LEFT',\n BOTTOM_CENTER: 'BOTTOM_CENTER',\n BOTTOM_RIGHT: 'BOTTOM_RIGHT',\n};\n\nexport const IG_VIRTUAL_TOUR_TYPES = {\n NODALVIEW: 'NODALVIEW',\n MATTERPORT: 'MATTERPORT',\n};\n\nexport const KRPANO_EVENTS = {\n ON_VIEW_CHANGED: 'onviewchanged',\n ON_LOAD_COMPLETE: 'onloadcomplete',\n ON_LOAD_ERROR: 'onloaderror',\n ON_NEW_SCENE: 'onnewscene',\n ON_NEW_PANO: 'onnewpano',\n};\n","export class BaseEntity {\n constructor(attributes) {}\n\n validateAttributes(attributes, requiredFields) {\n if (!requiredFields.every(k => k in attributes))\n throw Error(`Provided participant is not valid: ${JSON.stringify(attributes)}`);\n }\n}","import {useIGViewsContext} from \"../hooks\";\n\nexport const WithIGActiveView = (Component) => (props) => {\n const {isViewActive} = useIGViewsContext();\n\n if (!isViewActive(props.module?.name)) {\n return null;\n }\n return <Component {...props} />\n}","import {memo, useEffect} from \"react\";\nimport {useIGModulesContext, useIGPropertyContext} from \"../hooks\";\n\n/**\n * @param Component\n * @param options\n * @param module: Module\n */\nexport const WithIGModuleRegistration = (Component, options = {}) => {\n const MemoComponent = memo(Component);\n\n return (props) => {\n const {registeredModules, registerModule, unregisterModule} = useIGModulesContext();\n const {property} = useIGPropertyContext()\n \n const {authorize, module} = options;\n const registeredModule = registeredModules.find(mod => mod.name === module.name);\n const isAuthorized = typeof authorize === 'function' ? authorize({property}) : true;\n\n useEffect(() => {\n if (isAuthorized) {\n registerModule(module)\n return () => unregisterModule(module)\n }\n }, [isAuthorized])\n\n if (!registeredModule) {\n return null;\n }\n\n return <MemoComponent {...props} module={registeredModule}/>\n }\n}","import {memo, useCallback} from \"react\";\nimport {useIGViewsContext} from \"../hooks\";\n\nexport const WithIGRegisteredView = (Component, viewName) => {\n const MemoComponent = memo(Component);\n\n return props => {\n const {isViewActive, setActiveView} = useIGViewsContext();\n\n const activateView = useCallback(() => {\n setActiveView(viewName);\n }, [setActiveView]);\n\n return <MemoComponent {...props} isActive={isViewActive(viewName)} onActivate={activateView}/>\n }\n}","import {omit, pick} from \"lodash\";\nimport {ViewExtensionProvider} from \"../components\";\n\nconst PROVIDER_PROPS_LIST = ['onScroll', 'onClose', 'onOpen', 'onChange', 'isOpen', 'scrollProgress', 'actionData', 'disabled']\n\nexport const WithViewExtensionProvider = (Component) => {\n return (props) => {\n const providerProps = pick(props, PROVIDER_PROPS_LIST);\n const componentProps = omit(props, PROVIDER_PROPS_LIST);\n\n return (\n <ViewExtensionProvider {...providerProps}>\n <Component {...componentProps} />\n </ViewExtensionProvider>\n )\n }\n}","import {useContext} from \"react\";\nimport {AssetsGalleryContext} from \"../components/assets_gallery_provider\";\n\nexport const useAssetsGalleryContext = () => {\n return useContext(AssetsGalleryContext);\n}","import {useContext} from \"react\";\nimport {InteractiveGalleryContext} from \"../components\";\n\nexport function useInteractiveGalleryContext() {\n return useContext(InteractiveGalleryContext);\n}","import {useContext} from \"react\";\nimport {NodalviewTourContext} from \"../components\";\n\nexport const useKrpanoContext = () => {\n return useContext(NodalviewTourContext);\n}","import {useContext} from \"react\";\nimport {MatterportContext} from \"../components\";\n\nexport const useMatterportContext = () => {\n return useContext(MatterportContext);\n}","import {useCallback, useContext} from \"react\";\nimport {IGModulesContext} from \"../components\";\nimport {IG_MODULES_ACTIONS} from \"../reducers\";\n\nconst {REGISTER, UNREGISTER} = IG_MODULES_ACTIONS\n\nexport const useIGModulesContext = () => {\n const [modules, dispatch] = useContext(IGModulesContext);\n\n const registerModule = useCallback((mod) => dispatch({type: REGISTER, value: mod}), []);\n const unregisterModule = useCallback((mod) => dispatch({type: UNREGISTER, value: mod}), []);\n const hasModuleOfType = useCallback((type) => modules.registeredModules.some(mod => mod.type === type), []);\n\n return {\n ...modules,\n registerModule,\n unregisterModule,\n hasModuleOfType,\n }\n}","import {IGPropertyContext} from \"@react/interactive_gallery\";\nimport {useContext} from \"react\";\n\nexport const useIGPropertyContext = () => {\n const [property, setProperty] = useContext(IGPropertyContext);\n\n return {\n property,\n setProperty,\n }\n}","import {useContext} from \"react\";\nimport {ViewExtensionContext} from \"../components\";\n\nexport const useViewExtensionContext = () => {\n return useContext(ViewExtensionContext);\n}","import {useCallback, useContext, useEffect, useMemo} from \"react\";\nimport {IGViewsContext} from \"../components\";\nimport {IG_VIEWS_ACTIONS} from \"../reducers\";\nimport {useIGModulesContext} from \"./use_modules_context\";\n\nconst {SET_ACTIVE_VIEW} = IG_VIEWS_ACTIONS;\n\nexport const useIGViewsContext = () => {\n const {registeredModules} = useIGModulesContext();\n const context = useContext(IGViewsContext);\n const [{activeView}, dispatch] = context\n\n const registeredViews = useMemo(\n () => registeredModules.filter(mod => mod.type === 'view'),\n [registeredModules]\n )\n\n const setActiveView = useCallback((viewName) => dispatch({type: SET_ACTIVE_VIEW, value: viewName}), []);\n const isViewActive = useCallback((viewName) => activeView === viewName, [activeView]);\n const hasView = useCallback((viewName) => registeredViews.some(view => view.name === viewName), [registeredViews]);\n\n useEffect(() => {\n if ((!activeView || !hasView(activeView)) && registeredViews.length > 0) {\n setActiveView(registeredViews[0].name);\n }\n }, [registeredViews, activeView]);\n\n return {\n activeView,\n registeredViews,\n setActiveView,\n isViewActive,\n context,\n }\n}","import {BaseEntity} from \"./base_entity\";\n\nconst REQUIRED_FIELDS = ['name', 'type'];\n\n/**\n * A \"Module\" is an object that is shaped like this:\n *\n * @type Module: {\n * name: String\n * type: String\n * component: ReactComponent\n * isActive: Boolean\n * }\n */\nexport class Module extends BaseEntity {\n constructor(attributes) {\n super(attributes);\n this.validateAttributes(attributes, REQUIRED_FIELDS);\n\n this.name = attributes.name;\n this.type = attributes.type;\n this.component = attributes?.component ?? null;\n this.isActive = attributes?.isActive ?? false;\n this.order = attributes?.order ?? 9999;\n }\n}","import {Logger} from \"@react/helpers\";\nimport {Module} from \"../entities\";\n\n/**\n * A \"Module\" is an object that is shaped like this:\n *\n * @type Module: {\n * name: String\n * type: String<Panel, Viewer, Conference, Sync>\n * component: ReactComponent\n * hoc: Function(ReactComponent) - Optional\n * }\n */\nexport const IG_MODULES_INITIAL_STATE = {\n registeredModules: [],\n}\n\nexport const ACTIONS = {\n REGISTER: 'REGISTER',\n UNREGISTER: 'UNREGISTER',\n}\nexport const IG_MODULES_ACTIONS = ACTIONS;\n\nexport const IGModulesReducer = (state, {type, value}) => {\n Logger.info(`%cMODULE:${type}`, 'background-color: #EF4538; color: white;', value);\n\n try {\n switch (type) {\n case ACTIONS.REGISTER: {\n const freshModule = new Module(value);\n const registeredModules = [...state.registeredModules, freshModule];\n return {...state, registeredModules}\n }\n case ACTIONS.UNREGISTER: {\n const registeredModules = state.registeredModules.filter(mod => mod.name !== value.name);\n return {...state, registeredModules}\n }\n default:\n return state;\n }\n } catch (error) {\n Logger.error(error);\n return state;\n }\n}","import {Logger} from \"@react/helpers\";\n\nconst ACTION = {\n SET_ACTIVE_VIEW: 'SET_ACTIVE_VIEW',\n SET_CONTAINER_ELEMENT: 'SET_CONTAINER_ELEMENT',\n}\n\nexport const IG_VIEWS_ACTIONS = ACTION;\nexport const IG_VIEWS_INITIAL_STATE = {\n activeView: null,\n containerElement: null,\n}\n\nexport const IGViewsReducer = (state, {type, value}) => {\n Logger.info(`%cVIEW:${type}`, 'background-color: #11B769; color: white;', value);\n\n try {\n switch (type) {\n case ACTION.SET_ACTIVE_VIEW: {\n const view = value;\n if (view === state.activeView) return state;\n return {...state, activeView: view}\n }\n case ACTION.SET_CONTAINER_ELEMENT: {\n return {...state, containerElement: value}\n }\n default:\n return state;\n }\n } catch (error) {\n Logger.error(error);\n return state;\n }\n}","export const SEARCH_PARAMS = {\n searchQuery: 'q',\n sortBy: 'sort_by',\n order: 'order',\n status: 'status',\n};\n\nexport const DEFAULT_FILTERS = {\n searchQuery: '',\n sortBy: 'created_at',\n order: 'desc',\n};\n\nexport const MEDIA_TYPE = {\n panorama: 'panorama',\n photo: 'photo',\n videoProject: 'video',\n matterportTour: 'matterport',\n floorplan: 'floorplan',\n};\n\nexport const TOUR_STATUS = {\n active: 'active',\n archived: 'archived',\n deleted: 'deleted',\n};\n\nexport const PROPERTY_TABS = {\n overview: 'overview',\n content: 'content',\n diffusion: 'diffusion',\n contacts: 'contacts',\n};\n\nexport const PROPERTIES_LAYOUT = {\n GRID: 'GRID',\n LIST: 'LIST',\n};\n\nexport const PROPERTY_CONTENT_ASSETS = {\n PHOTOS: 'photos',\n VIDEOS: 'videos',\n PANORAMAS: 'panoramas',\n MATTERPORTS: 'matterports',\n FLOORPLANS: 'floorplans',\n DOCUMENTS: 'documents',\n DETAILS: 'details',\n};\n\nexport const PROPERTY_DETAILS_TYPES = {\n APARTMENT: 'apartment',\n HOUSE: 'house',\n LAND: 'land',\n};\n\nexport const PROPERTY_DETAILS_TRANSACTION_TYPES = {\n FOR_SALE: 'for_sale',\n FOR_RENT: 'for_rent',\n SOLD: 'sold',\n};\n\nexport const PROPERTY_DETAILS_UNITS = {\n METRIC: 'm2',\n IMPERIAL: 'sqft',\n};\nexport const PROPERTY_DETAILS_LOCATION_TYPES = {\n EXACT: 'exact_location',\n AREA: 'area_location',\n};\nexport const PROPERTY_DETAILS_EPC = {\n AAA: 'A++',\n AA: 'A+',\n A: 'A',\n B: 'B',\n C: 'C',\n D: 'D',\n E: 'E',\n F: 'F',\n G: 'G',\n};\nexport const ATTRACTIVENESS_SCORES = {\n F: 'F',\n E: 'E',\n D: 'D',\n C: 'C',\n B: 'B',\n A: 'A',\n AA: 'A+',\n};\n","import { Text, useTranslation } from '@nodalview/nodes-web';\nimport { OrganisationLogo } from '@react/interactive_gallery';\nimport { Layout } from '../lead_forms_layout';\n\nexport const GetInTouchFormHeader = ({ children, onSubmitted, onCancel, ...props }) => {\n const { t } = useTranslation('property_gallery.contact_bar.dialog');\n\n return (\n <Layout.Container {...props}>\n <OrganisationLogo\n nameProps={{ as: Layout.LeadOrgName }}\n imageProps={{ as: Layout.LeadLogo }}\n />\n\n <Text size=\"md\">{t('description')}</Text>\n </Layout.Container>\n );\n};\n","import { Dialog, Flex } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { GetInTouchForm } from '../get_in_touch_form';\nimport { GetInTouchFormHeader } from '../get_in_touch_form_header';\n\nexport const GetInTouchDialog = ({ isOpen, onClose, ...props }) => (\n <Dialog.Root {...props} open={isOpen} onClose={onClose}>\n <Dialog.Content>\n <Flex align=\"stretch\" direction=\"column\" gap=\"4\">\n <GetInTouchFormHeader />\n <GetInTouchForm onSubmitted={onClose} onCancel={onClose} withContactReason />\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n);\n\nGetInTouchDialog.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n};\n","import { Schema } from '@react/helpers';\nimport { useLeadCapture } from '@react/hooks/web_rest';\n\nfunction VALIDATION_SCHEMA() {\n return Schema.object({\n name: Schema.string().required(),\n email: Schema.string().email(),\n phone: Schema.string().phone().required(),\n contactReason: Schema.string().oneOf(['ask_information', 'schedule_viewing']),\n acceptTerms: Schema.boolean().oneOf([true]).required(),\n });\n}\n\nexport function useGetInTouchFormHandler({ smartlinkUuid, onSuccess, onFailure }) {\n const [saveLead] = useLeadCapture();\n const defaultValues = {\n name: '',\n email: '',\n phone: '',\n contactReason: 'ask_information',\n acceptTerms: false,\n };\n\n const handleSubmit = async ({ name, email, phone, contactReason }) => {\n try {\n const payload = {\n name,\n email,\n phone,\n contact_reason: contactReason,\n smartlink_uuid: smartlinkUuid,\n };\n await saveLead(payload);\n onSuccess?.(payload);\n } catch (err) {\n onFailure?.(err);\n }\n };\n\n return {\n defaultValues,\n validationSchema: VALIDATION_SCHEMA(),\n handleSubmit,\n };\n}\n","import {useLazyWebRestApi} from \"@react/hooks\";\n\nexport function useLeadCapture(options) {\n return useLazyWebRestApi(`smartlinks/lead_capture`, {\n ...options,\n method: 'post',\n });\n}","import styled, {css} from \"styled-components\";\n\nexport const RadioCard = styled.label(\n ({theme: {utils}, $selected}) => css`\n align-items: flex-start;\n background: ${utils.color('neutral.white')};\n border: 1px solid ${utils.color('neutral.300')};\n border-radius: ${utils.radius(\"md\")};\n color: ${utils.color('neutral.800')};\n margin: 0;\n padding: ${utils.spacing(4)};\n width: 100%;\n\n ${$selected && css`\n outline: ${utils.rem(4)} solid ${utils.color('primary.500')};\n `}\n `\n)\n\nexport const RadioText = styled.div(\n ({theme: {utils}}) => css`\n display: flex;\n flex-direction: column;\n gap: ${utils.spacing(1)};\n width: 100%;\n `\n)\n\n","import { purposeAttributes } from '@global';\nimport { Button, Form, Link, Tag, Text, useTranslation } from '@nodalview/nodes-web';\nimport PropTypes from 'prop-types';\nimport { FieldPhone } from '@react/components/field_phone';\nimport { WebsiteUrls } from '@react/helpers';\nimport { useToast } from '@react/hooks';\nimport { useInteractiveGalleryContext } from '@react/interactive_gallery';\nimport { useGetInTouchFormHandler } from '../../hooks';\nimport { Layout } from '../lead_forms_layout';\nimport * as Styled from './get_in_touch_form.styled';\n\nexport const GetInTouchForm = ({ onSubmitted, onCancel, withContactReason, ...props }) => {\n const { uuid, viewerCountry } = useInteractiveGalleryContext();\n const { t, i18n } = useTranslation('property_gallery.contact_form');\n const toast = useToast();\n\n const { defaultValues, validationSchema, handleSubmit } = useGetInTouchFormHandler({\n smartlinkUuid: uuid,\n onSuccess: () => {\n toast.success(t('toast.success'));\n onSubmitted?.();\n },\n onFailure: () => toast.error(t('toast.failure')),\n });\n\n const termsLabel = t('fields.terms_phrase') ?? [];\n\n return (\n <Form\n {...purposeAttributes('get_in_touch_form')}\n {...props}\n as={Layout.Container}\n defaultValues={defaultValues}\n validationSchema={validationSchema}\n onSubmit={handleSubmit}\n >\n <Form.FieldText\n name=\"name\"\n label={t('fields.name')}\n required\n {...purposeAttributes('name_input')}\n />\n <Form.FieldText\n name=\"email\"\n label={t('fields.email')}\n {...purposeAttributes('email_input')}\n />\n <FieldPhone\n name=\"phone\"\n label={t('fields.phone')}\n initialCountry={viewerCountry}\n required\n {...purposeAttributes('phone_input')}\n />\n\n {withContactReason && (\n <Form.FieldRadioButtonList\n name=\"contactReason\"\n label={t('fields.request_type')}\n orientation=\"vertical\"\n containerProps={{ direction: 'column' }}\n options={[\n {\n value: 'ask_information',\n label: (\n <Styled.RadioText>\n <Text size=\"sm\" strong>\n {t('fields.request_type_options.more_info')}\n </Text>\n </Styled.RadioText>\n ),\n containerProps: { as: Styled.RadioCard, direction: 'row-reverse' },\n ...purposeAttributes('contact_reason_input'),\n },\n {\n value: 'schedule_viewing',\n label: (\n <Styled.RadioText>\n <Text size=\"sm\" strong>\n {t('fields.request_type_options.schedule_tour')}{' '}\n <Tag color=\"primary\">{t('shared:adjectives.new')}</Tag>\n </Text>\n <Text size=\"sm\">\n {t('fields.request_type_options.schedule_tour_description')}\n </Text>\n </Styled.RadioText>\n ),\n containerProps: { as: Styled.RadioCard, direction: 'row-reverse' },\n ...purposeAttributes('contact_reason_input'),\n },\n ]}\n />\n )}\n\n <Form.FieldCheckbox\n name=\"acceptTerms\"\n label={\n <Text size=\"sm\">\n <span>{termsLabel[0]}</span>{' '}\n <Link\n size=\"sm\"\n href={WebsiteUrls.get('terms_and_conditions', i18n.locale)}\n target=\"_blank\"\n >\n {termsLabel[1]}\n </Link>{' '}\n <span>{termsLabel[2]}</span>{' '}\n <Link size=\"sm\" href={WebsiteUrls.get('privacy_policy', i18n.locale)} target=\"_blank\">\n {termsLabel[3]}\n </Link>{' '}\n <span>{termsLabel[4]}</span>\n </Text>\n }\n {...purposeAttributes('accept_input')}\n />\n\n <Form.Actions>\n {onCancel && <Button onClick={onCancel}>{t('shared:actions.cancel')}</Button>}\n <Form.SubmitButton {...purposeAttributes('submit_button')}>{t('submit')}</Form.SubmitButton>\n </Form.Actions>\n </Form>\n );\n};\n\nGetInTouchForm.propTypes = {\n onSubmitted: PropTypes.func,\n onCancel: PropTypes.func,\n withContactReason: PropTypes.bool,\n};\n\nGetInTouchForm.defaultProps = {\n onSubmitted: undefined,\n onCancel: undefined,\n withContactReason: false,\n};\n","import styled, {css} from \"styled-components\";\n\nexport const Container = styled.form(\n ({theme: {utils}}) => css`\n display: flex;\n flex-direction: column;\n gap: ${utils.spacing(4)};\n `\n)\n\nexport const LeadOrgName = styled.div(\n () => css`\n text-align: center;\n `\n)\nexport const LeadLogo = styled.img(\n ({theme: {utils}}) => css`\n margin: auto;\n max-height: ${utils.rem(64)};\n `\n)\n\n\n","export default {events:{admin:{device_resources:{previous_page:{click:'Admin - Device resource - Previous page - click'},next_page:{click:'Admin - Device resources - Next page - click'},search_button:{click:'Admin - Device resource - Search button - click'},download:{click:'Admin - Device resources - Download - click'},gallery_view_page:{click:'Admin - Device resources - Gallery view page - click'},panoramas_page:{click:'Admin - Device resources - Panoramas page - click'},photos_page:{click:'Admin - Device resources - Photos page - click'},show:{click:'Admin - Device resources - Show - click'},table_view_page:{click:'Admin - Device resources - Table view page - click'},table:{open_tour:{click:'Admin - Device resources - Table - Open tour - click'}}},organisation:{properties:{bulk_action:{archive:'Admin - Organisation - Properties - Bulk action - Archive - click',transfer:'Admin - Organisation - Properties - Bulk action - Transfer - click','delete':'Admin - Organisation - Properties - Bulk action - Delete - click'}},devices:{bulk_action:{change_status:'Admin - Organisation - Devices - Bulk action - Change status - click','delete':'Admin - Organisation - Devices - Bulk action - Delete - click'}}}},admin_panel:{users:{go_to_user_button:{click:'Admin Panel - Users - Go to User button - click'}},organisations:{tabs:'Admin - Organisation - Tabs - click'}},coming_soon:{feature:{click:'Coming Soon - Feature - click',interested:'Coming Soon - Interested - click',not_interested:'Coming Soon - Not interested - click'}},credits:{buy_credits:{click:'Credits - Buy credits - Click'},notify_admin:{click:'Credits - Notify admin - Click'}},floorplan:{new_button:{click:'Floorplan - New button - click'},add_button:{click:'Floor plan - Add button - Click'},download_button:{click:'Floor plan - Download button - Click'},download_with_options_button:{click:'Floor plan - Download with options button - Click'},edit_label:{submit:'Floor plan - Edit label - Submit'},hide:{click:'Floor plan - Hide in property - Click'},show:{click:'Floor plan - Show in property - Click'},hotspots:{edit_button:{click:'Floor plan - Hotspots - Edit button - Click'}}},floorplan_request:{edit_label:{submit:'Floor plan request - Edit label - Submit'},alerts:{read_more:{click:'Floor plan request - Alert - Read more - Click'},try_again:{click:'Floor plan request - Alert - Try again - Click'}},play_button:{click:'Floor plan request - Play button - Click'},generate_button:{click:'Floor plan request - Generate button - Click'},go_back_to_options:{click:'Floor plan request - Go back to options - Click'},continue_to_checkout:{click:'Floor plan request - Continue to checkout - Click'},confirm_purchase:{click:'Floor plan request - Confirm purchase - Click'}},free_trial:{synchronise_demo_tours:{click:'Free trial - Synchronise demo tours - click'},tripod_set_up:{click:'Free trial - Tripod set up - click'}},header_menu:{matterport_tours_tab:{click:'Header menu - Matterport tours tab - click'},other_tab:{click:'Header menu - Other tab - click'},panoramas_tab:{click:'Header menu - Panoramas tab - click'},photos_tab:{click:'Header menu - Photos tab - click'},videos_tab:{click:'Header menu - Videos tab - click'}},hotspots:{add_button:{click:'Hotspots - Add button - click'}},live_session:{launch:{click:'Live session - launch - click'},set_camera_on:{click:'Live session - Set camera on - click'},set_camera_off:{click:'Live session - Set camera off - click'},message_chat:{submit:'Live session - Chat Message - Submit'},virtual_tour_tab:{click:'Live session - Virtual Tour Tab - click'},map_tab:{click:'Live session - Map Tab - click'},matter_port_tab:{click:'Live session - MatterPort Tab - click'},floor_plan_tab:{click:'Live session - Floor plan Tab - click'},photo_tab:{click:'Live session - Photo Tab - click'},video_tab:{click:'Live session - Video Tab - click'},no_effect_video:{submit:'Live session - No Effect Video - Submit'},blur_effect_video:{submit:'Live session - Blur Effect Video - Submit'},image_back_ground_video:{submit:'Live session - BackGround Image Video - Submit'},give_participant_control:{click:'Live session - Give Participant Control - Click'},call_to_action_email_agent:{click:'Live session - Call to action email agent - Click'}},main_menu:{social_media_hub_button:{click:'Main menu - Social media button - click'},my_organisation_button:{click:'Main menu - My organisation button - click'},new_tour_button:{click:'Main menu - New tour button - click'}},matterport_tour:{new_button:{click:'Matterport tour - New button - click'},share_button:{click:'Matterport tour - Share button - click'},tour_empty:{click:'matterport_tour_empty - click'}},media_editor:{generate_image:{click:'Media editor - Generate image - click'},save_image:{click:'Media editor - Save image - click'},blur:{save_changes:'Media Editor - Blur - Save changes - click'}},my_organisation:{billing:{chargebee_portal:{manage_subscription:{click:'My organisation - Billing - chargebee_portal_sub_details - click'},update_payment_methods:{click:'My organisation - Billing - chargebee_portal_portal_payment_methods - click'},update_address:{click:'My organisation - Billing - chargebee_portal_portal_address - click'}},invoices:{pay_invoices:{click:'My organisation - Billing - Pay invoices - click'}},see_pricing:{click:'My organisation - Billing - See pricing button - click'},update_payment_method:{click:'My organisation - Billing - Update Payment Method - click'}},devices:{change_status:{submit:'Device - Change status - submit'},contact_us:{click:'My organisation - Devices - Contact Us - click'},bulk_action:{change_status:'My organisation - Devices - Bulk action - Change status - click','delete':'My organisation - Devices - Bulk action - Delete - click'}},properties:{bulk_action:{archive:'My organisation - Properties - Bulk action - Archive - click',transfer:'My organisation - Properties - Bulk action - Transfer - click','delete':'My organisation - Properties - Bulk action - Delete - click'}}},navigation:{breadcrumb:{my_tours:{click:'Navigation - Breadcrumb - My tours - click'}}},new_credits:{added:'Credits added',removed:'Credits removed',consumed:'Credits consumed',refunded:'Credits refunded'},onboarding:{sign_up:{discover_photos:{click:'Onboarding - Sign up - Discover photos - click'},magic_eraser:{click:'Onboarding - Sign up - Magic eraser - click'}},discover:{discover_photos:{click:'Onboarding - Discover features - Discover photos - click'},magic_eraser:{click:'Onboarding - Discover features - Magic eraser - click'}}},panorama:{download_upload_button:{click:'Panorama - Download/upload button - click'},rename:{click:'Panorama - Rename - click'},edit_button:{click:'Panorama - Edit button - click'},share_button:{click:'Panorama - Share button - click'},tour_empty:{click:'panorama_tour_empty - click'},media_editor:{click:'Panorama - Media Editor - click'},toggle_visibility:{click:'Panorama - Toggle visibility - click'}},photo:{edit_icon:{click:'Photo - Edit icon - click'},magic_eraser:{open:{click:'Photo - Magic Eraser icon - click'},initiated:{hardware:'Photo - Magic Eraser icon - Hardware initiated'},undo:{click:'Photo - Magic Eraser icon - Undo - click'},redo:{click:'Photo - Magic Eraser icon - Redo - click'},save:{click:'Photo - Magic Eraser icon - Save - click'},erase:{click:'Photo - Magic Eraser icon - Erase - click'}},home_staging:{processing_time:'Home staging processing time',open:{click:'Home staging opened'}},tour_empty:{click:'photo_tour_empty - click'},edit_photo_in_media_editor:{click:'Photo - Edit photo in media editor - click'},delete_photos:{click:'Photo - Delete photos - click'},toggle_photo:{click:'Photo - Toggle photo - click'},download_photos:{click:'Photo - Download photos - click'},import_photos:{click:'Photo - Import photos - click'},sort_photos:{click:'Photo - Reorder photos - click'}},photo_editor:{export_button:{click:'Photo editor - Export button - click'}},polices_button:{request_demo:{click:'Policed button - Request demo - click',hover:'Policed button - Request demo - hover'}},property:{change_status:{click:'Property - Change status - click',bulk:'Property - Change status - bulk'},transfer:{bulk:'Property - Transfer - bulk'},'delete':{bulk:'Property - Delete - bulk'},share:{click:'Property - share - click'}},recap:{feedback:{click:'Recap - Appreciation - Click'},share_video:{click:'Recap - Share video - Click'},fail_and_rerender:{click:'Recap - Fail and rerender - Click'},render:{click:'Recap - Render - Click'},render_error:{click:'Recap - Render error - Click'},render_success:{click:'Recap - Render success - Click'},rerender:{click:'Recap - Rerender - Click'},download:{click:'Recap - Download - Click'},ebook:{click:'Recap - Ebook - Click'},nodalview:{click:'Recap - Nodalview - Click'}},smartlink:{copy:{click:'Smartlink - Copy - click'},faq_link:{click:'Smartlink - FAQ link - click'},share_by_email:{click:'Smartlink - Share by email - click'},share_on_social_media:{click:'Smartlink - Share on social media - click'}},social_media:{hub:{create_post:{click:'Social Media - Hub - Create post - click',submit:'Social Media - Hub - Create Post - submit'},delete_post:{click:'Social Media - Hub - Delete post - click'},edit_post:{click:'Social Media - Hub - Edit post - click'},preview_post:{click:'Social Media - Hub - Preview post - click'},incentive_dialog:{connect_to_facebook:{click:'Social Media - Hub - Dialog - Connect to Facebook - click'}},share_again:{click:'Social Media - Hub - Share again - click'},log_back_in:{click:'Social Media - Hub - Log back in - click'},reschedule_post:{click:'Social Media - Hub - Reschedule post - click'}},share:{click:'Social Media - Share - click'},steps:{account:{'continue':'Social Media - Account - Continue - click',disconnect_account:'Social Media - Account - Disconnect account - click',select_account:'Social Media - Account - Select - click',unselect_account:'Social Media - Account - Unselect - click'},attach:{go_back:'Social Media - Attach - Go back - click','continue':'Social Media - Attach - Continue - click',assets:{submit:'Social Media - Attach - Assets - submit'}},compose:{go_back:'Social Media - Compose - Go back - click','continue':'Social Media - Compose - Continue - click',submit:'Social Media - Compose - submit',pristine:'Social Media - Compose - pristine'},schedule:{go_back:'Social Media - Schedule - Go back - click',publish:'Social Media - Schedule - Publish - click',submit:'Social Media - Schedule - submit'},template:{go_back:'Social Media - Template - Go back - click','continue':'Social Media - Template - Publish - click',select_property_status:'Social Media - Template - Select property status - click',property_status:{submit:'Social Media - Template - Property status - submit'},template_type:{submit:'Social Media - Template - Template type - submit'}}}},team:{tab:{click:'Team - Tab - Click'},reassign_property:{submit:'Team - Reassign Property - Submit'},add_filter_button:{click:'Team - Add filter button - click'},organisation_page:{delete_team_button:{click:'Team - Delete team button - click'},create_team_button:{click:'Team - Create team button - click'},update_team_button:{click:'Team - Update team button - click'}}},team_member:{organisation_page:{create_team_member_button:{click:'Team Member - Create team member button - click'},delete_team_member_button:{click:'Team Member - Delete team member button - click'}}},tour:{share_button:{click:'Tour - Share button - click'},timeline_button:{click:'Tour - Timeline button - click'}},tours:{new_tour_button:{click:'Tours - New tour button - click'},options_button:{click:'Tours - Options button - click'},search_filter_button:{click:'Tours - Search filter button - click'},search_tour_button:{click:'Tours - Search tour button - click'},contact_your_administrator:{click:'Tours - Contact your administrator button - click'},contact_us:{click:'Tours - Contact us button - click'},more_info:{click:'Tours - More info button - click'}},users_and_devices:{invitations:{new_button:{click:'Users and devices - Invitations - New button - click'},action_button:{click:'Users and devices - Invitations - Action button - click'}}},video:{tour_empty:{click:'video_tour_empty - click'},download_clip:{click:'Video - Download clip - click'},download_clip_from_options:{click:'Video - Download clip (from options) - click'},download_project:{click:'Video - Download project - click'}},video_editor:{generate:{open_new_tab:'Video editor - Generate - open new tab'},ai_generation:{try_it_out:{click:'Video editor - AI generation - Try it out - Click'},generate_videos:{click:'Video editor - AI generation - Generate videos - Click'},regenerate_videos:{click:'Video editor - AI generation - Regenerate videos - Click'},save_videos_to_property:{click:'Video editor - AI generation - Save videos to property - Click'}}},virtual_visit:{book_a_tour:{click:'Virtual visit - Book a tour - click',submit:'Virtual visit - Book a tour - submit'},book_a_tour_submit:{click:'Virtual visit - Book a tour submit - click'},business_card_button:{click:'Virtual visit - Business card button - click'},more_information_form:{show:'Virtual visit - More information form - click',submit:'Virtual visit - More information form - submit'},gated:{submit_form:{click:'Virtual visit - Gated - Submit form - click'}},'private':{get_verification_number:{click:'Virtual visit - Private - Get verification number - click'},submit_code_button:{click:'Virtual visit - Private - Submit code button - click'}}},nudges:{unpaid_invoice:{make_payment:{click:'Nudges - unpaid invoice - make payment - click'},view_invoice:{click:'Nudges - unpaid invoice - view invoices - click'}}},account_status:{suspended:{view_page:'Dunning pages - suspended organisation - view page',pay_invoice:{click:'Dunning pages - suspended organisation - pay invoices - click'},contact_us:{click:'Dunning pages - suspended organisation - contact us - click'},notify_org_admin:{click:'Dunning pages - suspended organisation - notify org admin - click'},view_invoices:{click:'Dunning pages - suspended organisation - view invoices - click'}},paused:{view_page:'Dunning pages - paused organisation - view page',contact_us:{click:'Dunning pages - paused organisation - contact us - click'},notify_org_admin:{click:'Dunning pages - paused organisation - notify org admin - click'},view_invoices:{click:'Dunning pages - paused organisation - view invoices - click'}},cancelled:{view_page:'Dunning pages - cancelled organisation - view page',go_to_shop:{click:'Dunning pages - cancelled organisation - go to shop - click'},contact_us:{click:'Dunning pages - cancelled organisation - contact us - click'},notify_org_admin:{click:'Dunning pages - cancelled organisation - notify org admin - click'},view_invoices:{click:'Dunning pages - cancelled organisation - view invoices - click'}},demo_expired:{view_page:'Dunning pages - demo expired organisation - view page',go_to_shop:{click:'Dunning pages - demo expired organisation - go to shop - click'},contact_us:{click:'Dunning pages - demo expired organisation - contact us - click'},notify_org_admin:{click:'Dunning pages - demo expired organisation - notify org admin - click'}}},uploader:{import_documents:{open:{click:'Uploader - Documents - Open - click'},add_files:{event:'Uploader - Documents - File uploaded - event'},restriction_failed:{event:'Uploader - Documents - Restriction failed - event'}},import_photos:{open:{click:'Uploader - Photos - Open - click'},add_files:{event:'Uploader - Photos - File uploaded - event'},restriction_failed:{event:'Uploader - Photos - Restriction failed - event'}},import_panoramas:{open:{click:'Uploader - Panoramas - Open - click'},add_files:{event:'Uploader - Panoramas - File uploaded - event'},restriction_failed:{event:'Uploader - Panoramas - Restriction failed - event'}},replace_panorama:{open:{click:'Uploader - Replace Panoramas - Open - click'},add_files:{event:'Uploader - Replace Panoramas - File uploaded - event'},restriction_failed:{event:'Uploader - Replace Panoramas - Restriction failed - event'}},import_floorplans:{open:{click:'Uploader - Floor plans - Open - click'},add_files:{event:'Uploader - Floor plans - File uploaded - event'},restriction_failed:{event:'Uploader - Floor plans - Restriction failed - event'}},import_video_clips:{open:{click:'Uploader - Video clips - Open - click'},add_files:{event:'Uploader - Video clips - File uploaded - event'},restriction_failed:{event:'Uploader - Video clips - Restriction failed - event'}}},self_service:{banner:{click:'Self service - Banner - click'},expired_trial:{click:'Self service - Expired trial - click'},select_plan:{click:'Self service - Select plan - click'},contact_sales:{click:'Self service - Contact sales - click'},subscription:{created:'Self service - Subscription created - event',updated:'Self service - Subscription updated - event'}},api:{photos:{property_found_by_title:'Property found by title'}},auth:{sign_up:{email_submitted:'Sign up Email submitted',password_submitted:'Sign up Password submitted',role_submitted:'Sign up Role submitted',goals_submitted:'Sign up Goals submitted',usage_submitted:'Sign up Usage submitted',sign_in_clicked:'Sign in clicked',download_app_clicked:'Sign up Download app clicked'},sign_in:{sign_up_clicked:'Sign up clicked'}},properties:{contacts_tab_viewed:'Contacts tab viewed',diffusion_tab_viewed:'Diffusion tab viewed'},smartlinks:{new_clicked:'New smartlink clicked',new_saved:'New smartlink saved',shared:'Smartlink shared'},home_staging:{generated:'Home staging generated',saved:'Home staging saved'},contacts:{'export':'Contacts tab exported'}}};"],"names":["div","Backdrop","theme","utils","color","Menu","breakpoint","x","y","width","rem","transition","spacing","up","MenuContainer","zIndex","generateCoordinates","coordinates","dropdownRef","options","alignment","anchorPoint","offset","anchorCoords","offsetX","offsetY","height","getAnchorCoordinates","element","anchorX","anchorY","getBoundingClientRect","windowHeight","window","innerHeight","windowWidth","innerWidth","Math","max","min","getElementCoordinates","getTargetCoordinates","targetRef","left","top","ControlledDropdown","children","isOpen","onClose","containerRef","disabledClose","props","setDropdownRef","useState","targetCoords","setTargetCoords","coords","useMemo","handleClose","useEffect","debouncedHandleResize","debounce","addEventListener","document","body","style","setProperty","removeEventListener","removeProperty","createPortal","as","visible","onClick","keyPressed","action","ref","event","stopPropagation","Container","radius","shadow","TelInput","input","FieldPhone","initialCountry","name","defaultValue","onCountryChange","useRef","telRef","inputRef","value","setValue","control","_a","field","_b","onChange","onBlur","fieldState","current","preferredCountries","dropdownContainer","utilsScript","destroy","handleCountryChange","country","getSelectedCountryData","iso2","type","rawValue","nextValue","getNumber","error","message","propTypes","isRequired","onFocus","defaultProps","UserBusinessCard","email","phoneNumber","photo","rating","branding","withBranding","logoUrl","canContact","onContact","t","providerRating","provider","score","reviewsCount","profileUrl","review","count","providerLogoUrl","userBranding","backgroundColor","mainColor","foregroundColor","fullName","pictureUrl","transparentizeColor","opacity","alpha","css","generateColorRange","scale","mode","domain","colors","getContrastColor","lightColor","darkColor","ENVIRONMENT","NodalviewEnvironment","rails_env","log","args","includes","console","Logger","info","warn","unitToCent","amount","round","centToUnit","toCurrency","locale","currency","Intl","NumberFormat","format","centToCurrency","FindDescription","descriptions","order","description","find","desc","language","toLowerCase","sort","a","b","indexOf","shift","useBreakpoint","breakpointName","breakpointDefinition","list","breakpointQuery","useDialog","initialState","isDialogOpen","openDialog","closeDialog","useStatedDialog","dialogState","setDialogState","state","useMediaQueries","query","mediaQueryList","matchMedia","matchedQuery","setMatchedQuery","matches","checkMediaQuery","useLocalStorage","key","initialise","storedState","setStoredState","initialComputedState","item","localStorage","getItem","JSON","parse","storeState","useCallback","freshState","valueToStore","Function","setItem","stringify","clearState","removeItem","useTracker","eventKey","defaultEventProperties","eventName","get","eventProperties","eventsManager","logEvent","useLazyWebRestApi","url","onCompleted","onError","method","defaultOptions","loading","setLoading","setError","data","setData","request","params","localOptions","rawBody","formatBody","response","resData","inRange","status","Error","err","useWebRestApi","controller","AbortController","signal","abort","INTEGRATION_TYPES","CRM","SOCIAL_MEDIA","CUSTOMER_RATINGS","EMAIL","PRODUCTIVITY","INTEGRATION_NAMES","FACEBOOK","GOOGLE","INSTAGRAM","IMMODVISOR","OPINION_SYSTEM","WHISE","YOUTUBE","EMAIL_FORWARDING","INTEGRATION_STATES","DISABLED","OVERVIEW","CONFIGURE","CONNECTED","INTEGRATION_ICONS","MATTERPORT_SCRIPT","MatterportApi","constructor","mpInstance","this","interface","appState","lastReceivedPose","position","z","rotation","zoom","sweep","transitioning","rotating","bindEvents","view","_roundPosition","_roundRotation","_roundZoom","Sweep","Mode","on","Event","EXIT","_","_setSweep","subscribe","s","sid","App","_setAppState","bind","Camera","pose","_setCameraPose","_setCameraZoom","changeView","_isTransitioning","_isRotating","modeChanged","sweepChanged","positionChanged","isEqual","rotationChanged","moveTo","changeSweep","rotateTo","changeMode","_startTransition","_setMode","_endTransition","Transition","FLY","zoomTo","INSIDE","level","_startRotation","setRotation","speed","_endRotation","TransitionType","INSTANT","_isPlaying","phase","Phase","PLAYING","TRANSITIONING","MainImage","img","borderRadius","default","AssetGalleryPreviewImage","selectedImage","onLoad","alt","src","assetPath","tabIndex","MainVideo","video","AssetGalleryPreviewVideo","preload","onLoadedMetadata","controls","ThumbImage","AssetGalleryThumbnailImage","image","thumbnailPath","Thumbnail","AssetGalleryThumbnailVideo","loaded","setLoaded","onLoadedMetaData","Button","button","$active","disabled","BaseButton","icon","active","Gallery","ImageView","Loader","Overlay","NavigationButton","$position","ThumbsList","AssetGallery","canControl","overlay","listRef","assets","selectedAsset","selectAsset","currentAssetIndex","findIndex","asset","id","lastIndex","length","hasNextAsset","hasPreviousAsset","handleAssetSelection","assetIndex","nextAsset","previousAsset","isSelected","itemPosition","currentThumbnail","querySelector","timeout","setTimeout","scrollIntoView","block","inline","behavior","clearTimeout","purposeAttributes","autoPlay","unit","noBackground","map","index","role","AssetsGalleryContext","createContext","AssetsGalleryProvider","initialAsset","context","Provider","Page","fontFamily","Errors","ErrorsState","title","errors","Picture","Title","Message","InteractiveGalleryContext","accessType","blocking","contactBar","organisation","timeToAuthenticate","viewerCountry","InteractiveGalleryProvider","settings","animation","keyFrames","delay","SlideDownAnimation","SlideUpAnimation","ScaleUpAnimation","ScaleUpElement","SlideUpElement","SlideDownElement","Wrapper","Body","section","Content","Header","View","Footer","$unit","$noBackground","LoadingState","size","MatterportContext","MatterportProvider","initialMatterportId","matterport","setMatterport","matterportId","setMatterportId","mp","getView","MatterportParams","uid","m","play","qs","gt","hr","tourcta","mls","help","brand","search","vr","URLSearchParams","Iframe","iframe","defaultFunc","Matterport","memo","onReady","onCameraMove","onCameraZoom","onAppStateChange","onSweepChange","onModeChange","matterportParams","iframeRef","iframeUrl","scriptLoaded","scriptError","async","checkLoaded","MP_SDK","disconnect","connect","then","catch","useMatterport","throttledCameraMove","throttle","trailing","throttledCameraZoom","CHANGE_START","frameBorder","MatterportTour","onInit","handleReady","Image","Text","KrpanoInformationBoxDialog","activeInfoHotspot","closeInfoBox","cachedActiveInfoHotspot","usePrevious","infoHotspot","hasImage","imageUrl","hasText","text","safeHtml","flowRight","sanitize","transform","Root","open","align","direction","gap","dangerouslySetInnerHTML","__html","Viewer","Krpano","xml","onViewChanged","onLoadComplete","onLoadError","onNewScene","onOpenInformationBox","onCloseInformationBox","openInfoBox","previousView","krpanoInstance","globalVarName","globalFunctions","openInformationBox","hotspotId","throttledViewChanged","handleViewChanged","pick","handleSceneChanged","scene","events","addListener","ON_VIEW_CHANGED","ON_LOAD_COMPLETE","ON_LOAD_ERROR","ON_NEW_SCENE","removeListener","NodalviewTour","property","setKrpano","nodalviewTour","xmlUrl","krpano","KrpanoApi","krpanoInterface","domElement","display","htmltarget","currentPano","hlookat","vlookat","fov","loadPano","sceneName","_log","Promise","resolve","actions","loadscene","toggleAutoRotate","autorotate","isrotating","stop","start","startMove","threshold","set","stopMove","startZoom","stopZoom","lookAt","lookat","enableControl","_setHotspotsAlpha","disableControl","enterVr","eventType","eventHandler","_checkInterface","off","hotspot","getArray","forEach","NodalviewTourContext","NodalviewTourProvider","informationHotspots","setScene","autoRotate","useToggle","setActiveInfoHotspot","instance","startRotatePano","stopRotatePano","startZoomPano","stopZoomPano","hs","Number","Link","OrganisationLogo","imageProps","nameProps","websiteUrl","showName","setShowName","href","target","hidePlaceholder","span","PoweredBy","strong","rel","IGModulesContext","IGModulesProvider","defaults","useReducer","IGPropertyContext","IGPropertyProvider","initialProperty","contextGetter","contextSetter","IGViewsContext","IGViewsContextProvider","IGViewsProvider","TabsButton","gteMD","leadingIcon","TabsButtonList","registeredViews","sortedViews","sortBy","component","Component","ViewExtensionContext","actionData","scrollProgress","onScroll","onOpen","ViewExtensionProvider","controlledIsOpen","isOpenState","setIsOpenState","BaseExtensionButton","forwardRef","displayName","$disabled","CloseButton","BaseExtensionOverlay","withoutCloseButton","scrollHeight","offsetHeight","scrollTop","scrollTo","container","variant","BusinessCardExtensionOverlay","businessCard","BusinessCardExtensionButton","businessCardOverride","dropdownProps","p","ZoomIn","$top","$left","Hotspot","FloorplansExtensionHotspot","Plan","FloorplansExtensionListItem","floorplan","onHotspotClick","isLoaded","setIsLoaded","handleHotspotClick","linkedScene","isCurrentScene","hotspots","FloorplansExtensionList","floorplans","selectedFloorplan","selectFloorplan","handleSelectFloorplan","floorplanIndex","payload","Item","uuid","label","FloorplansExtensionButton","closable","AnimatedElement","ControlsBar","ShowControls","Spacer","KrpanoControlsExtension","areControlsVisible","toggleControls","startZoomPanoIn","startZoomPanoOut","onMouseDown","onMouseUp","Selected","Label","PanoramaExtensionListItem","panorama","isActive","thumbnailUrl","List","PanoramaExtensionList","panoramas","handlePanoramaChange","sceneTitle","tag","PanoramasExtensionButton","IconSpacer","Value","PropertyFeaturesExtensionItem","Description","PropertyFeaturesExtensionList","propertyDetails","i18n","bathrooms","bedrooms","energy","garden","livingArea","livingAreaUnit","parking","price","priceUnit","propertyType","toilets","transactionType","PropertyFeaturesExtensionListLegacy","bathRooms","co2Emisson","energyConsumption","epcReference","garages","gardenSurface","livableSurface","outdoorParking","showerRooms","storyNumber","terraceSurface","units","PropertyFeaturesExtensionButton","details","FloorplansViewButton","onActivate","trackFloorPlanTabButton","VirtualTourButton","trackVirtualTourButton","MAP_TYPES","MAP_STYLES","AREA_OPTIONS","strokeOpacity","strokeWeight","fillOpacity","MapView","onLoaded","onZoom","onCenterChange","onStreetViewVisible","onStreetViewZoom","onStreetViewPov","onStreetViewPanoChange","onMapTypeChange","latitude","longitude","locationType","streetview","streetviewPov","location","heading","pitch","pov","mapContainerStyle","pointerEvents","mapOptions","fullscreenControl","rotateControl","disableDefaultUI","enableCloseButton","areaOptions","strokeColor","fillColor","center","lat","parseFloat","lng","googleMapsApiKey","loadingElement","tilt","onZoomChanged","onCenterChanged","onMapTypeIdChanged","onVisibleChanged","onZoomChange","onPovChanged","onPanoChanged","MapButton","trackMapButton","MatterportToursViewButton","trackMatterPortTabButton","PhotosViewButton","trackPhotoTabButton","TOP_LEFT","TOP_CENTER","TOP_RIGHT","BOTTOM_LEFT","BOTTOM_CENTER","BOTTOM_RIGHT","CENTER_LEFT","CENTER_RIGHT","SlideFromVertically","from","to","SlideFromHorizontally","$location","ViewToolbar","Object","values","IG_UI_LOCATION","KRPANO_EVENTS","ON_NEW_PANO","BaseEntity","attributes","validateAttributes","requiredFields","every","k","WithIGActiveView","isViewActive","module","WithIGModuleRegistration","MemoComponent","registeredModules","registerModule","unregisterModule","authorize","registeredModule","mod","isAuthorized","WithIGRegisteredView","viewName","setActiveView","activateView","PROVIDER_PROPS_LIST","WithViewExtensionProvider","providerProps","componentProps","omit","useAssetsGalleryContext","useContext","useInteractiveGalleryContext","useKrpanoContext","useMatterportContext","REGISTER","UNREGISTER","useIGModulesContext","modules","dispatch","hasModuleOfType","some","useIGPropertyContext","useViewExtensionContext","SET_ACTIVE_VIEW","useIGViewsContext","activeView","filter","hasView","REQUIRED_FIELDS","Module","super","IG_MODULES_INITIAL_STATE","ACTIONS","IG_MODULES_ACTIONS","IGModulesReducer","freshModule","ACTION","SET_CONTAINER_ELEMENT","IG_VIEWS_ACTIONS","IG_VIEWS_INITIAL_STATE","containerElement","IGViewsReducer","SEARCH_PARAMS","searchQuery","TOUR_STATUS","archived","deleted","PROPERTY_TABS","overview","content","diffusion","contacts","PROPERTIES_LAYOUT","GRID","LIST","PROPERTY_CONTENT_ASSETS","PHOTOS","VIDEOS","PANORAMAS","MATTERPORTS","FLOORPLANS","DOCUMENTS","DETAILS","PROPERTY_DETAILS_TYPES","APARTMENT","HOUSE","LAND","PROPERTY_DETAILS_TRANSACTION_TYPES","FOR_SALE","FOR_RENT","SOLD","PROPERTY_DETAILS_UNITS","METRIC","IMPERIAL","PROPERTY_DETAILS_LOCATION_TYPES","EXACT","AREA","PROPERTY_DETAILS_EPC","AAA","AA","A","B","C","D","E","F","G","ATTRACTIVENESS_SCORES","GetInTouchFormHeader","onSubmitted","onCancel","GetInTouchDialog","withContactReason","useGetInTouchFormHandler","smartlinkUuid","onSuccess","onFailure","saveLead","defaultValues","phone","contactReason","acceptTerms","validationSchema","required","oneOf","handleSubmit","contact_reason","smartlink_uuid","RadioCard","$selected","RadioText","GetInTouchForm","toast","success","termsLabel","onSubmit","FieldText","FieldRadioButtonList","orientation","containerProps","FieldCheckbox","Actions","SubmitButton","form","LeadOrgName","LeadLogo","admin","device_resources","previous_page","click","next_page","search_button","download","gallery_view_page","panoramas_page","photos_page","show","table_view_page","table","open_tour","properties","bulk_action","archive","transfer","devices","change_status","admin_panel","users","go_to_user_button","organisations","tabs","coming_soon","feature","interested","not_interested","credits","buy_credits","notify_admin","new_button","add_button","download_button","download_with_options_button","edit_label","submit","hide","edit_button","floorplan_request","alerts","read_more","try_again","play_button","generate_button","go_back_to_options","continue_to_checkout","confirm_purchase","free_trial","synchronise_demo_tours","tripod_set_up","header_menu","matterport_tours_tab","other_tab","panoramas_tab","photos_tab","videos_tab","live_session","launch","set_camera_on","set_camera_off","message_chat","virtual_tour_tab","map_tab","matter_port_tab","floor_plan_tab","photo_tab","video_tab","no_effect_video","blur_effect_video","image_back_ground_video","give_participant_control","call_to_action_email_agent","main_menu","social_media_hub_button","my_organisation_button","new_tour_button","matterport_tour","share_button","tour_empty","media_editor","generate_image","save_image","blur","save_changes","my_organisation","billing","chargebee_portal","manage_subscription","update_payment_methods","update_address","invoices","pay_invoices","see_pricing","update_payment_method","contact_us","navigation","breadcrumb","my_tours","new_credits","added","removed","consumed","refunded","onboarding","sign_up","discover_photos","magic_eraser","discover","download_upload_button","rename","toggle_visibility","edit_icon","initiated","hardware","undo","redo","save","erase","home_staging","processing_time","edit_photo_in_media_editor","delete_photos","toggle_photo","download_photos","import_photos","sort_photos","photo_editor","export_button","polices_button","request_demo","hover","bulk","share","recap","feedback","share_video","fail_and_rerender","render","render_error","render_success","rerender","ebook","nodalview","smartlink","copy","faq_link","share_by_email","share_on_social_media","social_media","hub","create_post","delete_post","edit_post","preview_post","incentive_dialog","connect_to_facebook","share_again","log_back_in","reschedule_post","steps","account","disconnect_account","select_account","unselect_account","attach","go_back","compose","pristine","schedule","publish","template","select_property_status","property_status","template_type","team","tab","reassign_property","add_filter_button","organisation_page","delete_team_button","create_team_button","update_team_button","team_member","create_team_member_button","delete_team_member_button","tour","timeline_button","tours","options_button","search_filter_button","search_tour_button","contact_your_administrator","more_info","users_and_devices","invitations","action_button","download_clip","download_clip_from_options","download_project","video_editor","generate","open_new_tab","ai_generation","try_it_out","generate_videos","regenerate_videos","save_videos_to_property","virtual_visit","book_a_tour","book_a_tour_submit","business_card_button","more_information_form","gated","submit_form","get_verification_number","submit_code_button","nudges","unpaid_invoice","make_payment","view_invoice","account_status","suspended","view_page","pay_invoice","notify_org_admin","view_invoices","paused","cancelled","go_to_shop","demo_expired","uploader","import_documents","add_files","restriction_failed","import_panoramas","replace_panorama","import_floorplans","import_video_clips","self_service","banner","expired_trial","select_plan","contact_sales","subscription","created","updated","api","photos","property_found_by_title","auth","email_submitted","password_submitted","role_submitted","goals_submitted","usage_submitted","sign_in_clicked","download_app_clicked","sign_in","sign_up_clicked","contacts_tab_viewed","diffusion_tab_viewed","smartlinks","new_clicked","new_saved","shared","generated","saved"],"sourceRoot":""}