{"version":3,"file":"assets/js/chunks/443.78de04826a42b458f930.js","mappings":"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","sources":["webpack://frontend-setup/./src/components/atoms/loading-state/hooks/use-loading-state.ts","webpack://frontend-setup/./src/utilities/constants/index.ts","webpack://frontend-setup/./src/components/molecules/apartments-view/utilities/transform-data.ts","webpack://frontend-setup/./src/components/molecules/apartments-view/apartments-view.tsx","webpack://frontend-setup/./src/components/molecules/apartments-view/utilities/constants.ts","webpack://frontend-setup/./src/features/area-map/utilities/get-map-card-title.ts","webpack://frontend-setup/./src/features/compare/components/compare-open-button/compare-open-button.tsx","webpack://frontend-setup/./src/features/properties/store/store.ts","webpack://frontend-setup/./src/features/properties/utilities/bounding-box.ts","webpack://frontend-setup/./src/features/properties/routes/apartment-view.ts","webpack://frontend-setup/./src/utilities/partition.ts","webpack://frontend-setup/./src/features/properties/utilities/sold-project-phase-data.ts","webpack://frontend-setup/./src/features/properties/routes/construction-number.ts","webpack://frontend-setup/./src/utilities/hooks/use-routing/use-routing.ts","webpack://frontend-setup/./src/features/properties/hooks/use-properties-routing/use-properties-routing.ts","webpack://frontend-setup/./src/features/properties/routes/property-type.ts","webpack://frontend-setup/./src/features/properties/utilities/data.ts","webpack://frontend-setup/./src/features/properties/utilities/extend-map-theme.tsx","webpack://frontend-setup/./src/store/filters/utilities/transform-filters.ts","webpack://frontend-setup/./src/store/filters/store.ts","webpack://frontend-setup/./src/store/filters/utilities/transform-payload.ts","webpack://frontend-setup/./src/features/properties/components/house-selector-card/house-selector-card.tsx","webpack://frontend-setup/./src/features/properties/components/properties-view/hooks/use-content-interaction.ts","webpack://frontend-setup/./src/features/properties/components/house-selector/constants/events.ts","webpack://frontend-setup/./src/features/properties/components/house-selector/utilities/canvas-styles.ts","webpack://frontend-setup/./src/features/properties/components/house-selector/utilities/convert-percentage-to-pixel.ts","webpack://frontend-setup/./src/features/properties/components/house-selector/utilities/render-pointer.tsx","webpack://frontend-setup/./src/features/properties/components/house-selector/utilities/use-canvas-repaint.ts","webpack://frontend-setup/./src/features/properties/components/house-selector/house-selector.tsx","webpack://frontend-setup/./src/features/properties/components/house-selector/utilities/draw-polygon.ts","webpack://frontend-setup/./src/features/properties/components/house-selector/utilities/house-selector-data.ts","webpack://frontend-setup/./src/features/properties/components/properties-view/hooks/use-visual-interaction.ts","webpack://frontend-setup/./src/features/properties/components/properties-view/utilities/sorting.ts","webpack://frontend-setup/./src/components/atoms/lazy-render/lazy-render.tsx","webpack://frontend-setup/./src/features/properties/components/properties-view/utilities/tiles.tsx","webpack://frontend-setup/./src/features/properties/components/properties-view/properties-view.tsx","webpack://frontend-setup/./src/features/properties/components/property-filter/utilities/generate-inputs.tsx","webpack://frontend-setup/./src/features/properties/components/property-filter/utilities/filter-names.ts","webpack://frontend-setup/./src/features/properties/components/property-filter/utilities/filter-order.ts","webpack://frontend-setup/./src/features/properties/components/property-filter/utilities/transform-filter-label.ts","webpack://frontend-setup/./src/features/properties/components/tag-list/utilities/transform-tag-label.ts","webpack://frontend-setup/./src/features/properties/components/property-filter/property-filter.tsx","webpack://frontend-setup/./src/features/properties/components/tag-list/tag-list.tsx","webpack://frontend-setup/./src/utilities/filters/urls.ts","webpack://frontend-setup/./src/utilities/filters/is-range-in-range.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/utilities/generate-steps.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/living-area.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/plot-area.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/price.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/property-types.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/rooms.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/status.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/construct-filters.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/apartments.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/districts.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/rental.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/project-phases.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/filters/sun-direction.ts","webpack://frontend-setup/./src/features/properties/components/properties-filters/properties-filters.tsx","webpack://frontend-setup/./src/features/properties/components/properties-breadcrumbs/properties-breadcrumbs.tsx","webpack://frontend-setup/./src/features/properties/properties.tsx","webpack://frontend-setup/./src/utilities/api-utilities/is-nhg.ts","webpack://frontend-setup/./src/utilities/map/provider.ts","webpack://frontend-setup/./src/utilities/map/config/theme.tsx","webpack://frontend-setup/./src/utilities/map/service.ts","webpack://frontend-setup/./src/features/properties/properties.scss"],"sourcesContent":["const LOADED_CLASS = 'is--loaded';\n\nconst useLoadingState = (element: Element) => {\n    const loadingState = element.querySelector('[js-hook-loading-state]');\n\n    return {\n        setLoaded: () => {\n            element.classList.add(LOADED_CLASS);\n\n            loadingState?.addEventListener('animationend', () => {\n                loadingState?.remove();\n            });\n        },\n    };\n};\n\nexport default useLoadingState;\n","export const DESIGN_SYSTEM = 'Design System';\nexport const ATOMS = `${DESIGN_SYSTEM}/Atoms`;\nexport const MOLECULES = `${DESIGN_SYSTEM}/Molecules`;\nexport const ORGANISMS = `${DESIGN_SYSTEM}/Organisms`;\n\nexport const FEATURES = 'Features';\nexport const TEMPLATES = 'Templates';\n\nexport const DOCUMENTATION = 'Documentation';\nexport const BRAND_GUIDE = `${DOCUMENTATION}/Brand Guide`;\nexport const TECHNICAL = `${DOCUMENTATION}/Technical`;\n\nexport const IMAGE_PLACEHOLDER =\n    'https://www.hoefenhaag.nl/media/ydyjxqnz/nieuwbouw-vianen-hoefenhaag-home-dorpshart.jpg';\n","import {\n    ApartmentBuildingView,\n    ApartmentBuildingViewPointer,\n    ExtendedApartmentBuilding,\n    getApartmentBuildingView,\n} from '@bpd-library/utilities';\nimport { VirtualTourMinimap, VirtualTourPointer, VirtualView } from '@features/virtual-tour/types';\nimport { formatConstructionNumberStatus, formatDetailPageUrl } from '@utilities/api-formatters';\nimport { IMAGE_PLACEHOLDER } from '@utilities/constants';\nimport { getPrefixedUrl } from '@utilities/get-prefixed-url';\nimport { useAreaData, useAreaDataUnsafe } from '@utilities/hooks';\n\nexport const getApartmentBuilding = async (options: {\n    constructionNumberId?: string | null;\n    viewId?: string | null;\n}) => {\n    let apartmentBuilding: ExtendedApartmentBuilding | undefined;\n\n    const { constructionNumbers } = await useAreaData();\n\n    if (options.constructionNumberId) {\n        const constructionNumber = constructionNumbers.find(\n            (c) => c.id === options.constructionNumberId,\n        );\n        apartmentBuilding = constructionNumber?.apartmentBuilding;\n    } else if (options.viewId) {\n        apartmentBuilding = getApartmentBuildingByViewId(options.viewId);\n    }\n\n    return apartmentBuilding;\n};\n\nexport const getViewIdByConstructionNumberId = async (constructionNumberId: string) => {\n    const { constructionNumbers } = await useAreaData();\n\n    const constructionNumber = constructionNumbers.find((c) => c.id === constructionNumberId);\n    return (constructionNumber && getApartmentBuildingView(constructionNumber)?.id) || null;\n};\n\nexport const transformApartmentBuildingViews = (apartmentBuilding?: ExtendedApartmentBuilding) => {\n    const minimap = transformMinimap(apartmentBuilding?.views?.find((v) => v.type === 'minimap'));\n    const views = (\n        minimap\n            ? apartmentBuilding?.views?.filter((v) => v.type !== 'minimap')\n            : apartmentBuilding?.views\n    )?.map<VirtualView>(mapViewFor(apartmentBuilding));\n    return { minimap, views };\n};\n\nconst transformMinimap = (minimapView?: ApartmentBuildingView): VirtualTourMinimap | undefined => {\n    return (\n        minimapView && {\n            id: minimapView.id!,\n            source: minimapView.imageUrl!,\n            pointers: minimapView.pointers!.filter(isPointerDataClean).map(mapPointer),\n        }\n    );\n};\n\nfunction mapViewFor(apartmentBuilding?: ExtendedApartmentBuilding) {\n    return (abView: ApartmentBuildingView): VirtualView => {\n        if (abView.imageUrl) {\n            return {\n                type: '2d',\n                id: abView.id!,\n                source: getPrefixedUrl(abView.imageUrl) || IMAGE_PLACEHOLDER,\n                pointers: abView.pointers!.filter(isPointerDataClean).map(mapPointer),\n                ...(apartmentBuilding && { apartmentBuildingId: apartmentBuilding.id }),\n            };\n        } else {\n            return {\n                type: '3d',\n                id: abView.id!,\n                source: abView.sourceUrl!,\n                ...(apartmentBuilding && { apartmentBuildingId: apartmentBuilding.id }),\n            };\n        }\n    };\n}\n\nfunction isPointerDataClean(pointer: ApartmentBuildingViewPointer): boolean {\n    const { constructionNumbers } = useAreaDataUnsafe() ?? {};\n\n    if (pointer.constructionNumberId) {\n        const constructionNumber = constructionNumbers?.find(\n            (cn) => cn.id === pointer.constructionNumberId,\n        );\n\n        if (!constructionNumber) return false;\n    }\n\n    return true;\n}\n\nfunction mapPointer(pointer: ApartmentBuildingViewPointer): VirtualTourPointer {\n    const { coordinates, compassDirection, label, type, constructionNumberId, linkToViewId } =\n        pointer;\n    if (!coordinates) {\n        console.warn('[virtual-tour]: rendering pointer without coordinates: >>> ', pointer);\n        return {} as VirtualTourPointer;\n    }\n\n    const { constructionNumbers } = useAreaDataUnsafe() ?? {};\n\n    if (type === 'label') {\n        const constructionNumber = constructionNumbers?.find(\n            (cn) => cn.id === constructionNumberId,\n        );\n\n        return {\n            type: 'label',\n            position: [coordinates[0], coordinates[1]],\n            constructionNumber: {\n                id: constructionNumberId,\n                identifier: label,\n                status: formatConstructionNumberStatus(constructionNumber!),\n                url: getPrefixedUrl(\n                    formatDetailPageUrl({ constructionNumber: constructionNumber! }) || '',\n                ),\n            },\n        };\n    } else if (type === 'text') {\n        return {\n            type: 'text',\n            position: [coordinates[0], coordinates[1]],\n            label,\n        };\n    } else if (type === 'pointer') {\n        const linkedView = getApartmentBuildingByViewId(linkToViewId)?.views?.find(\n            (v) => v.id === linkToViewId,\n        );\n        const amount = linkedView?.pointers?.filter((p) => p.constructionNumberId).length || 0;\n        return {\n            type: amount ? 'number' : 'generic',\n            position: [coordinates[0], coordinates[1]],\n            sceneId: linkToViewId,\n            amount,\n            label,\n        };\n    } else {\n        return {\n            type: pointerTypeTransform(type),\n            position: [coordinates[0], coordinates[1]],\n            eyeDirection: compassDirection,\n            sceneId: linkToViewId,\n            label,\n        };\n    }\n}\n\nfunction pointerTypeTransform(type?: string | null, compassDirection?: string | null) {\n    switch (type) {\n        case 'compass':\n            return `eye-${compassDirection}`;\n        default:\n            return type || 'generic';\n    }\n}\n\nfunction getApartmentBuildingByViewId(\n    viewId?: string | null,\n): ExtendedApartmentBuilding | undefined {\n    const { apartmentBuildings } = useAreaDataUnsafe() || {};\n\n    if (!apartmentBuildings || !viewId) return;\n    return apartmentBuildings?.find((apartmentBuilding) =>\n        apartmentBuilding.views?.find((view) => view.id === viewId),\n    );\n}\n","import '@features/virtual-tour';\n\nimport {\n    defineElement,\n    FC,\n    onDidLoad,\n    useElement,\n    useEvent,\n    useListen,\n    useProp,\n} from '@atomify/hooks';\nimport { h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { ExtendedApartmentBuilding } from '@bpd-library/utilities';\nimport { virtualView2dPointerEvents } from '@features/virtual-tour/constants';\nimport {\n    findPointerInCurrentView,\n    findView,\n    pushView,\n    setData,\n    VirtualTourState,\n    virtualTourStore,\n} from '@features/virtual-tour/store';\nimport {\n    VirtualTourImageView,\n    VirtualTourPointer,\n    VirtualView,\n    VRTourPointerFilter,\n} from '@features/virtual-tour/types';\nimport { VirtualTourElement } from '@features/virtual-tour/virtual-tour';\n\nimport { apartmentsViewEvents } from './utilities/constants';\nimport {\n    getApartmentBuilding,\n    getViewIdByConstructionNumberId,\n    transformApartmentBuildingViews,\n} from './utilities/transform-data';\n\ninterface ApartmentsViewElement {\n    constructionNumberId: string | null;\n    expanded: boolean;\n}\n\nexport const ApartmentsView: FC<ApartmentsViewElement> = () => {\n    const [expanded] = useProp<boolean | undefined>('expanded', false);\n    const [vrTourId] = useProp<string>('vrTourId');\n    const [onClose] = useProp<Function | null>('onClose', null);\n    const [currConstructionNumberId, setConstructionNumberId, watchConstructionNumberId] = useProp<\n        string | null\n    >('constructionNumberId', null);\n\n    const vrTourContainer = useElement<VirtualTourElement>('virtual-tour');\n\n    const [, subscribe] = useStore<VirtualTourState>(virtualTourStore);\n\n    let apartmentBuilding: ExtendedApartmentBuilding | undefined;\n\n    const setViewData = async (options: {\n        constructionNumberId?: string | null;\n        linkToViewId?: string | null;\n        triggerEvent?: boolean;\n    }) => {\n        const { constructionNumberId, linkToViewId } = options;\n        const constructionNumberViewId =\n            constructionNumberId && (await getViewIdByConstructionNumberId(constructionNumberId));\n\n        const viewId = linkToViewId || constructionNumberViewId;\n        if (!viewId) return;\n\n        apartmentBuilding = await getApartmentBuilding({ viewId });\n        options.triggerEvent && handleApartmentBuildingChange();\n\n        const { views, minimap } = await transformApartmentBuildingViews(apartmentBuilding);\n        views && setData(vrTourId, { views, firstViewId: viewId, minimap });\n    };\n\n    useListen(document, apartmentsViewEvents.ALIAS_CHANGED, (e) => {\n        const { constructionNumberId } = e.detail;\n        setViewData({ constructionNumberId });\n    });\n\n    useListen(document, virtualView2dPointerEvents.LABEL_FOCUS, ({ detail }) => {\n        setConstructionNumberId(detail.active ? detail.id : null);\n    });\n\n    watchConstructionNumberId((id) => {\n        if (!id) {\n            vrTourContainer.current?.focusPointer(() => false);\n            return;\n        }\n\n        const pointerFilter: VRTourPointerFilter = (p) => p.constructionNumber?.id === id;\n\n        const pointer = findPointerInCurrentView(vrTourId, pointerFilter);\n\n        if (!pointer) {\n            const view = findView(vrTourId, (v: VirtualView) => {\n                if (v.type !== '2d') return false;\n                else v = v as VirtualTourImageView;\n\n                if (v.pointers.find(pointerFilter)) return true;\n                return false;\n            });\n\n            if (!view) return;\n\n            pushView(vrTourId, view.id);\n        }\n        setTimeout(() => {\n            vrTourContainer.current?.focusPointer(pointerFilter);\n        }, 50);\n    });\n\n    onDidLoad(() => {\n        setViewData({ constructionNumberId: currConstructionNumberId });\n    });\n\n    subscribe(\n        async ({ [vrTourId]: vrState }) => {\n            const { apartmentBuildingId, id: viewId } = vrState.currentView!;\n            if (apartmentBuildingId && apartmentBuildingId !== apartmentBuilding?.id) {\n                apartmentBuilding = await getApartmentBuilding({ viewId });\n                handleApartmentBuildingChange();\n\n                const { minimap } = await transformApartmentBuildingViews(apartmentBuilding);\n                minimap && vrTourContainer.current?.setMinimap(minimap, vrState.currentView!);\n            }\n        },\n        [vrTourId],\n    );\n\n    const apartmentBuildingChangeEvent = useEvent({ eventName: apartmentsViewEvents.UPDATE_ALIAS });\n    function handleApartmentBuildingChange() {\n        apartmentBuildingChangeEvent.emit({\n            apartmentBuildingId: apartmentBuilding?.id,\n        });\n    }\n\n    return (\n        <div class={`c-apartments-view apartments-view--${expanded ? 'expanded' : 'contained'}`}>\n            <virtual-tour\n                id={vrTourId}\n                onClose={onClose}\n                onMissingData={(viewId: string) => {\n                    setViewData({ linkToViewId: viewId, triggerEvent: true });\n                }}\n                {...(currConstructionNumberId && {\n                    pointerHighlighted: (p: VirtualTourPointer) =>\n                        p.constructionNumber?.id === currConstructionNumberId,\n                })}\n            />\n        </div>\n    );\n};\n\nApartmentsView.props = {\n    expanded: {\n        type: Boolean,\n    },\n    constructionNumberId: {\n        type: String,\n    },\n    vrTourId: {\n        type: String,\n        required: true,\n    },\n    onClose: {\n        type: Function,\n    },\n};\n\ndefineElement('apartments-view', ApartmentsView);\n","export const apartmentsViewEvents = {\n    UPDATE_ALIAS: 'apartments-view::updateAlias',\n    ALIAS_CHANGED: 'apartments-view::aliasChanged',\n};\n","import { ExtendedApiObject } from '@bpd-library/utilities';\nimport { translateItem } from '@utilities/hooks';\n\nconst getMapCardTitle = async (apiObject: ExtendedApiObject) => {\n    switch (apiObject.objectType) {\n        case 'constructionNumber':\n            const houseTypeTranslationKey = `PropertyTypeName-${apiObject.propertyType?.houseType?.toLowerCase()}`;\n            const houseTypeTranslated = await translateItem(houseTypeTranslationKey);\n            return `${houseTypeTranslated} ${apiObject.identifier}`;\n        case 'propertyType':\n            return `${apiObject.name} ${apiObject.projectPhaseName || ''}`;\n        case 'apartmentBuilding':\n            return apiObject.displayName || '';\n        case 'projectPhase':\n            return apiObject.name || '';\n        case 'district':\n            return apiObject.name || '';\n        case 'areaProject':\n            return apiObject.name || '';\n    }\n};\n\nexport { getMapCardTitle };\n","import { defineElement, FC, onDidLoad } from '@atomify/hooks';\nimport { h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { ButtonA } from '@source/components/atoms/button/button';\nimport { CompareState, compareStore, getCompareState } from '@source/store/compare';\nimport { useTranslate } from '@source/utilities/hooks';\n\nexport const CompareOpenButton: FC = ({ element }) => {\n    const [, subscribe] = useStore<CompareState>(compareStore);\n\n    onDidLoad(render);\n    subscribe(render);\n\n    function render() {\n        const { constructionNumberIds } = getCompareState();\n        const total = constructionNumberIds.length;\n\n        element.innerHTML = '';\n\n        if (total) {\n            element.append(\n                <div class=\"c-compare-open-button\">\n                    <ButtonA\n                        url={window.__ENVIRONMENT_DETAILS__.compareUrl}\n                        width=\"full-width\"\n                        variant=\"primary\"\n                        attr={{ ['js-hook-compare-button-link']: '' }}>\n                        {useTranslate('Compare.CompareHouses')}\n\n                        <span class=\"compare-open-button__total\">{total ? total : ''}</span>\n                    </ButtonA>\n                </div>,\n            );\n        }\n    }\n};\n\ndefineElement('compare-open-button', CompareOpenButton);\n","import {\n    ExtendedApartmentBuilding,\n    ExtendedAreaModels,\n    ExtendedConstructionNumber,\n    ExtendedProjectPhase,\n    ExtendedPropertyType,\n} from '@bpd-library/utilities';\nimport { HouseSelectorModel } from '@features/properties/components/house-selector/utilities/types';\nimport createStore from '@utilities/store';\n\ninterface ViewConstructor<Type, DataItem> {\n    expandedMap?: boolean;\n    type: Type;\n    data: ViewData;\n    dataType?: 'default' | 'recommended' | 'soldConstructionNumbers' | 'soldProjects';\n    slug?: string;\n    name?: string | null;\n    viewId?: string | null;\n    onCardClick?: (event: MouseEvent, item: DataItem, cardType: ViewCardTypes) => void;\n    onReturn?: () => void;\n}\n\ntype ViewGrid = ViewConstructor<\n    'propertyType' | 'apartmentPropertyType',\n    ExtendedPropertyType | ExtendedApartmentBuilding | ExtendedProjectPhase\n>;\ntype ViewList = ViewConstructor<\n    'apartmentConstructionNumber' | 'constructionNumber',\n    ExtendedConstructionNumber\n>;\n\nexport type View = ViewList | ViewGrid;\nexport type ViewType =\n    | 'propertyType'\n    | 'apartmentPropertyType'\n    | 'apartmentConstructionNumber'\n    | 'constructionNumber';\n\nexport type ViewCardObject =\n    | ExtendedConstructionNumber\n    | ExtendedPropertyType\n    | ExtendedApartmentBuilding\n    | ExtendedProjectPhase;\n\nexport type ViewCardTypes = ViewCardObject['objectType'];\n\nexport type ViewData = ViewCardObject[];\n\nexport interface PropertiesState {\n    view?: View;\n    viewData?: ViewData;\n    filteredData?: ExtendedAreaModels;\n    soldProjectsData?: ExtendedAreaModels;\n    allProjectsSold?: boolean;\n    houseSelectorData?: HouseSelectorModel;\n}\n\nconst UPDATE_VIEW = 'updateView';\nconst UPDATE_FILTER_DATA = 'updateFilterData';\nconst UPDATE_VIEW_DATA = 'updateViewData';\nconst UPDATE_SOLD_PROJECTS_DATA = 'updateSoldProjectsData';\nconst UPDATE_HOUSE_SELECTOR_DATA = 'updateHouseSelectorData';\nconst SET_ALL_PROJECTS_SOLD = 'setAllProjectsSold';\n\nconst initialState: PropertiesState = {};\n\nconst actions = {\n    [UPDATE_FILTER_DATA]: (state: PropertiesState, filteredData: ExtendedAreaModels) => {\n        state.filteredData = filteredData;\n        return state;\n    },\n    [UPDATE_SOLD_PROJECTS_DATA]: (state: PropertiesState, soldProjectsData: ExtendedAreaModels) => {\n        state.soldProjectsData = soldProjectsData;\n        return state;\n    },\n    [UPDATE_VIEW]: (state: PropertiesState, view: View) => {\n        state.view = view;\n        return state;\n    },\n    [UPDATE_VIEW_DATA]: (state: PropertiesState, viewData: ViewData) => {\n        state.viewData = viewData;\n        return state;\n    },\n    [UPDATE_HOUSE_SELECTOR_DATA]: (state: PropertiesState, selectorData: HouseSelectorModel) => {\n        state.houseSelectorData = selectorData;\n        return state;\n    },\n    [SET_ALL_PROJECTS_SOLD]: (state: PropertiesState, allProjectsSold: boolean) => {\n        state.allProjectsSold = allProjectsSold;\n        return state;\n    },\n};\n\nexport const propertiesStore = createStore<PropertiesState>({\n    initialState,\n    actions,\n});\n\nexport const updateFilteredData = (data: ExtendedAreaModels) => {\n    propertiesStore.dispatch(UPDATE_FILTER_DATA, data);\n};\n\nexport const updateSoldProjectsData = (data: ExtendedAreaModels) => {\n    propertiesStore.dispatch(UPDATE_SOLD_PROJECTS_DATA, data);\n};\n\nexport const updateView = (view: View) => {\n    propertiesStore.dispatch(UPDATE_VIEW, view);\n};\n\nexport const updateViewData = (viewData: ViewData) => {\n    propertiesStore.dispatch(UPDATE_VIEW_DATA, viewData);\n};\n\nexport const updateHouseSelectorData = (houseSelectorData: HouseSelectorModel) => {\n    propertiesStore.dispatch(UPDATE_HOUSE_SELECTOR_DATA, houseSelectorData);\n};\n\nexport const setAllProjectsSold = (allProjectsSold: boolean) => {\n    propertiesStore.dispatch(SET_ALL_PROJECTS_SOLD, allProjectsSold);\n};\n\nexport const getCurrentView = () => propertiesStore.getState().view;\n\nexport const getFilteredData = () => propertiesStore.getState().filteredData;\n\nexport const getSoldProjectsData = () => propertiesStore.getState().soldProjectsData;\n\nexport const getHouseSelectorData = () => propertiesStore.getState().houseSelectorData;\n\nexport const getHouseSelectorView = (viewId: string) => {\n    const data = propertiesStore.getState().houseSelectorData;\n    return data?.views?.find(({ id }) => id === viewId);\n};\n\nexport const getHouseSelectorViewByObjectId = (id: string) => {\n    const data = propertiesStore.getState().houseSelectorData;\n    return data?.views?.find(({ polygons }) => {\n        return polygons?.find(({ objectId }) => objectId === id);\n    });\n};\n","import { getMapInstance } from '@bpd-library/components';\nimport { BoundingBox, Coordinates, MapDataItem } from '@bpd-library/types';\nimport {\n    calculateBoundingBox,\n    calculateMapDataBoundingBox,\n    expandBoundingBox,\n    ExtendedAreaModels,\n    getApiObjectCenter,\n    getApiObjectCoordinates,\n} from '@bpd-library/utilities';\nimport { isGermany } from '@utilities/is-germany';\n\nfunction getBoundingBox(\n    data: ExtendedAreaModels,\n    mapData?: MapDataItem[],\n): BoundingBox | undefined {\n    let boundingBox: BoundingBox | undefined;\n\n    if (isGermany()) {\n        // If the environment is germany, base it on area and project polygons\n        boundingBox = getGermanyBoundingBox(data);\n    } else {\n        // If the environment is not germany, base it on the mapdata\n        if (mapData?.length) {\n            boundingBox = calculateMapDataBoundingBox(mapData);\n            boundingBox = expandBoundingBox(boundingBox, 0.075);\n        }\n    }\n\n    if (!boundingBox) {\n        // If there's no mapdata, use the center of the areaProject\n        const center = getApiObjectCenter(data.areaProject);\n\n        if (center) {\n            boundingBox = calculateBoundingBox(center);\n            boundingBox = expandBoundingBox(boundingBox, 0.4);\n        }\n    }\n\n    return boundingBox;\n}\n\nfunction setPropertiesMapBounds(data: ExtendedAreaModels, mapData: MapDataItem[]) {\n    const mapInstance = getMapInstance();\n\n    // Set map boundingbox delayed, for visual effect\n    setTimeout(() => {\n        const boundingBox = getBoundingBox(data, mapData);\n\n        if (boundingBox) mapInstance?.fitBounds(boundingBox, { duration: 1200 });\n    }, 600);\n}\n\nfunction getGermanyBoundingBox(data: ExtendedAreaModels): BoundingBox | undefined {\n    /*\n        Germany doesn't have any construction number / property type polygons yet.\n        Instead, use the areaProject and projectPhases to calculate the boundingbox.\n    */\n    const areaProjectCoordinates = getApiObjectCoordinates(data.areaProject) || [];\n    const projectPhaseCoordinates = data.projectPhases.reduce<Coordinates>(\n        (projectPhaseCoordinates, projectPhase) => {\n            const coordinates = getApiObjectCoordinates(projectPhase);\n\n            return coordinates\n                ? [...projectPhaseCoordinates, ...coordinates]\n                : projectPhaseCoordinates;\n        },\n        [],\n    );\n\n    let boundingBox: BoundingBox | undefined;\n\n    if (areaProjectCoordinates.length || projectPhaseCoordinates.length) {\n        boundingBox = calculateBoundingBox([...areaProjectCoordinates, ...projectPhaseCoordinates]);\n    }\n\n    return boundingBox;\n}\n\nexport { getBoundingBox, setPropertiesMapBounds };\n","import { updateMapData } from '@bpd-library/components';\nimport {\n    ExtendedAreaModels,\n    ExtendedConstructionNumber,\n    findApartmentBuilding,\n} from '@bpd-library/utilities';\nimport { getFilteredData, getSoldProjectsData, updateView } from '@features/properties/store';\nimport { apartmentsViewEvents } from '@molecules/apartments-view/utilities/constants';\nimport { hasConsent } from '@store/service-consent';\nimport getExtendedAreaMapData from '@utilities/api-utilities/get-extended-area-map-data';\nimport { useAreaData } from '@utilities/hooks';\nimport { Route, RouteHandler } from '@utilities/hooks/use-routing';\n\nimport { usePropertiesRouting } from '../hooks/use-properties-routing';\nimport { setPropertiesMapBounds } from '../utilities/bounding-box';\n\nconst getApartmentBuildingById = (data?: ExtendedAreaModels, apartmentBuildingId?: string) => {\n    if (!data?.apartmentBuildings.length || !apartmentBuildingId) return;\n    return data.apartmentBuildings.find(({ id }) => apartmentBuildingId === id);\n};\n\nconst apartmentViewRoute: RouteHandler = async (route) => {\n    const { slug: apartmentBuildingId = '' } = route;\n    let buildingName: string | null | undefined;\n    let constructionNumbers: ExtendedConstructionNumber[] | undefined;\n\n    const filteredData = getFilteredData();\n    const filteredAB = getApartmentBuildingById(filteredData, apartmentBuildingId);\n\n    buildingName = filteredAB?.displayName;\n    constructionNumbers = filteredAB?.constructionNumbers?.filter(({ id }) =>\n        filteredData?.constructionNumbers.find(({ id: filteredId }) => filteredId === id),\n    );\n\n    if (constructionNumbers?.length) {\n        setApartmentConstructionNumberView(route, constructionNumbers, buildingName);\n        return;\n    }\n\n    const soldData = getSoldProjectsData();\n    const soldAB = getApartmentBuildingById(soldData, apartmentBuildingId);\n\n    buildingName = soldAB?.displayName;\n    constructionNumbers = soldAB?.constructionNumbers;\n\n    if (constructionNumbers?.length) {\n        setApartmentConstructionNumberView(route, constructionNumbers, buildingName);\n        return;\n    }\n\n    const nonFilteredData = await useAreaData();\n    const nonFilteredAB = getApartmentBuildingById(nonFilteredData, apartmentBuildingId);\n\n    buildingName = nonFilteredAB?.displayName;\n    constructionNumbers = nonFilteredAB?.constructionNumbers;\n\n    if (\n        (nonFilteredAB?.status === 'Sold' || nonFilteredAB?.status === 'UnderConstruction') &&\n        constructionNumbers?.length\n    ) {\n        setApartmentConstructionNumberView(route, constructionNumbers, buildingName);\n        return;\n    }\n\n    setApartmentPropertyTypeView(route, filteredData, apartmentBuildingId, buildingName);\n};\n\n/**\n * @description Sets the properties view to an apartment view with construction numbers\n * @param {ExtendedConstructionNumber[]} constructionNumbers\n */\nfunction setApartmentConstructionNumberView(\n    { slug, viewId }: Route,\n    constructionNumbers: ExtendedConstructionNumber[],\n    buildingName?: string | null,\n) {\n    const { setRoute } = usePropertiesRouting();\n\n    updateView({\n        type: 'apartmentConstructionNumber',\n        data: constructionNumbers,\n        slug,\n        viewId,\n        name: buildingName,\n        onReturn: () => {\n            setRoute({\n                to: 'propertyType',\n            });\n        },\n    });\n\n    document.dispatchEvent(\n        new CustomEvent(apartmentsViewEvents.ALIAS_CHANGED, {\n            detail: {\n                constructionNumberId: constructionNumbers[0].id,\n            },\n        }),\n    );\n}\n\n/**\n * @description Sets the properties view to apartment view with property types\n * @param {ExtendedAreaModels} data\n * @param {string} [apartmentBuildingId]\n */\nfunction setApartmentPropertyTypeView(\n    { slug, viewId }: Route,\n    data?: ExtendedAreaModels,\n    apartmentBuildingId?: string,\n    buildingName?: string | null,\n) {\n    const { setRoute } = usePropertiesRouting();\n\n    if (!data) return;\n\n    const apartmentBuilding = findApartmentBuilding(data.apartmentBuildings, {\n        id: apartmentBuildingId,\n    });\n\n    const propertyTypes = data.propertyTypes?.filter((s) =>\n        s.apartmentBuildings?.find(\n            (apartmentBuilding) => apartmentBuilding.id === apartmentBuildingId,\n        ),\n    );\n\n    updateView({\n        type: 'propertyType',\n        data: propertyTypes,\n        slug,\n        viewId,\n        name: buildingName,\n        onReturn: () => {\n            setRoute({\n                to: 'propertyType',\n            });\n        },\n    });\n\n    if (hasConsent('mapbox')) {\n        const mapData = getExtendedAreaMapData({\n            propertyTypes,\n            apartmentBuildings: apartmentBuilding ? [apartmentBuilding] : [],\n        });\n\n        updateMapData(mapData);\n        setPropertiesMapBounds(data, mapData);\n    }\n}\n\nexport { apartmentViewRoute };\n","const partition = <Item, ItemPass extends Item = Item, ItemFail extends Item = Item>(\n    data: Item[] | undefined,\n    filter: (item: Item) => boolean,\n): [ItemPass[] | undefined, ItemFail[] | undefined] => {\n    return (\n        data?.reduce<[ItemPass[], ItemFail[]]>(\n            (acc, item) => {\n                if (filter(item)) acc[0].push(item as ItemPass);\n                else acc[1].push(item as ItemFail);\n                return acc;\n            },\n            [[], []],\n        ) ?? [undefined, undefined]\n    );\n};\n\nexport { partition };\n","import { MapDataItem } from '@bpd-library/types';\nimport { ExtendedAreaModels, ExtendedProjectPhase, findProjectPhase } from '@bpd-library/utilities';\nimport { getSoldProjectsData } from '@features/properties/store';\nimport { createConstructionNumberMapData } from '@utilities/map/service';\nimport { partition } from '@utilities/partition';\n\nexport const filterSoldProjectPhasesData = (data: ExtendedAreaModels): ExtendedAreaModels => {\n    const [soldProjects = [], notSoldProjects = []] = partition(\n        data.projectPhases,\n        ({ status }) => status === 'Sold',\n    );\n    const [soldPropertyTypes = [], notSoldPropertyTypes = []] = partition(\n        data.propertyTypes,\n        ({ projectPhase }) => projectPhase?.status === 'Sold',\n    );\n    const [soldConstructionNumbers = [], notSoldConstructionNumbers = []] = partition(\n        data.constructionNumbers,\n        ({ projectPhase }) => projectPhase?.status === 'Sold',\n    );\n    const [soldApartmentBuildings = [], notSoldApartmentBuildings = []] = partition(\n        data.apartmentBuildings,\n        ({ projectPhase }) => projectPhase?.status === 'Sold',\n    );\n\n    data.projectPhases = notSoldProjects;\n    data.propertyTypes = notSoldPropertyTypes;\n    data.constructionNumbers = notSoldConstructionNumbers;\n    data.apartmentBuildings = notSoldApartmentBuildings;\n\n    return {\n        ...data,\n        projectPhases: soldProjects,\n        propertyTypes: soldPropertyTypes,\n        constructionNumbers: soldConstructionNumbers,\n        apartmentBuildings: soldApartmentBuildings,\n    };\n};\n\nexport const getSoldProjectPhase = (id: string) => {\n    const { projectPhases: soldProjects = [] } = getSoldProjectsData() ?? {};\n    return findProjectPhase(soldProjects, { id });\n};\n\nexport const getSoldProjectPhaseMapData = (): MapDataItem[] => {\n    const mapData: MapDataItem[] = [];\n\n    const { projectPhases: soldProjects = [] } = getSoldProjectsData() ?? {};\n\n    soldProjects\n        .filter(({ mapDataItems }) => !!mapDataItems?.length)\n        .map<MapDataItem[]>(({ mapDataItems }) => mapDataItems!)\n        .forEach((items) => mapData.push(...items));\n\n    return mapData;\n};\n\nexport const toggleSoldProjectPhaseConstructionNumberPolygons = (\n    projectPhase: ExtendedProjectPhase,\n    visible: boolean,\n) => {\n    if (projectPhase.status !== 'Sold') return;\n    projectPhase.constructionNumbers?.forEach((constructionNumber) => {\n        constructionNumber.mapDataItems = createConstructionNumberMapData(constructionNumber, {\n            showSold: visible,\n        });\n    });\n};\n\nexport const shouldToggleSoldProjectPolygon = (projectPhase?: ExtendedProjectPhase): boolean => {\n    if (!projectPhase || projectPhase.status !== 'Sold') return false;\n\n    // toggle project polygon only if there is no available polygons for every nested construction number\n    return !!projectPhase.constructionNumbers?.every(({ mapDataItems }) => !mapDataItems?.length);\n};\n","import { updateMapData } from '@bpd-library/components';\nimport {\n    ExtendedConstructionNumber,\n    findProjectPhase,\n    findPropertyType,\n} from '@bpd-library/utilities';\nimport { getFilteredData, getSoldProjectsData, updateView, View } from '@features/properties/store';\nimport { hasConsent } from '@store/service-consent';\nimport getExtendedAreaMapData from '@utilities/api-utilities/get-extended-area-map-data';\nimport { RouteHandler } from '@utilities/hooks/use-routing';\n\nimport { usePropertiesRouting } from '../hooks/use-properties-routing';\nimport { setPropertiesMapBounds } from '../utilities/bounding-box';\nimport {\n    shouldToggleSoldProjectPolygon,\n    toggleSoldProjectPhaseConstructionNumberPolygons,\n} from '../utilities/sold-project-phase-data';\n\nconst constructionNumberRoute: RouteHandler = ({ slug, viewId }) => {\n    const { setRoute } = usePropertiesRouting();\n    let dataType: View['dataType'] = 'default';\n    let parentViewApiObject:\n        | { constructionNumbers?: ExtendedConstructionNumber[]; name?: string | null }\n        | undefined;\n\n    const data = getFilteredData();\n    const propertyType = findPropertyType(data?.propertyTypes ?? [], { id: slug });\n\n    const soldData = getSoldProjectsData();\n    const soldProjectPhase = findProjectPhase(soldData?.projectPhases ?? [], { id: slug });\n\n    parentViewApiObject = soldProjectPhase ?? propertyType;\n    const viewName = parentViewApiObject?.name;\n\n    if (!parentViewApiObject) {\n        if (!data) return;\n        parentViewApiObject = data;\n        dataType = 'recommended';\n    }\n\n    let constructionNumbers = parentViewApiObject.constructionNumbers;\n\n    if (soldProjectPhase) {\n        toggleSoldProjectPhaseConstructionNumberPolygons(soldProjectPhase, true);\n        dataType = 'soldConstructionNumbers';\n    } else {\n        constructionNumbers = constructionNumbers?.filter((cn) =>\n            data?.constructionNumbers.includes(cn),\n        );\n    }\n\n    updateView({\n        type: 'constructionNumber',\n        data: constructionNumbers || [],\n        dataType,\n        slug,\n        viewId,\n        name: viewName,\n        onReturn: () => {\n            if (soldProjectPhase) {\n                toggleSoldProjectPhaseConstructionNumberPolygons(soldProjectPhase, false);\n            }\n            setRoute({\n                to: 'propertyType',\n            });\n        },\n    });\n\n    if (hasConsent('mapbox')) {\n        const mapData = getExtendedAreaMapData({\n            constructionNumbers,\n            propertyTypes: propertyType && [propertyType],\n            ...(shouldToggleSoldProjectPolygon(soldProjectPhase) && {\n                projectPhases: [soldProjectPhase!],\n            }),\n        });\n\n        updateMapData(mapData);\n        setPropertiesMapBounds(data ?? soldData!, mapData);\n    }\n};\n\nexport { constructionNumberRoute };\n","interface Route {\n    to: string;\n    slug?: string;\n    viewId?: string | null;\n}\n\nexport type RouteHandler = (route: Route) => void | Promise<void>;\n\ninterface Routes {\n    [key: string]: RouteHandler;\n}\n\nconst ROUTE_TO_PARAM = 'route';\nconst ROUTE_SLUG_PARAM = 'slug';\nconst ROUTE_LINKED_VIEW_PARAM = 'viewId';\n\n/**\n * @description Creates a hook, with which you can handle client side routing\n * @param {{ routes: Routes; defaultRoute: Route }} { routes, defaultRoute }\n * @return {*}\n */\nconst createRoutingHook = ({ routes, defaultRoute }: { routes: Routes; defaultRoute: Route }) => {\n    let currentRoute: Route | undefined;\n\n    init();\n\n    function init() {\n        window.addEventListener('popstate', (e) => {\n            const urlParamRoute = parseUrlParams();\n\n            if (urlParamRoute) {\n                setRoute(urlParamRoute, false);\n            }\n\n            e.preventDefault();\n        });\n    }\n\n    /**\n     * @description Set's the current route to passed route. When pushState is false, the url & history won't be updated.\n     * @param {Route} route\n     * @param {boolean} [pushState=true]\n     */\n    function setRoute(route: Route, pushState: boolean = true) {\n        currentRoute = route;\n\n        const url = appendUrlParams(route);\n\n        routes[route.to](route);\n\n        if (pushState) history.pushState(currentRoute, '', url);\n    }\n\n    /**\n     * @description Will call the current route again, optionally without updating the url & history\n     */\n    function updateCurrentRoute(options?: Partial<Route> & { updateHistory?: boolean }) {\n        if (currentRoute) {\n            const { updateHistory, ...route } = options || {};\n            setRoute({ ...currentRoute, ...route }, updateHistory ?? true);\n        }\n    }\n\n    function parseUrlParams(): Route | void {\n        const url = new URL(document.location.href);\n\n        const to = url.searchParams.get(ROUTE_TO_PARAM);\n        const slug = url.searchParams.get(ROUTE_SLUG_PARAM);\n        const viewId = url.searchParams.get(ROUTE_LINKED_VIEW_PARAM);\n\n        if (to) {\n            return {\n                to: to as Route['to'],\n                slug: slug ?? undefined,\n                viewId: viewId ?? undefined,\n            };\n        }\n    }\n\n    function appendUrlParams(route: Route): string {\n        const url = new URL(document.location.href);\n\n        url.searchParams.set(ROUTE_TO_PARAM, route.to);\n\n        if (route.slug) {\n            url.searchParams.set(ROUTE_SLUG_PARAM, route.slug);\n        } else {\n            url.searchParams.delete(ROUTE_SLUG_PARAM);\n        }\n\n        if (route.viewId) {\n            url.searchParams.set(ROUTE_LINKED_VIEW_PARAM, route.viewId);\n        } else {\n            url.searchParams.delete(ROUTE_LINKED_VIEW_PARAM);\n        }\n\n        return url.toString();\n    }\n\n    /**\n     * @description Call setInitialRoute() when the component is ready to initialise the first route\n     */\n    function setInitialRoute() {\n        const urlParamRoute = parseUrlParams();\n\n        setRoute(urlParamRoute || defaultRoute);\n    }\n\n    return () => {\n        return {\n            setInitialRoute,\n            setRoute,\n            updateCurrentRoute,\n        };\n    };\n};\n\nexport { createRoutingHook, Route, Routes };\n","import { useUrlParams } from '@bpd-library/utilities';\nimport { apartmentViewRoute } from '@features/properties/routes/apartment-view';\nimport { constructionNumberRoute } from '@features/properties/routes/construction-number';\nimport { propertyTypeRoute } from '@features/properties/routes/property-type';\nimport { createRoutingHook, Route, Routes } from '@utilities/hooks/use-routing';\n\nconst PROPERTIES_ROUTES: Routes = {\n    apartmentView: apartmentViewRoute,\n    constructionNumber: constructionNumberRoute,\n    propertyType: propertyTypeRoute,\n    allConstructionNumbers: constructionNumberRoute,\n};\n\nfunction getInitialRoute(): Route {\n    const { get: getUrlParam } = useUrlParams();\n\n    const viewMode = getUrlParam('view-mode') as string | undefined;\n    const propertyTypeId = getUrlParam('propertytypeId') as string | undefined;\n    const apartmentBuildingId = getUrlParam('apartmentBuildingId') as string | undefined;\n\n    if (viewMode) {\n        switch (viewMode) {\n            case 'construction-numbers':\n                return {\n                    to: 'allConstructionNumbers',\n                };\n        }\n    } else if (propertyTypeId) {\n        return {\n            to: 'constructionNumber',\n            slug: propertyTypeId,\n        };\n    } else if (apartmentBuildingId) {\n        return {\n            to: 'apartmentView',\n            slug: apartmentBuildingId,\n        };\n    }\n\n    return {\n        to: 'propertyType',\n    };\n}\n\nexport const usePropertiesRouting = createRoutingHook({\n    routes: PROPERTIES_ROUTES,\n    defaultRoute: getInitialRoute(),\n});\n","import { updateMapData } from '@bpd-library/components';\nimport {\n    getFilteredData,\n    getSoldProjectsData,\n    updateView,\n    ViewData,\n} from '@features/properties/store';\nimport { hasConsent } from '@store/service-consent';\nimport getExtendedAreaMapData from '@utilities/api-utilities/get-extended-area-map-data';\nimport { RouteHandler } from '@utilities/hooks/use-routing';\n\nimport { usePropertiesRouting } from '../hooks/use-properties-routing';\nimport { setPropertiesMapBounds } from '../utilities/bounding-box';\nimport { getSoldProjectPhaseMapData } from '../utilities/sold-project-phase-data';\n\nconst propertyTypeRoute: RouteHandler = ({ slug, viewId }) => {\n    const { setRoute } = usePropertiesRouting();\n    const viewData: ViewData = [];\n\n    let data = getFilteredData();\n    const isSoldData = data?.projectPhases.every((project) => project.status === 'Sold');\n\n    if (data && data.projectPhases.length && !isSoldData) {\n        viewData.push(\n            ...data.propertyTypes.filter(({ apartmentBuildings }) => !apartmentBuildings?.length),\n            ...data.apartmentBuildings,\n        );\n    } else {\n        data = getSoldProjectsData();\n        if (!data || !data.projectPhases.length) return;\n        viewData.push(...data.projectPhases.filter(({ mainImage }) => !!mainImage?.url));\n    }\n\n    updateView({\n        type: 'propertyType',\n        data: viewData,\n        dataType: isSoldData ? 'soldProjects' : 'default',\n        viewId,\n        slug,\n        onCardClick(e, item, cardType) {\n            if (item.constructionNumbers?.length) {\n                e.preventDefault();\n                e.stopPropagation();\n\n                if (cardType === 'apartmentBuilding') {\n                    setRoute({\n                        to: 'apartmentView',\n                        slug: item.id,\n                    });\n                }\n                if (cardType === 'propertyType' || cardType === 'projectPhase') {\n                    setRoute({\n                        to: 'constructionNumber',\n                        slug: item.id,\n                    });\n                }\n\n                return;\n            }\n\n            if (cardType === 'apartmentBuilding') {\n                setRoute({\n                    to: 'apartmentView',\n                    slug: item.id,\n                });\n            }\n        },\n    });\n\n    if (hasConsent('mapbox')) {\n        const mapData = getExtendedAreaMapData(data);\n        const soldProjectPolygons = getSoldProjectPhaseMapData();\n\n        updateMapData([...mapData, ...soldProjectPolygons]);\n        setPropertiesMapBounds(data, mapData);\n    }\n};\n\nexport { propertyTypeRoute };\n","import {\n    ExtendedApiObject,\n    ExtendedAreaModels,\n    filterConstructionNumbers,\n    filterDistricts,\n    filterProjectPhases,\n    filterPropertyTypes,\n    findExtendedObjectById,\n} from '@bpd-library/utilities';\nimport { FilterInput, FilterState, SelectedFilter } from '@source/store/filters';\n\nimport {\n    HouseSelectorModel,\n    HouseSelectorObject,\n    HouseSelectorObjectTypeOrder,\n    HouseSelectorPolygon,\n} from '../components/house-selector/utilities/types';\nimport { getFilteredData, getSoldProjectsData, propertiesStore, View, ViewType } from '../store';\n\nconst FIRST_POLYGON_ORDER = 0;\nconst LAST_POLYGON_ORDER = 6;\n\nconst PROPERTY_TYPE_VIEW_POLYGON_ORDER: HouseSelectorObjectTypeOrder = {\n    viewLink: FIRST_POLYGON_ORDER,\n    propertyType: FIRST_POLYGON_ORDER,\n    apartmentBuilding: FIRST_POLYGON_ORDER,\n    projectPhase: FIRST_POLYGON_ORDER + 1,\n    district: FIRST_POLYGON_ORDER + 2,\n    areaProject: FIRST_POLYGON_ORDER + 3,\n    constructionNumber: FIRST_POLYGON_ORDER + 4,\n};\n\nconst CONSTRUCTION_NUMBER_VIEW_POLYGON_ORDER: HouseSelectorObjectTypeOrder = {\n    viewLink: FIRST_POLYGON_ORDER,\n    constructionNumber: FIRST_POLYGON_ORDER,\n    propertyType: FIRST_POLYGON_ORDER + 1,\n    apartmentBuilding: FIRST_POLYGON_ORDER + 1,\n    projectPhase: FIRST_POLYGON_ORDER + 2,\n    district: FIRST_POLYGON_ORDER + 3,\n    areaProject: FIRST_POLYGON_ORDER + 4,\n};\n\nconst SOLD_DATA_POLYGON_ORDER: HouseSelectorObjectTypeOrder = {\n    viewLink: FIRST_POLYGON_ORDER,\n    constructionNumber: LAST_POLYGON_ORDER,\n    propertyType: LAST_POLYGON_ORDER - 1,\n    apartmentBuilding: LAST_POLYGON_ORDER - 1,\n    projectPhase: LAST_POLYGON_ORDER - 2,\n    district: LAST_POLYGON_ORDER - 3,\n    areaProject: LAST_POLYGON_ORDER - 3,\n};\n\nfunction filterDataByDistrict(data: ExtendedAreaModels) {\n    const stagedData: ExtendedAreaModels = { ...data };\n    const { districtId } = window.__ENVIRONMENT_DETAILS__;\n    const isDistrictPage = !!districtId;\n\n    if (isDistrictPage) {\n        stagedData.constructionNumbers = filterConstructionNumbers(data.constructionNumbers, {\n            districtId,\n        });\n        stagedData.propertyTypes = filterPropertyTypes(data.propertyTypes, {\n            districtId,\n        });\n        stagedData.projectPhases = filterProjectPhases(data.projectPhases, {\n            districtId,\n        });\n        stagedData.apartmentBuildings = data.apartmentBuildings.filter(\n            ({ constructionNumbers = [], propertyTypes = [] }) => {\n                return (\n                    !!filterConstructionNumbers(constructionNumbers, { districtId }).length ||\n                    !!filterConstructionNumbers(propertyTypes, { districtId }).length\n                );\n            },\n        );\n        stagedData.districts = filterDistricts(data.districts, { id: districtId });\n    }\n\n    return stagedData;\n}\n\nfunction filterHouseSelectorData(\n    houseSelectorData: HouseSelectorModel,\n    areaData: ExtendedAreaModels,\n) {\n    houseSelectorData.views?.forEach((view) => {\n        view.polygons = view.polygons?.filter(({ objectType, objectId }) => {\n            if (objectType === 'viewLink' || !objectId) return true;\n            else return findExtendedObjectById(areaData, objectId);\n        });\n    });\n}\n\nfunction groupFilter(filter: SelectedFilter) {\n    const { inputs } = filter!;\n\n    const inputsPerFilter: {\n        [key: string]: FilterInput[];\n    } = {};\n\n    inputs.forEach((input) => {\n        if (!input.checked || !input.name) return;\n\n        if (!inputsPerFilter[input.name]) {\n            inputsPerFilter[input.name] = [];\n        }\n\n        inputsPerFilter[input.name].push(input);\n    });\n\n    return inputsPerFilter;\n}\n\nfunction filterData(data: ExtendedAreaModels, filters: FilterState) {\n    const includedIds: { [id: string]: boolean } = {};\n\n    let filteredData: ExtendedAreaModels = { ...data };\n\n    const hasIncludedObject = (objects: { id: string }[]): boolean =>\n        !!objects.find(({ id }) => includedIds[id]);\n\n    const objectIsIncluded = (object: { id: string }): boolean => includedIds[object.id];\n\n    Object.keys(filters).forEach((filterName) => {\n        const { filterFunctions, filterLogic } = filters[filterName]!;\n        const inputsPerFilter = groupFilter(filters[filterName]!);\n\n        Object.keys(inputsPerFilter).forEach((key) => {\n            const inputs = inputsPerFilter[key];\n\n            filteredData.constructionNumbers.forEach((constructionNumber) => {\n                let isIncluded: boolean;\n\n                if (filterLogic !== '&&') {\n                    isIncluded = !!inputs.find((input) =>\n                        filterFunctions.constructionNumber(constructionNumber, input),\n                    );\n                } else {\n                    isIncluded = !!inputs.every((input) =>\n                        filterFunctions.constructionNumber(constructionNumber, input),\n                    );\n                }\n\n                includedIds[constructionNumber.id] = isIncluded;\n            });\n\n            filteredData.propertyTypes.forEach((propertyType) => {\n                const { id, constructionNumbers } = propertyType;\n\n                const hasConstructionNumbers = !!constructionNumbers?.length;\n\n                if (!hasConstructionNumbers) {\n                    // If there are no construction numbers, filter based on propertyType data\n                    let isIncluded: boolean;\n\n                    if (filterLogic !== '&&') {\n                        isIncluded = !!inputs.find((input) =>\n                            filterFunctions.propertyType(propertyType, input),\n                        );\n                    } else {\n                        isIncluded = !!inputs.every((input) =>\n                            filterFunctions.propertyType(propertyType, input),\n                        );\n                    }\n\n                    includedIds[id] = isIncluded;\n                } else {\n                    // If there are construction numbers, filter based on construction number data\n                    includedIds[id] = hasIncludedObject(constructionNumbers!);\n                }\n            });\n\n            filteredData.apartmentBuildings.forEach((apartmentBuilding) => {\n                const { id, constructionNumbers, propertyTypes } = apartmentBuilding;\n\n                const hasConstructionNumbers = !!constructionNumbers?.length;\n                const hasPropertyTypes = !!propertyTypes?.length;\n\n                if (hasConstructionNumbers) {\n                    includedIds[id] = hasIncludedObject(constructionNumbers!);\n                } else if (hasPropertyTypes) {\n                    includedIds[id] = hasIncludedObject(propertyTypes!);\n                } else {\n                    includedIds[id] = false;\n                }\n            });\n\n            filteredData = {\n                ...data,\n                constructionNumbers: data.constructionNumbers.filter(objectIsIncluded),\n                propertyTypes: data.propertyTypes.filter(objectIsIncluded),\n                apartmentBuildings: data.apartmentBuildings.filter(objectIsIncluded),\n                projectPhases: data.projectPhases.filter((projectPhase) => {\n                    return !!inputs.find((input) =>\n                        filterFunctions.projectPhase(projectPhase, input),\n                    );\n                }),\n            };\n        });\n    });\n\n    return filteredData;\n}\n\nconst getViewTypePolygonOrder = (viewType?: ViewType): HouseSelectorObjectTypeOrder => {\n    switch (viewType) {\n        case 'propertyType':\n        case 'apartmentPropertyType': {\n            return PROPERTY_TYPE_VIEW_POLYGON_ORDER;\n        }\n        default: {\n            return CONSTRUCTION_NUMBER_VIEW_POLYGON_ORDER;\n        }\n    }\n};\n\nfunction sortHouseSelectorData(houseSelectorData: HouseSelectorModel) {\n    houseSelectorData.views?.forEach(\n        (view) =>\n            view.polygons?.length &&\n            view.polygons.sort(\n                ({ order: orderA = LAST_POLYGON_ORDER }, { order: orderB = LAST_POLYGON_ORDER }) =>\n                    orderB - orderA,\n            ),\n    );\n}\n\nconst findInPropertiesDataById = (\n    id: string,\n): { object?: ExtendedApiObject; isSoldProjectData?: boolean } => {\n    let object: ExtendedApiObject | undefined;\n\n    const filteredData = getFilteredData();\n    if (filteredData) {\n        object = findExtendedObjectById(filteredData, id);\n        if (object) {\n            return { object, isSoldProjectData: propertiesStore.getState().allProjectsSold };\n        }\n    }\n\n    const soldProjectsData = getSoldProjectsData();\n    if (soldProjectsData) {\n        object = findExtendedObjectById(soldProjectsData, id);\n        if (object) return { object, isSoldProjectData: true };\n    }\n\n    return {};\n};\n\nconst setPolygonDrawingOptions = (polygon: HouseSelectorPolygon, currentView: View) => {\n    const { objectId, objectType, linkToViewId } = polygon;\n    const { type, slug } = currentView;\n\n    polygon.variant = 'white';\n    polygon.canHover = true;\n    polygon.hidden = false;\n    polygon.order = getViewTypePolygonOrder(type)[objectType];\n\n    if (objectType === 'viewLink' && !!linkToViewId) {\n        polygon.variant = 'link';\n        return;\n    }\n\n    if (!objectId) {\n        return;\n    }\n\n    const { object, isSoldProjectData } = findInPropertiesDataById(objectId);\n\n    switch (object?.status) {\n        case 'InPreparation':\n        case 'AmountAvailable':\n        case 'SaleSoon': {\n            polygon.variant = 'white';\n            break;\n        }\n        case 'UnderConstruction': {\n            polygon.variant = 'purple';\n            break;\n        }\n        case 'InOption':\n        case 'AssigningOn':\n        case 'Reserved': {\n            polygon.variant = 'orange';\n            break;\n        }\n        case 'SaleStarted':\n        case 'OnSale':\n        case 'Available':\n        case 'ForRent': {\n            polygon.variant = 'green';\n            break;\n        }\n        case 'Sold':\n        case 'Rented':\n        case 'NotActive': {\n            polygon.variant = 'red';\n            break;\n        }\n        default: {\n            break;\n        }\n    }\n\n    const isHighLevelPolygon = ['areaProject', 'district', 'projectPhase'].includes(objectType);\n\n    if (isHighLevelPolygon) {\n        polygon.variant = 'white';\n        if (!linkToViewId) {\n            polygon.canHover = false;\n        }\n    }\n\n    if (!object) {\n        polygon.canHover = false;\n        polygon.variant = 'striped';\n        polygon.order = LAST_POLYGON_ORDER;\n    }\n\n    if (isSoldProjectData) {\n        polygon.variant = 'red';\n        polygon.order = SOLD_DATA_POLYGON_ORDER[objectType];\n    }\n\n    if (slug) {\n        const { object: slugObject } = findInPropertiesDataById(slug);\n        let polygonCorrelates = false;\n        if (!slugObject) return;\n\n        switch (slugObject.objectType) {\n            case 'apartmentBuilding': {\n                polygonCorrelates =\n                    slugObject.id === objectId ||\n                    !!slugObject.constructionNumbers?.find((cn) => cn.id === objectId) ||\n                    !!slugObject.propertyTypes?.find((cn) => cn.id === objectId);\n\n                break;\n            }\n            case 'projectPhase': {\n                polygonCorrelates =\n                    slugObject.id === objectId ||\n                    !!slugObject.constructionNumbers?.find((cn) => cn.id === objectId) ||\n                    !!slugObject.propertyTypes?.find((cn) => cn.id === objectId);\n\n                break;\n            }\n            case 'propertyType': {\n                polygonCorrelates =\n                    slugObject.id === objectId ||\n                    !!slugObject.constructionNumbers?.find((cn) => cn.id === objectId);\n\n                break;\n            }\n        }\n\n        if (isHighLevelPolygon || !polygonCorrelates) {\n            polygon.canHover = false;\n            polygon.variant = 'striped';\n            polygon.order = LAST_POLYGON_ORDER;\n        }\n    }\n\n    return;\n};\n\nconst getHouseSelectorHelperData = ({\n    objectType,\n    objectId,\n    linkToViewId,\n}: HouseSelectorObject) => {\n    let additionalData: Object | undefined;\n\n    if (objectType !== 'viewLink' && objectId) {\n        const { object, isSoldProjectData } = findInPropertiesDataById(objectId);\n        if (object) {\n            const { status } = object;\n            additionalData = { status, isSoldProjectData };\n        }\n    }\n\n    const helperObject = {\n        objectId,\n        objectType,\n        linkToViewId,\n        ...(additionalData && additionalData),\n    };\n\n    return JSON.stringify(helperObject, null, 2);\n};\n\nexport {\n    filterData,\n    filterDataByDistrict,\n    filterHouseSelectorData,\n    findInPropertiesDataById,\n    getHouseSelectorHelperData,\n    setPolygonDrawingOptions,\n    sortHouseSelectorData,\n};\n","import { h } from '@atomify/jsx';\nimport { MapLabel } from '@atoms/map-label';\nimport { extendMapTheme, GREY_DARK, HOVER, MapThemeExtension, RED, THEME } from '@utilities/map';\n\nexport const PROPERTIES_THEME: MapThemeExtension = extendMapTheme(THEME, {\n    polygon: {\n        settings: [\n            {\n                variant: `projectPhaseSold`,\n                normal: {\n                    fill: [...RED, 0.5],\n                    stroke: [...GREY_DARK, 1],\n                },\n                hover: HOVER,\n            },\n            {\n                variant: `hidden`,\n                visibility: 'none',\n                normal: {},\n            },\n        ],\n    },\n    pointer: {\n        settings: [\n            {\n                variant: 'projectPhaseSoldPointer',\n                disablePointerEvents: true,\n                createElement: (item) => <MapLabel title={item.title} subtitle={item.status} />,\n            },\n        ],\n    },\n});\n","import { FilterState } from '../store';\n\ninterface TransformFiltersProps {\n    filterName: string; // key that is displayed within the url\n    minValue: number | null;\n    maxValue: number | null;\n    stringValues: Array<string> | null;\n}\n\nexport const transformFilters = (items: FilterState) => {\n    const transformedFilters: TransformFiltersProps[] = [];\n\n    Object.keys(items).forEach(key => {\n        const filterName = key as keyof typeof items;\n        const { hasRangeValues, inputs } = items[filterName];\n        const filterInputs = inputs.filter(input => input.checked);\n\n        if (hasRangeValues) {\n            transformedFilters.push({\n                filterName: filterName as string,\n                stringValues: null,\n                minValue: filterInputs.length > 0 ? parseInt(filterInputs[0].value) : null,\n                maxValue: filterInputs.length > 1 ? parseInt(filterInputs[1].value) : null,\n            });\n        } else {\n            transformedFilters.push({\n                filterName: filterName as string,\n                stringValues: filterInputs.map(input => input.value),\n                minValue: null,\n                maxValue: null,\n            });\n        }\n    });\n\n    return transformedFilters.filter(transformFiltersHasValues);\n};\n\n/**\n * Check if the a transformed value has any values otherwise we do not sent it.\n * @param {TransformFiltersProps} item\n * @returns { boolean }\n */\nfunction transformFiltersHasValues(item: TransformFiltersProps) {\n    return (item.stringValues && item.stringValues.length > 0) || item.minValue || item.maxValue;\n}\n","import {\n    ExtendedConstructionNumber,\n    ExtendedProjectPhase,\n    ExtendedPropertyType,\n} from '@bpd-library/utilities';\nimport { Filters } from '@features/properties/components/properties-filters/filters';\nimport createStore from '@utilities/store';\n\nimport { transformFilters } from './utilities/transform-filters';\nimport { transformPayload } from './utilities/transform-payload';\n\n// Saved within the store\nexport interface FilterInput {\n    value: string;\n    name: string;\n    checked: boolean;\n    id: string;\n    label: string;\n    type: string;\n}\n\nexport interface PropertiesFilterFunctions {\n    constructionNumber: (\n        constructionNumber: ExtendedConstructionNumber,\n        filterInput: FilterInput,\n    ) => boolean;\n    propertyType: (propertyType: ExtendedPropertyType, filterInput: FilterInput) => boolean;\n    projectPhase: (projectPhase: ExtendedProjectPhase, filterInput: FilterInput) => boolean;\n}\n\nexport interface SelectedFilter {\n    hasRangeValues: boolean;\n    filterFunctions: PropertiesFilterFunctions;\n    filterLogic?: FilterLogic;\n    inputs: FilterInput[];\n}\n\nexport interface FilterState {\n    [key: string]: SelectedFilter;\n}\n\nexport type FilterLogic = '&&' | '||';\n\nexport interface Filter {\n    name: string;\n    id: string;\n    checked: boolean;\n    value: string;\n    type: string;\n    hasRangeValues: boolean;\n    filterLogic?: FilterLogic;\n}\n\ninterface State {\n    filters: FilterState;\n    isLoading: boolean;\n    currentFilterChange: string;\n    isOpen: boolean;\n}\n\nconst initialState: State = {\n    filters: {},\n    isLoading: true,\n    currentFilterChange: '',\n    isOpen: false,\n};\n\nconst ADD_FILTERS = 'addFilters';\nconst UPDATE_FILTERS = 'updateFilters';\nconst OPEN_FILTERS = 'openFilters';\nconst RESET_FILTERS = 'resetFiltes';\n\nconst actions = {\n    [ADD_FILTERS]: (state: State, payload: Filters) => {\n        state.filters = transformPayload(payload);\n        state.isLoading = false;\n        return state;\n    },\n    [UPDATE_FILTERS]: (state: State, payload: Filter) => {\n        const currentFilter = state.filters[payload.name];\n        const { filterLogic } = currentFilter;\n\n        state.currentFilterChange = payload.name;\n\n        state.filters = {\n            ...state.filters,\n            [payload.name]: {\n                ...currentFilter,\n                inputs: currentFilter.inputs.map((input) => {\n                    // if filters has range values and is a radio set all checked radio falseexcept the current id\n                    if (payload.type === 'radio' && payload.hasRangeValues) {\n                        input.checked = payload.id === input.id ? payload.checked : false;\n                    }\n\n                    // If type is checkbox or radio and not a range value update only the checked status when the id of the input is the same as the input of the payload\n                    if (\n                        (payload.type === 'checkbox' || payload.type === 'radio') &&\n                        !payload.hasRangeValues &&\n                        input.id === payload.id\n                    ) {\n                        input.checked = payload.checked;\n                    }\n\n                    if (filterLogic === '&&' && payload.id === input.id) {\n                        currentFilter.inputs.map((input) => (input.checked = payload.checked));\n                        input.value = payload.value;\n                    }\n\n                    return input;\n                }),\n            },\n        };\n\n        return state;\n    },\n\n    [OPEN_FILTERS]: (state: State, payload: boolean) => {\n        state.isOpen = payload;\n        return state;\n    },\n    [RESET_FILTERS]: (state: State, payload: boolean) => {\n        if (payload) {\n            const newFilters: FilterState = {};\n\n            Object.keys(state.filters).forEach((filterName) => {\n                const filter = state.filters[filterName];\n\n                newFilters[filterName] = {\n                    ...filter,\n                    inputs: filter.inputs.map((input) => ({ ...input, checked: false })),\n                };\n            });\n            state.currentFilterChange = 'all';\n            state.filters = { ...newFilters };\n        }\n\n        return state;\n    },\n};\n\nexport const filterStore = createStore<State>({\n    initialState,\n    actions,\n});\n\nexport const addFilters = (payload: Filters) => {\n    filterStore.dispatch(ADD_FILTERS, payload);\n};\n\nexport const getSelectedFilters = () => {\n    const { filters } = filterStore.getState();\n\n    return transformFilters(filters);\n};\n\nexport const getSelectedFiltersByType = (type: string) => {\n    const { filters } = filterStore.getState();\n    const selectedFilters = transformFilters(filters);\n    return selectedFilters.find((filter) => filter.filterName === type);\n};\n\nexport const getAllFilters = () => {\n    return filterStore.getState().filters;\n};\n\nexport const getFilterInputByValue = (name: string, value: string) => {\n    const { filters } = filterStore.getState();\n\n    const filter = filters[name];\n\n    return filter.inputs.find((input) => input.value === value) as FilterInput;\n};\n\nexport const updateFilter = (payload: Filter) => {\n    filterStore.dispatch(UPDATE_FILTERS, payload);\n};\n\nexport const getFilterByType = (type: string) => {\n    const { filters } = filterStore.getState();\n    return filters[type];\n};\n\nexport const toggleFilters = (state: boolean) => {\n    filterStore.dispatch(OPEN_FILTERS, state);\n};\n\nexport const resetFilters = (state: boolean) => filterStore.dispatch(RESET_FILTERS, state);\n","import { Filters } from '@features/properties/components/properties-filters/filters';\n\nimport { FilterState } from '../store';\n\nexport const transformPayload = (items: Filters): FilterState => {\n    const constructedFilters: FilterState = {};\n\n    Object.keys(items).forEach((key) => {\n        const filterName = key as keyof typeof items;\n        const { hasRangeValues, filterFunctions, filterLogic, filters } = items[filterName];\n\n        constructedFilters[filterName] = {\n            hasRangeValues,\n            filterFunctions,\n            filterLogic,\n            inputs: filters.components.map(({ label, id, name, checked, value, type }) => ({\n                label,\n                id,\n                name,\n                checked,\n                value,\n                type,\n            })),\n        };\n    });\n    return constructedFilters;\n};\n","import { h } from '@atomify/jsx';\nimport { Button, ButtonA } from '@source/components/atoms/button/button';\nimport { Image } from '@source/components/atoms/image';\nimport { COLOR_CLASSES, FormattedPrice, FormattedStatus } from '@source/utilities/api-formatters';\n\ninterface HouseSelectorCardProps {\n    title: string;\n    image?: string | null;\n    description?: string | null;\n    identifier?: string | null;\n    status?: FormattedStatus | null;\n    price?: FormattedPrice | null;\n    specs?:\n        | {\n              title: string | Text;\n              subtitle: string | Text;\n          }[]\n        | null;\n    buttonLabel?: string | Text | null;\n    buttonUrl?: string | null;\n    onButtonClick?: (event: MouseEvent) => void;\n    onClose?: Function | null;\n    isNhg?: boolean;\n}\n\nconst HouseSelectorCard = ({\n    image,\n    title,\n    description,\n    identifier,\n    status,\n    price,\n    specs,\n    isNhg,\n    buttonLabel,\n    buttonUrl,\n    onButtonClick,\n    onClose,\n}: HouseSelectorCardProps) => {\n    return (\n        <div class=\"c-house-selector-card\">\n            {image && (\n                <div class=\"house-selector-card__image-container\">\n                    <Image\n                        classes=\"house-selector-card__image\"\n                        preload={{\n                            width: 310,\n                            height: 200,\n                        }}\n                        settings={{\n                            '640w': {\n                                width: 640,\n                                height: 360,\n                            },\n                        }}\n                        image={image}\n                        alt={title}\n                        objectFit={true}\n                    />\n                </div>\n            )}\n\n            {identifier && (\n                <span class=\"house-selector-card__object-identifier\">#{identifier}</span>\n            )}\n\n            {onClose && (\n                <Button\n                    classes=\"house-selector-card__close\"\n                    icon=\"icons-close\"\n                    variant=\"white\"\n                    width=\"square\"\n                    shape=\"round\"\n                    size=\"small\"\n                    onClick={onClose}\n                />\n            )}\n\n            <div class=\"house-selector-card__content\">\n                <div\n                    class=\"house-selector-card__main-content\"\n                    js-hook-house-selector-card-main-content>\n                    {status && (\n                        <span\n                            class={`house-selector-card__status u-body-normal-bold ${\n                                COLOR_CLASSES[status.color]\n                            }`}>\n                            {status.label}\n                        </span>\n                    )}\n\n                    <p class=\"house-selector-card__title u-body-large-bold\">{title}</p>\n\n                    {price && (\n                        <span class=\"house-selector-card__price\">\n                            {price.prefix && (\n                                <span class=\"u-status-large u-color--grey-30 u-margin-right-1\">\n                                    {price.prefix}\n                                </span>\n                            )}\n                            {price.amount && price.amount}\n                            {price.suffix && (\n                                <span class=\"u-status-large u-color--grey-30 u-margin-left-1\">\n                                    {price.suffix}\n                                </span>\n                            )}\n                            {isNhg && (\n                                <span class=\"u-margin-left-1 u-color--positive u-label\">NHG</span>\n                            )}\n                        </span>\n                    )}\n\n                    {description && <p class=\"house-selector-card__description\">{description}</p>}\n                </div>\n\n                {specs && (\n                    <div class=\"house-selector-card__specs u-margin-top-2\">\n                        {specs.map((spec) => (\n                            <div class=\"house-selector-card__spec u-background--bg\">\n                                <p class=\"u-body-normal-bold u-color--grey-80\">{spec.title}</p>\n                                <span class=\"u-body-normal\">{spec.subtitle}</span>\n                            </div>\n                        ))}\n                    </div>\n                )}\n\n                {buttonLabel && buttonUrl && (\n                    <ButtonA\n                        classes=\"u-margin-top-2\"\n                        width=\"full-width\"\n                        label={buttonLabel}\n                        url={buttonUrl}\n                        onClick={onButtonClick}\n                    />\n                )}\n\n                {buttonLabel && !buttonUrl && onButtonClick && (\n                    <Button\n                        classes=\"u-margin-top-2\"\n                        width=\"full-width\"\n                        label={buttonLabel}\n                        onClick={onButtonClick}\n                    />\n                )}\n            </div>\n        </div>\n    );\n};\n\nexport { HouseSelectorCard };\n","import { clearFocus, setFocus } from '@bpd-library/components';\nimport { ExtendedConstructionNumber, ExtendedPropertyType } from '@bpd-library/utilities';\nimport { HouseSelectorElement } from '@features/properties/components/house-selector';\nimport { getCurrentView, getHouseSelectorViewByObjectId } from '@features/properties/store';\nimport { virtualView2dPointerEvents } from '@features/virtual-tour/constants';\n\nimport { HouseSelectorView } from '../../house-selector/utilities/types';\n\nconst useContentInteraction = (options: {\n    houseSelectorElement?: { current: HouseSelectorElement | null };\n}) => {\n    function onMouseenter(_: MouseEvent, item: ExtendedConstructionNumber | ExtendedPropertyType) {\n        const { type } = getCurrentView() || {};\n\n        switch (type) {\n            case 'constructionNumber':\n                setFocus([item.id], { static: true });\n                houseSelectorPolygonFocus([item.id], true);\n                break;\n            case 'apartmentConstructionNumber':\n                houseSelectorPolygonFocus([item.id], true);\n                virtualTourLabelFocus(item as ExtendedConstructionNumber, true);\n                break;\n            case 'propertyType':\n                item = item as ExtendedPropertyType;\n                const constructionNumberIds = item.constructionNumbers?.map(({ id }) => id) || [];\n                const apartmentBuildingIds = item.apartmentBuildings?.map(({ id }) => id) || [];\n                const focusIds = [item.id, ...constructionNumberIds, ...apartmentBuildingIds];\n\n                /*\n                 * In some cases the propertyType polygon is drawn instead of constructionNumbers.\n                 * Add both constructionNumber and item id to be sure.\n                 */\n\n                houseSelectorPolygonFocus(focusIds, true);\n                setFocus(focusIds);\n\n                break;\n        }\n    }\n\n    function onMouseleave(_: MouseEvent, item: ExtendedConstructionNumber | ExtendedPropertyType) {\n        const { type } = getCurrentView() || {};\n\n        houseSelectorPolygonFocus([item.id], false);\n\n        if (type !== 'apartmentConstructionNumber') clearFocus();\n        else virtualTourLabelFocus(item as ExtendedConstructionNumber, false);\n    }\n\n    function virtualTourLabelFocus(item: ExtendedConstructionNumber, active: boolean) {\n        const event = new CustomEvent(virtualView2dPointerEvents.LABEL_FOCUS, {\n            detail: {\n                active,\n                id: item.id,\n            },\n        });\n\n        return document.dispatchEvent(event);\n    }\n\n    async function houseSelectorPolygonFocus(apiObjectIds: string[], active: boolean) {\n        const houseSelector = options?.houseSelectorElement?.current;\n        if (!houseSelector) return;\n\n        if (active) {\n            houseSelector.hoverDisabled = true;\n            let focusPolygons = houseSelector.currentView?.polygons?.filter(\n                ({ objectId }) => objectId && apiObjectIds.includes(objectId),\n            );\n\n            if (!focusPolygons?.length) {\n                let polygonView: HouseSelectorView | undefined;\n\n                apiObjectIds.find((id) => {\n                    polygonView = getHouseSelectorViewByObjectId(id);\n                    return !!polygonView;\n                });\n\n                polygonView && (await houseSelector.setView(polygonView));\n\n                focusPolygons = houseSelector.currentView?.polygons?.filter(\n                    ({ objectId }) => objectId && apiObjectIds.includes(objectId),\n                );\n                if (!focusPolygons?.length) return;\n            }\n\n            houseSelector.highlightedPolygons = focusPolygons ?? null;\n        } else {\n            houseSelector.hoverDisabled = false;\n            houseSelector.highlightedPolygons = null;\n        }\n    }\n\n    return [onMouseenter, onMouseleave];\n};\n\nexport { useContentInteraction };\n","const houseSelectorEvents = {\n    POLYGON_HOVER: 'house-selector::polygonHovered',\n    POLYGON_FOCUS: 'house-selector::focusPolygon',\n};\n\nexport { houseSelectorEvents };\n","import { RGBA } from '@bpd-library/types';\nimport { getAssetsFolder } from '@utilities/get-assets-folder';\nimport {\n    BLUE,\n    BLUE_ALPHA,\n    BLUE_ALPHA_LIGHT,\n    GREEN,\n    GREEN_ALPHA,\n    GREY_DARK,\n    ORANGE,\n    ORANGE_ALPHA,\n    PURPLE,\n    PURPLE_ALPHA_LIGHT,\n    RED,\n    RED_ALPHA,\n    RGB,\n    WHITE,\n    WHITE_ALPHA,\n} from '@utilities/map';\nimport { nextEvent } from '@utilities/next-event';\n\nimport { CanvasStyle, CanvasStyleItem } from './types';\n\nconst STRIPED_IMAGE_URL = '/images/no-filter-found-pattern.png';\nlet stripedImage: HTMLImageElement;\n\nconst BASE_ITEM_STYLE: Partial<CanvasStyleItem> = {\n    lineJoin: 'round',\n    lineWidth: 2,\n    lineCap: 'round',\n    setLineDash: () => [],\n};\n\nconst createColoredStyle = (strokeColor: RGB, fillColor: RGBA) => {\n    return {\n        ...BASE_ITEM_STYLE,\n        strokeStyle: `rgb(${strokeColor.join(',')})`,\n        fillStyle: `rgba(${fillColor.join(',')})`,\n    };\n};\n\nconst createStripedStyle = (context: CanvasRenderingContext2D): Partial<CanvasStyleItem> => {\n    return {\n        ...BASE_ITEM_STYLE,\n        strokeStyle: `rgb(${GREY_DARK.join(',')})`,\n        fillStyle: context.createPattern(stripedImage, 'repeat')!,\n    };\n};\n\nconst initCanvasStyles = async (context: CanvasRenderingContext2D): Promise<CanvasStyle> => {\n    await loadStripedImage();\n    return {\n        polygons: {\n            blue: createColoredStyle(BLUE, BLUE_ALPHA),\n            green: createColoredStyle(GREEN, GREEN_ALPHA),\n            orange: createColoredStyle(ORANGE, ORANGE_ALPHA),\n            red: createColoredStyle(RED, RED_ALPHA),\n            white: createColoredStyle(WHITE, WHITE_ALPHA),\n            purple: createColoredStyle(PURPLE, PURPLE_ALPHA_LIGHT),\n            link: createColoredStyle(BLUE, BLUE_ALPHA_LIGHT),\n            highlighted: createColoredStyle(BLUE, BLUE_ALPHA),\n            striped: createStripedStyle(context),\n        },\n    };\n};\n\nconst applyStyle = (context: any, style: CanvasStyleItem) => {\n    if (!context || !style) return;\n\n    const entries = Object.entries(style as any);\n\n    entries.forEach(([key, value]) => {\n        if (typeof value === 'function') {\n            context[key](value());\n        } else {\n            context[key] = value;\n        }\n    });\n};\n\nasync function loadStripedImage() {\n    stripedImage = new Image();\n    stripedImage.src = getAssetsFolder(STRIPED_IMAGE_URL);\n\n    await nextEvent(stripedImage, 'load');\n}\n\nexport { initCanvasStyles, applyStyle };\n","import { Point } from '@bpd-library/utilities';\nimport { Dimensions } from '@features/virtual-tour/types';\n\nimport { HouseSelectorPolygon } from './types';\n\nexport const convertPercentageGeometryToPixels = (\n    { width, height }: Dimensions,\n    objects: HouseSelectorPolygon[],\n) => {\n    const updatePolygonPoints = (object: HouseSelectorPolygon) => {\n        if (!object.polygon) return;\n        if (!object.polygonPx) object.polygonPx = [];\n\n        const percentageToPixels = ({ x, y }: Point, index: number) => {\n            const xPx = Math.floor(width * x!);\n            const yPx = Math.floor(height * y!);\n\n            if (object.polygonPx?.[index]) {\n                object.polygonPx[index].x = xPx;\n                object.polygonPx[index].y = yPx;\n            } else {\n                object.polygonPx?.push({ x: xPx, y: yPx });\n            }\n        };\n\n        object.polygon?.forEach(percentageToPixels);\n    };\n\n    objects.forEach(updatePolygonPoints);\n};\n","import { h } from '@atomify/jsx';\nimport { Label } from '@atoms/label/label';\nimport { Marker, MarkerProps } from '@atoms/marker/marker';\n\nimport { HouseSelectorObjectHandler, HouseSelectorPointer } from './types';\n\nexport const renderPointer = (\n    pointer: HouseSelectorPointer,\n    pointerProps?: { onPointerClick: HouseSelectorObjectHandler },\n): Element => {\n    if (!pointer.iconName) {\n        return (\n            <div\n                class=\"house-selector__pointer house-selector__pointer--text\"\n                style={{\n                    left: `${(pointer.point?.x || 0) * 100}%`,\n                    top: `${(pointer.point?.y || 0) * 100}%`,\n                }}>\n                <Label text={pointer.label || ''} />\n            </div>\n        );\n    }\n\n    const markerProps: MarkerProps = { variant: '' };\n    switch (pointer.iconName) {\n        case 'entry':\n            markerProps.variant = 'entrance';\n            break;\n        case 'interest':\n            markerProps.variant = 'generic';\n            break;\n    }\n\n    return (\n        <Marker\n            {...markerProps}\n            classes=\"house-selector__pointer house-selector__pointer--marker\"\n            size=\"small\"\n            onClick={() => pointerProps?.onPointerClick(pointer)}\n            style={{\n                left: `${(pointer.point?.x || 0) * 100}%`,\n                top: `${(pointer.point?.y || 0) * 100}%`,\n            }}\n        />\n    );\n};\n","import { Dimensions } from '@features/virtual-tour/types';\n\nimport { CanvasStyle, HouseSelectorPolygon } from './types';\n\ntype RepaintState = {\n    styles?: CanvasStyle | null;\n    dimensions?: Dimensions | null;\n    hoverPolygons?: HouseSelectorPolygon[] | null;\n};\n\nexport const useCanvasRepaint = (options: { onRepaint: Function }) => {\n    const state: RepaintState = {};\n\n    const canRepaint = (): boolean => {\n        return !!state.styles && !!state.dimensions;\n    };\n\n    const setState = (newState: Partial<RepaintState>) => {\n        Object.assign(state, newState);\n        requestRepaint();\n    };\n\n    const getState = () => state;\n\n    const requestRepaint = () => {\n        if (!canRepaint()) return;\n        options.onRepaint();\n    };\n\n    return { setState, getState, requestRepaint };\n};\n","import {\n    Component,\n    defineElement,\n    FC,\n    onDidLoad,\n    useBindMethod,\n    useElement,\n    useEvent,\n    useListen,\n    useProp,\n} from '@atomify/hooks';\nimport { Fragment, h } from '@atomify/jsx';\nimport { getHouseSelectorView } from '@features/properties/store';\nimport { getHouseSelectorHelperData } from '@features/properties/utilities/data';\nimport { Dimensions, ScreenCoordinates } from '@features/virtual-tour/types';\nimport {\n    useMousePosition,\n    usePanningImage,\n    useResizableViewport,\n} from '@features/virtual-tour/utilities/hooks';\nimport { getDebugState } from '@store/debugger';\n\nimport { houseSelectorEvents } from './constants';\nimport { applyStyle, initCanvasStyles } from './utilities/canvas-styles';\nimport { convertPercentageGeometryToPixels } from './utilities/convert-percentage-to-pixel';\nimport { drawPolygon } from './utilities/draw-polygon';\nimport { findPolygonCenterPoint } from './utilities/house-selector-data';\nimport { renderPointer } from './utilities/render-pointer';\nimport {\n    HouseSelectorObject,\n    HouseSelectorObjectHandler,\n    HouseSelectorPointer,\n    HouseSelectorPolygon,\n    HouseSelectorView,\n} from './utilities/types';\nimport { useCanvasRepaint } from './utilities/use-canvas-repaint';\n\nconst POLYGON_HOVER_CLASS = 'house-selector--polygon-hover';\n\nexport interface HouseSelectorElement extends Component {\n    highlightedPolygons: HouseSelectorPolygon[] | null;\n    hoverDisabled: boolean;\n    currentView: HouseSelectorView | null;\n    setView: (view: HouseSelectorView) => void;\n}\n\nconst HouseSelector: FC<HouseSelectorElement> = ({ element }) => {\n    const [, setHighlightedPolygons, watchHighlightedPolygons] = useProp<\n        HouseSelectorPolygon[] | null\n    >('highlightedPolygons', null);\n    const [, setCurrentView] = useProp<HouseSelectorView | null>('currentView', null);\n    const [onObjectClick] = useProp<HouseSelectorObjectHandler>('onObjectClick');\n    useProp<boolean>('hoverDisabled', false);\n\n    const houseSelectorCanvas = useElement<HTMLCanvasElement>('[js-hook-house-selector-canvas]');\n    const viewport = useElement<HTMLElement>('[js-hook-house-selector-viewport]');\n    const imageContainer = useElement<HTMLElement>('[js-hook-house-selector-view-image]');\n    const pointersContainer = useElement<HTMLElement>('[js-hook-house-selector-pointers]');\n    const polygonIdHelper = useElement<HTMLElement>('[js-hook-house-selector-polygon-id-helper]');\n\n    let houseSelectorCanvasContext: CanvasRenderingContext2D;\n\n    const panningImage = usePanningImage({\n        imageContainer,\n        viewport,\n        onResize: setCanvasDimensions,\n    });\n\n    const { refresh, dimensions: viewportDimensions } = useResizableViewport({\n        viewport,\n        onResize: panningImage.resize,\n    });\n\n    const { updatePosition } = useMousePosition({\n        viewport: houseSelectorCanvas,\n        onUpdate: ({ position }) => position && handleHoverPolygon(position),\n    });\n\n    const canvasRepaintState = useCanvasRepaint({ onRepaint: drawViewObjects });\n\n    const polygonHoverEvent = useEvent({ eventName: houseSelectorEvents.POLYGON_HOVER });\n\n    const { showIdInHouseSelector } = getDebugState();\n\n    onDidLoad(async () => {\n        panningImage.setInteractionBehavior('scroll');\n        const canvasContext = houseSelectorCanvas.current?.getContext('2d');\n\n        if (!canvasContext) {\n            throw new Error('[house-selector] -- ERROR: could not initialize canvas context');\n        }\n\n        houseSelectorCanvasContext = canvasContext;\n        const canvasStyles = await initCanvasStyles(houseSelectorCanvasContext);\n        canvasRepaintState.setState({ styles: canvasStyles });\n    });\n\n    useListen(window, 'resize', refresh);\n    useListen(window, 'scroll', refresh);\n    useListen(document, 'properties-view::map-resized', refresh);\n    useListen(houseSelectorCanvas, 'mousemove', updateMousePosition);\n\n    useBindMethod('setView', setView);\n\n    useListen(houseSelectorCanvas, 'click', async () => {\n        const { highlightedPolygons } = element;\n        if (!highlightedPolygons?.length) return;\n\n        const { objectType, linkToViewId } = highlightedPolygons[0];\n\n        if (objectType === 'viewLink' && linkToViewId) {\n            const view = getHouseSelectorView(linkToViewId);\n            view && setView(view);\n            return;\n        }\n\n        onObjectClick(highlightedPolygons[0]);\n    });\n\n    watchHighlightedPolygons(async (nextHighlighted, prevHighlighted) => {\n        if (prevHighlighted?.length && !element.hoverDisabled) {\n            prevHighlighted\n                .filter(({ objectId }) => !!objectId)\n                .forEach(({ objectId }) => polygonHoverEvent.emit({ id: objectId, active: false }));\n        }\n\n        canvasRepaintState.setState({ hoverPolygons: nextHighlighted });\n        element.classList[!!nextHighlighted ? 'add' : 'remove'](POLYGON_HOVER_CLASS);\n\n        if (nextHighlighted?.length && !element.hoverDisabled) {\n            nextHighlighted\n                .filter(({ objectId }) => !!objectId)\n                .forEach(({ objectId }) => polygonHoverEvent.emit({ id: objectId, active: true }));\n        } else if (nextHighlighted?.length && element.hoverDisabled) {\n            const focusPoint = findPolygonCenterPoint(nextHighlighted[0], {\n                asPercentage: true,\n            }) as ScreenCoordinates;\n\n            focusPoint && panningImage.focusPoint(focusPoint);\n        }\n    });\n\n    async function handleHoverPolygon(position: ScreenCoordinates) {\n        const hoveredPolygon = getCurrentHoveredPolygon(position);\n\n        if (\n            element.highlightedPolygons?.length &&\n            element.highlightedPolygons[0] === hoveredPolygon\n        ) {\n            return;\n        }\n\n        setHighlightedPolygons(hoveredPolygon ? [hoveredPolygon] : null);\n    }\n\n    function updateMousePosition(e: MouseEvent) {\n        if (!houseSelectorCanvas.current) return;\n        const { x, y } = houseSelectorCanvas.current.getBoundingClientRect();\n        const { width, height } = houseSelectorCanvas.current;\n        updatePosition(e, { width, height }, { x, y });\n    }\n\n    function drawViewObjects() {\n        const { polygons, pointers } = element.currentView || {};\n\n        if (polygons?.length) {\n            const { styles, dimensions, hoverPolygons } = canvasRepaintState.getState();\n            convertPercentageGeometryToPixels(dimensions!, polygons);\n\n            houseSelectorCanvasContext.clearRect(0, 0, dimensions!.width, dimensions!.height);\n            polygons.forEach(async (object: HouseSelectorPolygon) => {\n                const hovering = hoverPolygons?.some((hovered) => hovered === object);\n\n                if (object.hidden || !object.variant || !styles) return;\n                let style = styles.polygons[object.variant];\n\n                if (object.canHover && hovering) style = styles.polygons['highlighted'];\n\n                applyStyle(houseSelectorCanvasContext, style);\n                drawPolygon(houseSelectorCanvasContext, object);\n            });\n        }\n\n        if (pointersContainer.current) {\n            pointersContainer.current.innerHTML = '';\n            if (!pointers?.length) return;\n\n            pointersContainer.current.append(\n                ...pointers.map((pointer) =>\n                    renderPointer(pointer, { onPointerClick: handlePointerClick }),\n                ),\n            );\n        }\n    }\n\n    function setCanvasDimensions(dimensions: Dimensions) {\n        houseSelectorCanvas.current!.width = dimensions.width;\n        houseSelectorCanvas.current!.height = dimensions.height;\n\n        window.requestAnimationFrame(async () => {\n            if (!(dimensions.width && dimensions.height)) return;\n            canvasRepaintState.setState({ dimensions });\n        });\n    }\n\n    async function setView(view: HouseSelectorView) {\n        if (element.currentView?.id !== view.id) {\n            setCurrentView(view);\n            canvasRepaintState.setState({ dimensions: null });\n            await panningImage.setSource(view.imageUrl!);\n            panningImage.resize(viewportDimensions);\n        }\n\n        canvasRepaintState.requestRepaint();\n    }\n\n    function getCurrentHoveredPolygon({ x, y }: ScreenCoordinates): HouseSelectorPolygon | null {\n        if (!element.currentView?.polygons?.length) return null;\n\n        const hoveredPolygons = element.currentView.polygons\n            .filter(({ path }) => path && houseSelectorCanvasContext.isPointInPath(path, x, y))\n            .reverse();\n\n        const activeHoveredPolygons = hoveredPolygons.filter((polygon) => polygon.canHover);\n\n        if (showIdInHouseSelector) {\n            if (activeHoveredPolygons[0]) showHelper(activeHoveredPolygons[0]);\n            else if (hoveredPolygons[0]) showHelper(hoveredPolygons[0]);\n        }\n\n        return activeHoveredPolygons[0] ?? null;\n    }\n\n    function handlePointerClick(pointer: HouseSelectorPointer) {\n        if (!pointer.linkToViewId) return;\n        const view = getHouseSelectorView(pointer.linkToViewId);\n        view && setView(view);\n    }\n\n    function showHelper(object: HouseSelectorObject) {\n        if (!polygonIdHelper.current) return;\n        polygonIdHelper.current.innerHTML = '';\n\n        polygonIdHelper.current.append(<pre>{getHouseSelectorHelperData(object)}</pre>);\n    }\n\n    return (\n        <Fragment>\n            <div class=\"house-selector__viewport\" js-hook-house-selector-viewport>\n                <div class=\"house-selector__view-image\" js-hook-house-selector-view-image />\n\n                <canvas\n                    width=\"100%\"\n                    height=\"100%\"\n                    id=\"houseSelectorCanvas\"\n                    class=\"house-selector__canvas\"\n                    js-hook-house-selector-canvas>\n                    <p>Something went wrong</p>\n                </canvas>\n\n                <div class=\"house-selector__pointers\" js-hook-house-selector-pointers />\n            </div>\n\n            {showIdInHouseSelector ? (\n                <div\n                    class=\"house-selector__polygon-id-helper\"\n                    js-hook-house-selector-polygon-id-helper\n                />\n            ) : null}\n        </Fragment>\n    );\n};\n\nHouseSelector.props = {\n    highlightedPolygons: {\n        type: Object,\n    },\n    hoverDisabled: {\n        type: Object,\n    },\n    currentView: {\n        type: Object,\n    },\n    onObjectClick: {\n        type: Function,\n        required: true,\n    },\n};\n\ndefineElement('bpd-house-selector', HouseSelector);\n","import { HouseSelectorPolygon } from './types';\n\nexport const drawPolygon = (\n    context: CanvasRenderingContext2D,\n    polygonObject: HouseSelectorPolygon,\n) => {\n    const polygon = new Path2D();\n    polygonObject.polygonPx?.forEach((point, index) => {\n        if (index === 0) polygon.moveTo(point.x!, point.y!);\n        polygon.lineTo(point.x!, point.y!);\n    });\n\n    polygon.closePath();\n    context.stroke(polygon);\n    context.fill(polygon);\n\n    polygonObject.path = polygon;\n};\n","import {\n    houseSelectorGetByExternalId,\n    HouseSelectorModel as APIHouseSelectorModel,\n    HouseSelectorObject as APIHouseSelectorObject,\n    HouseSelectorView as APIHouseSelectorView,\n} from '@bpd-library/utilities';\nimport { partition } from '@utilities/partition';\n\nimport {\n    HouseSelectorModel,\n    HouseSelectorPointer,\n    HouseSelectorPolygon,\n    HouseSelectorView,\n} from './types';\n\nexport const fetchHouseSelectorData = async (\n    houseSelectorId: string,\n): Promise<HouseSelectorModel | null> => {\n    try {\n        const data: APIHouseSelectorModel = await houseSelectorGetByExternalId(houseSelectorId);\n        return {\n            ...data,\n            views: data.views?.map<HouseSelectorView>(\n                ({ objects, ...view }: APIHouseSelectorView) => {\n                    const [polygons, pointers] = partition<\n                        APIHouseSelectorObject,\n                        HouseSelectorPolygon,\n                        HouseSelectorPointer\n                    >(objects ?? [], (object) => !!object.polygon);\n                    return { ...view, polygons, pointers };\n                },\n            ),\n        };\n    } catch (error) {\n        console.error('[House Selector] -- data not available');\n        return null;\n    }\n};\n\nexport const findPolygonCenterPoint = (\n    object: HouseSelectorPolygon,\n    options?: { asPercentage: boolean },\n) => {\n    if (!object.polygon) return;\n\n    let minX = Number.MAX_SAFE_INTEGER,\n        minY = Number.MAX_SAFE_INTEGER,\n        maxX = 0,\n        maxY = 0;\n\n    object.polygon?.forEach(({ x, y }) => {\n        if (x && x < minX) minX = x;\n        if (x && x > maxX) maxX = x;\n        if (y && y < minY) minY = y;\n        if (y && y > maxY) maxY = y;\n    });\n\n    object.center = {\n        x: (minX + maxX) / 2,\n        y: (minY + maxY) / 2,\n    };\n\n    if (options?.asPercentage) {\n        return {\n            x: object.center.x! * 100,\n            y: object.center.y! * 100,\n        };\n    }\n\n    return object.center;\n};\n","import { Component, useListen } from '@atomify/hooks';\nimport { useStore } from '@atomify/kit';\nimport { clearFocus, MapState, mapStore, setFocus } from '@bpd-library/components';\nimport { ExtendedPropertyType, findExtendedObjectById } from '@bpd-library/utilities';\nimport { getCurrentView, getFilteredData } from '@features/properties/store';\nimport { virtualView2dPointerEvents } from '@features/virtual-tour/constants';\n\nimport { houseSelectorEvents } from '../../house-selector';\n\nconst HIGHLIGHTED_MODIFIER = 'is--highlighted';\n\nconst useVisualInteraction = (\n    element: { current?: Component | HTMLElement | null },\n    scrollContainer: { current?: HTMLDivElement | null },\n) => {\n    const [, subscribeMap] = useStore<MapState>(mapStore);\n\n    // Subscribe to map\n    subscribeMap(\n        ({ hover }) => {\n            const { type } = getCurrentView() || {};\n            switch (type) {\n                case 'constructionNumber':\n                    if (hover.previous) focusCard(hover.previous.id, false);\n                    if (hover.current) focusCard(hover.current.id, true);\n\n                    break;\n                case 'propertyType':\n                    if (hover.previous) handlePropertyTypeViewHover(hover.previous.id, false);\n                    if (hover.current) handlePropertyTypeViewHover(hover.current.id, true);\n\n                    break;\n            }\n        },\n        ['hover'],\n    );\n\n    // Listen to apartment view events\n    useListen(document, virtualView2dPointerEvents.LABEL_HOVER, ({ detail }) =>\n        focusCard(detail.id, detail.active),\n    );\n\n    // Listen to House selector events\n    useListen(document, houseSelectorEvents.POLYGON_HOVER, ({ detail }) => {\n        const { type } = getCurrentView() || {};\n\n        if (type === 'constructionNumber' || type === 'apartmentConstructionNumber') {\n            focusCard(detail.id, detail.active);\n        } else if (type === 'propertyType' || type === 'apartmentPropertyType') {\n            handlePropertyTypeViewHover(detail.id, detail.active);\n        }\n    });\n\n    function handlePropertyTypeViewHover(mapDataItemId: string, active: boolean) {\n        const filteredData = getFilteredData();\n\n        if (filteredData) {\n            const extendedObject = findExtendedObjectById(filteredData, mapDataItemId);\n            switch (extendedObject?.objectType) {\n                case 'constructionNumber':\n                    if (extendedObject.apartmentBuilding?.id) {\n                        focusCard(extendedObject.apartmentBuilding.id, active);\n                        return;\n                    }\n                    if (extendedObject.propertyType) {\n                        focusPropertyTypeCard(extendedObject.propertyType, active);\n                    }\n                    return;\n                case 'propertyType':\n                    focusPropertyTypeCard(extendedObject, active);\n                    return;\n                case 'apartmentBuilding':\n                case 'projectPhase':\n                    focusCard(extendedObject.id, active);\n                    return;\n            }\n        }\n    }\n\n    function focusPropertyTypeCard(propertyType: ExtendedPropertyType, active: boolean) {\n        const relatedConstructionNumberIds =\n            propertyType.constructionNumbers?.map(({ id }) => id) || [];\n\n        if (active) {\n            setFocus([...relatedConstructionNumberIds, propertyType.id], { static: true });\n        } else {\n            clearFocus();\n        }\n\n        focusCard(propertyType.id, active);\n    }\n\n    function focusCard(cardId: string, active: boolean) {\n        const card = element.current?.querySelector<HTMLElement>(`#container-${cardId}`);\n\n        if (card) {\n            card.classList[active ? 'add' : 'remove'](HIGHLIGHTED_MODIFIER);\n\n            if (active) {\n                const { top } = card.getBoundingClientRect();\n                const windowCenter = window.innerHeight * 0.4;\n                const currentScroll = scrollContainer.current?.scrollTop || 0;\n                const targetScroll = currentScroll + top - windowCenter;\n\n                // Apply to html\n                scrollContainer.current?.scroll({\n                    top: targetScroll,\n                    left: 0,\n                    behavior: 'smooth',\n                });\n            }\n        }\n    }\n};\n\nexport { useVisualInteraction };\n","import {\n    ApartmentBuildingStatus,\n    calculateDifferenceInDays,\n    ProjectPhaseStatus,\n    PropertyTypeStatus,\n} from '@bpd-library/utilities';\nimport { View, ViewData } from '@features/properties/store';\n\nconst PROPERTY_TYPE_VIEW_SORTING: (\n    | ProjectPhaseStatus\n    | ApartmentBuildingStatus\n    | PropertyTypeStatus\n)[] = [\n    'OnSale',\n    'SaleStarted',\n    'SaleSoon',\n    'InPreparation',\n    'ForRent',\n    'AmountAvailable',\n    'AssigningOn',\n    'InOption',\n    'Sold',\n    'Rented',\n    'UnderConstruction',\n];\n\nfunction sortData(view: View) {\n    switch (view.type) {\n        case 'apartmentConstructionNumber':\n        case 'constructionNumber':\n            sortConstructionNumberView(view.data);\n            break;\n        case 'apartmentPropertyType':\n        case 'propertyType':\n            sortPropertyTypeView(view.data);\n            break;\n    }\n}\n\nfunction sortConstructionNumberView(data: ViewData) {\n    data.sort((a, b) => {\n        if (a.objectType !== 'constructionNumber' || b.objectType !== 'constructionNumber') {\n            return 0;\n        }\n\n        if (!a.status || a.status === 'Reserved') return -1;\n\n        if (!b.status || b.status === 'Reserved') return 1;\n\n        if (\n            a.status === 'AssigningOn' &&\n            b.status === 'AssigningOn' &&\n            a.projectPhase?.allocationDate &&\n            b.projectPhase?.allocationDate\n        ) {\n            const millisecondsA = new Date(a.projectPhase.allocationDate).valueOf();\n            const millisecondsB = new Date(b.projectPhase.allocationDate).valueOf();\n            return millisecondsA - millisecondsB;\n        }\n\n        return (\n            PROPERTY_TYPE_VIEW_SORTING.indexOf(a.status) -\n            PROPERTY_TYPE_VIEW_SORTING.indexOf(b.status)\n        );\n    });\n}\n\nfunction sortPropertyTypeView(data: ViewData) {\n    data.sort((a, b) => {\n        if (a.objectType === 'constructionNumber' || b.objectType === 'constructionNumber')\n            return 0;\n\n        if (!a.status) return -1;\n        if (!b.status) return 1;\n\n        const aIndex = PROPERTY_TYPE_VIEW_SORTING.indexOf(a.status);\n        const bIndex = PROPERTY_TYPE_VIEW_SORTING.indexOf(b.status);\n\n        // If both objects have the same index (status), apply extra sorting logic\n        if (aIndex === bIndex) {\n            if (a.objectType !== 'projectPhase' && a.objectType === b.objectType) {\n                // If object types are equal, sort by nearest sale start date\n                if (!a.projectPhase?.saleStartDate) return 1;\n                if (!b.projectPhase?.saleStartDate) return -1;\n\n                const now = new Date();\n\n                const aSaleStartDifference = calculateDifferenceInDays(\n                    now,\n                    new Date(a.projectPhase.saleStartDate),\n                );\n                const bSaleStartDifference = calculateDifferenceInDays(\n                    now,\n                    new Date(b.projectPhase.saleStartDate),\n                );\n\n                return aSaleStartDifference < bSaleStartDifference ? -1 : 1;\n            } else {\n                // If not, sort apartmentBuildings first\n                return a.objectType === 'apartmentBuilding' ? -1 : 1;\n            }\n        } else {\n            return aIndex < bIndex ? -1 : 1;\n        }\n    });\n}\n\nexport { sortData };\n","import { h } from '@atomify/jsx';\nimport { inviewObserver } from '@source/utilities/inview';\n\ninterface LazyRenderInterface {\n    renderFunction: () => Element;\n    classes?: string;\n    threshold?: number;\n}\n\nconst RENDERED_CLASS = 'is--rendered';\n\nconst LazyRender = ({ renderFunction, classes = '', threshold = 0.5 }: LazyRenderInterface) => {\n    let isRendered = false;\n\n    const element = (<div class={classes}></div>) as Element;\n\n    inviewObserver.observe(\n        element,\n        inView => {\n            if (inView && !isRendered) {\n                element.append(renderFunction());\n                element.classList.add(RENDERED_CLASS);\n                isRendered = true;\n                inviewObserver.unobserve(element);\n            }\n        },\n        {\n            threshold,\n        },\n    );\n\n    return element;\n};\n\nexport default LazyRender;\n","import { Fragment, h } from '@atomify/jsx';\nimport {\n    ExtendedApartmentBuilding,\n    ExtendedConstructionNumber,\n    ExtendedProjectPhase,\n    ExtendedPropertyType,\n} from '@bpd-library/utilities';\nimport { getCurrentView, ViewCardObject, ViewCardTypes } from '@features/properties/store';\nimport { ProjectPhaseCard } from '@molecules/project-phase-card/project-phase-card';\nimport { PropertyCard } from '@molecules/property-card/property-card';\nimport LazyRender from '@source/components/atoms/lazy-render/lazy-render';\nimport {\n    formatApartmentBuildingStatus,\n    formatConstructionNumberStatus,\n    formatDetailPageUrl,\n    formatLivingArea,\n    formatPrice,\n    formatProjectPhaseStatus,\n    formatPropertyTypeStatus,\n    formatRooms,\n    formatShoppingCartUrl,\n    FormattedSpecification,\n} from '@source/utilities/api-formatters';\nimport { getDebugState } from '@store/debugger';\nimport { isConstructionNumberNhg } from '@utilities/api-utilities/is-nhg';\nimport { isMobile } from '@utilities/media-query';\n\nconst apartmentBuildingTile = (apartmentBuilding: ExtendedApartmentBuilding) => {\n    return (\n        <LazyRender\n            classes=\"properties-view__property-type\"\n            threshold={0.1}\n            renderFunction={() => {\n                const { image, displayName, projectPhaseName, id } = apartmentBuilding;\n\n                return (\n                    <PropertyCard\n                        title={displayName || ''}\n                        project={projectPhaseName}\n                        image={image?.url || ''}\n                        status={formatApartmentBuildingStatus(apartmentBuilding)}\n                        price={formatPrice({ apartmentBuilding })}\n                        debugId={getDebugState().propertiesId ? id : ''}\n                        orientation=\"horizontal\"\n                    />\n                );\n            }}\n        />\n    );\n};\n\nconst constructionNumberTile = (constructionNumber: ExtendedConstructionNumber) => {\n    return (\n        <LazyRender\n            classes=\"properties-view__construction-number\"\n            renderFunction={() => {\n                const {\n                    id,\n                    propertyTypeName,\n                    mainImage,\n                    identifier,\n                    wishlistItemCount,\n                    propertyType,\n                    areaProject,\n                } = constructionNumber;\n\n                const specs: FormattedSpecification[] = [];\n\n                const rooms = formatRooms(constructionNumber);\n                const livingArea = formatLivingArea(constructionNumber);\n\n                if (rooms) specs.push(rooms);\n                if (livingArea) specs.push(livingArea);\n\n                return (\n                    <bpd-construction-number-card\n                        classes=\"\"\n                        href={formatDetailPageUrl({ constructionNumber })}\n                        id={id}\n                        house-name={`${propertyTypeName} #${identifier}`}\n                        price={formatPrice({ constructionNumber })}\n                        status={formatConstructionNumberStatus(constructionNumber)}\n                        image={{\n                            url: mainImage?.url || '',\n                            alt: mainImage?.title || '',\n                        }}\n                        isNhg={isConstructionNumberNhg(constructionNumber)}\n                        specs={specs}\n                        wishlistItemCount={wishlistItemCount}\n                        shoppingCartUrl={formatShoppingCartUrl(constructionNumber)}\n                        hidePrice={!propertyType?.canShowPrice}\n                        debugId={getDebugState().propertiesId ? id : ''}\n                        compare={!areaProject?.website?.disablePropertyComparison}\n                    />\n                );\n            }}\n        />\n    );\n};\n\nconst propertyTypeTile = (propertyType: ExtendedPropertyType) => {\n    return (\n        <LazyRender\n            classes=\"properties-view__property-type\"\n            threshold={0.1}\n            renderFunction={() => {\n                const { mainImage, name, id, projectPhaseName, canShowPrice } = propertyType;\n\n                return (\n                    <PropertyCard\n                        id={id}\n                        title={name || ''}\n                        project={projectPhaseName}\n                        href={formatDetailPageUrl({ propertyType })}\n                        image={mainImage?.url || ''}\n                        price={formatPrice({ propertyType })}\n                        status={formatPropertyTypeStatus(propertyType)}\n                        hidePrice={!canShowPrice}\n                        debugId={getDebugState().propertiesId ? id : ''}\n                        orientation=\"horizontal\"\n                    />\n                );\n            }}\n        />\n    );\n};\n\nconst projectPhaseTile = (projectPhase: ExtendedProjectPhase) => {\n    return (\n        <LazyRender\n            classes=\"properties-view__property-type\"\n            threshold={0.1}\n            renderFunction={() => {\n                const { mainImage, name, id, constructionNumbers, status } = projectPhase;\n\n                const specs: FormattedSpecification[] = [];\n                const livingArea = formatLivingArea(projectPhase);\n                if (livingArea) specs.push(livingArea);\n\n                return (\n                    <ProjectPhaseCard\n                        id={id}\n                        title={name || ''}\n                        image={mainImage?.url || ''}\n                        housesAmount={constructionNumbers?.length}\n                        price={status !== 'Sold' ? formatPrice({ projectPhase }) : undefined}\n                        status={formatProjectPhaseStatus(projectPhase)}\n                        debugId={getDebugState().propertiesId ? id : ''}\n                        specs={specs}\n                    />\n                );\n            }}\n        />\n    );\n};\n\nconst handleInteraction = (item: ViewCardObject, cardType: ViewCardTypes, cb?: Function) => {\n    return (e: MouseEvent) => {\n        cb && cb(e, item, cardType);\n    };\n};\n\nconst getTiles = (onMouseenter: Function, onMouseleave: Function): HTMLElement | undefined => {\n    const currentView = getCurrentView();\n    const data = currentView?.data;\n\n    if (!data) return;\n\n    const ButtonContainer = ({\n        item,\n        card,\n        cardType,\n        attr,\n    }: {\n        item: ViewCardObject;\n        card: Element;\n        cardType: ViewCardTypes;\n        attr?: {};\n    }) => (\n        <button\n            class=\"properties-view__tile\"\n            id={`container-${item.id}`}\n            onClick={handleInteraction(item, cardType, currentView?.onCardClick)}\n            onMouseenter={handleInteraction(item, cardType, onMouseenter)}\n            onMouseleave={handleInteraction(item, cardType, onMouseleave)}\n            onTouchStart={!isMobile() ? handleInteraction(item, cardType, onMouseenter) : null}\n            onTouchEnd={!isMobile() ? handleInteraction(item, cardType, onMouseleave) : null}\n            {...attr}>\n            {card}\n        </button>\n    );\n\n    return (\n        <Fragment>\n            <div></div>\n            {data.map((item) => {\n                switch (item.objectType) {\n                    case 'projectPhase': {\n                        return (\n                            item.mainImage?.url && (\n                                <ButtonContainer\n                                    item={item}\n                                    cardType=\"projectPhase\"\n                                    card={projectPhaseTile(item)}\n                                />\n                            )\n                        );\n                    }\n                    case 'apartmentBuilding': {\n                        return (\n                            item.image?.url && (\n                                <ButtonContainer\n                                    item={item}\n                                    cardType=\"apartmentBuilding\"\n                                    card={apartmentBuildingTile(item)}\n                                />\n                            )\n                        );\n                    }\n                    case 'propertyType': {\n                        return (\n                            item.mainImage?.url && (\n                                <ButtonContainer\n                                    item={item}\n                                    cardType=\"propertyType\"\n                                    card={propertyTypeTile(item)}\n                                    attr={{\n                                        ['data-track-property-type-id']: item.id,\n                                        ...(item.status && {\n                                            ['data-track-property-type-status']: item.status,\n                                        }),\n                                    }}\n                                />\n                            )\n                        );\n                    }\n                    case 'constructionNumber': {\n                        return (\n                            item.mainImage?.url && (\n                                <ButtonContainer\n                                    item={item}\n                                    cardType=\"constructionNumber\"\n                                    card={constructionNumberTile(item)}\n                                    attr={{\n                                        ['data-track-construction-number-id']: item.id,\n                                        ...(item.status && {\n                                            ['data-track-construction-number-status']: item.status,\n                                        }),\n                                        ...(item.propertyType && {\n                                            ['data-track-property-type-id']: item.propertyType.id,\n                                        }),\n                                        ...(item.propertyType?.status && {\n                                            ['data-track-property-type-status']:\n                                                item.propertyType.status,\n                                        }),\n                                    }}\n                                />\n                            )\n                        );\n                    }\n                }\n            })}\n        </Fragment>\n    );\n};\n\nexport { getTiles };\n","import '@bpd-library/components/dist/molecules/map/map';\nimport '@features/compare/components/compare-open-button';\nimport '@molecules/apartments-view';\n\nimport {\n    Component,\n    defineElement,\n    FC,\n    onDidLoad,\n    useBindMethod,\n    useElement,\n    useProp,\n} from '@atomify/hooks';\nimport { Fragment, h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { Button, ButtonInterface } from '@atoms/button/button';\nimport { getMapInstance, MapState, mapStore } from '@bpd-library/components';\nimport { BoundingBox } from '@bpd-library/types';\nimport { ExtendedConstructionNumber, ExtendedPropertyType } from '@bpd-library/utilities';\nimport { getMapCardTitle } from '@features/area-map/utilities/get-map-card-title';\nimport {\n    RoutePerObjectHandler,\n    usePropertiesRouting,\n} from '@features/properties/hooks/use-properties-routing';\nimport {\n    getCurrentView,\n    getHouseSelectorData,\n    PropertiesState,\n    propertiesStore,\n    View,\n    ViewType,\n} from '@features/properties/store';\nimport {\n    findInPropertiesDataById,\n    setPolygonDrawingOptions,\n    sortHouseSelectorData,\n} from '@features/properties/utilities/data';\nimport { PROPERTIES_THEME } from '@features/properties/utilities/extend-map-theme';\nimport { resetFilters } from '@source/store/filters';\nimport { GTMPush } from '@source/utilities/gtm';\nimport { useTranslate } from '@source/utilities/hooks';\nimport { getDebuggerMapOptions } from '@store/debugger';\nimport { hasConsent, ServiceConsentState, serviceConsentStore } from '@store/service-consent';\nimport {\n    formatConstructionNumberStatus,\n    formatDetailPageUrl,\n    formatLivingArea,\n    formatPlotArea,\n    formatPrice,\n    formatPropertyTypeStatus,\n    formatRooms,\n    FormattedPrice,\n    FormattedStatus,\n} from '@utilities/api-formatters';\nimport { isConstructionNumberNhg } from '@utilities/api-utilities/is-nhg';\nimport { handleGTMPolygonInteraction, PolygonDimensionality } from '@utilities/gtm-map';\nimport { isMobile } from '@utilities/media-query';\nimport mapboxgl from 'mapbox-gl';\n\nimport { HouseSelectorElement } from '../house-selector';\nimport { HouseSelectorCard } from '../house-selector-card';\nimport { HouseSelectorObjectHandler, HouseSelectorView } from '../house-selector/utilities/types';\nimport { useContentInteraction } from './hooks/use-content-interaction';\nimport { useVisualInteraction } from './hooks/use-visual-interaction';\nimport { sortData } from './utilities/sorting';\nimport { getTiles } from './utilities/tiles';\n\nconst APARTMENT_CLASS = 'properties-view--apartments';\nconst HOUSE_SELECTOR_CLASS = 'properties-view--house-selector';\nconst EXPANDED_MAP_CLASS = 'properties-view--expanded-map';\nconst FULLSCREEN_CLASS = 'properties-view--fullscreen';\nconst NO_RESULTS_CLASS = 'properties-view--no-results';\nconst RESIZING_CLASS = 'properties-view--resizing';\nconst HIDDEN_CLASS = 'u-hidden';\n\nconst SWITCH_DEFAULT_PROPS: ButtonInterface = {\n    size: 'small',\n    width: 'square',\n};\n\nconst SWITCH_2D3D_ACTIVE_PROPS: ButtonInterface = {\n    ...SWITCH_DEFAULT_PROPS,\n    shape: 'smooth-15',\n    variant: 'grey-90',\n};\n\nconst SWITCH_2D3D_INACTIVE_PROPS: ButtonInterface = {\n    ...SWITCH_DEFAULT_PROPS,\n    shape: 'smooth-15',\n    variant: 'white',\n};\n\nconst SWITCH_ZOOM_ACTIVE_PROPS: ButtonInterface = {\n    ...SWITCH_DEFAULT_PROPS,\n    size: 'regular',\n    variant: 'white',\n};\n\ntype ViewMode = '2D' | '3D';\n\nexport interface PropertiesViewElement extends Component {\n    viewMode: ViewMode;\n    fullScreen: boolean;\n    renderCardPopup: (object: ExtendedPropertyType | ExtendedConstructionNumber) => Promise<void>;\n}\n\nconst PropertiesView: FC<PropertiesViewElement> = ({ element }) => {\n    const [layerRaster] = useProp<string | null>('layerRaster', null);\n    const [boundingBox] = useProp<BoundingBox | null>('boundingBox', null);\n    const [, setFullScreen, watchFullScreen] = useProp<boolean>('fullScreen', false);\n    const [, setViewMode, watchViewMode] = useProp<ViewMode>('viewMode', '2D');\n    const [hasHouseSelector] = useProp<boolean>('hasHouseSelector', false);\n    const [onRouteRequested] = useProp<RoutePerObjectHandler>('onRouteRequested');\n\n    const tiles = useElement<HTMLDivElement>('[js-hook-properties-view-tiles]');\n    const mapContainer = useElement<HTMLDivElement>('[js-hook-properties-map-container]');\n    const scrollContainer = useElement<HTMLDivElement>(\n        '[js-hook-properties-view-scroll-container]',\n    );\n    const viewModeToggle = useElement<HTMLDivElement>('[js-hook-2d-3d-toggle]');\n    const mapZoomToggle = useElement<HTMLDivElement>('[js-hook-map-zoom-toggle]');\n    const fullscreenToggle = useElement<HTMLDivElement>('[js-hook-fullscreen-toggle-button]');\n    const houseSelectorElement = useElement<HouseSelectorElement>('bpd-house-selector');\n    const headerTotal = useElement<HTMLDivElement>('[js-hook-properties-view-total]');\n    const cardPopup = useElement<HTMLDivElement>('[js-hook-card-popup]');\n\n    const [, subscribe] = useStore<PropertiesState>(propertiesStore);\n    const [, subscribeMap] = useStore<MapState>(mapStore);\n    const [, subscribeConsentStore] = useStore<ServiceConsentState>(serviceConsentStore);\n\n    useVisualInteraction({ current: element }, scrollContainer);\n    const [onMouseenter, onMouseleave] = useContentInteraction({ houseSelectorElement });\n\n    const { updateCurrentRoute } = usePropertiesRouting();\n\n    let currentView: View | undefined;\n\n    onDidLoad(async () => {\n        if (hasHouseSelector) {\n            await houseSelectorElement.current?.componentOnReady();\n            setViewMode('3D');\n        }\n\n        handleConsent(hasConsent('mapbox'));\n\n        handleView();\n        renderFullscreenToggleButton();\n    });\n\n    subscribe(handleView, ['view']);\n\n    watchViewMode((viewMode) => {\n        renderViewModeToggle(viewMode);\n\n        const action = viewMode === '3D' ? 'add' : 'remove';\n        element.classList[action](HOUSE_SELECTOR_CLASS);\n    });\n\n    watchFullScreen((fullScreen) => {\n        closeCardPopup();\n        const action = fullScreen ? 'add' : 'remove';\n        element.classList[action](FULLSCREEN_CLASS);\n\n        // hide map in css transition\n        toggleViewportResizing(true);\n\n        // do resize\n        if (isMobile()) {\n            setTimeout(() => {\n                element.classList[action](EXPANDED_MAP_CLASS);\n                initResizeEvent();\n            }, 500); // 500 opacity transition\n        } else {\n            setTimeout(() => {\n                initResizeEvent();\n            }, 700 + 500); // 700 animation time, 500 opacity transition\n            element.classList[action](EXPANDED_MAP_CLASS);\n        }\n    });\n\n    useBindMethod('renderCardPopup', renderPropertiesViewCardPopup);\n\n    const renderViewModeToggle = (viewMode: ViewMode) => {\n        if (!viewModeToggle.current) return;\n        viewModeToggle.current.innerHTML = '';\n        viewModeToggle.current.append(\n            <button-toggle\n                classes=\"properties-view__control properties-view__control-switch properties-view__2d3d-toggle\"\n                type=\"switch\"\n                toggleOff={{\n                    label: '2D',\n                    onClick: () => {\n                        setViewMode('2D');\n                    },\n                    ...(viewMode === '2D' ? SWITCH_2D3D_ACTIVE_PROPS : SWITCH_2D3D_INACTIVE_PROPS),\n                }}\n                toggleOn={{\n                    label: '3D',\n                    onClick: () => {\n                        setViewMode('3D');\n                    },\n                    ...(viewMode === '3D' ? SWITCH_2D3D_ACTIVE_PROPS : SWITCH_2D3D_INACTIVE_PROPS),\n                }}\n                is-toggle-on={viewMode === '3D'}\n            />,\n        );\n    };\n\n    const renderMapZoomToggle = (map: mapboxgl.Map) => {\n        if (!mapZoomToggle.current) return;\n        mapZoomToggle.current.innerHTML = '';\n        mapZoomToggle.current.append(\n            <button-toggle\n                classes=\"properties-view__control properties-view__control-switch properties-view__map-zoom-control\"\n                direction=\"column\"\n                type=\"switch\"\n                toggleOff={{\n                    ...SWITCH_ZOOM_ACTIVE_PROPS,\n                    icon: 'icons-plus',\n                    onClick: () => {\n                        GTMPush({\n                            event: 'Map Interaction',\n                            eventCategory: 'Map',\n                            eventAction: 'Zoom filter',\n                            eventLabel: 'zoom_in',\n                        });\n                        map.zoomIn();\n                    },\n                    classes: 'properties-view__map-zoom-control--plus',\n                }}\n                toggleOn={{\n                    ...SWITCH_ZOOM_ACTIVE_PROPS,\n                    icon: 'icons-minus',\n                    onClick: () => {\n                        GTMPush({\n                            event: 'Map Interaction',\n                            eventCategory: 'Map',\n                            eventAction: 'Zoom filter',\n                            eventLabel: 'zoom_out',\n                        });\n                        map.zoomOut();\n                    },\n                }}\n            />,\n        );\n    };\n\n    function renderFullscreenToggleButton() {\n        fullscreenToggle.current!.innerHTML = '';\n        fullscreenToggle.current!.append(\n            <button-toggle\n                classes=\"properties-view__control properties-view__map-expand\"\n                toggleOff={{\n                    variant: 'grey-90',\n                    shape: 'smooth-32',\n                    icon: 'icons-enlarge',\n                }}\n                toggleOn={{\n                    variant: 'grey-90',\n                    shape: 'smooth-32',\n                    icon: 'icons-close',\n                    ...(!isMobile() && {\n                        label: useTranslate('PropertiesOverview-MapCollapse'),\n                    }),\n                }}\n                is-toggle-on={element.fullScreen}\n                onClick={() => {\n                    setFullScreen(!element.fullScreen);\n                }}\n            />,\n        );\n    }\n\n    async function renderPropertiesViewCardPopup(\n        object: ExtendedPropertyType | ExtendedConstructionNumber,\n    ) {\n        let formattedStatus: FormattedStatus | undefined;\n        let formattedPrice: FormattedPrice | undefined;\n        let url: string | undefined;\n        let identifier: string | null | undefined;\n        let isNhg: boolean | undefined;\n\n        switch (object.objectType) {\n            case 'propertyType':\n                formattedStatus = formatPropertyTypeStatus(object);\n                url = formatDetailPageUrl({ propertyType: object });\n                formattedPrice = formatPrice({ propertyType: object });\n\n                break;\n            case 'constructionNumber':\n                formattedStatus = formatConstructionNumberStatus(object);\n                url = formatDetailPageUrl({ constructionNumber: object });\n                formattedPrice = formatPrice({ constructionNumber: object });\n                identifier = object.identifier;\n                isNhg = isConstructionNumberNhg(object);\n\n                break;\n            default:\n                break;\n        }\n\n        const livingArea = formatLivingArea(object);\n        const plotArea = formatPlotArea(object);\n        const rooms = formatRooms(object);\n        const title = await getMapCardTitle(object);\n        const projectPhaseName = object.projectPhaseName;\n\n        const specs = [];\n\n        if (livingArea) {\n            specs.push({\n                title: `${livingArea.value} ${livingArea.suffix || ''}`,\n                subtitle: useTranslate('houses-infobox-living'),\n            });\n        }\n        if (plotArea) {\n            specs.push({\n                title: `${plotArea.value} ${plotArea.suffix || ''}`,\n                subtitle: useTranslate('houses-infobox-lot'),\n            });\n        }\n        if (rooms) {\n            specs.push({\n                title: `${rooms.value}`,\n                subtitle: useTranslate('Rooms'),\n            });\n        }\n\n        cardPopup.current!.innerHTML = '';\n        cardPopup.current!.append(\n            <HouseSelectorCard\n                title={title}\n                status={formattedStatus}\n                price={formattedPrice}\n                description={projectPhaseName}\n                identifier={identifier}\n                image={object.mainImage?.url}\n                buttonLabel={useTranslate('ViewDetails')}\n                buttonUrl={url}\n                specs={specs}\n                onClose={closeCardPopup}\n                isNhg={isNhg}\n            />,\n        );\n        cardPopup.current?.classList.remove(HIDDEN_CLASS);\n    }\n\n    function closeCardPopup() {\n        cardPopup.current?.classList.add(HIDDEN_CLASS);\n        cardPopup.current!.innerHTML = '';\n    }\n\n    function handleConsent(consent: boolean) {\n        if (consent) {\n            renderMap();\n        } else {\n            renderSDPBanner();\n        }\n    }\n\n    function handleView() {\n        currentView = getCurrentView();\n\n        headerTotal.current!.innerHTML = '';\n        tiles.current!.innerHTML = '';\n\n        if (currentView) {\n            sortData(currentView);\n            resizeMap();\n            setViewTypeClass(currentView.type);\n            setHouseSelectorView(currentView);\n\n            if (currentView.data.length && currentView.dataType !== 'recommended') {\n                setHeaderTotal();\n                renderTiles();\n            } else {\n                renderNoResults();\n            }\n        }\n    }\n\n    subscribeMap(({ mapInstance: map }) => map && renderMapZoomToggle(map), ['mapInstance']);\n\n    subscribeMap(\n        ({ click }) => {\n            if (!click?.id) return;\n            handlePropertiesViewObjectClick(click.id, { dimensionality: '2D' });\n        },\n        ['click'],\n    );\n\n    subscribeConsentStore(\n        ({ mapbox }) => {\n            handleConsent(mapbox);\n            updateCurrentRoute();\n        },\n        ['mapbox'],\n    );\n\n    const handleHouseSelectorObjectClick: HouseSelectorObjectHandler = ({\n        objectId,\n        linkToViewId: viewId,\n    }) => {\n        if (!objectId) return;\n        handlePropertiesViewObjectClick(objectId, { viewId, dimensionality: '3D' });\n    };\n\n    const handlePropertiesViewObjectClick = (\n        objectId: string,\n        options?: { viewId?: string | null; dimensionality?: PolygonDimensionality },\n    ) => {\n        closeCardPopup();\n\n        const { object, isSoldProjectData } = findInPropertiesDataById(objectId);\n        if (!object) return;\n\n        const { viewId, dimensionality } = options || {};\n        onRouteRequested(object, {\n            isSoldProjectData,\n            viewId,\n            isFullscreen: element.fullScreen,\n        });\n\n        handleGTMPolygonInteraction(object, dimensionality);\n    };\n\n    function setViewTypeClass(type: ViewType) {\n        const isApartmentView = type === 'apartmentConstructionNumber';\n        element.classList[isApartmentView ? 'add' : 'remove'](APARTMENT_CLASS);\n    }\n\n    const hasCurrentViewDataObjects = (view: HouseSelectorView, currentView: View) => {\n        return !!view.polygons?.find(({ objectId }) =>\n            currentView.data.find(({ id }) => id === objectId),\n        );\n    };\n\n    function setHouseSelectorView(currentView: View) {\n        const houseSelectorData = getHouseSelectorData();\n        if (!houseSelectorData || !houseSelectorElement.current) return;\n\n        const { views } = houseSelectorData ?? {};\n\n        if (!views?.length) return;\n        views.forEach((view) =>\n            view.polygons?.forEach((polygon) => setPolygonDrawingOptions(polygon, currentView)),\n        );\n        sortHouseSelectorData(houseSelectorData);\n\n        let nextView: HouseSelectorView | undefined;\n\n        if (currentView.viewId) {\n            nextView = views.find((view) => view.id === currentView.viewId);\n        }\n\n        if (\n            currentView.type !== 'propertyType' &&\n            currentView.type !== 'apartmentPropertyType' &&\n            !nextView\n        ) {\n            nextView = views.find((view) => hasCurrentViewDataObjects(view, currentView));\n        }\n\n        if (!nextView) nextView = views[0];\n        houseSelectorElement.current.setView(nextView);\n    }\n\n    function renderTiles() {\n        const tileElements = getTiles(onMouseenter, onMouseleave);\n\n        if (tileElements) {\n            tiles.current!.append(tileElements);\n            element.classList.remove(NO_RESULTS_CLASS);\n        }\n    }\n\n    function renderNoResults() {\n        element.classList.add(NO_RESULTS_CLASS);\n\n        tiles.current!.innerHTML = '';\n        tiles.current!.append(\n            <div class=\"properties-view__no-results\">\n                <div class=\"properties-view__no-results-inner\">\n                    <bpd-svg name=\"icons-wishlist-empty\" />\n\n                    <h2 class=\"properties-view__no-results-title\">\n                        {useTranslate('HousingOverview.NoResultTitle')}\n                    </h2>\n                    <p class=\"properties-view__no-results-description\">\n                        {useTranslate('HousingOverview.NoResultDescription')}\n                    </p>\n                    <Button\n                        label={useTranslate('HousingOverview.ResetFilter')}\n                        onClick={() => {\n                            GTMPush({\n                                event: 'gtm.filters',\n                                eventCategory: 'Woonwensen',\n                                eventAction: 'Reset filters',\n                            });\n\n                            resetFilters(true);\n                        }}\n                    />\n                </div>\n            </div>,\n        );\n    }\n\n    function renderMap() {\n        mapContainer.current!.innerHTML = '';\n        mapContainer.current!.append(\n            <bpd-map\n                options={{\n                    boundingBox,\n                    layerRaster,\n                    autoOpenUrl: false,\n                    ...getDebuggerMapOptions(),\n                }}\n                theme={PROPERTIES_THEME}\n            />,\n        );\n    }\n\n    function renderSDPBanner() {\n        mapContainer.current!.innerHTML = '';\n        mapContainer.current!.append(<div uc-mapbox-banner />);\n    }\n\n    function initResizeEvent() {\n        const resizeEvent = new CustomEvent('properties-view::map-resized');\n        document.dispatchEvent(resizeEvent);\n        resizeMap();\n        // show map again\n        toggleViewportResizing(false);\n    }\n\n    function resizeMap() {\n        if (!hasConsent('mapbox')) return;\n        requestAnimationFrame(() => getMapInstance()?.resize());\n    }\n\n    function toggleViewportResizing(isResizing: boolean) {\n        const action = isResizing ? 'add' : 'remove';\n        element.classList[action](RESIZING_CLASS);\n    }\n\n    function setHeaderTotal() {\n        const { type, dataType } = currentView || {};\n        const hasPropertyTypes = type === 'apartmentPropertyType' || type === 'propertyType';\n        const total = currentView?.data.length;\n        let titleSingular = hasPropertyTypes\n            ? useTranslate('HouseType')\n            : useTranslate('BuildingNumber');\n        let titlePlural = hasPropertyTypes\n            ? useTranslate('HouseTypes')\n            : useTranslate('HousingOverview-ConstructionNumbers');\n\n        if (dataType === 'soldProjects') {\n            titleSingular = useTranslate('ProjectPhase.soldInArea');\n            titlePlural = useTranslate('ProjectPhases.soldInArea');\n        }\n\n        if (total) {\n            headerTotal.current!.innerHTML = '';\n            headerTotal.current!.append(\n                <Fragment>\n                    <span class=\"u-h4 u-h4--md\">{total}</span>\n                    <span class=\"u-h4 u-h4--md\">{total > 1 ? titlePlural : titleSingular}</span>\n                </Fragment>,\n            );\n        }\n    }\n\n    return (\n        <div class=\"properties-view__container\">\n            <div class=\"properties-view__content\" js-hook-properties-view-scroll-container>\n                <div class=\"properties-view__header-total\" js-hook-properties-view-total />\n\n                <div class=\"properties-view__tiles\" js-hook-properties-view-tiles />\n\n                <div class=\"properties-view__compare\">\n                    <compare-open-button />\n                </div>\n            </div>\n\n            <div class=\"properties-view__visual\">\n                <div class=\"properties-view__map\" js-hook-properties-map-container></div>\n\n                <div class=\"properties-view__apartments\">\n                    <apartments-view vr-tour-id=\"properties-view-tour\" expanded />\n                </div>\n\n                {hasHouseSelector ? (\n                    <div class=\"properties-view__house-selector\" js-hook-house-selector-container>\n                        <bpd-house-selector onObjectClick={handleHouseSelectorObjectClick} />\n                    </div>\n                ) : null}\n\n                <div class=\"properties-view__card-popup\" js-hook-card-popup />\n\n                <div class=\"properties-view__controls\">\n                    <div js-hook-fullscreen-toggle-button />\n\n                    <div js-hook-2d-3d-toggle />\n\n                    <div js-hook-map-zoom-toggle />\n                </div>\n            </div>\n        </div>\n    );\n};\n\nPropertiesView.props = {\n    viewMode: {\n        type: String,\n    },\n    layerRaster: {\n        type: String,\n        required: true,\n    },\n    boundingBox: {\n        type: Array,\n    },\n    fullScreen: {\n        type: Boolean,\n        reflectToAttr: true,\n    },\n    hasHouseSelector: {\n        type: Boolean,\n    },\n    onRouteRequested: {\n        type: Function,\n        required: true,\n    },\n};\n\ndefineElement('properties-view', PropertiesView);\n","import { h } from '@atomify/jsx';\nimport { RangeSliderElement, RangeSliderProps } from '@bpd-library/components';\nimport { RadioElement } from '@source/components/atoms';\nimport { CheckboxElement } from '@source/components/atoms/form-elements/checkbox/checkbox';\nimport { FilterInput } from '@source/store/filters';\n\nexport interface GeneratedFiltersProps {\n    type: string;\n    components: Array<FilterInput>;\n    rangeSliderOptions?: RangeSliderProps;\n}\nexport const generateInputs = ({ type, components, rangeSliderOptions }: GeneratedFiltersProps) => {\n    switch (type) {\n        case 'radio':\n            const options = components.map(component => ({\n                name: component.name,\n                label: component.label,\n                value: component.value,\n                id: component.id,\n                checked: component.checked,\n            }));\n            return options?.length === 0 ? null : (\n                <RadioElement classes=\"property-filter__filter\" options={options} />\n            );\n\n        case 'checkbox':\n            return components.map(component => (\n                <CheckboxElement\n                    label={component.label}\n                    name={component.name}\n                    id={component.id}\n                    value={component.value}\n                    hideError={true}\n                    checked={component.checked}\n                    classes=\"property-filter__filter\"\n                />\n            ));\n\n        case 'range':\n            if (!rangeSliderOptions) return;\n            return <RangeSliderElement classes=\"property-filter__filter\" {...rangeSliderOptions} />;\n        default:\n            return null;\n    }\n};\n","/**\n * Filter names holds the name of a filter.\n * The name key is what is shown in the url\n * The order of the filters, will be the order in the menu\n *\n */\n\nexport const FILTER_NAMES = {\n    priceRange: 'price',\n    propertyTypes: 'propertyTypes',\n    status: 'status',\n    districts: 'districts',\n    projectPhases: 'projectPhases',\n    rooms: 'rooms',\n    livingArea: 'livingArea',\n    plotArea: 'plotArea',\n    rental: 'rental',\n    sunDirection: 'sunDirection',\n    apartmentBuildings: 'apartmentBuildings',\n};\n","/**\n * Filter names holds the name of a filter.\n * The name key is what is shown in the url\n * The order of the filters, will be the order in the menu\n *\n */\n\nimport { isNetherlands } from '@utilities/is-netherlands';\n\nconst FILTER_ORDER_NL = [\n    'price',\n    'propertyTypes',\n    'status',\n    'districts',\n    'projectPhases',\n    'rooms',\n    'livingArea',\n    'plotArea',\n    'rental',\n    'sunDirection',\n    'apartmentBuildings',\n];\n\nconst FILTER_ORDER_DE = [\n    'price',\n    'livingArea',\n    'status',\n    'rooms',\n    'propertyTypes',\n    'plotArea',\n    'sunDirection',\n    'districts',\n    'projectPhases',\n    'rental',\n    'apartmentBuildings',\n];\n\nexport const getFilterOrder = () => (isNetherlands() ? FILTER_ORDER_NL : FILTER_ORDER_DE);\n","import { toCurrency } from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { SelectedFilter } from '@source/store/filters';\nimport { transformFilters } from '@source/store/filters/utilities/transform-filters';\nimport { useTranslate } from '@source/utilities/hooks';\n\nexport const transformFilterLabel = (name: string, filter: SelectedFilter) => {\n    const transformFilter = transformFilters({ [name]: filter });\n\n    if (transformFilter.length === 0) return null;\n\n    const { minValue, maxValue } = transformFilter[0];\n\n    if (!minValue && !maxValue) return null;\n\n    const replacer = { id: 'Amount', value: minValue?.toString() || '' };\n\n    switch (name) {\n        case FILTER_NAMES.rooms:\n            return useTranslate('Filters.Rooms.selectedLabel', {\n                replace: [replacer],\n            });\n        case FILTER_NAMES.livingArea:\n            return useTranslate('Filters.LivingArea.selectedLabel', {\n                replace: [replacer],\n            });\n        case FILTER_NAMES.plotArea:\n            return useTranslate('Filters.PlotArea.selectedLabel', {\n                replace: [replacer],\n            });\n        case FILTER_NAMES.status:\n        case FILTER_NAMES.districts:\n        case FILTER_NAMES.projectPhases:\n        case FILTER_NAMES.propertyTypes:\n        case FILTER_NAMES.rental:\n            return '';\n        case FILTER_NAMES.priceRange:\n            if (!minValue || !maxValue) return;\n            return `${toCurrency(minValue)} - ${toCurrency(maxValue)}`;\n        default:\n            return '';\n    }\n};\n","import { toCurrency } from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter/utilities';\nimport { getFilterInputByValue } from '@source/store/filters';\nimport { useTranslate } from '@source/utilities/hooks';\n\nexport const transformTagLabel = (name: string, value: string) => {\n    const filterInput = getFilterInputByValue(name, value);\n\n    const replacer = { id: 'Amount', value };\n\n    switch (name) {\n        case FILTER_NAMES.rooms:\n            return useTranslate('Filters.Rooms.selectedLabel', {\n                replace: [replacer],\n            });\n        case FILTER_NAMES.livingArea:\n            return useTranslate('Filters.LivingArea.selectedLabel', {\n                replace: [replacer],\n            });\n        case FILTER_NAMES.plotArea:\n            return useTranslate('Filters.PlotArea.selectedLabel', {\n                replace: [replacer],\n            });\n        case FILTER_NAMES.priceRange:\n            const prices = value.split('.');\n\n            return `${toCurrency(parseInt(prices[prices.length > 2 ? 1 : 0]))} - ${toCurrency(\n                parseInt(prices[prices.length > 2 ? 2 : 1]),\n            )}`;\n        default:\n            return filterInput.label || '';\n    }\n};\n","import {\n    Component,\n    defineElement,\n    FC,\n    useElement,\n    useElements,\n    useListen,\n    useProp,\n} from '@atomify/hooks';\nimport { Fragment, h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { BPDRange } from '@bpd-library/components';\nimport { useClickOutside } from '@bpd-library/utilities';\nimport { transformTagLabel } from '@features/properties/components/tag-list/utilities/transform-tag-label';\nimport { BPDFunctionalSvg } from '@source/components/atoms';\nimport { ContentCollapseElement } from '@source/components/atoms/content-collapse/utilities/content-collapse';\nimport {\n    FilterInput,\n    FilterLogic,\n    filterStore,\n    getFilterByType,\n    PropertiesFilterFunctions,\n    updateFilter,\n} from '@source/store/filters';\nimport { GTMPush } from '@source/utilities/gtm';\nimport { isMobile } from '@utilities/media-query';\n\n// import style from './property-filter.scss';\nimport { GeneratedFiltersProps, generateInputs, transformFilterLabel } from './utilities';\n\nexport interface PropertyFilterProps {\n    expanded: boolean;\n    icon: string;\n    title: string;\n    dropdownLabel: string;\n    filterName: string;\n    hasRangeValues: boolean;\n    filterFunctions: PropertiesFilterFunctions;\n    filters: GeneratedFiltersProps;\n    filterLogic?: FilterLogic;\n}\n\nexport type PropertyFilterElement = Component & PropertyFilterProps;\n\nconst PropertyFilter: FC<PropertyFilterElement> = ({ element }) => {\n    // Properties\n    const [icon] = useProp<string>('icon', 'icons-spec-house');\n    const [filterTitle] = useProp('title', '');\n    const [dropdownLabel] = useProp('dropdownLabel', `Kies ${filterTitle}`);\n    const [filterName] = useProp('filterName', '');\n    const [onToggle] = useProp<Function>('onToggle', () => null);\n    const [hasRangeValues] = useProp<boolean>('hasRangeValues', false);\n    const [, setExpanded, watchExpanded] = useProp<boolean>('expanded', false);\n    const [filters] = useProp<GeneratedFiltersProps>('filters', {\n        type: '',\n        components: [],\n        rangeSliderOptions: undefined,\n    });\n\n    // Elements\n    const inputElements = useElements<HTMLInputElement[]>('input');\n    const title = useElement<HTMLSpanElement>('[js-hook-filter-label]');\n    const contentCollapse = useElement<ContentCollapseElement>('[js-hook-filter-collapse]');\n    const rangeSlider = useElement<BPDRange>('bpd-range-slider');\n\n    // Stores and utilties\n    const [, subscribe] = useStore(filterStore);\n\n    useListen(inputElements, 'change', async (e: InputEvent) => {\n        const { id, checked, name, type, value } = e.currentTarget as HTMLInputElement;\n        // Update the filter within the store\n        updateFilter({ id, checked, name, type, value, hasRangeValues });\n\n        const filter = getFilterByType(filterName);\n        const label =\n            (await transformFilterLabel(filterName, filter)) ||\n            (await transformTagLabel(name, value));\n\n        GTMPush({\n            event: 'gtm.filters',\n            eventCategory: 'Woonwensen',\n            eventAction: checked ? `Add ${name}` : `Remove ${name}`,\n            eventLabel: label?.toString(),\n        });\n    });\n\n    watchExpanded((expanded) => {\n        if (isMobile()) {\n            contentCollapse.current!.expanded = expanded;\n        }\n    });\n\n    useClickOutside(element, (clickOutside) => {\n        if (clickOutside) {\n            setExpanded(false);\n        }\n    });\n\n    subscribe(\n        (state) => {\n            const { filters, currentFilterChange } = state;\n\n            // Only update the filter state when the current filter that is changed is equal to the name of this filter.\n            if (currentFilterChange === filterName || currentFilterChange === 'all') {\n                const filterItems = filters[filterName];\n\n                // We only want to reset elements that are unchecked within the store.\n                resetInputState(filterItems.inputs.filter((input) => !input.checked));\n\n                // Update filter label based upon selected values and based upon if it has range values.\n                updateFilterLabel();\n            }\n        },\n        ['filters'],\n    );\n\n    async function updateFilterLabel() {\n        if (!hasRangeValues) return;\n        const label = await getLabel();\n\n        if (label) {\n            title.current!.innerHTML = '';\n            title.current!.append(label);\n        }\n    }\n\n    /**\n     * Returns the label based upon types and selected filters of that type\n     * @returns { string | null }\n     */\n    function getLabel() {\n        if (isMobile()) return filterTitle;\n        const filter = getFilterByType(filterName);\n        return transformFilterLabel(filterName, filter) || filterTitle;\n    }\n\n    /**\n     * Reset inputs based upon their state within the filter store.\n     * @param {FilterInput[]} inputs\n     */\n    function resetInputState(inputs: FilterInput[]) {\n        if (inputElements.current) {\n            inputs.forEach((input) => {\n                // Get related input based upon if one of the current input elements of this filter has an id equal to an id of the store.\n                const relatedInput = Array.from(inputElements.current).find(\n                    (item) => item && item.id === input.id,\n                );\n\n                // If input is range slider reset the range\n                if (input.type === 'number') rangeSlider.current!.resetState();\n\n                // Check if there is a related input and if the input is not already checked\n                if (relatedInput && relatedInput.checked) relatedInput.checked = false;\n            });\n        }\n    }\n\n    function handleFilterToggle() {\n        const nextExpandedState = !element.expanded;\n        onToggle();\n        setExpanded(nextExpandedState);\n    }\n\n    return (\n        <Fragment>\n            <button class=\"property-filter__toggle\" onClick={() => handleFilterToggle()}>\n                <BPDFunctionalSvg name={icon} />\n                <span class=\"property-filter__label\" js-hook-filter-label>\n                    {getLabel() || filterTitle}\n                </span>\n                <span class=\"property-filter__dropdown-chevron\">\n                    <BPDFunctionalSvg name={'icons-arrow-down'} />\n                </span>\n            </button>\n            <div class=\"property-filter__dropdown\">\n                <span class=\"property-filter__dropdown-label\">{dropdownLabel}</span>\n                <bpd-content-collapse js-hook-filter-collapse class=\"property__filter-collapse\">\n                    <div class=\"property-filter__dropdown-filters\">\n                        {generateInputs({\n                            type: filters.type,\n                            components: filters.components,\n                            rangeSliderOptions: filters.rangeSliderOptions,\n                        })}\n                    </div>\n                </bpd-content-collapse>\n            </div>\n        </Fragment>\n    );\n};\n\nPropertyFilter.props = {\n    icon: {\n        type: String,\n    },\n    expanded: {\n        type: Boolean,\n        reflectToAttr: true,\n    },\n    title: {\n        type: String,\n    },\n    dropdownLabel: {\n        type: String,\n    },\n    filterName: {\n        type: String,\n    },\n    filters: {\n        type: Object,\n    },\n    hasRangeValues: {\n        type: Boolean,\n    },\n    onToggle: {\n        type: Function,\n    },\n};\n\ndefineElement('property-filter', PropertyFilter);\n","import {\n    Component,\n    defineElement,\n    FC,\n    onDidLoad,\n    useElement,\n    useListen,\n    useProp,\n} from '@atomify/hooks';\nimport { Fragment, h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { useClickOutside } from '@bpd-library/utilities';\nimport { BPDFunctionalSvg } from '@source/components/atoms';\nimport { Filter, filterStore, updateFilter } from '@source/store/filters';\nimport { GTMPush } from '@source/utilities/gtm';\n\nimport { FILTER_NAMES } from '../property-filter';\nimport { transformTagLabel } from './utilities/transform-tag-label';\n\nconst DROPDOWN_WIDTH = 70;\nconst DROPDOWN_VISIBLE_CLASS = 'tag-list__dropdown--visible';\nconst COLLAPSING_DISABLED_CLASS = 'tag-list--collapse-disabled';\n\ninterface TagListElement extends Component {\n    disableCollapse: boolean;\n}\n\nexport const TagList: FC<TagListElement> = ({ element }) => {\n    const [disableCollapse] = useProp<boolean>('disableCollapse', false);\n    const wrapper = useElement<HTMLDivElement>('[js-hook-tag-list-wrapper]');\n    const items = useElement<HTMLElement>('[js-hook-tag-list-items]');\n    const dropdown = useElement<HTMLElement>('[js-hook-tag-list-dropdown]');\n\n    const [, subscribe] = useStore(filterStore);\n\n    onDidLoad(() => {\n        appendTagList();\n\n        useClickOutside(dropdown.current!, (clickOutside) => {\n            if (clickOutside) hideDropdown();\n        });\n\n        if (disableCollapse) {\n            element.classList.add(COLLAPSING_DISABLED_CLASS);\n        }\n    });\n\n    subscribe(appendTagList, ['filters']);\n\n    useListen(window, 'resize', appendTagList);\n\n    function appendTagList() {\n        // Draw tags\n        renderTagList();\n\n        // Hide overflowing tags\n        !disableCollapse && handleOverflow();\n    }\n\n    function generateTags() {\n        const { filters } = filterStore.getState();\n\n        const tags: Filter[] = [];\n        const price: Filter[] = [];\n\n        Object.keys(filters).forEach((filterName) => {\n            const { inputs, hasRangeValues } = filters[filterName];\n            inputs.forEach(({ id, name, type, value, checked }) => {\n                if (checked) {\n                    if (FILTER_NAMES.priceRange === name) {\n                        if (!price.length)\n                            price.push({ id, type, value, name, hasRangeValues, checked });\n                        if (price.length) price[0].value = `${price[0].value}.${value}`;\n                    } else {\n                        tags.push({ id, type, value, name, hasRangeValues, checked });\n                    }\n                }\n            });\n        });\n\n        return [...tags, ...price];\n    }\n\n    function getOverflowElements(\n        container: HTMLElement,\n        children: NodeListOf<HTMLElement>,\n    ): [Element[], Element[]] | undefined {\n        const containerWidth = container.clientWidth;\n        const containerOffsetLeft = container.offsetLeft;\n\n        const visible: Element[] = [];\n        const overflow: Element[] = [];\n\n        if (!containerWidth || !children.length) return;\n\n        Array.from(children).forEach((child) => {\n            const { offsetLeft, clientWidth } = child;\n\n            const isOverflowing =\n                clientWidth + offsetLeft > containerWidth + containerOffsetLeft - DROPDOWN_WIDTH;\n\n            if (isOverflowing) {\n                overflow.push(child);\n            } else {\n                visible.push(child);\n            }\n        });\n\n        return [visible, overflow];\n    }\n\n    function toggleDropdown() {\n        const action = dropdown.current!.classList.contains(DROPDOWN_VISIBLE_CLASS)\n            ? 'remove'\n            : 'add';\n\n        dropdown.current!.classList[action](DROPDOWN_VISIBLE_CLASS);\n    }\n\n    function hideDropdown() {\n        dropdown.current!.classList.remove(DROPDOWN_VISIBLE_CLASS);\n    }\n\n    function handleOverflow() {\n        dropdown.current!.innerHTML = '';\n\n        const tags = element.querySelectorAll<HTMLElement>('[js-hook-tag-list-item]');\n        const [visible, overflow] = getOverflowElements(wrapper.current!, tags) || [];\n\n        if (overflow?.length) {\n            // Render visible items\n            items.current!.innerHTML = '';\n            items.current!.append(<Fragment>{visible}</Fragment>);\n\n            // Render overflow\n            dropdown.current!.append(\n                <Fragment>\n                    <button class=\"tag-list__tag\" onClick={toggleDropdown}>\n                        <span class=\"tag-list__tag-label\">{overflow.length}</span>\n                        <BPDFunctionalSvg name=\"arrow-chevron-right\" />\n                    </button>\n\n                    <div\n                        class={`tag-list__dropdown-items tag-list__dropdown-items--${\n                            !visible || visible.length <= 1 ? 'left' : 'right'\n                        }`}>\n                        {overflow}\n                    </div>\n                </Fragment>,\n            );\n        }\n    }\n\n    function renderTagList() {\n        const tags = generateTags();\n\n        items.current!.innerHTML = '';\n        items.current!.append(\n            <Fragment>\n                {tags.length > 0 &&\n                    tags.map(({ id, name, type, value, hasRangeValues }) => (\n                        <button\n                            class=\"tag-list__tag\"\n                            onClick={async () => {\n                                updateFilter({\n                                    id,\n                                    checked: false,\n                                    name,\n                                    type,\n                                    value,\n                                    hasRangeValues,\n                                });\n\n                                const label = await transformTagLabel(name, value);\n\n                                GTMPush({\n                                    event: 'gtm.filters',\n                                    eventCategory: 'Woonwensen',\n                                    eventAction: `Remove ${name}`,\n                                    eventLabel: label.toString(),\n                                });\n                            }}\n                            js-hook-tag-list-item>\n                            <span class=\"tag-list__tag-label\">\n                                {transformTagLabel(name, value)}\n                            </span>\n                            <span class=\"tag-list__tag-icon\">\n                                <BPDFunctionalSvg name=\"icons-close\" />\n                            </span>\n                        </button>\n                    ))}\n            </Fragment>,\n        );\n    }\n\n    return (\n        <div class=\"tag-list__wrapper\" js-hook-tag-list-wrapper>\n            <div class=\"tag-list__items\" js-hook-tag-list-items />\n            <div class=\"tag-list__dropdown\" js-hook-tag-list-dropdown />\n        </div>\n    );\n};\n\nTagList.props = {\n    disableCollapse: {\n        type: Boolean,\n        reflectToAttr: true,\n    },\n};\n\ndefineElement('bpd-tag-list', TagList);\n","export const hasSearchParams = window.location.search.length > 0;\n\nexport const hasFilterUrl = (value: string, type: string) => {\n    const searchParams = new URLSearchParams(window.location.search);\n    const params = searchParams.get(type);\n\n    if (!params) return false;\n\n    return params.split('.').includes(`${value}`);\n};\n\nexport const getFilterUrlValues = (type: string) => {\n    const searchParams = new URLSearchParams(window.location.search);\n    const params = searchParams.getAll(type);\n\n    return params.map(param => param.split('.'));\n};\n\nexport const getFilterUrlValue = (type: string) => {\n    const searchParams = new URLSearchParams(window.location.search);\n    const param = searchParams.get(type);\n\n    return param;\n};\n","import { DecimalRange } from '@bpd-library/utilities';\n\n/*\n    Checks if rangeA is within range of rangeB\n*/\nconst isRangeWithinRange = (rangeA: DecimalRange, rangeB: DecimalRange): boolean => {\n    let moreThanMin = true;\n    let lessThanMax = true;\n\n    if (!rangeA.from && !rangeA.to) return false;\n\n    if (rangeA.from) {\n        if (rangeB.to) {\n            if (rangeB.to < rangeA.from) moreThanMin = false;\n        } else if (rangeB.from) {\n            if (rangeB.from < rangeA.from) moreThanMin = false;\n        }\n    }\n\n    if (rangeA.to) {\n        if (rangeB.from) {\n            if (rangeB.from > rangeA.to) lessThanMax = false;\n        } else if (rangeB.to) {\n            if (rangeB.to > rangeA.to) lessThanMax = false;\n        }\n    }\n\n    return moreThanMin && lessThanMax;\n};\n\nexport default isRangeWithinRange;\n","import { DecimalRange } from '@bpd-library/utilities';\n\nconst generateSteps = ({\n    range,\n    stepSize,\n    transformFn,\n}: {\n    range: DecimalRange;\n    stepSize: number;\n    transformFn?: (number: number) => number;\n}) => {\n    let from = range.from;\n    let to = range.to;\n    const steps: number[] = [];\n\n    if (!from && !to) {\n        return [];\n    } else {\n        if (!from) {\n            return [to!];\n        } else if (!to) {\n            return [from!];\n        }\n    }\n\n    if (transformFn) {\n        from = transformFn(from);\n        to = transformFn(to);\n    }\n\n    for (let step = from; step < to + stepSize; step += stepSize) {\n        if (step > to) {\n            steps.push(to);\n        } else {\n            steps.push(step);\n        }\n    }\n\n    return steps;\n};\n\nexport { generateSteps };\n","import {\n    ExtendedAreaModels,\n    mergeConstructionNumberSpecification,\n    mergeDecimalRange,\n    mergePropertySpecification,\n} from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport isRangeWithinRange from '@source/utilities/filters/is-range-in-range';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { generateSteps } from '../utilities/generate-steps';\nimport { Filters } from './construct-filters';\n\nexport const generateLivingAreaSteps = (data: ExtendedAreaModels) => {\n    const filteredPropertyTypes = data.propertyTypes.filter(\n        ({ constructionNumbers }) => !constructionNumbers?.length,\n    );\n\n    const constructionNumberRange = mergeConstructionNumberSpecification(\n        data.constructionNumbers,\n        'livingArea',\n    );\n    const propertyTypeRange = mergePropertySpecification(\n        { propertyTypes: filteredPropertyTypes },\n        'livingArea',\n    );\n\n    const livingAreaRange = mergeDecimalRange(constructionNumberRange, propertyTypeRange);\n\n    const steps = generateSteps({\n        range: livingAreaRange,\n        stepSize: 25,\n    });\n\n    return steps;\n};\n\nexport const setLivingAreaFilters = async (data: ExtendedAreaModels, filters: Filters) => {\n    const steps = generateLivingAreaSteps(data);\n    const filterName = FILTER_NAMES.livingArea;\n\n    if (steps.length) {\n        filters[filterName] = {\n            expanded: false,\n            icon: 'specs-rooms',\n            title: await translateItem('Filters.LivingArea.label'),\n            dropdownLabel: await translateItem('Filters.LivingArea.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) => {\n                    if (!constructionNumber.specifications?.livingArea) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        constructionNumber.specifications?.livingArea,\n                    );\n                },\n                propertyType: (propertyType, filterInput) => {\n                    if (!propertyType.specifications?.livingArea) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        propertyType.specifications?.livingArea,\n                    );\n                },\n                projectPhase: (projectPhase, filterInput) => {\n                    if (!projectPhase.propertySpecifications?.livingArea) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        projectPhase.propertySpecifications?.livingArea,\n                    );\n                },\n            },\n            filterName,\n            hasRangeValues: true,\n            filters: {\n                type: 'radio',\n                components: steps.map((step) => ({\n                    id: `${filterName}-${step}`,\n                    label: `${step}+ m2`,\n                    value: `${step}`,\n                    name: filterName,\n                    checked: hasFilterUrl(`${step}`, filterName),\n                    type: 'radio',\n                })),\n            },\n        };\n    }\n};\n","import {\n    ExtendedAreaModels,\n    mergeConstructionNumberSpecification,\n    mergeDecimalRange,\n    mergePropertySpecification,\n} from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport isRangeWithinRange from '@source/utilities/filters/is-range-in-range';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { generateSteps } from '../utilities/generate-steps';\nimport { Filters } from './construct-filters';\n\nconst getPlotAreaSteps = (data: ExtendedAreaModels): number[] => {\n    const filteredPropertyTypes = data.propertyTypes.filter(\n        ({ constructionNumbers }) => !constructionNumbers?.length,\n    );\n\n    const constructionNumberRange = mergeConstructionNumberSpecification(\n        data.constructionNumbers,\n        'plotArea',\n    );\n    const propertyTypeRange = mergePropertySpecification(\n        { propertyTypes: filteredPropertyTypes },\n        'plotArea',\n    );\n\n    const plotAreaRange = mergeDecimalRange(constructionNumberRange, propertyTypeRange);\n\n    const steps = generateSteps({\n        range: plotAreaRange,\n        stepSize: 25,\n    });\n\n    return steps;\n};\n\nexport const setPlotAreaFilters = async (data: ExtendedAreaModels, filters: Filters) => {\n    const steps = getPlotAreaSteps(data);\n    const filterName = FILTER_NAMES.plotArea;\n\n    if (steps.length) {\n        filters[filterName] = {\n            expanded: false,\n            icon: 'specs-surface',\n            title: await translateItem('Filters.PlotArea.label'),\n            dropdownLabel: await translateItem('Filters.PlotArea.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) => {\n                    if (!constructionNumber.specifications?.plotArea) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        constructionNumber.specifications?.plotArea,\n                    );\n                },\n                propertyType: (propertyType, filterInput) => {\n                    if (!propertyType.specifications?.plotArea) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        propertyType.specifications?.plotArea,\n                    );\n                },\n                projectPhase: (projectPhase, filterInput) => {\n                    if (!projectPhase.propertySpecifications?.plotArea) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        projectPhase.propertySpecifications?.plotArea,\n                    );\n                },\n            },\n            filterName,\n            hasRangeValues: true,\n            filters: {\n                type: 'radio',\n                components: steps.map((step) => ({\n                    id: `${filterName}-${step}`,\n                    label: `${step}+ m2`,\n                    value: `${step}`,\n                    name: filterName,\n                    checked: hasFilterUrl(`${step}`, filterName),\n                    type: 'radio',\n                })),\n            },\n        };\n    }\n};\n","import {\n    DecimalRange,\n    ExtendedAreaModels,\n    mergeDecimalRange,\n    showPrice,\n} from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { getFilterUrlValue, hasFilterUrl } from '@source/utilities/filters';\nimport isRangeWithinRange from '@source/utilities/filters/is-range-in-range';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { Filters } from './construct-filters';\n\nexport const getPrices = (data: ExtendedAreaModels): { min: number; max: number } => {\n    const constructionNumberAmounts = data.constructionNumbers.reduce<DecimalRange[]>(\n        (amounts, constructionNumber) => {\n            if (!showPrice({ constructionNumber })) return amounts;\n\n            const amount =\n                constructionNumber.salesPrice?.amount || constructionNumber.rentalPrice?.amount;\n\n            if (amount) amounts.push(amount);\n\n            return amounts;\n        },\n        [],\n    );\n\n    const propertyTypeAmounts = data.propertyTypes.reduce<DecimalRange[]>(\n        (amounts, propertyType) => {\n            if (propertyType.constructionNumbers?.length || !showPrice({ propertyType }))\n                return amounts;\n\n            const amount = propertyType.salesPrice?.amount || propertyType.rentalPrice?.amount;\n\n            if (amount) amounts.push(amount);\n\n            return amounts;\n        },\n        [],\n    );\n\n    const range = [...constructionNumberAmounts, ...propertyTypeAmounts].reduce<DecimalRange>(\n        mergeDecimalRange,\n        {},\n    );\n\n    return {\n        min: range.from!,\n        max: range.to!,\n    };\n};\n\nexport const setPriceFilters = async (data: ExtendedAreaModels, filters: Filters) => {\n    const filterName = FILTER_NAMES.priceRange;\n    const currentFilter = getFilterUrlValue(filterName)?.split('.');\n    const hasSale = !!data.projectPhases.find(({ isRental }) => !isRental);\n    const increment = hasSale ? 5000 : 100;\n\n    const prices = getPrices(data);\n\n    if (prices.min && prices.max) {\n        if (prices.min === prices.max) prices.max += increment;\n\n        let min: number = (currentFilter && parseInt(currentFilter[0])) || prices.min;\n        let max: number = (currentFilter && parseInt(currentFilter[1])) || prices.max;\n\n        const handlePriceChange = ({\n            minValue,\n            maxValue,\n        }: {\n            minValue: number;\n            maxValue: number;\n        }) => {\n            min = minValue;\n            max = maxValue;\n        };\n\n        const updatedPrice: { min: number; max: number } = {\n            min: prices.min,\n            max: prices.max,\n        };\n\n        filters[filterName] = {\n            expanded: false,\n            icon: 'specs-price',\n            title: await translateItem('Filters.Price.label'),\n            dropdownLabel: await translateItem('Filters.Price.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) => {\n                    if (\n                        constructionNumber.salesPrice?.priceType === 'PriceOnRequest' ||\n                        constructionNumber.rentalPrice?.priceType === 'PriceOnRequest'\n                    )\n                        return true;\n\n                    if (!showPrice({ constructionNumber })) return false;\n\n                    if (\n                        !constructionNumber.salesPrice?.amount &&\n                        !constructionNumber.rentalPrice?.amount\n                    )\n                        return false;\n\n                    if (filterInput.id === `${filterName}-0`) {\n                        updatedPrice.min = parseInt(filterInput.value);\n                    } else {\n                        updatedPrice.max = parseInt(filterInput.value);\n                    }\n\n                    const range =\n                        filterInput.id === `${filterName}-0`\n                            ? {\n                                  from: parseInt(filterInput.value),\n                                  to: updatedPrice.max,\n                              }\n                            : {\n                                  from: updatedPrice.min,\n                                  to: parseInt(filterInput.value),\n                              };\n\n                    return isRangeWithinRange(\n                        range,\n                        constructionNumber.salesPrice?.amount! ||\n                            constructionNumber.rentalPrice?.amount,\n                    );\n                },\n                propertyType: (propertyType, filterInput) => {\n                    if (\n                        propertyType.salesPrice?.priceType === 'PriceOnRequest' ||\n                        propertyType.rentalPrice?.priceType === 'PriceOnRequest'\n                    )\n                        return true;\n\n                    if (!showPrice({ propertyType })) return false;\n\n                    if (!propertyType.salesPrice?.amount && !propertyType.rentalPrice?.amount)\n                        return false;\n\n                    if (filterInput.id === `${filterName}-0`) {\n                        updatedPrice.min = parseInt(filterInput.value);\n                    } else {\n                        updatedPrice.max = parseInt(filterInput.value);\n                    }\n\n                    const range =\n                        filterInput.id === `${filterName}-0`\n                            ? {\n                                  from: parseInt(filterInput.value),\n                                  to: updatedPrice.max,\n                              }\n                            : {\n                                  from: updatedPrice.min,\n                                  to: parseInt(filterInput.value),\n                              };\n\n                    return isRangeWithinRange(\n                        range,\n                        propertyType.salesPrice?.amount! || propertyType.rentalPrice?.amount,\n                    );\n                },\n                projectPhase: (projectPhase, filterInput) => {\n                    if (\n                        projectPhase.propertyPurchasePrice?.priceType === 'PriceOnRequest' ||\n                        projectPhase.propertyRentalPrice?.priceType === 'PriceOnRequest'\n                    )\n                        return true;\n\n                    if (\n                        !projectPhase.propertyPurchasePrice?.amount &&\n                        !projectPhase.propertyRentalPrice?.amount\n                    )\n                        return false;\n\n                    if (filterInput.id === `${filterName}-0`) {\n                        updatedPrice.min = parseInt(filterInput.value);\n                    } else {\n                        updatedPrice.max = parseInt(filterInput.value);\n                    }\n\n                    const range =\n                        filterInput.id === `${filterName}-0`\n                            ? {\n                                  from: parseInt(filterInput.value),\n                                  to: updatedPrice.max,\n                              }\n                            : {\n                                  from: updatedPrice.min,\n                                  to: parseInt(filterInput.value),\n                              };\n\n                    return isRangeWithinRange(\n                        range,\n                        projectPhase.propertyPurchasePrice?.amount! ||\n                            projectPhase.propertyRentalPrice?.amount,\n                    );\n                },\n            },\n            filterName,\n            filterLogic: '&&',\n            hasRangeValues: true,\n            filters: {\n                type: 'range',\n                components: [\n                    {\n                        label: `${filterName}-0`,\n                        value: `${min}`,\n                        id: `${filterName}-0`,\n                        checked: hasFilterUrl(`${min}`, filterName),\n                        name: filterName,\n                        type: 'number',\n                    },\n                    {\n                        label: `${filterName}-1`,\n                        value: `${max}`,\n                        id: `${filterName}-1`,\n                        checked: hasFilterUrl(`${max}`, filterName),\n                        name: filterName,\n                        type: 'number',\n                    },\n                ],\n                rangeSliderOptions: {\n                    min: prices.min,\n                    max: prices.max,\n                    increment,\n                    start: [min, max],\n                    onChange: (e: CustomEvent) => handlePriceChange(e.detail),\n                    name: filterName,\n                },\n            },\n        };\n    }\n};\n","import { ExtendedAreaModels } from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { Filters } from './construct-filters';\n\nconst getHouseTypes = async (data: ExtendedAreaModels): Promise<[string[], string[]]> => {\n    const houseTypes: string[] = [];\n\n    // get unique houseTypes\n    data.constructionNumbers.forEach(({ propertyType }) => {\n        const { houseType } = propertyType || {};\n\n        if (!propertyType || !houseType || houseTypes.includes(houseType)) return;\n\n        houseTypes.push(houseType);\n    });\n\n    // Get unique houseTypes, for property types that don't have constructionNumbers\n    data.propertyTypes.forEach(({ houseType, constructionNumbers }) => {\n        const isUniqueHouseType = houseType && !houseTypes.includes(houseType);\n\n        if (!constructionNumbers?.length && isUniqueHouseType) {\n            houseTypes.push(houseType!);\n        }\n    });\n\n    // Translate houseTypes\n    const translatedHouseTypes = await Promise.all(\n        houseTypes.map(\n            async (houseType) => await translateItem(`PropertyTypeName-${houseType.toLowerCase()}`),\n        ),\n    );\n\n    return [houseTypes, translatedHouseTypes];\n};\n\nexport const setPropertyTypesFilters = async (data: ExtendedAreaModels, filters: Filters) => {\n    const [houseTypes, translatedHouseTypes] = await getHouseTypes(data);\n    const filterName = FILTER_NAMES.propertyTypes;\n\n    filters[filterName] = {\n        expanded: false,\n        icon: 'specs-village-house',\n        title: await translateItem('Filters.PropertyType.label'),\n        dropdownLabel: await translateItem('Filters.PropertyType.dropdownLabel'),\n        filterFunctions: {\n            constructionNumber: (constructionNumber, filterInput) =>\n                constructionNumber.propertyType?.houseType === filterInput.value,\n            propertyType: (propertyType, filterInput) =>\n                propertyType.houseType === filterInput.value,\n            projectPhase: (projectPhase, filterInput) =>\n                projectPhase.propertyTypes\n                    ?.map(({ houseType }) => houseType)\n                    .includes(filterInput.value) || false,\n        },\n        filterName,\n        hasRangeValues: false,\n        filters: {\n            type: 'checkbox',\n            components: houseTypes.map((houseType, i) => {\n                return {\n                    id: `${filterName}-${houseType}`,\n                    label: translatedHouseTypes[i],\n                    value: houseType,\n                    name: filterName,\n                    checked: hasFilterUrl(houseType, filterName),\n                    type: 'checkbox',\n                };\n            }),\n        },\n    };\n};\n","import {\n    ExtendedAreaModels,\n    mergeConstructionNumberSpecification,\n    mergeDecimalRange,\n    mergePropertySpecification,\n} from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport isRangeWithinRange from '@source/utilities/filters/is-range-in-range';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { generateSteps } from '../utilities/generate-steps';\nimport { Filters } from './construct-filters';\n\nconst getRoomSteps = (data: ExtendedAreaModels): number[] => {\n    const filteredPropertyTypes = data.propertyTypes.filter(\n        ({ constructionNumbers }) => !constructionNumbers?.length,\n    );\n\n    const constructionNumberRoomsRange = mergeConstructionNumberSpecification(\n        data.constructionNumbers,\n        'rooms',\n    );\n    const propertyTypeRoomsRange = mergePropertySpecification(\n        { propertyTypes: filteredPropertyTypes },\n        'rooms',\n    );\n\n    const roomsRange = mergeDecimalRange(constructionNumberRoomsRange, propertyTypeRoomsRange);\n\n    const steps = generateSteps({\n        range: roomsRange,\n        stepSize: 1,\n        transformFn: Math.floor,\n    });\n\n    return steps;\n};\n\nexport const setRoomFilters = async (data: ExtendedAreaModels, filters: Filters) => {\n    const steps = getRoomSteps(data);\n    const selectedLabel = await translateItem('Filters.Rooms.selectedLabel');\n\n    if (steps.length) {\n        const filterName = FILTER_NAMES.rooms;\n\n        filters[filterName] = {\n            expanded: false,\n            icon: 'specs-house',\n            title: await translateItem('Filters.Rooms.label'),\n            dropdownLabel: await translateItem('Filters.Rooms.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) => {\n                    if (!constructionNumber.specifications?.rooms) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        constructionNumber.specifications?.rooms,\n                    );\n                },\n                propertyType: (propertyType, filterInput) => {\n                    if (!propertyType.specifications?.rooms) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        propertyType.specifications?.rooms,\n                    );\n                },\n                projectPhase: (projectPhase, filterInput) => {\n                    if (!projectPhase.propertySpecifications?.rooms) return false;\n\n                    return isRangeWithinRange(\n                        {\n                            from: parseInt(filterInput.value),\n                        },\n                        projectPhase.propertySpecifications?.rooms,\n                    );\n                },\n            },\n            filterName: filterName,\n            hasRangeValues: true,\n            filters: {\n                type: 'radio',\n                components: steps.map((step) => ({\n                    id: `${filterName}-${step}`,\n                    label: selectedLabel.replace('[Amount]', `${step}`),\n                    value: `${step}`,\n                    name: filterName,\n                    checked: hasFilterUrl(`${step}`, filterName),\n                    type: 'radio',\n                })),\n            },\n        };\n    }\n};\n","import {\n    ExtendedAreaModels,\n    GeneratedConstructionNumberStatus,\n    PropertyTypeStatus,\n} from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { CONSTRUCTION_NUMBER_STATUS_TRANSLATIONS } from '@source/utilities/api-formatters';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { Filters } from './construct-filters';\n\nconst STATUSES_ORDER: GeneratedConstructionNumberStatus[] = [\n    'InPreparation',\n    'Available',\n    'AssigningOn',\n    'InOption',\n    'Reserved',\n    'Sold',\n    'Rented',\n    'UnderConstruction',\n];\n\nconst DEFAULT_STATUSES: GeneratedConstructionNumberStatus[] = [\n    'Available',\n    'AssigningOn',\n    'InOption',\n    'InPreparation',\n    'Reserved',\n    'Sold',\n];\n\nconst getStatuses = (data: ExtendedAreaModels) => {\n    let statuses: GeneratedConstructionNumberStatus[] & PropertyTypeStatus[] = [];\n\n    data.constructionNumbers.forEach((constructionNumber) => {\n        const { status } = constructionNumber;\n\n        if (!status || statuses.includes(status)) return;\n\n        statuses.push(status);\n    });\n\n    data.propertyTypes.forEach((propertyType) => {\n        /*\n            When a property type has no construction numbers,\n            it will be filtered and in this case the property type\n            status has to be included in the filter.\n        */\n        if (propertyType.constructionNumbers?.length) return;\n\n        // When the status of a property type is SaleSoon, add InPreparation to the filter.\n        const status = propertyType.status === 'SaleSoon' ? 'InPreparation' : propertyType.status;\n\n        if (!status || statuses.includes(status)) return;\n        if (!(status in CONSTRUCTION_NUMBER_STATUS_TRANSLATIONS)) return;\n\n        statuses.push(status);\n    });\n\n    statuses = statuses.sort((a, b) =>\n        STATUSES_ORDER.indexOf(a) < STATUSES_ORDER.indexOf(b) ? -1 : 1,\n    );\n\n    return statuses;\n};\n\nexport const setStatusFilter = async (\n    data: ExtendedAreaModels,\n    filters: Filters,\n    options?: { applyDefaultSettings?: boolean; allProjectsSold?: boolean },\n) => {\n    const statuses = getStatuses(data);\n    const filterName = FILTER_NAMES.status;\n\n    if (options?.allProjectsSold) {\n        DEFAULT_STATUSES.push('UnderConstruction');\n    }\n\n    filters[filterName] = {\n        expanded: false,\n        icon: 'specs-house',\n        title: await translateItem('Filters.Availability.label'),\n        dropdownLabel: await translateItem('Filters.Availability.dropdownLabel'),\n        filterFunctions: {\n            constructionNumber: (constructionNumber, filterInput) =>\n                constructionNumber.status === filterInput.value,\n            propertyType: (propertyType, filterInput) => {\n                if (!propertyType.status) return false;\n\n                /*\n                    There will only be filtered on a propertyType when there are no constructionNumbers.\n                    In this case, the property type will always be InPreparation\n                */\n\n                return filterInput.value === 'InPreparation';\n            },\n            projectPhase: (projectPhase) => {\n                /*\n                    The project phases shown on the map are always in preparation.\n                */\n\n                return !!projectPhase?.status;\n            },\n        },\n        filterName,\n        hasRangeValues: false,\n        filters: {\n            type: 'checkbox',\n            components: await Promise.all(\n                statuses.map(async (status) => {\n                    let checked = false;\n\n                    if (options?.applyDefaultSettings) {\n                        checked = DEFAULT_STATUSES.includes(status);\n                    } else {\n                        checked = hasFilterUrl(status, FILTER_NAMES.status);\n                    }\n\n                    return {\n                        id: `${FILTER_NAMES.status}-${status}`,\n                        label: await translateItem(CONSTRUCTION_NUMBER_STATUS_TRANSLATIONS[status]),\n                        value: status,\n                        name: FILTER_NAMES.status,\n                        checked,\n                        type: 'checkbox',\n                    };\n                }),\n            ),\n        },\n    };\n};\n","import { ExtendedAreaModels } from '@bpd-library/utilities';\nimport { PropertyFilterProps } from '@features/properties/components/property-filter';\n\nimport { setApartmentFilters } from './apartments';\nimport { setDistrictsFilters } from './districts';\nimport { setLivingAreaFilters } from './living-area';\nimport { setPlotAreaFilters } from './plot-area';\nimport { setPriceFilters } from './price';\nimport { setProjectPhasesFilters } from './project-phases';\nimport { setPropertyTypesFilters } from './property-types';\nimport { setRentalFilter } from './rental';\nimport { setRoomFilters } from './rooms';\nimport { setStatusFilter } from './status';\nimport { setSunDirectionFilter } from './sun-direction';\n\nexport interface Filters {\n    [key: string]: PropertyFilterProps;\n}\n\nexport const constructFilters = async (\n    data: ExtendedAreaModels,\n    { allProjectsSold }: { allProjectsSold?: boolean },\n) => {\n    const urlHasParameters = !!window.location.search;\n    const applyDefaultSettings = !urlHasParameters;\n\n    const filters: Filters = {};\n\n    await setApartmentFilters(data.apartmentBuildings, filters);\n    await setDistrictsFilters(data.districts, filters);\n    await setRentalFilter(data, filters, { applyDefaultSettings });\n    await setProjectPhasesFilters(data, filters);\n    await setPriceFilters(data, filters);\n    await setStatusFilter(data, filters, { applyDefaultSettings, allProjectsSold });\n    await setPropertyTypesFilters(data, filters);\n    await setRoomFilters(data, filters);\n    await setLivingAreaFilters(data, filters);\n    await setPlotAreaFilters(data, filters);\n    await setSunDirectionFilter(data, filters);\n\n    return filters;\n};\n","import { ApartmentBuildingModel } from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { Filters } from './construct-filters';\n\nexport const setApartmentFilters = async (\n    apartmentBuildings: ApartmentBuildingModel[],\n    filters: Filters,\n) => {\n    const hasApartmentBuildings = apartmentBuildings.length > 0;\n\n    if (hasApartmentBuildings) {\n        const filterName = FILTER_NAMES.apartmentBuildings;\n\n        filters[filterName] = {\n            expanded: false,\n            icon: 'icons-pin-outline',\n            title: await translateItem('Filters.apartmentBuildings.label'),\n            dropdownLabel: await translateItem('Filters.apartmentBuildings.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) =>\n                    constructionNumber.apartmentBuilding?.id === filterInput.value,\n                propertyType: (propertyType, filterInput) =>\n                    !!propertyType.apartmentBuildings?.length &&\n                    propertyType.apartmentBuildings.map(({ id }) => id).includes(filterInput.value),\n                projectPhase: (projectPhase, filterInput) =>\n                    projectPhase.id ===\n                    apartmentBuildings.find((building) => building.id === filterInput.value)!.id,\n            },\n            filterName,\n            hasRangeValues: false,\n            filters: {\n                type: 'checkbox',\n                components: apartmentBuildings.map((apartmentBuilding) => ({\n                    id: `${filterName}-${apartmentBuilding.displayName}`,\n                    label: `${apartmentBuilding.displayName}`,\n                    value: `${apartmentBuilding.id}`,\n                    name: filterName,\n                    checked: hasFilterUrl(`${apartmentBuilding.id}`, filterName),\n                    type: 'checkbox',\n                })),\n            },\n        };\n    }\n};\n","import { DistrictModel } from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { Filters } from './construct-filters';\n\nexport const setDistrictsFilters = async (districts: DistrictModel[], filters: Filters) => {\n    const { districtId } = window.__ENVIRONMENT_DETAILS__;\n    const hasDistricts = districts.length > 1;\n\n    if (hasDistricts) {\n        // If a districtId is set in __ENVIRONMENT_DETAILS__, it means that the housing overview of a district is opened.\n        // Limit the district filters in that case\n        districts = districtId ? districts.filter(({ id }) => id === districtId) : districts;\n\n        const filterName = FILTER_NAMES.districts;\n\n        filters[filterName] = {\n            expanded: false,\n            icon: 'icons-pin-outline',\n            title: await translateItem('Filters.District.label'),\n            dropdownLabel: await translateItem('Filters.District.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) =>\n                    constructionNumber.districtId === filterInput.value,\n                propertyType: (propertyType, filterInput) =>\n                    propertyType.districtId === filterInput.value,\n                projectPhase: (projectPhase, filterInput) =>\n                    projectPhase.districtId === filterInput.value,\n            },\n            filterName,\n            hasRangeValues: false,\n            filters: {\n                type: 'checkbox',\n                components: districts.map((district) => ({\n                    id: `${filterName}-${district.name}`,\n                    label: `${district.name}`,\n                    value: `${district.id}`,\n                    name: filterName,\n                    checked: hasFilterUrl(`${district.id}`, filterName),\n                    type: 'checkbox',\n                })),\n            },\n        };\n    }\n};\n","import { ExtendedAreaModels } from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { Filters } from './construct-filters';\n\nexport const setRentalFilter = async (\n    data: ExtendedAreaModels,\n    filters: Filters,\n    options: { applyDefaultSettings: boolean },\n) => {\n    const hasRental = !!data.projectPhases.find(({ isRental }) => isRental);\n    const hasSale = !!data.projectPhases.find(({ isRental }) => !isRental);\n\n    if (hasRental && hasSale) {\n        const rentalLabel = await translateItem('Filters.Rental');\n        const buyLabel = await translateItem('Filters.Buy');\n\n        filters[FILTER_NAMES.rental] = {\n            expanded: false,\n            icon: 'specs-house',\n            title: await translateItem('Filters.RentalBuy.label'),\n            dropdownLabel: await translateItem('Filters.RentalBuy.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) => {\n                    const { projectPhase } = constructionNumber;\n\n                    if (!projectPhase) return false;\n\n                    if (filterInput.value === rentalLabel) return !!projectPhase.isRental;\n                    if (filterInput.value === buyLabel) return !projectPhase.isRental;\n\n                    return false;\n                },\n                propertyType: (propertyType, filterInput) => {\n                    const { projectPhase } = propertyType;\n\n                    if (!projectPhase) return false;\n\n                    if (filterInput.value === rentalLabel) return !!projectPhase.isRental;\n                    if (filterInput.value === buyLabel) return !projectPhase.isRental;\n\n                    return false;\n                },\n                projectPhase: (projectPhase, filterInput) => {\n                    if (filterInput.value === rentalLabel) return !!projectPhase.isRental;\n                    if (filterInput.value === buyLabel) return !projectPhase.isRental;\n\n                    return false;\n                },\n            },\n            filterName: FILTER_NAMES.rental,\n            hasRangeValues: false,\n            filters: {\n                type: 'checkbox',\n                components: [\n                    {\n                        id: `${FILTER_NAMES.rental}-${rentalLabel}`,\n                        label: rentalLabel,\n                        value: rentalLabel,\n                        name: FILTER_NAMES.rental,\n                        checked: options.applyDefaultSettings\n                            ? true\n                            : hasFilterUrl(rentalLabel, FILTER_NAMES.rental),\n                        type: 'checkbox',\n                    },\n                    {\n                        id: `${FILTER_NAMES.rental}-${buyLabel}`,\n                        label: buyLabel,\n                        value: buyLabel,\n                        name: FILTER_NAMES.rental,\n                        checked: options.applyDefaultSettings\n                            ? true\n                            : hasFilterUrl(buyLabel, FILTER_NAMES.rental),\n                        type: 'checkbox',\n                    },\n                ],\n            },\n        };\n    }\n};\n","import { ExtendedAreaModels } from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { translateItem } from '@source/utilities/hooks';\n\nimport { Filters } from './construct-filters';\n\nexport const setProjectPhasesFilters = async (data: ExtendedAreaModels, filters: Filters) => {\n    // Project phases without any property types and construction numbers should not be in the filter.\n    const filteredProjectPhases = data.projectPhases.filter(\n        ({ constructionNumbers, propertyTypes }) =>\n            constructionNumbers?.length || propertyTypes?.length,\n    );\n\n    const hasProjectPhases = filteredProjectPhases.length > 1;\n\n    if (hasProjectPhases) {\n        const filterName = FILTER_NAMES.projectPhases;\n\n        filters[filterName] = {\n            expanded: false,\n            icon: 'specs-floors',\n            title: await translateItem('Filters.ProjectPhase.label'),\n            dropdownLabel: await translateItem('Filters.ProjectPhase.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) =>\n                    constructionNumber.projectPhaseId === filterInput.value,\n                propertyType: (propertyType, filterInput) =>\n                    propertyType.projectPhaseId === filterInput.value,\n                projectPhase: (projectPhase, filterInput) => projectPhase.id === filterInput.value,\n            },\n            filterName,\n            hasRangeValues: false,\n            filters: {\n                type: 'checkbox',\n                components: filteredProjectPhases.map((projectPhase) => ({\n                    id: `${filterName}-${projectPhase.name}`,\n                    label: `${projectPhase.name}`,\n                    value: `${projectPhase.id}`,\n                    name: filterName,\n                    checked: hasFilterUrl(`${projectPhase.id}`, filterName),\n                    type: 'checkbox',\n                })),\n            },\n        };\n    }\n};\n","import { ExtendedAreaModels, ExtendedConstructionNumber } from '@bpd-library/utilities';\nimport { FILTER_NAMES } from '@features/properties/components/property-filter';\nimport { hasFilterUrl } from '@source/utilities/filters/urls';\nimport { normalizedTranslateItem, translateItem } from '@source/utilities/hooks';\n\nimport { Filters } from './construct-filters';\n\nexport const setSunDirectionFilter = async (\n    { constructionNumbers }: ExtendedAreaModels,\n    filters: Filters,\n) => {\n    const filterName = FILTER_NAMES.sunDirection;\n\n    const getConstructionNumberSunDirections = (\n        constructionNumber: ExtendedConstructionNumber,\n    ): string[] => {\n        const sunDirections: string[] = [];\n\n        if (constructionNumber.specifications?.sunDirection) {\n            sunDirections.push(constructionNumber.specifications.sunDirection);\n        }\n\n        constructionNumber.gardens\n            ?.map(({ position }) => position)\n            .forEach((position) => {\n                if (position && !sunDirections.includes(position)) {\n                    sunDirections.push(position);\n                }\n            });\n\n        constructionNumber.outsideSpace\n            ?.map(({ position }) => position)\n            .forEach((position) => {\n                if (position && !sunDirections.includes(position)) {\n                    sunDirections.push(position);\n                }\n            });\n\n        return sunDirections;\n    };\n\n    const sunDirections = constructionNumbers.reduce<string[]>((directions, constructionNumber) => {\n        const sunDirections = getConstructionNumberSunDirections(constructionNumber);\n\n        sunDirections.forEach((sunDirection) => {\n            if (!directions.includes(sunDirection)) directions.push(sunDirection);\n        });\n\n        return directions;\n    }, []);\n\n    if (sunDirections.length) {\n        const translatedDirections: Record<string, string> = {};\n        for (const direction of sunDirections) {\n            const translated = await normalizedTranslateItem(\n                'Filters.SunDirection.Direction-',\n                direction,\n            );\n            translatedDirections[direction] = translated;\n        }\n\n        filters[filterName] = {\n            expanded: false,\n            icon: 'icons-sunrise',\n            title: await translateItem('Filters.SunDirection.label'),\n            dropdownLabel: await translateItem('Filters.SunDirection.dropdownLabel'),\n            filterFunctions: {\n                constructionNumber: (constructionNumber, filterInput) => {\n                    const sunDirections = getConstructionNumberSunDirections(constructionNumber);\n                    return sunDirections.includes(filterInput.value);\n                },\n                propertyType: () => {\n                    // Property types don't have a sunDirection property\n                    return false;\n                },\n                projectPhase: () => {\n                    // Project phases don't have a sunDirection property\n                    return false;\n                },\n            },\n            filterName,\n            hasRangeValues: false,\n            filters: {\n                type: 'checkbox',\n                components: sunDirections.map((direction) => ({\n                    id: `${filterName}-${direction}`,\n                    label: `${translatedDirections[direction]}`,\n                    value: `${direction}`,\n                    name: filterName,\n                    checked: hasFilterUrl(`${direction}`, filterName),\n                    type: 'checkbox',\n                })),\n            },\n        };\n    }\n};\n","import '@features/properties/components/tag-list';\n\nimport {\n    Component,\n    defineElement,\n    FC,\n    onDidLoad,\n    useElement,\n    useListen,\n    useProp,\n} from '@atomify/hooks';\nimport { Fragment, h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { Button } from '@atoms/button/button';\nimport { BPDFunctionalSvg } from '@atoms/svg/svg';\nimport { ExtendedAreaModels, rafThrottle, useUrlParams } from '@bpd-library/utilities';\nimport { propertiesStore } from '@features/properties/store';\nimport { addFilters, filterStore, getAllFilters, getSelectedFilters } from '@source/store/filters';\nimport { useTranslate } from '@source/utilities/hooks';\nimport { GTMPush } from '@utilities/gtm';\nimport { isMobile } from '@utilities/media-query';\n\nimport { getFilterOrder, PropertyFilterElement } from '../property-filter';\nimport { constructFilters, Filters } from './filters';\n\nconst HIDDEN_ACTIVE_COUNT_SELECTOR = '[js-hook-properties-filter-hidden-active-count]';\nconst FILTERS_ACTIVE_CLASS = 'properties-filters--filters-active';\nconst HAS_FILTER_EXPAND = 'properties-filters--has-expand';\nconst FILTERS_EXPANDED = 'properties-filters--expanded';\nconst FILTER_IS_HIDDEN = 'property-filter--is-hidden';\nconst FILTER_ACCORDION = 'property-filter--accordion';\nconst FILTER_DROPDOWN = 'property-filter--dropdown';\nconst EXPAND_TOGGLE_WIDTH_DESKTOP = 130;\nconst EXPAND_TOGGLE_WIDTH_MOBILE = 80;\n\ntype FilterVisibilityState = { left: number; width: number; overflow?: boolean };\n\ninterface PropertiesFiltersElement extends Component {\n    expanded: boolean;\n}\n\nexport const PropertiesFilters: FC<PropertiesFiltersElement> = ({ element }) => {\n    const { replace, clearParam } = useUrlParams();\n    const [, subscribe] = useStore(filterStore);\n\n    // Setup filters\n    const [data] = useProp<ExtendedAreaModels>('data');\n    const [, setExpanded, watchExpanded] = useProp<boolean>('expanded', false);\n\n    const filterDropdowns = useElement<HTMLDivElement>('[js-hook-properties-filters-dropdowns]');\n    const expandToggleWrapper = useElement<HTMLDivElement>(\n        '[js-hook-properties-filters-expand-toggle-wrapper]',\n    );\n\n    const filterItemsWidth = new Map<PropertyFilterElement, FilterVisibilityState>();\n    let filterItems: undefined | PropertyFilterElement[];\n    let isMobileDevice = isMobile();\n\n    const updateItemsShownThrottled = rafThrottle(updateItemsShown);\n    useListen(window, 'orientationchange', updateItemsShownThrottled);\n    useListen(window, 'resize', updateItemsShownThrottled);\n\n    onDidLoad(async () => {\n        const allProjectsSold = propertiesStore.getState().allProjectsSold;\n        const filters = await constructFilters(data, { allProjectsSold });\n        const sortedFilters = sortFilters(filters);\n        addFilters(sortedFilters);\n\n        filterDropdowns.current?.append(\n            <Fragment>\n                {Object.keys(sortedFilters).map((key) => (\n                    <property-filter\n                        {...sortedFilters[key as keyof typeof filters]}\n                        class={FILTER_DROPDOWN}\n                        onToggle={collapseAllFilters}\n                    />\n                ))}\n            </Fragment>,\n        );\n\n        filterItems = Array.from(\n            element.querySelectorAll<PropertyFilterElement>('property-filter'),\n        );\n\n        // Wait until all filters are rendered then update the state of the <properties-filters>\n        await Promise.all(filterItems?.map((item) => item && item.componentOnReady()));\n\n        updateFilterItemsWidth();\n        updateItemsShown();\n        updateFilterActiveState();\n    });\n\n    subscribe(handleFilterChange, ['filters']);\n\n    watchExpanded((expanded) => {\n        collapseAllFilters();\n        element.classList[expanded ? 'add' : 'remove'](FILTERS_EXPANDED);\n\n        GTMPush({\n            event: 'gtm.filters',\n            eventCategory: 'Woonwensen',\n            eventAction: expanded ? 'Expand filters' : 'Contract filters',\n        });\n\n        if (isMobileDevice) {\n            if (expanded) {\n                showAllFilters();\n                convertTo('accordion');\n            } else {\n                convertTo('dropdown');\n                updateFilterItemsWidth();\n                updateItemsShown();\n            }\n        }\n    });\n\n    function sortFilters(filters: Filters) {\n        const sortedFilters: Filters = {};\n        getFilterOrder().forEach((filter) => {\n            if (filters[filter]) {\n                sortedFilters[filter] = filters[filter];\n            }\n        });\n        return sortedFilters;\n    }\n\n    function showAllFilters() {\n        filterItems?.forEach((filterItem) => {\n            filterItem.classList.remove(FILTER_IS_HIDDEN);\n        });\n    }\n\n    function convertTo(to: 'accordion' | 'dropdown') {\n        const addName = to === 'accordion' ? FILTER_ACCORDION : FILTER_DROPDOWN;\n        const removeName = to === 'accordion' ? FILTER_DROPDOWN : FILTER_ACCORDION;\n        filterItems?.forEach((filterItem) => {\n            filterItem.classList.add(addName);\n            filterItem.classList.remove(removeName);\n        });\n    }\n\n    function updateFilterItemsWidth() {\n        filterItemsWidth.clear();\n\n        // go through items twice to prevent layout thrashing\n\n        showAllFilters();\n        filterItems?.forEach((filterItem) => {\n            const { left } = filterItem.getBoundingClientRect();\n\n            filterItemsWidth.set(filterItem, {\n                width: filterItem.offsetWidth,\n                left: Math.round(left),\n            });\n        });\n    }\n\n    function updateItemsShown() {\n        if (!(filterItems?.length && filterDropdowns.current)) return;\n\n        const { left: wrapperLeft, width: wrapperWidth } =\n            filterDropdowns.current.getBoundingClientRect();\n\n        const newIsMobile = isMobile();\n\n        if (isMobileDevice !== newIsMobile) {\n            isMobileDevice = newIsMobile;\n\n            if (element.expanded) {\n                setExpanded(false);\n                return;\n            }\n            updateFilterItemsWidth();\n        }\n\n        element.classList.remove(HAS_FILTER_EXPAND);\n\n        const { width: lastFilterWidth, left: lastFilterLeft } = filterItemsWidth.get(\n            filterItems[filterItems.length - 1],\n        )!;\n\n        const showToggle = lastFilterLeft + lastFilterWidth > wrapperLeft + wrapperWidth;\n        const toggleWidth = showToggle\n            ? isMobileDevice\n                ? EXPAND_TOGGLE_WIDTH_MOBILE\n                : EXPAND_TOGGLE_WIDTH_DESKTOP\n            : 0;\n        let hasOverflowItems = false;\n\n        filterItemsWidth.forEach((item, filter) => {\n            const { left: filterLeft, width: filterWidth } = item;\n\n            const isOverflowing =\n                filterLeft + filterWidth > wrapperLeft + wrapperWidth - toggleWidth;\n\n            if (isOverflowing) {\n                filter.classList.add(FILTER_IS_HIDDEN);\n                element.classList.add(HAS_FILTER_EXPAND);\n                item.overflow = true;\n                hasOverflowItems = true;\n            } else {\n                filter.classList.remove(FILTER_IS_HIDDEN);\n                item.overflow = false;\n            }\n        });\n\n        if (hasOverflowItems) {\n            renderExpandToggle();\n            setTimeout(updateExpandToggleLabel, 50);\n        } else {\n            expandToggleWrapper.current!.innerHTML = '';\n        }\n    }\n\n    function handleFilterChange() {\n        const selectedFilters = getSelectedFilters();\n        const allFilters = getAllFilters();\n\n        Object.keys(allFilters).forEach(clearParam);\n\n        if (selectedFilters.length) {\n            element.classList.add(FILTERS_ACTIVE_CLASS);\n\n            selectedFilters.forEach(({ minValue, filterName, maxValue, stringValues }) => {\n                if (minValue && !maxValue) replace(filterName, `${minValue}`);\n                if (maxValue && !minValue) replace(filterName, `${minValue}`);\n                if (maxValue && minValue) replace(filterName, `${minValue}.${maxValue}`);\n                if (stringValues) replace(filterName, stringValues.join('.'));\n            });\n        } else {\n            element.classList.remove(FILTERS_ACTIVE_CLASS);\n        }\n\n        updateFilterActiveState();\n\n        // TODO: improve hacky logic\n        if (!(isMobileDevice && element.expanded)) {\n            updateFilterItemsWidth();\n            updateItemsShown();\n        }\n    }\n\n    function updateFilterActiveState() {\n        if (!filterItems) return;\n        const activeFilters = filterItems.filter(\n            (element) => element.querySelectorAll('input:checked').length > 0,\n        );\n        filterItems.forEach((filter) => filter.classList.remove('active'));\n        activeFilters.forEach((filter) => filter.classList.add('active'));\n    }\n\n    function updateExpandToggleLabel() {\n        if (!expandToggleWrapper.current) return;\n        const countField = expandToggleWrapper.current.querySelector(HIDDEN_ACTIVE_COUNT_SELECTOR);\n        if (!countField) return;\n\n        const activeCount = countHiddenActiveFilters();\n        countField.innerHTML = activeCount ? ` (${activeCount})` : '';\n    }\n\n    function countHiddenActiveFilters() {\n        let count = 0;\n        filterItemsWidth.forEach((item, filter) => {\n            if (!item.overflow) return;\n            count += filter.querySelectorAll('input:checked').length;\n        });\n        return count;\n    }\n\n    function collapseAllFilters() {\n        if (!filterItems?.length) return;\n        filterItems.forEach((filter) => filter.removeAttribute('expanded'));\n    }\n\n    function renderExpandToggle() {\n        if (!expandToggleWrapper.current) return;\n        const expandKey = isMobileDevice ? 'Filters.Filters' : 'Filters.AllFilters';\n\n        expandToggleWrapper.current.innerHTML = '';\n        expandToggleWrapper.current.append(\n            <button class=\"properties-filters__expand-button\" onClick={() => setExpanded(true)}>\n                <BPDFunctionalSvg name=\"icons-filter\" />\n                <span class=\"properties-filters__expand-button-label\">\n                    {useTranslate(expandKey)}\n                    <span js-hook-properties-filter-hidden-active-count />\n                </span>\n            </button>,\n            <button class=\"properties-filters__collapse-button\" onClick={() => setExpanded(false)}>\n                <BPDFunctionalSvg name=\"icons-close\" />\n                <span class=\"properties-filters__collapse-button-label\">\n                    {useTranslate('Filters.AllFiltersClose')}\n                </span>\n            </button>,\n        );\n    }\n\n    return (\n        <Fragment>\n            <div class=\"properties-filters__dropdowns-wrapper\">\n                <Button\n                    variant=\"grey-5\"\n                    icon=\"icons-close\"\n                    size=\"small\"\n                    width=\"square\"\n                    shape=\"round\"\n                    classes=\"properties-filters__expanded-mobile-control properties-filters__collapse\"\n                    onClick={() => setExpanded(false)}\n                />\n\n                <span class=\"properties-filters__expanded-mobile-only u-h4 u-margin-top-2 u-margin-bottom-4\">\n                    {useTranslate('Filters.Filters')}\n                </span>\n\n                <div class=\"properties-filters__expanded-mobile-tag-list\">\n                    <bpd-tag-list disable-collapse />\n                </div>\n\n                <div class=\"properties-filters__dropdowns\" js-hook-properties-filters-dropdowns />\n\n                <div\n                    class=\"properties-filters__expand-toggle-wrapper\"\n                    js-hook-properties-filters-expand-toggle-wrapper\n                />\n\n                <Button\n                    variant=\"primary\"\n                    width=\"full-width\"\n                    classes=\"properties-filters__expanded-mobile-control properties-filters__confirm\"\n                    label={useTranslate('ShowResults')}\n                    onClick={() => setExpanded(false)}\n                />\n            </div>\n\n            <div class=\"properties-filters__action-bar\">\n                <div class=\"properties-filters__tag-list\">\n                    <bpd-tag-list />\n                </div>\n            </div>\n        </Fragment>\n    );\n};\n\nPropertiesFilters.props = {\n    data: {\n        type: Object,\n        required: true,\n    },\n    expanded: {\n        type: Boolean,\n        reflectToAttr: true,\n    },\n};\n\ndefineElement('properties-filters', PropertiesFilters);\n","import { defineElement, FC, useElement } from '@atomify/hooks';\nimport { Fragment, h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { BPDFunctionalSvg } from '@atoms/index';\nimport { propertiesStore, View } from '@features/properties/store';\nimport { useTranslate } from '@utilities/hooks';\n\nexport interface PropertiesBreadcrumbLink {\n    text: string;\n    url: string;\n}\n\nexport interface PropertiesBreadcrumbs extends Element {\n    links: PropertiesBreadcrumbLink[];\n}\n\nconst Breadcrumb = ({ text, onClick }: { text: string | Text; onClick?: Function }) => {\n    return onClick ? (\n        <Fragment>\n            <button\n                class=\"u-h6 c-properties-breadcrumb properties-breadcrumb--clickable\"\n                onClick={onClick}>\n                {text}\n            </button>\n            <span class=\"u-color--grey-20 properties-breadcrumb__chevron\">\n                <BPDFunctionalSvg name=\"arrow-chevron-right\" />\n            </span>\n        </Fragment>\n    ) : (\n        <span class=\"u-h6 u-inline-block\">{text}</span>\n    );\n};\n\nconst PropertiesHomeBreadcrumb = ({ onClick }: { onClick?: Function }) => (\n    <Breadcrumb text={useTranslate('Houses')} onClick={onClick} />\n);\n\nconst PropertiesBreadcrumbsElement: FC<PropertiesBreadcrumbs> = () => {\n    const breadcrumbsWrapper = useElement<HTMLDivElement>('[js-hook-properties-breadcrumbs]');\n\n    const [, subscribeProperties] = useStore(propertiesStore);\n    subscribeProperties(({ view }) => renderBreadcrumbs(view), ['view']);\n\n    async function renderBreadcrumbs(view?: View) {\n        if (!breadcrumbsWrapper.current || !view) return;\n\n        breadcrumbsWrapper.current.innerHTML = '';\n        if (!view.onReturn) {\n            breadcrumbsWrapper.current.append(<PropertiesHomeBreadcrumb />);\n        } else {\n            breadcrumbsWrapper.current.append(<PropertiesHomeBreadcrumb onClick={view.onReturn} />);\n            breadcrumbsWrapper.current.append(\n                <Breadcrumb text={view.name || view.slug || view.type} />,\n            );\n        }\n    }\n\n    return (\n        <div class=\"c-properties-breadcrumbs\" js-hook-properties-breadcrumbs>\n            <PropertiesHomeBreadcrumb />\n        </div>\n    );\n};\n\ndefineElement('properties-breadcrumbs', PropertiesBreadcrumbsElement);\n","import {\n    Component,\n    defineElement,\n    FC,\n    onDidLoad,\n    useElement,\n    useListen,\n    useProp,\n} from '@atomify/hooks';\nimport { Fragment, h } from '@atomify/jsx';\nimport { useStore } from '@atomify/kit';\nimport { clearFocus } from '@bpd-library/components';\nimport { ExtendedAreaModels, getApiObjectLayerRaster } from '@bpd-library/utilities';\nimport {\n    getCurrentView,\n    setAllProjectsSold,\n    updateFilteredData,\n    updateHouseSelectorData,\n    updateSoldProjectsData,\n} from '@features/properties/store';\nimport useLoadingState from '@source/components/atoms/loading-state/hooks/use-loading-state';\nimport { apartmentsViewEvents } from '@source/components/molecules/apartments-view/utilities/constants';\nimport { compareStore, getCompareState } from '@source/store/compare';\nimport { filterStore } from '@source/store/filters';\nimport { formatDetailPageUrl } from '@source/utilities/api-formatters';\nimport getExtendedAreaMapData from '@source/utilities/api-utilities/get-extended-area-map-data';\nimport { useAreaData, useStylesheet } from '@utilities/hooks';\nimport { extendApiModelsWithMapData } from '@utilities/map';\n\nimport { fetchHouseSelectorData } from './components/house-selector/utilities/house-selector-data';\nimport { PropertiesViewElement } from './components/properties-view/properties-view';\nimport { RoutePerObjectHandler, usePropertiesRouting } from './hooks/use-properties-routing';\nimport style from './properties.scss';\nimport { getBoundingBox } from './utilities/bounding-box';\nimport { filterData, filterDataByDistrict, filterHouseSelectorData } from './utilities/data';\nimport { filterSoldProjectPhasesData } from './utilities/sold-project-phase-data';\n\nconst IS_COMPARING_CLASS = 'properties--is-comparing';\n\ninterface PropertiesElement extends Component {\n    houseSelectorId: string | null;\n}\n\nexport const Properties: FC<PropertiesElement> = ({ element }) => {\n    const [houseSelectorId] = useProp<string | null>('houseSelectorId', null);\n    const propertiesFilter = useElement<HTMLDivElement>('[js-hook-properties-filter]');\n    const propertiesView = useElement<HTMLDivElement>('[js-hook-properties-view]');\n\n    let propertiesViewElement: PropertiesViewElement | null | undefined = undefined;\n\n    const [, subscribeFilter] = useStore(filterStore);\n    const [, subscribeCompare] = useStore(compareStore);\n    const { setLoaded } = useLoadingState(element);\n\n    let data: ExtendedAreaModels;\n    let filteredData: ExtendedAreaModels;\n    let isInitialView = true;\n\n    useStylesheet(style);\n\n    const { setRoute, updateCurrentRoute, setInitialRoute } = usePropertiesRouting();\n\n    onDidLoad(async () => {\n        data = await useAreaData();\n\n        data = filterDataByDistrict(data);\n        await extendApiModelsWithMapData(data, { alwaysShowSoldProjectPolygons: true });\n\n        const houseSelectorData = houseSelectorId\n            ? await fetchHouseSelectorData(houseSelectorId)\n            : null;\n\n        // save housing overview data to store before sold data is filtered\n        if (houseSelectorData) {\n            filterHouseSelectorData(houseSelectorData, data);\n            updateHouseSelectorData(houseSelectorData);\n        }\n\n        const soldProjectsData = filterSoldProjectPhasesData(data);\n        updateSoldProjectsData(soldProjectsData);\n\n        if (!data.projectPhases.length) {\n            setAllProjectsSold(true);\n            data = soldProjectsData;\n        }\n\n        await renderPropertiesView(data, {\n            renderHouseSelector: !!houseSelectorData?.views?.length,\n        });\n\n        updateFilteredData(data);\n        renderPropertiesFilter(data);\n\n        setIsComparingClass();\n        setLoaded();\n    });\n\n    subscribeFilter(\n        ({ filters }) => {\n            filteredData = filterData(data, filters);\n\n            updateFilteredData(filteredData);\n\n            if (isInitialView) {\n                setInitialRoute();\n            } else {\n                updateCurrentRoute({ updateHistory: false });\n            }\n\n            isInitialView = false;\n        },\n        ['filters'],\n    );\n\n    subscribeCompare(setIsComparingClass);\n\n    useListen(document, apartmentsViewEvents.UPDATE_ALIAS, ({ detail }) => {\n        setRoute({\n            to: 'apartmentView',\n            slug: detail.apartmentBuildingId,\n        });\n    });\n\n    const handleRouteForObject: RoutePerObjectHandler = (\n        object,\n        { isFullscreen, viewId, isSoldProjectData },\n    ) => {\n        const { type: viewType } = getCurrentView() || {};\n        const isPropertyTypeRoute =\n            viewType === 'propertyType' || viewType === 'apartmentPropertyType';\n        const isConstructionNumberRoute =\n            viewType === 'constructionNumber' || viewType === 'apartmentConstructionNumber';\n\n        switch (object.objectType) {\n            case 'constructionNumber': {\n                if (isPropertyTypeRoute) {\n                    if (isFullscreen) {\n                        propertiesViewElement?.renderCardPopup(object);\n                    }\n\n                    if (isSoldProjectData && object.projectPhaseId) {\n                        setRoute({ to: 'constructionNumber', slug: object.projectPhaseId, viewId });\n                    } else if (object.apartmentBuilding) {\n                        setRoute({\n                            to: 'apartmentView',\n                            slug: object.apartmentBuilding.id,\n                            viewId,\n                        });\n                    } else if (object.propertyTypeId) {\n                        setRoute({ to: 'constructionNumber', slug: object.propertyTypeId, viewId });\n                    }\n\n                    clearFocus();\n                } else if (isConstructionNumberRoute) {\n                    if (isFullscreen) {\n                        propertiesViewElement?.renderCardPopup(object);\n                        if (viewId) updateCurrentRoute({ viewId });\n                    } else {\n                        const url = formatDetailPageUrl({ constructionNumber: object });\n                        if (url) window.location.href = url;\n                    }\n                } else if (viewId) updateCurrentRoute({ viewId });\n                break;\n            }\n            case 'propertyType': {\n                if (isPropertyTypeRoute) {\n                    if (object.constructionNumbers?.length) {\n                        const slug = isSoldProjectData ? object.projectPhaseId : object.id;\n                        slug && setRoute({ to: 'constructionNumber', slug, viewId });\n                        clearFocus();\n                    } else if (isFullscreen) {\n                        propertiesViewElement?.renderCardPopup(object);\n                        if (viewId) updateCurrentRoute({ viewId });\n                    } else {\n                        const url = formatDetailPageUrl({ propertyType: object });\n                        if (url) window.location.href = url;\n                    }\n                    break;\n                } else if (viewId) updateCurrentRoute({ viewId });\n                break;\n            }\n            case 'apartmentBuilding': {\n                if (isPropertyTypeRoute) {\n                    setRoute({ to: 'apartmentView', slug: object.id, viewId });\n                } else if (viewId) updateCurrentRoute({ viewId });\n                break;\n            }\n            case 'projectPhase':\n            case 'district':\n            case 'areaProject': {\n                if (\n                    isPropertyTypeRoute &&\n                    object.objectType === 'projectPhase' &&\n                    isSoldProjectData\n                ) {\n                    setRoute({ to: 'constructionNumber', slug: object.id, viewId });\n                    clearFocus();\n                } else if (viewId) updateCurrentRoute({ viewId });\n                break;\n            }\n        }\n    };\n\n    async function renderPropertiesView(\n        data: ExtendedAreaModels,\n        options: { renderHouseSelector: boolean },\n    ) {\n        const layerRaster = getApiObjectLayerRaster(data.areaProject);\n        const mapData = getExtendedAreaMapData(data);\n        const boundingBox = getBoundingBox(data, mapData);\n\n        propertiesView.current!.append(\n            <properties-view\n                boundingBox={boundingBox}\n                layerRaster={layerRaster}\n                hasHouseSelector={options.renderHouseSelector}\n                onRouteRequested={handleRouteForObject}\n            />,\n        );\n\n        propertiesViewElement =\n            propertiesView.current?.querySelector<PropertiesViewElement>('properties-view');\n\n        await propertiesViewElement?.componentOnReady();\n    }\n\n    function renderPropertiesFilter(data: ExtendedAreaModels) {\n        propertiesFilter.current!.append(<properties-filters data={data} />);\n    }\n\n    function setIsComparingClass() {\n        const { constructionNumberIds } = getCompareState();\n\n        if (constructionNumberIds?.length) {\n            element.classList.add(IS_COMPARING_CLASS);\n        } else {\n            element.classList.remove(IS_COMPARING_CLASS);\n        }\n    }\n\n    return (\n        <Fragment>\n            <div class=\"properties__header\">\n                <properties-breadcrumbs />\n                <div class=\"properties__filters\" js-hook-properties-filter />\n            </div>\n            <div js-hook-properties-view class=\"properties__view\" />\n        </Fragment>\n    );\n};\n\nProperties.props = {\n    houseSelectorId: {\n        type: String,\n    },\n};\n\ndefineElement('bpd-properties', Properties);\n","import { ExtendedConstructionNumber, showPrice } from '@bpd-library/utilities';\nimport { isGermany } from '@utilities/is-germany';\n\nimport { translateItem } from '../hooks';\n\nconst NHG_LIMIT_KEY = 'NHGLimit';\nconst NGH_ECO_LIMIT_KEY = 'NHGEcoLimit';\n\nconst translateNhgLimit = async () => parseInt(await translateItem(NHG_LIMIT_KEY));\nconst translateNhgEcoLimit = async () => parseInt(await translateItem(NGH_ECO_LIMIT_KEY));\n\nconst nhgChecker = () => {\n    let nhgLimit: number;\n    let nhgEcoLimit: number;\n\n    const init = async () => {\n        nhgLimit = await translateNhgLimit();\n        nhgEcoLimit = await translateNhgEcoLimit();\n    };\n\n    const isNhg = (amount: number, options?: { ecoLimit?: boolean }) => {\n        if (options?.ecoLimit) return amount < nhgEcoLimit;\n        return amount <= nhgLimit;\n    };\n\n    const isConstructionNumberNhg = (constructionNumber: ExtendedConstructionNumber) => {\n        if (isGermany() || !showPrice({ constructionNumber })) return false;\n        const price = constructionNumber.salesPrice?.amount?.from;\n        return !!price && isNhg(price, { ecoLimit: constructionNumber.isEnergyNeutral });\n    };\n\n    init();\n\n    return { isConstructionNumberNhg };\n};\n\nconst { isConstructionNumberNhg } = nhgChecker();\n\nexport { isConstructionNumberNhg };\n","import { ExtendedAreaModels } from '@bpd-library/utilities';\n\nimport shouldDrawPolygon from '../api-utilities/should-draw-polygon';\nimport {\n    createApartmentBuildingMapData,\n    createConstructionNumberMapData,\n    createProjectPhaseMapData,\n    createPropertyTypeMapData,\n} from './service';\n\nconst extendApiModelsWithMapData = async (\n    data: ExtendedAreaModels,\n    options?: { alwaysShowSoldProjectPolygons?: boolean },\n): Promise<ExtendedAreaModels> => {\n    data.constructionNumbers\n        .filter((constructionNUmber) => shouldDrawPolygon(constructionNUmber))\n        .forEach((constructionNumber) => {\n            constructionNumber.mapDataItems = createConstructionNumberMapData(constructionNumber);\n        });\n\n    data.propertyTypes\n        .filter((propertyType) => shouldDrawPolygon(propertyType))\n        .forEach((propertyType) => {\n            propertyType.mapDataItems = createPropertyTypeMapData(propertyType);\n        });\n\n    for (const projectPhase of data.projectPhases.filter((project) =>\n        shouldDrawPolygon(project, options),\n    )) {\n        projectPhase.mapDataItems = await createProjectPhaseMapData(projectPhase, options);\n    }\n\n    data.apartmentBuildings!.forEach((apartmentBuilding) => {\n        apartmentBuilding.mapDataItems = createApartmentBuildingMapData(apartmentBuilding);\n    });\n\n    return data;\n};\n\nexport { extendApiModelsWithMapData };\n","import { h } from '@atomify/jsx';\nimport { MapTheme, PointerTheme, PolygonTheme, RGBA } from '@bpd-library/types';\nimport { MapLabel } from '@source/components/atoms/map-label';\nimport { PickPartial } from '@utilities/types';\n\nexport type MapThemeExtension = {\n    polygon?: PolygonTheme;\n    pointer?: PickPartial<PointerTheme, 'settings'>;\n};\n\nexport type RGB = [number, number, number];\n\nexport const WHITE: RGB = [255, 255, 255]; // #FFFFFF\nexport const GREY_LIGHT: RGB = [190, 190, 190]; // #BEBEBE\nexport const GREY_DARK: RGB = [77, 77, 77]; // #4D4D4D\nexport const PURPLE: RGB = [217, 63, 115]; // #D93F73\nexport const RED: RGB = [200, 56, 53]; // #C83835\nexport const ORANGE: RGB = [240, 164, 0]; // #F0A400\nexport const GREEN: RGB = [176, 209, 72]; // #B0D148\nexport const BLUE: RGB = [50, 193, 222]; // #32C1DE\n\nexport const WHITE_ALPHA = [...WHITE, 0.25] as RGBA;\nexport const GREY_LIGHT_ALPHA = [...GREY_LIGHT, 0.25] as RGBA;\nexport const GREY_DARK_ALPHA = [...GREY_DARK, 0.25] as RGBA;\nexport const PURPLE_ALPHA = [...PURPLE, 0.4] as RGBA;\nexport const PURPLE_ALPHA_LIGHT = [...PURPLE, 0.7] as RGBA;\nexport const RED_ALPHA = [...RED, 0.6] as RGBA;\nexport const ORANGE_ALPHA = [...ORANGE, 0.4] as RGBA;\nexport const GREEN_ALPHA = [...GREEN, 0.5] as RGBA;\nexport const BLUE_ALPHA = [...BLUE, 0.6] as RGBA;\nexport const BLUE_ALPHA_LIGHT = [...BLUE, 0.25] as RGBA;\n\nexport const HOVER: {\n    fill: RGBA;\n    stroke: RGBA;\n} = {\n    fill: BLUE_ALPHA,\n    stroke: [...WHITE, 0.8],\n};\n\nexport const POLYGON_STATUS_THEME: MapThemeExtension = {\n    polygon: {\n        settings: [\n            {\n                variant: 'inPreparation',\n                normal: {\n                    fill: WHITE_ALPHA,\n                    stroke: [...GREY_LIGHT, 1],\n                },\n                hover: HOVER,\n            },\n            {\n                variant: 'available',\n                normal: {\n                    fill: GREEN_ALPHA,\n                    stroke: [...WHITE, 1],\n                },\n                hover: HOVER,\n            },\n            {\n                variant: 'inOption',\n                normal: {\n                    fill: ORANGE_ALPHA,\n                    stroke: [...WHITE, 1],\n                },\n                hover: HOVER,\n            },\n            {\n                variant: 'reserved',\n                normal: {\n                    fill: ORANGE_ALPHA,\n                    stroke: [...WHITE, 1],\n                },\n                hover: HOVER,\n            },\n            {\n                variant: 'sold',\n                normal: {\n                    fill: RED_ALPHA,\n                    stroke: [...WHITE, 1],\n                },\n                hover: HOVER,\n            },\n            {\n                variant: 'underConstruction',\n                normal: {\n                    fill: PURPLE_ALPHA,\n                    stroke: [...WHITE, 1],\n                },\n                hover: HOVER,\n            },\n        ],\n    },\n};\n\nexport const PROJECT_PHASE_THEME: MapThemeExtension = {\n    polygon: {\n        settings: [\n            {\n                variant: 'projectPhase',\n                normal: {\n                    fill: WHITE_ALPHA,\n                    stroke: [...GREY_DARK, 1],\n                },\n                hover: {\n                    fill: WHITE_ALPHA,\n                    stroke: [...GREY_DARK, 1],\n                },\n            },\n        ],\n    },\n    pointer: {\n        settings: [\n            {\n                variant: 'projectPhasePointer',\n                minzoom: 14,\n                createElement: (item) => {\n                    return <MapLabel title={item.title} subtitle={item.status} />;\n                },\n            },\n        ],\n    },\n};\n\nexport const extendMapTheme = (...mapThemes: (MapTheme | MapThemeExtension)[]): MapTheme => {\n    const newTheme: MapTheme = {\n        polygon: { settings: [] },\n        pointer: { settings: [], cluster: (total) => <span>{total}</span> },\n    };\n\n    mapThemes.forEach(({ polygon, pointer }) => {\n        polygon?.settings.length && newTheme.polygon?.settings?.push(...polygon.settings);\n        pointer?.settings.length && newTheme.pointer?.settings?.push(...pointer.settings);\n        if (pointer?.cluster && newTheme.pointer) {\n            newTheme.pointer.cluster = pointer.cluster;\n        }\n    });\n\n    return newTheme;\n};\n\nexport const THEME = extendMapTheme(POLYGON_STATUS_THEME, PROJECT_PHASE_THEME);\n","import { MapDataItem } from '@bpd-library/types';\nimport {\n    ExtendedApartmentBuilding,\n    ExtendedConstructionNumber,\n    ExtendedProjectPhase,\n    ExtendedPropertyType,\n    getApiObjectCoordinates,\n} from '@bpd-library/utilities';\n\nimport { formatDetailPageUrl, formatProjectPhaseStatusAsync } from '../api-formatters';\n\nconst createConstructionNumberMapData = (\n    constructionNumber: ExtendedConstructionNumber,\n    options?: { showSold?: boolean },\n): MapDataItem[] | undefined => {\n    const { id } = constructionNumber;\n\n    const coordinates = getApiObjectCoordinates(constructionNumber);\n    if (!coordinates) return;\n\n    const variant = getConstructionNumberVariant(constructionNumber, options);\n    const url = formatDetailPageUrl({ constructionNumber });\n\n    return [\n        {\n            coordinates,\n            id,\n            variant,\n            url,\n            objectType: 'constructionNumber',\n        },\n    ];\n};\n\nconst createPropertyTypeMapData = (\n    propertyType: ExtendedPropertyType,\n): MapDataItem[] | undefined => {\n    const { id } = propertyType;\n\n    const coordinates = getApiObjectCoordinates(propertyType);\n    if (!coordinates) return;\n\n    const variant = getPropertyTypeVariant(propertyType);\n    const url = formatDetailPageUrl({ propertyType });\n\n    return [\n        {\n            coordinates,\n            id,\n            variant,\n            url,\n            objectType: 'propertyType',\n        },\n    ];\n};\n\nconst createProjectPhaseMapData = async (\n    projectPhase: ExtendedProjectPhase,\n    options?: { alwaysShowSoldProjectPolygons?: boolean },\n): Promise<MapDataItem[] | undefined> => {\n    const { id } = projectPhase;\n\n    const coordinates = getApiObjectCoordinates(projectPhase);\n\n    if (!coordinates) return;\n\n    const status = await formatProjectPhaseStatusAsync(projectPhase);\n\n    const useSoldVariant = options?.alwaysShowSoldProjectPolygons && projectPhase.status === 'Sold';\n\n    return [\n        {\n            coordinates,\n            id,\n            variant: useSoldVariant ? 'projectPhaseSold' : 'projectPhase',\n            objectType: 'projectPhase',\n        },\n        {\n            coordinates,\n            id: ` ${id}`,\n            variant: useSoldVariant ? 'projectPhaseSoldPointer' : 'projectPhasePointer',\n            title: projectPhase.name,\n            status: status?.label,\n        },\n    ];\n};\n\nconst createApartmentBuildingMapData = (\n    apartmentBuilding: ExtendedApartmentBuilding,\n): MapDataItem[] | undefined => {\n    const { id } = apartmentBuilding;\n\n    const coordinates = getApiObjectCoordinates(apartmentBuilding);\n    if (!coordinates) return;\n\n    const variant = getApartmentBuildingVariant(apartmentBuilding);\n\n    return [\n        {\n            id,\n            coordinates,\n            variant,\n            objectType: 'apartmentBuilding',\n        },\n    ];\n};\n\nconst getConstructionNumberVariant = (\n    constructionNumber: ExtendedConstructionNumber,\n    options?: { showSold?: boolean },\n): string => {\n    const { propertyType, projectPhase, status } = constructionNumber;\n\n    if (status === 'Reserved') return 'reserved';\n    if (status === 'AssigningOn') return 'inOption';\n\n    if (!propertyType || !projectPhase) return '';\n\n    if (constructionNumber.availabilityStatus === 'Sold' && projectPhase.status === 'Sold')\n        return options?.showSold ? 'underConstruction' : 'hidden';\n\n    if (projectPhase.status === 'InPreparation') return 'inPreparation';\n\n    if (\n        constructionNumber.projectPhase?.status === 'OnSale' ||\n        constructionNumber.projectPhase?.status === 'ForRent'\n    ) {\n        switch (constructionNumber.availabilityStatus) {\n            case 'Available':\n                return 'available';\n            case 'InOption':\n                return 'inOption';\n            case 'Sold':\n                return 'sold';\n        }\n    }\n\n    return 'available';\n};\n\nconst getPropertyTypeVariant = (propertyType: ExtendedPropertyType): string => {\n    switch (propertyType.status) {\n        case 'InPreparation':\n        case 'SaleSoon':\n            return 'inPreparation';\n        case 'SaleStarted':\n        case 'ForRent':\n        case 'AmountAvailable':\n            return 'available';\n        case 'AssigningOn':\n        case 'InOption':\n            return 'inOption';\n        case 'Sold':\n        case 'Rented':\n            return 'sold';\n        case 'UnderConstruction':\n            return 'underConstruction';\n    }\n\n    return '';\n};\n\nconst getApartmentBuildingVariant = (apartmentBuilding: ExtendedApartmentBuilding): string => {\n    const { status } = apartmentBuilding;\n\n    switch (status) {\n        case 'InPreparation':\n        case 'SaleSoon':\n            return 'inPreparation';\n        case 'Available':\n        case 'SaleStarted':\n        case 'AmountAvailable':\n        case 'ForRent':\n            return 'available';\n        case 'InOption':\n        case 'AssigningOn':\n            return 'inOption';\n        case 'Rented':\n        case 'Sold':\n            return 'sold';\n        case 'UnderConstruction':\n            return 'underConstruction';\n    }\n\n    return '';\n};\n\nexport {\n    createConstructionNumberMapData,\n    createPropertyTypeMapData,\n    createProjectPhaseMapData,\n    createApartmentBuildingMapData,\n    getConstructionNumberVariant,\n};\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23333%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_1___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23333%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_2___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23333%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_3___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_4___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23333%27%3E%3Cpath d=%27m10.5 14 4-8 4 8h-8z%27/%3E%3Cpath d=%27m10.5 16 4 8 4-8h-8z%27 fill=%27%23ccc%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_5___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23333%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_6___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23aaa%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath d=%27m14 5 1 1-9 9-1-1 9-9z%27 fill=%27red%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_7___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%2333b5e5%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_8___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23e58978%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_9___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%2333b5e5%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_10___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23e54e33%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_11___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2788%27 height=%2723%27 xmlns=%27http://www.w3.org/2000/svg%27 xmlns:xlink=%27http://www.w3.org/1999/xlink%27 fill-rule=%27evenodd%27%3E%3Cdefs%3E%3Cpath id=%27a%27 d=%27M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z%27/%3E%3Cpath id=%27b%27 d=%27M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z%27/%3E%3C/defs%3E%3Cmask id=%27c%27%3E%3Crect width=%27100%25%27 height=%27100%25%27 fill=%27%23fff%27/%3E%3Cuse xlink:href=%27%23a%27/%3E%3Cuse xlink:href=%27%23b%27/%3E%3C/mask%3E%3Cg opacity=%27.3%27 stroke=%27%23000%27 stroke-width=%273%27%3E%3Ccircle mask=%27url%28%23c%29%27 cx=%2711.5%27 cy=%2711.5%27 r=%279.25%27/%3E%3Cuse xlink:href=%27%23b%27 mask=%27url%28%23c%29%27/%3E%3C/g%3E%3Cg opacity=%27.9%27 fill=%27%23fff%27%3E%3Cuse xlink:href=%27%23a%27/%3E%3Cuse xlink:href=%27%23b%27/%3E%3C/g%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_12___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_13___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_14___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_15___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27%3E%3Cpath d=%27M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_16___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27%3E%3Cpath d=%27m10.5 14 4-8 4 8h-8z%27/%3E%3Cpath d=%27m10.5 16 4 8 4-8h-8z%27 fill=%27%23999%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_17___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23fff%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_18___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23999%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath d=%27m14 5 1 1-9 9-1-1 9-9z%27 fill=%27red%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_19___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2788%27 height=%2723%27 xmlns=%27http://www.w3.org/2000/svg%27 xmlns:xlink=%27http://www.w3.org/1999/xlink%27 fill-rule=%27evenodd%27%3E%3Cdefs%3E%3Cpath id=%27a%27 d=%27M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z%27/%3E%3Cpath id=%27b%27 d=%27M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z%27/%3E%3C/defs%3E%3Cmask id=%27c%27%3E%3Crect width=%27100%25%27 height=%27100%25%27 fill=%27%23fff%27/%3E%3Cuse xlink:href=%27%23a%27/%3E%3Cuse xlink:href=%27%23b%27/%3E%3C/mask%3E%3Cg stroke=%27%23000%27 stroke-width=%273%27%3E%3Ccircle mask=%27url%28%23c%29%27 cx=%2711.5%27 cy=%2711.5%27 r=%279.25%27/%3E%3Cuse xlink:href=%27%23b%27 mask=%27url%28%23c%29%27/%3E%3C/g%3E%3Cg fill=%27%23fff%27%3E%3Cuse xlink:href=%27%23a%27/%3E%3Cuse xlink:href=%27%23b%27/%3E%3C/g%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_20___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_21___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_22___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_23___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27m10.5 14 4-8 4 8h-8z%27/%3E%3Cpath d=%27m10.5 16 4 8 4-8h-8z%27 fill=%27%23ccc%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_24___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_25___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill=%27%23666%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath d=%27m14 5 1 1-9 9-1-1 9-9z%27 fill=%27red%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_26___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2788%27 height=%2723%27 xmlns=%27http://www.w3.org/2000/svg%27 xmlns:xlink=%27http://www.w3.org/1999/xlink%27 fill-rule=%27evenodd%27%3E%3Cdefs%3E%3Cpath id=%27a%27 d=%27M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z%27/%3E%3Cpath id=%27b%27 d=%27M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z%27/%3E%3C/defs%3E%3Cmask id=%27c%27%3E%3Crect width=%27100%25%27 height=%27100%25%27 fill=%27%23fff%27/%3E%3Cuse xlink:href=%27%23a%27/%3E%3Cuse xlink:href=%27%23b%27/%3E%3C/mask%3E%3Cg stroke=%27%23fff%27 stroke-width=%273%27 fill=%27%23fff%27%3E%3Ccircle mask=%27url%28%23c%29%27 cx=%2711.5%27 cy=%2711.5%27 r=%279.25%27/%3E%3Cuse xlink:href=%27%23b%27 mask=%27url%28%23c%29%27/%3E%3C/g%3E%3Cuse xlink:href=%27%23a%27/%3E%3Cuse xlink:href=%27%23b%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_27___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2724%27 height=%2724%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill-rule=%27evenodd%27%3E%3Cpath d=%27M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_28___ = new URL(\"data:image/svg+xml;charset=utf-8,%3Csvg width=%2724%27 height=%2724%27 viewBox=%270 0 20 20%27 xmlns=%27http://www.w3.org/2000/svg%27 fill-rule=%27evenodd%27 fill=%27%23fff%27%3E%3Cpath d=%27M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0%27/%3E%3C/svg%3E\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\nvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\nvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___);\nvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_5___);\nvar ___CSS_LOADER_URL_REPLACEMENT_6___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_6___);\nvar ___CSS_LOADER_URL_REPLACEMENT_7___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_7___);\nvar ___CSS_LOADER_URL_REPLACEMENT_8___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_8___);\nvar ___CSS_LOADER_URL_REPLACEMENT_9___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_9___);\nvar ___CSS_LOADER_URL_REPLACEMENT_10___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_10___);\nvar ___CSS_LOADER_URL_REPLACEMENT_11___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_11___);\nvar ___CSS_LOADER_URL_REPLACEMENT_12___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_12___);\nvar ___CSS_LOADER_URL_REPLACEMENT_13___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_13___);\nvar ___CSS_LOADER_URL_REPLACEMENT_14___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_14___);\nvar ___CSS_LOADER_URL_REPLACEMENT_15___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_15___);\nvar ___CSS_LOADER_URL_REPLACEMENT_16___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_16___);\nvar ___CSS_LOADER_URL_REPLACEMENT_17___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_17___);\nvar ___CSS_LOADER_URL_REPLACEMENT_18___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_18___);\nvar ___CSS_LOADER_URL_REPLACEMENT_19___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_19___);\nvar ___CSS_LOADER_URL_REPLACEMENT_20___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_20___);\nvar ___CSS_LOADER_URL_REPLACEMENT_21___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_21___);\nvar ___CSS_LOADER_URL_REPLACEMENT_22___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_22___);\nvar ___CSS_LOADER_URL_REPLACEMENT_23___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_23___);\nvar ___CSS_LOADER_URL_REPLACEMENT_24___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_24___);\nvar ___CSS_LOADER_URL_REPLACEMENT_25___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_25___);\nvar ___CSS_LOADER_URL_REPLACEMENT_26___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_26___);\nvar ___CSS_LOADER_URL_REPLACEMENT_27___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_27___);\nvar ___CSS_LOADER_URL_REPLACEMENT_28___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_28___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"bpd-properties{display:block;position:relative;width:100%}.properties__header{background-color:var(--color-grey-5);position:-webkit-sticky;position:sticky;top:6.5rem;width:100%;z-index:10}.properties__view,property-filter{position:relative}property-filter{border:0;display:inline-block;padding:0;width:auto}property-filter .checkbox__hover-helper,property-filter .radio__hover-helper{display:none}property-filter .form__item{margin-bottom:0}property-filter[expanded] .property-filter__dropdown-chevron{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}property-filter[expanded] .property-filter__dropdown{opacity:1;pointer-events:all;-webkit-transform:translateY(0);transform:translateY(0);visibility:visible}property-filter[expanded].property-filter--dropdown{z-index:11}property-filter[expanded].property-filter--dropdown .property-filter__toggle{border-color:var(--color-selected)}property-filter[expanded].property-filter--accordion .property-filter__dropdown{max-height:none}property-filter bpd-svg{line-height:1}.property-filter--dropdown .property-filter__toggle{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background-color:var(--color-white);border:.1rem solid var(--color-grey-20);color:var(--color-black);cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;font-size:1.4rem;font-weight:500;height:3.7rem;-webkit-justify-content:space-between;justify-content:space-between;line-height:1.71;padding:.8rem;-webkit-transition:border-color .25s;transition:border-color .25s;width:-webkit-min-content;width:-moz-min-content;width:min-content}.property-filter--dropdown .property-filter__toggle:focus,.property-filter--dropdown .property-filter__toggle:hover{border-color:var(--color-black)}.property-filter--dropdown .property-filter__toggle .svg{opacity:.7}.property-filter--accordion .property-filter__toggle{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:1.4rem;font-weight:600;-webkit-justify-content:flex-start;justify-content:flex-start;letter-spacing:.25px;line-height:1.71;min-height:6.9rem;width:100%}.property-filter__toggle .svg-icons-arrow-down{height:.8rem;opacity:1;width:1.2rem}.property-filter__toggle [class*=svg-specs-]{height:1.7rem;width:1.7rem}.property-filter__toggle .svg-specs-rooms{width:1.6rem}.property-filter__toggle .svg-specs-price{width:1.4rem}.property-filter__toggle .svg-specs-village-house{height:1.9rem;width:2.3rem}.property-filter__dropdown-chevron{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .25s;transition:-webkit-transform .25s;transition:transform .25s;transition:transform .25s,-webkit-transform .25s}.property-filter__label{color:var(--color-grey-50);margin-left:.5rem;margin-right:2rem;-webkit-transition:color .25s;transition:color .25s;white-space:nowrap}.property-filter--accordion .property-filter__label{margin-right:auto}.property-filter__label sup{font-size:1rem;position:relative}.property-filter__dropdown{opacity:0;-webkit-transition-duration:.25s;transition-duration:.25s;-webkit-transition-property:opacity,visibility,max-height,-webkit-transform;transition-property:opacity,visibility,max-height,-webkit-transform;transition-property:opacity,visibility,transform,max-height;transition-property:opacity,visibility,transform,max-height,-webkit-transform}.property-filter--dropdown .property-filter__dropdown{background-color:var(--color-white);border:.1rem solid var(--color-grey-20);padding:1rem;pointer-events:none;position:absolute;-webkit-transform:translateY(1rem);transform:translateY(1rem);visibility:hidden;width:22.5rem}.property-filter--accordion .property-filter__dropdown{max-height:0;position:relative;-webkit-transform:translateY(-3.6rem);transform:translateY(-3.6rem);width:100%}.property-filter__dropdown-filters{overflow-x:hidden;overflow-y:auto}.property-filter--dropdown .property-filter__dropdown-filters{max-height:24rem;padding-top:1.6rem}.property-filter--accordion .property-filter__dropdown-filters{padding-top:.8rem}.property-filter__dropdown-label{color:var(--color-grey-50);display:block;font-size:1.2rem;font-weight:600;letter-spacing:.5px;line-height:1.33}.property-filter__filter .checkbox__label,.property-filter__filter .radio__label{color:var(--color-grey-50);font-size:1.4rem;padding-left:3.5rem}.property-filter__filter .checkbox__label:after,.property-filter__filter .checkbox__label:before,.property-filter__filter .radio__label:after,.property-filter__filter .radio__label:before{height:2rem;width:2rem}.property-filter__filter .checkbox__label:first-letter{text-transform:uppercase}.property-filter__filter .checkbox__label:before{background-size:70%}.property-filter__filter .radio__label:before{height:1rem;left:.5rem;width:1rem}.property-filter--dropdown .property__filter-collapse{height:100%!important}.properties-filters__dropdowns-wrapper,properties-filters{display:block;position:relative;width:100%}.properties-filters__dropdowns-wrapper{padding:0 3.2rem 3.2rem}.properties-filters--expanded .properties-filters__dropdowns-wrapper{padding:0 13rem 3.2rem 3.2rem}.properties-filters__expanded-mobile-only{display:none}.properties-filters__dropdowns{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.properties-filters__dropdowns property-filter{padding-bottom:.8rem;padding-right:.8rem}.properties-filters--expanded .properties-filters__dropdowns{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.properties-filters__expand-toggle-wrapper{display:none;height:100%;min-width:13rem;padding:0 3.2rem 3.2rem;position:absolute;right:0;top:0}.properties-filters--has-expand .properties-filters__expand-toggle-wrapper{display:block}.properties-filters__expand-button{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-align-items:center;align-items:center;background-color:var(--color-white);border:.1rem solid var(--color-grey-20);color:var(--color-black);cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;font-size:1.4rem;font-weight:500;height:3.7rem;-webkit-justify-content:space-between;justify-content:space-between;-webkit-justify-content:flex-start;justify-content:flex-start;line-height:1.71;padding:.8rem;-webkit-transition:border-color .25s;transition:border-color .25s;width:-webkit-min-content;width:-moz-min-content;width:min-content}.properties-filters__expand-button:focus,.properties-filters__expand-button:hover{border-color:var(--color-black)}.properties-filters__expand-button .svg{opacity:.7}.properties-filters--expanded .properties-filters__expand-button{display:none}.properties-filters__expand-button-label{color:var(--color-grey-50);margin-left:.5rem;margin-right:0;-webkit-transition:color .25s;transition:color .25s;white-space:nowrap}.properties-filters__collapse-button{display:none}.properties-filters--expanded .properties-filters__collapse-button{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;color:var(--color-black);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:1.4rem;font-weight:600;gap:.8rem;-webkit-justify-content:center;justify-content:center;letter-spacing:.5px;line-height:1.71;padding:.8rem 1.6rem}.property-filter--is-hidden{display:none}.properties-filters--expanded .property-filter--is-hidden{display:block}.properties-filters__action-bar,.properties-filters__expanded-mobile-tag-list,.properties-filters__tag-list{display:none}.properties-filters__expanded-mobile-control{display:none;position:fixed;z-index:1}.properties-filters__collapse{right:2.4rem;top:3.2rem}.properties-filters__confirm{bottom:3.2rem;left:1.6rem;right:1.6rem;width:auto}.properties-filters__reset{color:var(--color-secondary);font-size:1.6rem;font-weight:600}properties-breadcrumbs{position:relative}.c-properties-breadcrumbs{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-item-align:center;-webkit-align-self:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:2.4rem 3.2rem 1.6rem}.properties-breadcrumb--clickable{-webkit-transition:color .25s ease-in-out;transition:color .25s ease-in-out}html.is-touch--with-mouse .properties-breadcrumb--clickable:hover,html:not(.is-touch) .properties-breadcrumb--clickable:hover{color:var(--color-grey-30)}.properties-breadcrumb__chevron{margin:auto 1.2rem}.tag-list__wrapper,bpd-tag-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tag-list__wrapper{-webkit-box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;max-width:100%}.tag-list__tag{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background-color:var(--color-grey-5);border:.1rem solid var(--color-grey-20);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.8rem 1.4rem}.tag-list__tag:not(:last-child){margin-right:.8rem}.tag-list__tag:focus .tag-list__tag-icon,.tag-list__tag:focus .tag-list__tag-label,.tag-list__tag:hover .tag-list__tag-icon,.tag-list__tag:hover .tag-list__tag-label{color:var(--color-secondary)}.tag-list--collapse-disabled .tag-list__tag{margin-bottom:.8rem}.tag-list__dropdown-items .tag-list__tag{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;width:100%}.tag-list__dropdown-items .tag-list__tag:not(:last-child){margin-bottom:.8rem}.tag-list__tag .svg{display:block;height:.8rem;margin-left:1.4rem;width:.8rem}.tag-list__tag-label{display:block;font-size:1.2rem;font-weight:400;line-height:1.33;max-width:16rem;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.tag-list__tag-label:first-letter{text-transform:uppercase}.tag-list__items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tag-list--collapse-disabled .tag-list__items{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.tag-list__dropdown{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:.5rem;position:relative}.tag-list__dropdown.tag-list__dropdown--visible>.tag-list__tag{background-color:var(--color-white)}.tag-list__dropdown .svg-arrow-chevron-right{height:1rem;-webkit-transform:rotate(90deg);transform:rotate(90deg);width:.6rem}.tag-list__dropdown .tag-list__tag{margin-right:0}.tag-list__dropdown-items{display:none;position:absolute;top:calc(100% - .1rem)}.tag-list__dropdown-items.tag-list__dropdown-items--left{left:0}.tag-list__dropdown-items.tag-list__dropdown-items--right{right:0}.tag-list__dropdown--visible .tag-list__dropdown-items{background-color:var(--color-white);border:.1rem solid hsla(0,0%,61%,.3);display:block;padding:1rem;z-index:11}.mapboxgl-map{-webkit-tap-highlight-color:transparent;font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative}.mapboxgl-canvas{left:0;position:absolute;top:0}.mapboxgl-map:-webkit-full-screen{height:100%;width:100%}.mapboxgl-canary{background-color:salmon}.mapboxgl-canvas-container.mapboxgl-interactive,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass{cursor:-webkit-grab;cursor:grab;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer{cursor:pointer}.mapboxgl-canvas-container.mapboxgl-interactive:active,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active{cursor:-webkit-grabbing;cursor:grabbing}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.mapboxgl-canvas-container.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas{-ms-touch-action:pinch-zoom;touch-action:pinch-zoom}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas{-ms-touch-action:none;touch-action:none}.mapboxgl-ctrl-bottom-left,.mapboxgl-ctrl-bottom-right,.mapboxgl-ctrl-top-left,.mapboxgl-ctrl-top-right{pointer-events:none;position:absolute;z-index:2}.mapboxgl-ctrl-top-left{left:0;top:0}.mapboxgl-ctrl-top-right{right:0;top:0}.mapboxgl-ctrl-bottom-left{bottom:0;left:0}.mapboxgl-ctrl-bottom-right{bottom:0;right:0}.mapboxgl-ctrl{clear:both;pointer-events:auto;-webkit-transform:translate(0);transform:translate(0)}.mapboxgl-ctrl-top-left .mapboxgl-ctrl{float:left;margin:10px 0 0 10px}.mapboxgl-ctrl-top-right .mapboxgl-ctrl{float:right;margin:10px 10px 0 0}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl{float:left;margin:0 0 10px 10px}.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl{float:right;margin:0 10px 10px 0}.mapboxgl-ctrl-group{background:#fff;border-radius:4px}.mapboxgl-ctrl-group:not(:empty){-webkit-box-shadow:0 0 0 2px rgba(0,0,0,.1);box-shadow:0 0 0 2px rgba(0,0,0,.1)}.mapboxgl-ctrl-group button{background-color:transparent;border:0;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;height:29px;outline:0;padding:0;width:29px}.mapboxgl-ctrl-group button+button{border-top:1px solid #ddd}.mapboxgl-ctrl button .mapboxgl-ctrl-icon{background-position:50%;background-repeat:no-repeat;display:block;height:100%;width:100%}.mapboxgl-ctrl-attrib-button:focus,.mapboxgl-ctrl-group button:focus{-webkit-box-shadow:0 0 2px 2px #0096ff;box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl button:disabled{cursor:not-allowed}.mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon{opacity:.25}.mapboxgl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-group button:focus:focus-visible{-webkit-box-shadow:0 0 2px 2px #0096ff;box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl-group button:focus:not(:focus-visible){-webkit-box-shadow:none;box-shadow:none}.mapboxgl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.mapboxgl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.mapboxgl-ctrl-group button:focus:only-child{border-radius:inherit}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_8___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_9___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_10___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting .mapboxgl-ctrl-icon{-webkit-animation:mapboxgl-spin 2s linear infinite;animation:mapboxgl-spin 2s linear infinite}@-webkit-keyframes mapboxgl-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes mapboxgl-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}a.mapboxgl-ctrl-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_11___ + \");background-repeat:no-repeat;cursor:pointer;display:block;height:23px;margin:0 0 -4px -4px;overflow:hidden;width:88px}a.mapboxgl-ctrl-logo.mapboxgl-compact{width:23px}.mapboxgl-ctrl.mapboxgl-ctrl-attrib{background-color:hsla(0,0%,100%,.5);margin:0;padding:0 5px}.mapboxgl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.mapboxgl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.mapboxgl-ctrl-attrib .mapbox-improve-map{font-weight:700;margin-left:2px}.mapboxgl-attrib-empty{display:none}.mapboxgl-ctrl-scale{background-color:hsla(0,0%,100%,.75);border:2px solid #333;border-top:#333;-webkit-box-sizing:border-box;box-sizing:border-box;color:#333;font-size:10px;padding:0 5px}.mapboxgl-popup{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;pointer-events:none;position:absolute;top:0;will-change:transform}.mapboxgl-popup-anchor-top,.mapboxgl-popup-anchor-top-left,.mapboxgl-popup-anchor-top-right{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.mapboxgl-popup-anchor-bottom,.mapboxgl-popup-anchor-bottom-left,.mapboxgl-popup-anchor-bottom-right{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.mapboxgl-popup-anchor-left{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.mapboxgl-popup-anchor-right{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.mapboxgl-popup-tip{border:10px solid transparent;height:0;width:0;z-index:1}.mapboxgl-popup-anchor-top .mapboxgl-popup-tip{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center;border-bottom-color:#fff;border-top:none}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start;border-bottom-color:#fff;border-left:none;border-top:none}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end;border-bottom-color:#fff;border-right:none;border-top:none}.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center;border-bottom:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.mapboxgl-popup-anchor-left .mapboxgl-popup-tip{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center;border-left:none;border-right-color:#fff}.mapboxgl-popup-anchor-right .mapboxgl-popup-tip{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center;border-left-color:#fff;border-right:none}.mapboxgl-popup-close-button{background-color:transparent;border:0;border-radius:0 3px 0 0;cursor:pointer;position:absolute;right:0;top:0}.mapboxgl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.mapboxgl-popup-content{background:#fff;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1);box-shadow:0 1px 2px rgba(0,0,0,.1);padding:10px 10px 15px;pointer-events:auto;position:relative}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content{border-top-left-radius:0}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content{border-top-right-radius:0}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content{border-bottom-left-radius:0}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content{border-bottom-right-radius:0}.mapboxgl-popup-track-pointer{display:none}.mapboxgl-popup-track-pointer *{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mapboxgl-map:hover .mapboxgl-popup-track-pointer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.mapboxgl-map:active .mapboxgl-popup-track-pointer{display:none}.mapboxgl-marker{left:0;opacity:1;position:absolute;top:0;-webkit-transition:opacity .2s;transition:opacity .2s;will-change:transform}.mapboxgl-user-location-dot,.mapboxgl-user-location-dot:before{background-color:#1da1f2;border-radius:50%;height:15px;width:15px}.mapboxgl-user-location-dot:before{-webkit-animation:mapboxgl-user-location-dot-pulse 2s infinite;animation:mapboxgl-user-location-dot-pulse 2s infinite;content:\\\"\\\";position:absolute}.mapboxgl-user-location-dot:after{border:2px solid #fff;border-radius:50%;-webkit-box-shadow:0 0 3px rgba(0,0,0,.35);box-shadow:0 0 3px rgba(0,0,0,.35);-webkit-box-sizing:border-box;box-sizing:border-box;content:\\\"\\\";height:19px;left:-2px;position:absolute;top:-2px;width:19px}.mapboxgl-user-location-show-heading .mapboxgl-user-location-heading{height:0;width:0}.mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after,.mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before{border-bottom:7.5px solid #4aa1eb;content:\\\"\\\";position:absolute}.mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before{border-left:7.5px solid transparent;-webkit-transform:translateY(-28px) skewY(-20deg);transform:translateY(-28px) skewY(-20deg)}.mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after{border-right:7.5px solid transparent;-webkit-transform:translate(7.5px,-28px) skewY(20deg);transform:translate(7.5px,-28px) skewY(20deg)}@-webkit-keyframes mapboxgl-user-location-dot-pulse{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}70%{opacity:0;-webkit-transform:scale(3);transform:scale(3)}to{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes mapboxgl-user-location-dot-pulse{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}70%{opacity:0;-webkit-transform:scale(3);transform:scale(3)}to{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}.mapboxgl-user-location-dot-stale{background-color:#aaa}.mapboxgl-user-location-dot-stale:after{display:none}.mapboxgl-user-location-accuracy-circle{background-color:rgba(29,161,242,.2);border-radius:100%;height:1px;width:1px}.mapboxgl-crosshair,.mapboxgl-crosshair .mapboxgl-interactive,.mapboxgl-crosshair .mapboxgl-interactive:active{cursor:crosshair}.mapboxgl-boxzoom{background:#fff;border:2px dotted #202020;height:0;left:0;opacity:.5;position:absolute;top:0;width:0}bpd-map{display:block;position:relative}.c-map,bpd-map{height:100%;width:100%}.c-map .mapboxgl-canvas,.c-map .mapboxgl-canvas-container{height:100%!important;width:100%!important}.c-map .mapboxgl-ctrl-bottom-left{display:none}.c-map .mapboxgl-popup{pointer-events:all}.c-map .mapboxgl-popup .mapboxgl-popup-content{border-radius:0;-webkit-box-shadow:0 1rem 2rem rgba(0,0,0,.09);box-shadow:0 1rem 2rem rgba(0,0,0,.09);padding:0}.c-map .mapboxgl-ctrl-geocoder,.c-map .mapboxgl-popup .mapboxgl-popup-tip{display:none}.map--hovering .map__cluster:not(:hover),.map--hovering .map__pointer:not(:hover):not(.map__pointer--focus){opacity:.3}.map__container{height:100%;width:100%}.map__cluster,.map__pointer{-webkit-transition:opacity .3s cubic-bezier(.215,.61,.355,1);transition:opacity .3s cubic-bezier(.215,.61,.355,1)}.map__pointer{-webkit-animation:fadein .3s cubic-bezier(.215,.61,.355,1);animation:fadein .3s cubic-bezier(.215,.61,.355,1)}.map__pointer--disabled{pointer-events:none}.map__pointer--fadeout{-webkit-animation:fadeout .3s cubic-bezier(.215,.61,.355,1);animation:fadeout .3s cubic-bezier(.215,.61,.355,1);-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes fadein{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{0%{opacity:1}to{opacity:0}}@keyframes fadeout{0%{opacity:1}to{opacity:0}}.mapboxgl-map{font-family:Avenir Next W02,sans-serif}.map__navigation{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:var(--color-white);-webkit-box-shadow:0 0 2rem 0 rgba(0,0,0,.17);box-shadow:0 0 2rem 0 rgba(0,0,0,.17);-webkit-flex-flow:column wrap;-ms-flex-flow:column wrap;flex-flow:column wrap;position:absolute;right:2.2rem;top:1.8rem;z-index:9}.map__button,.map__navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.map__button{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;color:var(--color-black);height:3.3rem;-webkit-justify-content:center;justify-content:center;width:3.3rem}.map__button+.map__button{border-top:1px solid rgba(0,0,0,.09)}.map__button .svg-icons-plus{height:1.5rem;width:1.5rem}html.is-touch--with-mouse .map__button:hover,html:not(.is-touch) .map__button:hover{background-color:var(--color-bg)}.map__minus{background-color:currentColor;display:block;height:.1rem;width:1.5rem}.map__close,.map__open{display:none}properties-view{display:block;height:100%;position:relative;width:100%}.properties-view__container{background-color:var(--color-grey-5)}.properties-view__container,.properties-view__content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%}.properties-view__content{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:var(--color-white);-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:min-width,max-width;transition-property:min-width,max-width;-webkit-transition-timing-function:cubic-bezier(.455,.03,.515,.955);transition-timing-function:cubic-bezier(.455,.03,.515,.955)}.properties-view__tiles{-webkit-box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;width:100%}.properties-view__tile{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start;text-align:left;width:100%}.properties-view__tile+.properties-view__tile{position:relative}.properties-view__tile+.properties-view__tile:before{background-color:var(--color-grey-10);content:\\\"\\\";height:1px;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:calc(100% - 6.4rem);z-index:1}.properties-view__property-type{width:100%}.properties-view__property-type:not(.is--rendered){min-height:34rem}.properties-view__construction-number{width:100%}.properties-view__construction-number:not(.is--rendered){min-height:14.4rem}.properties-view__header-total{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-column-gap:.4rem;-moz-column-gap:.4rem;column-gap:.4rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:2.6rem;font-weight:500;letter-spacing:.5px;line-height:1.31;padding:3.2rem 3.2rem 1.6rem}.properties-view__visual{min-height:37.5rem;overflow:hidden;position:relative;width:100%}.properties-view--apartments .properties-view__visual .properties-view__apartments{opacity:1;pointer-events:all}.properties-view--apartments .properties-view__visual .properties-view__house-selector,.properties-view--apartments .properties-view__visual .properties-view__map{opacity:0;pointer-events:none}.properties-view--house-selector .properties-view__visual .properties-view__house-selector{opacity:1;pointer-events:all}.properties-view--house-selector .properties-view__visual .properties-view__apartments,.properties-view--house-selector .properties-view__visual .properties-view__map,.properties-view--resizing .properties-view__visual .properties-view__apartments,.properties-view--resizing .properties-view__visual .properties-view__house-selector,.properties-view--resizing .properties-view__visual .properties-view__map{opacity:0;pointer-events:none}.properties-view__visual:has(.uc-embedding-container) .uc-embedding-container{z-index:5}.properties-view__apartments,.properties-view__house-selector,.properties-view__map{height:100%;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;width:100%}.properties-view__house-selector{left:0;top:0;-webkit-transform:translateX(0);transform:translateX(0)}.properties-view__apartments,.properties-view__house-selector{opacity:0;pointer-events:none}.properties-view__no-results{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;-webkit-justify-content:center;justify-content:center}.properties-view__no-results,.properties-view__no-results-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.properties-view__no-results-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:30rem;padding:4rem 0;text-align:center}.properties-view__no-results-inner .svg-icons-wishlist-empty{color:var(--color-grey-20);height:17rem;width:10rem}.properties-view__no-results-title{color:var(--color-grey-50);font-size:1.8rem}.properties-view__no-results-description{color:var(--color-grey-30);font-size:1.4rem;line-height:1.7;margin:1.2rem 0 3rem}.properties-view__compare{bottom:0;left:0;pointer-events:all;position:fixed;width:100%}.properties-view__controls{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;z-index:5}.properties-view__control{pointer-events:all;position:absolute}.properties-view__control-switch{background-color:var(--color-white);border-radius:1.8rem;overflow:hidden}.properties-view__map-zoom-control{display:none}.properties-view__map-zoom-control--plus{border-bottom:1px solid var(--color-grey-10)}.properties-view__map-expand{left:1.6rem;top:1.6rem}.properties-view__map-expand.button-toggle-on .button-label{border:0;height:1px;margin:-1px;opacity:0;overflow:hidden;padding:0;position:absolute;width:1px}.properties-view__2d3d-toggle{gap:.6rem .6rem;padding:1.2rem;right:1.6rem;top:1.6rem}.properties-view__2d3d-toggle .button--square{height:3.2rem;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;width:3.2rem}.properties-view__2d3d-toggle .button--square.button--small:not(:has(.button__label)){width:3.2rem}.properties-view__card-popup{-ms-overflow-style:none;left:3.2rem;max-height:calc(100% - 13.4rem);overflow:scroll;position:absolute;scrollbar-width:none;top:11rem;z-index:5}.properties-view__card-popup::-webkit-scrollbar{display:none}.house-selector__viewport{background-color:var(--color-grey-90);display:grid;height:100%;overflow:scroll;position:relative;width:100%}.house-selector--polygon-hover .house-selector__viewport{cursor:pointer}.house-selector__canvas,.house-selector__pointers,.house-selector__view-image{grid-area:1/-1}.house-selector__canvas{z-index:1}.house-selector__view-image{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.house-selector__pointers{pointer-events:none;position:relative;z-index:2}.house-selector__pointer{pointer-events:all;position:absolute;z-index:3}.house-selector__pointer--text{display:inline-block}.house-selector__pointer--marker{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}html.is-touch--with-mouse .house-selector__pointer--marker:hover,html:not(.is-touch) .house-selector__pointer--marker:hover{-webkit-transform:translate(-50%,-50%) translateY(-.5rem);transform:translate(-50%,-50%) translateY(-.5rem)}.house-selector__polygon-id-helper{background-color:var(--color-grey-10);border-radius:1.6rem;bottom:2.4rem;color:var(--color-grey-90);font-size:1.2rem;font-weight:500;left:2.4rem;letter-spacing:.5px;line-height:1.33;padding:2.4rem;position:absolute;z-index:3}.c-house-selector-card{background-color:var(--color-white);max-width:36rem;min-width:30rem;position:relative}.house-selector-card__content{padding-bottom:2.4rem;padding-left:1.6rem;padding-right:1.6rem}.house-selector-card__status{display:block;min-height:1.7rem}.house-selector-card__main-content{margin-top:1.6rem}.house-selector-card__price{margin-top:.4rem}.house-selector-card__close{position:absolute;right:.8rem;top:.8rem}.house-selector-card__image-container{height:20rem;position:relative;width:100%}.house-selector-card__image{height:100%;left:0;position:absolute;top:0;width:100%}.house-selector-card__object-identifier{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background-color:var(--color-black);border-radius:.2rem;color:var(--color-white);font-size:1.2rem;font-weight:600;-webkit-justify-content:center;justify-content:center;left:1.6rem;letter-spacing:.5px;line-height:1.33;padding:.8rem;position:absolute;top:1.6rem}.house-selector-card__object-identifier,.house-selector-card__specs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.house-selector-card__spec{-webkit-box-flex:2;-ms-flex-positive:2;-webkit-flex-grow:2;flex-grow:2;padding:.8rem;text-align:center}.house-selector-card__spec+.house-selector-card__spec{margin-left:1.6rem}@media only screen and (min-width:48em){.map__navigation{right:1.5rem;top:3rem}}@media only screen and (min-width:64em){bpd-properties{height:calc(100vh - 7.2rem)}.properties__header{top:7.2rem}.properties__view{height:calc(100% - 14.9rem);left:0;position:absolute;top:14.9rem;width:100%}bpd-properties:has(.properties-filters--expanded) .properties__view{height:calc(100% - 18.9rem);top:18.9rem}bpd-properties:has(.properties-filters--filters-active) .properties__view{height:calc(100% - 21.8rem);top:21.8rem}bpd-properties:has(.properties-filters--expanded.properties-filters--filters-active) .properties__view{height:calc(100% - 25.8rem);top:25.8rem}property-filter:nth-of-type(2){margin-right:3.3rem}property-filter:nth-of-type(2):after{background-color:var(--color-grey-20);content:\\\"\\\";height:2.4rem;position:absolute;right:-1.4rem;top:.8rem;width:.1rem}.properties-filters__action-bar{background-color:var(--color-white);border-bottom:1px solid var(--color-grey-10);padding:1.8rem 3.2rem;width:100%}.properties-filters--filters-active .properties-filters__action-bar{display:block}.properties-filters--filters-active .properties-filters__tag-list{-webkit-box-flex:1;-ms-flex-positive:1;display:block;-webkit-flex-grow:1;flex-grow:1}.properties-view__content{max-width:61.5rem;min-width:61.5rem;overflow:scroll}.properties-view--fullscreen .properties-view__content{max-width:0;min-width:0}.properties-view__no-results-inner{padding:9rem 0}.properties-view__compare{display:block;position:-webkit-sticky;position:sticky;z-index:1}.properties-view__map-zoom-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;right:3.2rem;top:3.2rem}.properties-view--apartments .properties-view__map-zoom-control,.properties-view--house-selector .properties-view__map-zoom-control{display:none}.properties-view__map-expand{left:3.2rem;top:3.2rem}.properties-view__2d3d-toggle{right:50%;top:3.2rem;-webkit-transform:translate(50%);transform:translate(50%)}.c-house-selector-card{padding-left:0;padding-right:0}.house-selector-card__close{right:2.4rem;top:2rem}}@media only screen and (max-width:63.96875em){bpd-properties:has(.properties-filters--expanded),bpd-properties:has(.properties-view--fullscreen){height:100vh;left:0;overflow:hidden;position:fixed;top:0;width:100vw;z-index:200}bpd-properties:has(.properties-view--fullscreen) .properties__header{top:0}bpd-properties:has(.properties-view--fullscreen) .properties__view{height:calc(100vh - 12.1rem)}property-filter.property-filter--dropdown button>.svg:first-of-type{display:none}property-filter.property-filter--accordion+property-filter.property-filter--accordion{border-top:1px solid var(--color-grey-20)}.property-filter--dropdown .property-filter__toggle{font-size:1.2rem}.property-filter__label{margin-right:.8rem}.properties-filters--expanded .property-filter__dropdown-label{display:none}.properties-filters__dropdowns-wrapper{padding:0 1.6rem 1.6rem}.properties-filters--expanded .properties-filters__dropdowns-wrapper{background-color:var(--color-white);height:100vh;left:0;overflow:scroll;padding:3.2rem 1.6rem;position:fixed;top:0;width:100vw;z-index:200}.properties-filters--expanded .properties-filters__expanded-mobile-only{display:block}.properties-filters__dropdowns property-filter{padding-bottom:.4rem;padding-right:.4rem}.properties-filters--expanded .properties-filters__dropdowns{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:10rem}.properties-filters__expand-toggle-wrapper{min-width:8rem;padding:0 1.6rem 1.6rem}.properties-filters--expanded .properties-filters__expand-toggle-wrapper{display:none}.properties-filters__expand-button{font-size:1.2rem}.properties-filters__expand-button .svg-icons-filter{height:1.6rem;width:1.2rem}.properties-filters__expand-button-label{margin-right:.8rem}.properties-filters--expanded .properties-filters__expanded-mobile-control,.properties-filters--expanded .properties-filters__expanded-mobile-tag-list{display:block}.c-properties-breadcrumbs{padding:1.6rem}.properties-view__container{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;height:auto}.properties-view--fullscreen .properties-view__container{height:100%}.properties-view--fullscreen .properties-view__content{display:none}.properties-view__tile{padding-left:1.6rem;padding-right:1.6rem}.properties-view__tile+.properties-view__tile:before{width:calc(100% - 1.6rem)}.properties-view__property-type:not(.is--rendered){min-height:20rem}.properties-view__header-total{padding:2.4rem 2.4rem 1.6rem}.properties-view__visual .properties-view__apartments,.properties-view__visual .properties-view__house-selector,.properties-view__visual .properties-view__map{height:37.5rem}.properties-view--fullscreen .properties-view__visual{min-height:100%}.properties-view--fullscreen .properties-view__visual .properties-view__apartments,.properties-view--fullscreen .properties-view__visual .properties-view__house-selector,.properties-view--fullscreen .properties-view__visual .properties-view__map{height:100%}.properties-view__compare,.properties-view__no-results .svg-icons-wishlist-empty{display:none}.properties-view__card-popup{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}}@media(-ms-high-contrast:active){.mapboxgl-ctrl-group:not(:empty){-webkit-box-shadow:0 0 0 2px ButtonText;box-shadow:0 0 0 2px ButtonText}.mapboxgl-ctrl-icon{background-color:transparent}.mapboxgl-ctrl-group button+button{border-top:1px solid ButtonText}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_12___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_13___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_14___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_15___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_16___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_17___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_18___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_8___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_9___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_10___ + \")}a.mapboxgl-ctrl-logo{background-color:transparent;background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_19___ + \")}}@media(-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_20___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_21___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_22___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_23___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_24___ + \")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_25___ + \")}a.mapboxgl-ctrl-logo{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_26___ + \")}}@media screen{.mapboxgl-ctrl-attrib.mapboxgl-compact{background-color:#fff;border-radius:12px;margin:10px;min-height:20px;padding:2px 24px 2px 0;position:relative}.mapboxgl-ctrl-attrib.mapboxgl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact-show,.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact-show{border-radius:12px;padding:2px 8px 2px 28px}.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner{display:none}.mapboxgl-ctrl-attrib-button{background-color:hsla(0,0%,100%,.5);background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_27___ + \");border:0;border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:none;height:24px;outline:0;position:absolute;right:0;top:0;width:24px}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl-attrib-button,.mapboxgl-ctrl-top-left .mapboxgl-ctrl-attrib-button{left:0}.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-button,.mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-inner{display:block}.mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-bottom-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;right:0}.mapboxgl-ctrl-top-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{right:0;top:0}.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{left:0;top:0}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_28___ + \")}}@media screen and (-ms-high-contrast:black-on-white){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url(\" + ___CSS_LOADER_URL_REPLACEMENT_27___ + \")}}@media print{.mapbox-improve-map{display:none}}@media only screen and (max-width:47.96875em){.map__open{bottom:0;display:block;left:0;position:fixed;z-index:9}.map--is-visible .map__close{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background-color:var(--color-white);-webkit-box-shadow:0 0 2rem 0 rgba(0,0,0,.17);box-shadow:0 0 2rem 0 rgba(0,0,0,.17);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:3.3rem;-webkit-justify-content:center;justify-content:center;left:2.2rem;position:fixed;top:1.8rem;width:3.3rem;z-index:11}.map--is-visible .map__close .svg-icons-close{height:1.3rem;width:1.3rem}html.is-touch--with-mouse .map--is-visible .map__close:hover,html:not(.is-touch) .map--is-visible .map__close:hover{background-color:var(--color-bg)}}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n"],"names":["element","loadingState","querySelector","setLoaded","classList","add","addEventListener","remove","IMAGE_PLACEHOLDER","getApartmentBuilding","async","apartmentBuilding","constructionNumbers","options","constructionNumberId","find","c","id","viewId","getApartmentBuildingByViewId","transformApartmentBuildingViews","minimap","transformMinimap","views","v","type","filter","map","mapViewFor","abView","imageUrl","source","pointers","isPointerDataClean","mapPointer","apartmentBuildingId","sourceUrl","minimapView","pointer","constructionNumber","cn","coordinates","compassDirection","label","linkToViewId","position","identifier","status","url","linkedView","amount","p","length","sceneId","pointerTypeTransform","eyeDirection","apartmentBuildings","view","ApartmentsView","expanded","vrTourId","onClose","currConstructionNumberId","setConstructionNumberId","watchConstructionNumberId","vrTourContainer","subscribe","useStore","setViewData","constructionNumberViewId","getApartmentBuildingView","getViewIdByConstructionNumberId","triggerEvent","handleApartmentBuildingChange","firstViewId","document","e","detail","active","current","focusPointer","pointerFilter","setTimeout","vrState","currentView","setMinimap","apartmentBuildingChangeEvent","eventName","emit","class","onMissingData","pointerHighlighted","props","Boolean","String","required","Function","apartmentsViewEvents","UPDATE_ALIAS","ALIAS_CHANGED","getMapCardTitle","apiObject","objectType","houseTypeTranslationKey","propertyType","houseType","toLowerCase","name","projectPhaseName","displayName","compare","render","constructionNumberIds","total","innerHTML","append","window","__ENVIRONMENT_DETAILS__","compareUrl","width","variant","attr","UPDATE_VIEW","UPDATE_FILTER_DATA","UPDATE_VIEW_DATA","UPDATE_SOLD_PROJECTS_DATA","UPDATE_HOUSE_SELECTOR_DATA","SET_ALL_PROJECTS_SOLD","actions","state","filteredData","soldProjectsData","viewData","selectorData","houseSelectorData","allProjectsSold","propertiesStore","initialState","updateFilteredData","data","dispatch","updateView","getCurrentView","getState","getFilteredData","getHouseSelectorView","getBoundingBox","mapData","boundingBox","getGermanyBoundingBox","areaProjectCoordinates","getApiObjectCoordinates","areaProject","projectPhaseCoordinates","projectPhases","reduce","projectPhase","calculateBoundingBox","calculateMapDataBoundingBox","expandBoundingBox","center","getApiObjectCenter","setPropertiesMapBounds","mapInstance","fitBounds","duration","getApartmentBuildingById","setApartmentConstructionNumberView","buildingName","slug","setRoute","usePropertiesRouting","onReturn","to","dispatchEvent","CustomEvent","partition","acc","item","push","undefined","toggleSoldProjectPhaseConstructionNumberPolygons","visible","forEach","mapDataItems","showSold","constructionNumberRoute","parentViewApiObject","dataType","findPropertyType","propertyTypes","soldData","soldProjectPhase","findProjectPhase","viewName","includes","every","ROUTE_TO_PARAM","ROUTE_SLUG_PARAM","ROUTE_LINKED_VIEW_PARAM","currentRoute","routes","defaultRoute","route","pushState","appendUrlParams","history","updateCurrentRoute","updateHistory","parseUrlParams","URL","location","href","searchParams","get","set","delete","toString","setInitialRoute","init","urlParamRoute","preventDefault","createRoutingHook","apartmentView","filteredAB","filteredId","soldAB","nonFilteredData","nonFilteredAB","setApartmentPropertyTypeView","findApartmentBuilding","s","isSoldData","project","mainImage","onCardClick","cardType","stopPropagation","soldProjectPolygons","soldProjects","items","getSoldProjectPhaseMapData","allConstructionNumbers","getInitialRoute","getUrlParam","viewMode","propertyTypeId","LAST_POLYGON_ORDER","PROPERTY_TYPE_VIEW_POLYGON_ORDER","viewLink","FIRST_POLYGON_ORDER","district","CONSTRUCTION_NUMBER_VIEW_POLYGON_ORDER","SOLD_DATA_POLYGON_ORDER","findInPropertiesDataById","object","findExtendedObjectById","isSoldProjectData","setPolygonDrawingOptions","polygon","objectId","canHover","hidden","order","viewType","getViewTypePolygonOrder","isHighLevelPolygon","slugObject","polygonCorrelates","PROPERTIES_THEME","settings","normal","fill","stroke","hover","visibility","disablePointerEvents","createElement","title","subtitle","transformedFilters","Object","keys","key","filterName","hasRangeValues","inputs","filterInputs","input","checked","stringValues","minValue","parseInt","value","maxValue","transformFiltersHasValues","ADD_FILTERS","UPDATE_FILTERS","OPEN_FILTERS","RESET_FILTERS","payload","filters","constructedFilters","filterFunctions","filterLogic","components","transformPayload","isLoading","currentFilter","currentFilterChange","isOpen","newFilters","filterStore","updateFilter","getFilterByType","HouseSelectorCard","image","description","price","specs","isNhg","buttonLabel","buttonUrl","onButtonClick","classes","preload","height","alt","objectFit","icon","shape","size","onClick","color","prefix","suffix","spec","useContentInteraction","virtualTourLabelFocus","event","houseSelectorPolygonFocus","apiObjectIds","houseSelector","houseSelectorElement","hoverDisabled","focusPolygons","polygons","polygonView","getHouseSelectorViewByObjectId","setView","highlightedPolygons","onMouseenter","_","static","apartmentBuildingIds","focusIds","onMouseleave","houseSelectorEvents","STRIPED_IMAGE_URL","stripedImage","BASE_ITEM_STYLE","lineJoin","lineWidth","lineCap","setLineDash","createColoredStyle","strokeColor","fillColor","strokeStyle","join","fillStyle","createStripedStyle","context","createPattern","initCanvasStyles","loadStripedImage","Image","src","blue","green","orange","red","white","purple","link","highlighted","striped","useCanvasRepaint","requestRepaint","styles","dimensions","onRepaint","setState","newState","assign","HouseSelector","setHighlightedPolygons","watchHighlightedPolygons","setCurrentView","onObjectClick","houseSelectorCanvas","viewport","imageContainer","pointersContainer","polygonIdHelper","houseSelectorCanvasContext","panningImage","onResize","setCanvasDimensions","requestAnimationFrame","canvasRepaintState","refresh","viewportDimensions","resize","updatePosition","onUpdate","handleHoverPolygon","hoveredPolygon","getCurrentHoveredPolygon","x","y","hoveredPolygons","path","isPointInPath","reverse","activeHoveredPolygons","showIdInHouseSelector","showHelper","drawViewObjects","hoverPolygons","objects","polygonPx","index","xPx","Math","floor","yPx","convertPercentageGeometryToPixels","clearRect","hovering","some","hovered","style","entries","applyStyle","polygonObject","Path2D","point","moveTo","lineTo","closePath","drawPolygon","pointerProps","iconName","left","top","text","markerProps","onPointerClick","renderPointer","handlePointerClick","polygonHoverEvent","setSource","additionalData","helperObject","JSON","stringify","getHouseSelectorHelperData","setInteractionBehavior","canvasContext","getContext","Error","canvasStyles","updateMousePosition","getBoundingClientRect","nextHighlighted","prevHighlighted","focusPoint","minX","Number","MAX_SAFE_INTEGER","minY","maxX","maxY","asPercentage","findPolygonCenterPoint","PROPERTY_TYPE_VIEW_SORTING","sortData","sortConstructionNumberView","sort","a","b","allocationDate","Date","valueOf","indexOf","sortPropertyTypeView","aIndex","bIndex","saleStartDate","now","calculateDifferenceInDays","renderFunction","threshold","isRendered","inview","inviewObserver","inView","handleInteraction","cb","APARTMENT_CLASS","EXPANDED_MAP_CLASS","NO_RESULTS_CLASS","HIDDEN_CLASS","SWITCH_DEFAULT_PROPS","SWITCH_2D3D_ACTIVE_PROPS","SWITCH_2D3D_INACTIVE_PROPS","SWITCH_ZOOM_ACTIVE_PROPS","PropertiesView","layerRaster","setFullScreen","watchFullScreen","setViewMode","watchViewMode","hasHouseSelector","onRouteRequested","tiles","mapContainer","scrollContainer","viewModeToggle","mapZoomToggle","fullscreenToggle","headerTotal","cardPopup","subscribeMap","subscribeConsentStore","handlePropertyTypeViewHover","mapDataItemId","extendedObject","focusCard","focusPropertyTypeCard","relatedConstructionNumberIds","cardId","card","windowCenter","innerHeight","targetScroll","scrollTop","scroll","behavior","previous","useVisualInteraction","componentOnReady","handleConsent","handleView","renderFullscreenToggleButton","toggleOff","toggleOn","fullScreen","renderViewModeToggle","action","closeCardPopup","toggleViewportResizing","initResizeEvent","renderPropertiesViewCardPopup","formattedStatus","formattedPrice","livingArea","plotArea","rooms","consent","renderMap","autoOpenUrl","theme","renderSDPBanner","resizeMap","setViewTypeClass","isApartmentView","setHouseSelectorView","nextView","sortHouseSelectorData","orderA","orderB","hasCurrentViewDataObjects","setHeaderTotal","hasPropertyTypes","titleSingular","titlePlural","renderTiles","tileElements","ButtonContainer","onTouchStart","onTouchEnd","housesAmount","debugId","propertiesId","orientation","canShowPrice","hidePrice","propertyTypeName","wishlistItemCount","shoppingCartUrl","website","disablePropertyComparison","getTiles","renderNoResults","eventCategory","eventAction","direction","eventLabel","zoomIn","zoomOut","renderMapZoomToggle","click","handlePropertiesViewObjectClick","dimensionality","mapbox","isFullscreen","resizeEvent","isResizing","Array","reflectToAttr","FILTER_NAMES","FILTER_ORDER_NL","FILTER_ORDER_DE","transformFilterLabel","transformFilter","replacer","replace","toCurrency","transformTagLabel","filterInput","getFilterInputByValue","prices","split","PropertyFilter","filterTitle","dropdownLabel","onToggle","setExpanded","watchExpanded","rangeSliderOptions","inputElements","contentCollapse","rangeSlider","getLabel","currentTarget","clickOutside","resetInputState","relatedInput","from","resetState","updateFilterLabel","handleFilterToggle","nextExpandedState","component","hideError","generateInputs","DROPDOWN_VISIBLE_CLASS","TagList","disableCollapse","wrapper","dropdown","appendTagList","renderTagList","tags","generateTags","handleOverflow","querySelectorAll","overflow","getOverflowElements","container","children","containerWidth","clientWidth","containerOffsetLeft","offsetLeft","child","toggleDropdown","contains","hideDropdown","search","hasFilterUrl","params","URLSearchParams","rangeA","rangeB","moreThanMin","lessThanMax","generateSteps","range","stepSize","transformFn","steps","step","setLivingAreaFilters","filteredPropertyTypes","constructionNumberRange","mergeConstructionNumberSpecification","propertyTypeRange","mergePropertySpecification","livingAreaRange","mergeDecimalRange","generateLivingAreaSteps","specifications","propertySpecifications","setPlotAreaFilters","plotAreaRange","getPlotAreaSteps","setPriceFilters","increment","isRental","amounts","showPrice","salesPrice","rentalPrice","min","max","getPrices","handlePriceChange","updatedPrice","priceType","propertyPurchasePrice","propertyRentalPrice","start","onChange","setPropertyTypesFilters","houseTypes","translatedHouseTypes","isUniqueHouseType","Promise","all","getHouseTypes","i","setRoomFilters","constructionNumberRoomsRange","propertyTypeRoomsRange","roomsRange","getRoomSteps","selectedLabel","STATUSES_ORDER","DEFAULT_STATUSES","setStatusFilter","statuses","getStatuses","applyDefaultSettings","constructFilters","building","setApartmentFilters","districts","districtId","setDistrictsFilters","hasRental","hasSale","rentalLabel","buyLabel","setRentalFilter","filteredProjectPhases","projectPhaseId","setProjectPhasesFilters","getConstructionNumberSunDirections","sunDirections","sunDirection","gardens","outsideSpace","directions","translatedDirections","translated","setSunDirectionFilter","FILTERS_ACTIVE_CLASS","HAS_FILTER_EXPAND","FILTER_IS_HIDDEN","FILTER_ACCORDION","FILTER_DROPDOWN","PropertiesFilters","clearParam","filterDropdowns","expandToggleWrapper","filterItemsWidth","Map","filterItems","isMobileDevice","updateItemsShownThrottled","updateItemsShown","showAllFilters","filterItem","convertTo","addName","removeName","updateFilterItemsWidth","clear","offsetWidth","round","wrapperLeft","wrapperWidth","newIsMobile","lastFilterWidth","lastFilterLeft","toggleWidth","hasOverflowItems","filterLeft","filterWidth","renderExpandToggle","expandKey","updateExpandToggleLabel","updateFilterActiveState","activeFilters","countField","activeCount","countHiddenActiveFilters","count","collapseAllFilters","removeAttribute","sortedFilters","sortFilters","getFilterOrder","handleFilterChange","selectedFilters","getSelectedFilters","allFilters","Breadcrumb","PropertiesHomeBreadcrumb","breadcrumbsWrapper","subscribeProperties","renderBreadcrumbs","IS_COMPARING_CLASS","Properties","houseSelectorId","propertiesFilter","propertiesView","propertiesViewElement","subscribeFilter","subscribeCompare","isInitialView","filterDataByDistrict","stagedData","filterConstructionNumbers","filterPropertyTypes","filterProjectPhases","filterDistricts","alwaysShowSoldProjectPolygons","error","console","fetchHouseSelectorData","filterHouseSelectorData","areaData","updateHouseSelectorData","notSoldProjects","soldPropertyTypes","notSoldPropertyTypes","soldConstructionNumbers","notSoldConstructionNumbers","soldApartmentBuildings","notSoldApartmentBuildings","filterSoldProjectPhasesData","updateSoldProjectsData","renderPropertiesView","getApiObjectLayerRaster","renderHouseSelector","handleRouteForObject","renderPropertiesFilter","setIsComparingClass","filterData","includedIds","hasIncludedObject","objectIsIncluded","inputsPerFilter","groupFilter","isIncluded","hasConstructionNumbers","isPropertyTypeRoute","isConstructionNumberRoute","renderCardPopup","isConstructionNumberNhg","nhgLimit","nhgEcoLimit","translateNhgLimit","translateNhgEcoLimit","ecoLimit","isEnergyNeutral","nhgChecker","extendApiModelsWithMapData","constructionNUmber","WHITE","GREY_LIGHT","GREY_DARK","PURPLE","RED","ORANGE","GREEN","BLUE","WHITE_ALPHA","PURPLE_ALPHA","PURPLE_ALPHA_LIGHT","RED_ALPHA","ORANGE_ALPHA","GREEN_ALPHA","BLUE_ALPHA","BLUE_ALPHA_LIGHT","HOVER","POLYGON_STATUS_THEME","PROJECT_PHASE_THEME","minzoom","extendMapTheme","newTheme","cluster","mapThemes","THEME","createConstructionNumberMapData","getConstructionNumberVariant","createPropertyTypeMapData","getPropertyTypeVariant","createProjectPhaseMapData","useSoldVariant","createApartmentBuildingMapData","getApartmentBuildingVariant","availabilityStatus","___CSS_LOADER_URL_IMPORT_0___","___CSS_LOADER_URL_IMPORT_1___","___CSS_LOADER_URL_IMPORT_2___","___CSS_LOADER_URL_IMPORT_3___","___CSS_LOADER_URL_IMPORT_4___","___CSS_LOADER_URL_IMPORT_5___","___CSS_LOADER_URL_IMPORT_6___","___CSS_LOADER_URL_IMPORT_7___","___CSS_LOADER_URL_IMPORT_8___","___CSS_LOADER_URL_IMPORT_9___","___CSS_LOADER_URL_IMPORT_10___","___CSS_LOADER_URL_IMPORT_11___","___CSS_LOADER_URL_IMPORT_12___","___CSS_LOADER_URL_IMPORT_13___","___CSS_LOADER_URL_IMPORT_14___","___CSS_LOADER_URL_IMPORT_15___","___CSS_LOADER_URL_IMPORT_16___","___CSS_LOADER_URL_IMPORT_17___","___CSS_LOADER_URL_IMPORT_18___","___CSS_LOADER_URL_IMPORT_19___","___CSS_LOADER_URL_IMPORT_20___","___CSS_LOADER_URL_IMPORT_21___","___CSS_LOADER_URL_IMPORT_22___","___CSS_LOADER_URL_IMPORT_23___","___CSS_LOADER_URL_IMPORT_24___","___CSS_LOADER_URL_IMPORT_25___","___CSS_LOADER_URL_IMPORT_26___","___CSS_LOADER_URL_IMPORT_27___","___CSS_LOADER_URL_IMPORT_28___","___CSS_LOADER_EXPORT___","___CSS_LOADER_URL_REPLACEMENT_0___","___CSS_LOADER_URL_REPLACEMENT_1___","___CSS_LOADER_URL_REPLACEMENT_2___","___CSS_LOADER_URL_REPLACEMENT_3___","___CSS_LOADER_URL_REPLACEMENT_4___","___CSS_LOADER_URL_REPLACEMENT_5___","___CSS_LOADER_URL_REPLACEMENT_6___","___CSS_LOADER_URL_REPLACEMENT_7___","___CSS_LOADER_URL_REPLACEMENT_8___","___CSS_LOADER_URL_REPLACEMENT_9___","___CSS_LOADER_URL_REPLACEMENT_10___","___CSS_LOADER_URL_REPLACEMENT_11___","___CSS_LOADER_URL_REPLACEMENT_12___","___CSS_LOADER_URL_REPLACEMENT_13___","___CSS_LOADER_URL_REPLACEMENT_14___","___CSS_LOADER_URL_REPLACEMENT_15___","___CSS_LOADER_URL_REPLACEMENT_16___","___CSS_LOADER_URL_REPLACEMENT_17___","___CSS_LOADER_URL_REPLACEMENT_18___","___CSS_LOADER_URL_REPLACEMENT_19___","___CSS_LOADER_URL_REPLACEMENT_20___","___CSS_LOADER_URL_REPLACEMENT_21___","___CSS_LOADER_URL_REPLACEMENT_22___","___CSS_LOADER_URL_REPLACEMENT_23___","___CSS_LOADER_URL_REPLACEMENT_24___","___CSS_LOADER_URL_REPLACEMENT_25___","___CSS_LOADER_URL_REPLACEMENT_26___","___CSS_LOADER_URL_REPLACEMENT_27___","___CSS_LOADER_URL_REPLACEMENT_28___","module"],"sourceRoot":""}