{"id":32305,"date":"2025-03-31T10:00:38","date_gmt":"2025-03-31T07:00:38","guid":{"rendered":"https:\/\/buildingbox.isgcm.com\/?post_type=investment_property&#038;p=32305"},"modified":"2025-06-25T11:37:40","modified_gmt":"2025-06-25T08:37:40","slug":"kompleks-uebsila","status":"publish","type":"investment_property","link":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/","title":{"rendered":"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"32305\" class=\"elementor elementor-32305\" data-elementor-post-type=\"investment_property\">\n\t\t\t\t<div class=\"elementor-element elementor-element-59c5f0b e-con-full e-flex e-con e-parent\" data-id=\"59c5f0b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4be3af47 e-con-full e-flex e-con e-parent\" data-id=\"4be3af47\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-25a0823e elementor-widget elementor-widget-shortcode\" data-id=\"25a0823e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <div class=\"websy-main-container\">\n        <!-- Map Section -->\n        <div class=\"websy-main-map-container\">\n            <div class=\"websy-main-zoom-controls\" style=\"display: none;\">\n                <button class=\"websy-zoom-btn zoom-in\" title=\"Zoom In\">+<\/button>\n                <button class=\"websy-zoom-btn zoom-out\" title=\"Zoom Out\">-<\/button>\n                <button class=\"websy-zoom-btn zoom-reset\" title=\"Reset Zoom\">\u2302<\/button>\n            <\/div>\n            <div id=\"canvas-scroll-container\">\n                <svg id=\"frontend-svg\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/svg>\n            <\/div>\n        <\/div>\n\n        <!-- Websy bedroom filter -->\n        <div class=\"websy-modal-bedrooms\">\n            <div class=\"websy-modal-bedrooms-header\">\n                <strong>\u0421\u043f\u0430\u043b\u043d\u0438:<\/strong>\n            <\/div>\n                <div class=\"websy-modal-bedrooms-content\">\n                    <a href=\"https:\/\/buildingbox.isgcm.com\/en\/apartment-map\/?post=32305&#038;type=1+bedroom\">1<\/a>\n                    <a href=\"https:\/\/buildingbox.isgcm.com\/en\/apartment-map\/?post=32305&#038;type=2+bedroom\">2<\/a>\n                    <a href=\"https:\/\/buildingbox.isgcm.com\/en\/apartment-map\/?post=32305&#038;type=3+bedroom\">3<\/a>\n                <\/div>\n        <\/div>\n        \n        <!-- Navigation Section -->\n        <div class=\"websy-main-navigation\">\n            <div class=\"websy-main-nav-content\">\n                <div class=\"websy-nav-loading\">Loading navigation...<\/div>\n            <\/div>\n                        <div class=\"websy-contact-form-section\">\n                <button type=\"button\" id=\"websy-request-consultation-btn\" class=\"websy-consultation-btn\">\n                    Request Consultation                <\/button>\n            <\/div>\n                    <\/div>\n    <\/div>\n\n    <!-- Contact Form Modal -->\n        <div id=\"websy-contact-modal\" class=\"websy-modal-cf\" style=\"display: none;\">\n        <div class=\"websy-modal-cf-backdrop\"><\/div>\n        <div class=\"websy-modal-cf-container\">\n            <div class=\"websy-modal-cf-header\">\n                <h3>Request Consultation<\/h3>\n                <button type=\"button\" class=\"websy-modal-cf-close\" id=\"websy-contact-modal-close\">&times;<\/button>\n            <\/div>\n            <div class=\"websy-modal-cf-content\">\n                <form id=\"websy-contact-form\" class=\"websy-contact-form\">\n                    <div class=\"websy-form-group\">\n                        <label for=\"websy-contact-name\">Full Name <span class=\"required\">*<\/span><\/label>\n                        <input type=\"text\" id=\"websy-contact-name\" name=\"name\" required \/>\n                    <\/div>\n                    \n                    <div class=\"websy-form-group\">\n                        <label for=\"websy-contact-email\">Email Address <span class=\"required\">*<\/span><\/label>\n                        <input type=\"email\" id=\"websy-contact-email\" name=\"email\" required \/>\n                    <\/div>\n                    \n                    <div class=\"websy-form-group\">\n                        <label for=\"websy-contact-phone\">Phone Number<\/label>\n                        <input type=\"tel\" id=\"websy-contact-phone\" name=\"phone\" \/>\n                    <\/div>\n                    \n                    <div class=\"websy-form-group\">\n                        <label for=\"websy-contact-message\">Message <span class=\"required\">*<\/span><\/label>\n                        <textarea id=\"websy-contact-message\" name=\"message\" rows=\"4\" required placeholder=\"Please describe what you are looking for...\"><\/textarea>\n                    <\/div>\n                    \n                    <div class=\"websy-form-actions\">\n                        <button type=\"submit\" class=\"websy-btn websy-btn-primary\" id=\"websy-contact-submit\">\n                            Send Request                        <\/button>\n                    <\/div>\n                    \n                    <div id=\"websy-contact-status\" class=\"websy-form-status\"><\/div>\n                <\/form>\n            <\/div>\n        <\/div>\n    <\/div>\n    \n    <style>\n    \/* Main container with modal-inspired design *\/\n    .websy-main-container {\n        width: 100%;\n        \/* background: #fff; *\/\n        \/* box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); *\/\n        overflow: hidden;\n        \/* border: 1px solid #e0e0e0; *\/\n        min-height: 80vh;\n        position: relative;\n    }\n    \n    \/* Map container section *\/\n    .websy-main-map-container {\n        width: 100%;\n        height: auto;\n        min-height: 600px;\n        position: relative;\n        background: #f8f9fa;\n        border-bottom: 1px solid #4d40b4;\n        padding-bottom: 25px;\n        margin-bottom: 25px;\n    }\n\n    .elementor-shortcode .websy-main-map-container {\n        border-bottom: unset;\n        padding-bottom: unset;\n        margin-bottom: unset;\n\n    }\n\n    \n    \/* Navigation section overlapping the bottom of the map *\/\n    .websy-main-navigation {\n        \/* position: absolute; *\/\n        \/* margin-top: 20px; *\/\n        \/* background: rgb(255 255 255 \/ 60%); *\/\n        \/* backdrop-filter: blur(10px); *\/\n        \/* box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); *\/\n        \/* border: 1px solid rgba(255, 255, 255, 0.3); *\/\n        z-index: 1000;\n        \/* max-height: 200px; *\/\n        overflow: hidden;\n    }\n\n    \/*Hide navigation when we display it as shortcode and for building single cpt*\/\n    .elementor-shortcode .websy-main-navigation, .single-building .websy-main-navigation, .single-apartment .websy-main-navigation{\n        display: none !important;\n    }\n\n    .single-apartment .websy-modal-bedrooms,\n    .elementor-shortcode .websy-modal-bedrooms,\n    .single-complex .websy-modal-bedrooms,\n    .single-building .websy-modal-bedrooms,\n    .single-entrance .websy-modal-bedrooms {\n        display: none;\n    }\n    \n    .websy-main-nav-header {\n        padding: 16px 20px 12px 20px;\n        border-bottom: 1px solid rgba(224, 224, 224, 0.3);\n        background: transparent;\n        flex-shrink: 0;\n    }\n    \n    .websy-main-nav-title {\n        margin: 0;\n        font-size: 1em;\n        font-weight: 600;\n        color: #333;\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n    }\n    \n    .websy-main-nav-title-row {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        font-size: 1.5rem;\n    }\n    \n    .websy-main-nav-subtitle {\n        font-size: 0.85em;\n        font-weight: 400;\n        color: #666;\n        line-height: 1.2;\n    }\n    \n    .websy-main-nav-icon {\n        width: 18px;\n        height: 18px;\n        background: #007cba;\n        border-radius: 4px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        color: white;\n        font-size: 10px;\n        font-weight: bold;\n        display: none;\n    }\n    \n    .websy-main-nav-content {\n        flex: 1;\n        overflow-y: auto;\n        overflow-x: hidden;\n        padding: 8px 0;\n        \/* max-height: 140px; *\/\n        \/* Custom scrollbar styling *\/\n        scrollbar-width: thin;\n        scrollbar-color: rgba(0, 124, 186, 0.6) rgba(241, 241, 241, 0.3);\n    }\n    \n    .websy-main-nav-content::-webkit-scrollbar {\n        width: 4px;\n    }\n    \n    .websy-main-nav-content::-webkit-scrollbar-track {\n        background: rgba(241, 241, 241, 0.3);\n        border-radius: 2px;\n    }\n    \n    .websy-main-nav-content::-webkit-scrollbar-thumb {\n        background: rgba(0, 124, 186, 0.6);\n        border-radius: 2px;\n    }\n    \n    .websy-main-nav-content::-webkit-scrollbar-thumb:hover {\n        background: rgba(0, 90, 135, 0.8);\n    }\n    \n    \/* Main zoom controls *\/\n    .websy-main-zoom-controls {\n        position: absolute;\n        top: 20px;\n        right: 20px;\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n        z-index: 1001;\n        opacity: 0.9;\n        transition: opacity 0.2s ease;\n    }\n    \n    .websy-main-zoom-controls:hover {\n        opacity: 1;\n    }\n    \n    \/* Map container styles *\/\n    #canvas-scroll-container {\n        width: 100%;\n        height: 100%;\n        overflow: hidden;\n        position: relative;\n        background: #fff;\n        \/* Enable smooth scrolling *\/\n        scroll-behavior: smooth;\n        \/* Custom scrollbars for better UX - hidden by default *\/\n        scrollbar-width: none;\n        scrollbar-color: #007cba #f1f1f1;\n        \/* Allow pinch-to-zoom on mobile *\/\n        touch-action: manipulation;\n        \/* Center content by default *\/\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    \n    #canvas-scroll-container svg {\n        width: 100%;\n        height: 100%;\n        object-fit: contain;\n        display: block;\n    }\n    \n    #canvas-scroll-container::-webkit-scrollbar {\n        display: none; \/* Hide scrollbars completely by default *\/\n    }\n    \n    #canvas-scroll-container.centered {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        overflow: hidden;\n        width: 100%;\n        height: 100%;\n    }\n    \n    #canvas-scroll-container.fit-to-container {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        overflow: hidden;\n        width: 100%;\n        height: 100%;\n    }\n    \n    #canvas-scroll-container.full-size {\n        \/* Only used when zoom controls are active *\/\n        overflow: auto;\n        display: block;\n        justify-content: flex-start;\n        align-items: flex-start;\n    }\n    \n    #canvas-scroll-container.full-size svg {\n        max-width: none;\n        max-height: none;\n        width: auto;\n        height: auto;\n    }\n    \n    #canvas-scroll-container.full-size::-webkit-scrollbar {\n        width: 8px;\n        height: 8px;\n        display: block; \/* Show scrollbars only in zoom mode *\/\n    }\n    \n    #canvas-scroll-container.full-size::-webkit-scrollbar-track {\n        background: #f1f1f1;\n        border-radius: 4px;\n    }\n    \n    #canvas-scroll-container.full-size::-webkit-scrollbar-thumb {\n        background: #007cba;\n        border-radius: 4px;\n    }\n    \n    #canvas-scroll-container.full-size::-webkit-scrollbar-thumb:hover {\n        background: #005a87;\n    }\n    \n    #canvas-scroll-container.grabbing {\n        \/* cursor: grabbing !important; *\/\n        user-select: none;\n    }\n    \n    \/* Ensure SVG has no extra margins *\/\n    #frontend-svg {\n        display: block;\n        max-width: none;\n        max-height: none;\n        transition: transform 0.3s ease;\n    }\n    \n    \/* Fit to container for smaller maps *\/\n    #canvas-scroll-container.fit-to-container #frontend-svg {\n        width: 100%;\n        max-width: 100%;\n        max-height: 100%;\n        object-fit: contain;\n        margin: 0 auto;\n        display: block;\n    }\n    \n    \/* Full size for larger maps *\/\n    #canvas-scroll-container.full-size #frontend-svg {\n        width: auto;\n        height: auto;\n        min-width: 100%;\n        min-height: 100%;\n    }\n    \n    \/* Centered smaller maps *\/\n    #canvas-scroll-container.centered #frontend-svg {\n        width: 100%;\n        max-width: 100%;\n        max-height: 100%;\n        height: auto;\n    }\n    \n    \/* Make paths show pointer on hover *\/\n    #frontend-svg path {\n        cursor: pointer;\n        transition: all 0.2s ease;\n        \/* Improve touch targets on mobile *\/\n        -webkit-tap-highlight-color: rgba(0, 123, 186, 0.3);\n        touch-action: manipulation;\n    }\n    \n    #frontend-svg path:hover {\n        opacity: 0.8;\n        filter: brightness(1.1);\n    }\n    \n    \/* Touch-specific improvements for mobile *\/\n    @media (hover: none) and (pointer: coarse) {\n        #frontend-svg path {\n            \/* Increase touch target size on mobile *\/\n            stroke-width: 4px !important;\n            transition: none; \/* Disable transitions on touch devices for better performance *\/\n        }\n        \n        #frontend-svg path:active {\n            opacity: 0.7;\n            filter: brightness(1.2);\n        }\n    }\n    \n    \/* Loading state for main maps *\/\n    .websy-main-map-container.loading {\n        background: #f8f9fa;\n    }\n    \n    .websy-main-map-container.loading::before {\n        content: '';\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        width: 40px;\n        height: 40px;\n        border: 3px solid #e0e0e0;\n        border-top-color: #007cba;\n        border-radius: 50%;\n        animation: websy-spin 1s linear infinite;\n        z-index: 10;\n    }\n    \n    .websy-main-map-container.loading::after {\n        content: 'Loading Map...';\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        margin-top: 30px;\n        color: #666;\n        font-size: 14px;\n        z-index: 10;\n    }\n    \n    \/* Main tooltip adjustments *\/\n    #canvas-scroll-container .polygon-tooltip {\n        z-index: 1002; \/* Higher than zoom controls *\/\n        pointer-events: none;\n    }\n    \n    \/* Zoom controls styling matching modal design *\/\n    .websy-zoom-btn {\n        width: 40px;\n        height: 40px;\n        background: rgba(0, 0, 0, 0.8);\n        color: white;\n        border: none;\n        border-radius: 6px;\n        cursor: pointer;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 18px;\n        font-weight: bold;\n        transition: all 0.2s ease;\n        box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);\n    }\n    \n    .websy-zoom-btn:hover {\n        background: rgba(0, 0, 0, 0.9);\n        box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15);\n        transform: translateY(-1px);\n    }\n    \n    .websy-zoom-btn:active {\n        transform: translateY(0);\n        box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n    }\n    \n    .websy-zoom-btn.zoom-reset {\n        font-size: 14px;\n        font-weight: normal;\n    }\n    \n    .websy-zoom-btn.disabled {\n        opacity: 0.5;\n        cursor: not-allowed;\n        pointer-events: none;\n    }\n    \n    \/* Navigation styling matching modal design *\/\n    .websy-nav-item {\n        display: block;\n        padding: 15px 20px;\n        border-bottom: 1px solid #f0f0f0;\n        color: #333;\n        text-decoration: none;\n        transition: all 0.2s ease;\n        cursor: pointer;\n        position: relative;\n    }\n    \n    .websy-nav-item.current {\n        background: #007cba;\n        color: white;\n        font-weight: 500;\n    }\n    \n    .websy-nav-item.linked {\n        border-left: 4px solid #007cba;\n    }\n    \n    .websy-nav-item.unlinked {\n        border-left: 4px solid #ccc;\n        opacity: 0.8;\n    }\n    \n    .websy-nav-item.unlinked:hover {\n        opacity: 1;\n        background: #fff9e6;\n        color: #856404;\n    }\n    \n    .websy-nav-item-title {\n        font-weight: 500;\n        margin-bottom: 4px;\n        display: flex;\n        gap: 8px;\n        flex-direction: column;\n        justify-content: start;\n        align-items: start !important;\n    }\n    \n    .websy-nav-item-icon {\n        font-size: 16px;\n        width: 20px;\n        flex-shrink: 0;\n        display: none;\n    }\n    \n    .websy-nav-item-meta {\n        font-size: 0.85em;\n        color: #666;\n        opacity: 0.8;\n    }\n    \n    .websy-nav-item.current .websy-nav-item-meta {\n        color: rgba(255, 255, 255, 0.8);\n    }\n    \n    .websy-nav-item.unlinked .websy-nav-item-meta {\n        color: #856404;\n        font-style: italic;\n    }\n    \n    .websy-nav-item:last-child {\n        border-bottom: none;\n    }\n    \n    .websy-nav-loading {\n        padding: 30px 20px;\n        text-align: center;\n        color: #666;\n        font-style: italic;\n    }\n    \n    .websy-nav-empty {\n        padding: 30px 20px;\n        text-align: center;\n        color: #999;\n    }\n    \n    .websy-nav-empty-icon {\n        font-size: 2em;\n        margin-bottom: 10px;\n        opacity: 0.3;\n        display: none;\n    }\n    \n    .websy-nav-error {\n        padding: 30px 20px;\n        text-align: center;\n        color: #d32f2f;\n        background-color: #ffebee;\n        border: 1px solid #f8bbd9;\n        border-radius: 4px;\n        margin: 10px;\n    }\n    \n    \/* Responsive design for mobile *\/\n    @media (max-width: 768px) {\n        .websy-main-container {\n            width: 100%;\n            \/* margin: 0 -15px !important; *\/\n            \/* border-radius: 0 !important; *\/\n            \/* border-left: none !important; *\/\n            \/* border-right: none !important; *\/\n            \/* box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1) !important; *\/\n            \/* min-height: unset !important; *\/\n            height: unset !important;\n            display: flex !important;\n            flex-direction: column !important;\n            position: static !important;\n            gap: 0 !important;\n        }\n        \n        .websy-main-map-container {\n            \/* flex: 1 !important;  *\/\n            min-height: 0 !important; \/* Allow it to shrink *\/\n            height: auto !important; \/* Remove fixed height *\/\n            position: relative !important;\n            margin-bottom: 20px !important; \/* Small gap before navigation *\/\n        }\n        \n        \/* Make navigation non-overlapping on mobile - stack below map *\/\n        .websy-main-navigation {\n            position: static !important;\n            bottom: auto !important;\n            left: auto !important;\n            right: auto !important;\n            \/* margin: 0 15px 15px 15px !important; *\/\n            \/* background: #fff !important; *\/\n            \/* backdrop-filter: none !important; *\/\n            \/* border-radius: 12px !important; *\/\n            \/* box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1) !important; *\/\n            \/* border: 1px solid #e0e0e0 !important; *\/\n            \/* border-top: 1px solid #e0e0e0 !important; *\/\n            max-height: none !important;\n            overflow: visible !important;\n            flex-shrink: 0 !important;\n            display: flex !important;\n            flex-direction: column !important;\n            z-index: auto !important;\n            \/* min-height: 120px !important; Minimum height for usability *\/\n            \/* max-height: 40vh !important; Maximum 40% of viewport height *\/\n        }\n        \n        .websy-main-nav-header {\n            padding: 16px 20px 12px 20px !important;\n            border-bottom: 1px solid #e0e0e0 !important;\n            background: #f8f9fa !important;\n            flex-shrink: 0 !important;\n        }\n        \n        .websy-main-nav-content {\n            flex: 1 !important;\n            max-height: none !important; \/* Remove height restriction *\/\n            padding: 8px 0 !important;\n            overflow-y: auto !important;\n            \/* max-height: calc(40vh - 80px) !important; Account for header *\/\n        }\n        \n        \/* Fix SVG container centering on mobile *\/\n        #canvas-scroll-container {\n            align-items: flex-start !important; \/* Don't center vertically *\/\n            justify-content: flex-start !important; \/* Don't center horizontally *\/\n            padding: 0 !important; \/* Remove any padding *\/\n            display: block !important; \/* Override flex centering *\/\n        }\n        \n        #canvas-scroll-container svg {\n            width: 100% !important;\n            height: auto !important;\n            min-height: auto !important;\n            object-fit: contain !important; \/* Use contain instead of cover for better fit *\/\n            display: block !important;\n        }\n        \n        .websy-main-zoom-controls {\n            top: 15px;\n            right: 15px;\n            gap: 6px;\n        }\n        \n        .websy-zoom-btn {\n            width: 35px;\n            height: 35px;\n            font-size: 16px;\n        }\n        \n        \/* Main shortcode map tooltips - bigger for better mobile visibility *\/\n        #canvas-scroll-container .polygon-tooltip {\n            font-size: 14px;\n            padding: 8px 12px;\n            max-width: 180px;\n            transform: translate(-50%, -50%) scale(0.4);\n            border-width: 2px;\n            box-shadow: 0 3px 12px rgba(0, 0, 0, 0.5);\n            transition: transform 0.15s ease-out;\n            will-change: transform;\n            touch-action: manipulation;\n            -webkit-user-select: none;\n            user-select: none;\n        }\n        \n        #canvas-scroll-container .polygon-tooltip:hover {\n            transform: translate(-50%, -50%) scale(1.3);\n        }\n        \n        \/* Prevent tooltip movement on touch devices *\/\n        #canvas-scroll-container .polygon-tooltip:active {\n            transform: translate(-50%, -50%) scale(1.2) !important;\n        }\n        \n        \/* Larger touch targets for mobile *\/\n        #canvas-scroll-container #frontend-svg path {\n            stroke-width: 3px !important;\n            min-width: 44px;\n            min-height: 44px;\n        }\n        \n        \/* Mobile navigation improvements *\/\n        .websy-main-nav-list {\n            padding: 0 16px;\n            gap: 20px;\n            flex-direction: column; \/* Stack vertically on mobile *\/\n            align-items: stretch;\n        }\n        \n        .websy-main-nav-item {\n            width: 100%;\n            margin-bottom: 8px;\n        }\n        \n        .websy-main-nav-link {\n            padding: 12px 16px;\n            font-size: 0.95em;\n            min-height: 44px; \/* Better touch target *\/\n            justify-content: flex-start;\n            text-align: left;\n        }\n        \n        .websy-nav-title {\n            text-align: left;\n            flex: 1;\n            font-size: 20px;\n            font-weight: 800;\n        }\n        \n        .websy-nav-type {\n            font-size: 0.75em;\n            margin-left: auto; \/* Push to right *\/\n        }\n    }\n    \n    \/* Tablet adjustments *\/\n    @media (max-width: 1024px) and (min-width: 769px) {\n        .websy-main-map-container {\n            height: 400px;\n        }\n        \n        .websy-main-nav-content {\n            max-height: 275px;\n        }\n        \n        .polygon-tooltip {\n            font-size: 11px;\n            padding: 5px 9px;\n            max-width: 150px;\n        }\n        \n        #frontend-svg path {\n            stroke-width: 1.5px !important;\n        }\n    }\n    \/* Tooltip styles *\/\n    .polygon-tooltip {\n        position: absolute;\n        padding: 4px;\n        background: #4d40b4e8;\n        color: #fff;\n        border-radius: 3px;\n        font-size: 10px;\n        display: block; \/* Always visible *\/\n        pointer-events: auto; \/* Allow interaction *\/\n        z-index: 1000; \/* Lower z-index to not interfere with modals *\/\n        white-space: nowrap; \/* Prevent text wrapping *\/\n        transition: opacity 0.2s ease-in-out, transform 0.2s ease-in-out;\n        max-width: 200px; \/* Prevent extremely wide tooltips *\/\n        word-wrap: break-word; \/* Allow long words to break *\/\n        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);\n        border: 1px solid rgba(255, 255, 255, 0.3);\n        transform: translate(-50%, -50%); \/* Center on polygon *\/\n        font-weight: 500;\n        text-align: center;\n        line-height: 1.25;\n    }\n    \n\n    \n    .polygon-tooltip a {\n        color: #fff;\n        text-decoration: none;\n        display: block;\n    }\n    \n\n    \n    \/* Remove arrow since tooltips are centered on polygons *\/\n    .polygon-tooltip::after {\n        display: none;\n    }\n    \n    \/* Loading state for tooltips *\/\n    .polygon-tooltip.loading {\n        opacity: 0.7;\n        font-style: italic;\n    }\n\n    .polygon-tooltip.has-apartment-count {\n        padding: 8px;\n    }\n    \n    \/* Apartment status color-based tooltips *\/\n    .polygon-tooltip.apartment-available {\n        background: #28a745 !important; \/* Green for available *\/\n        border: 2px solid #1e7e34;\n    }\n    \n    .polygon-tooltip.apartment-reserved {\n        background: #ffc107 !important; \/* Yellow for reserved *\/\n        border: 2px solid #e0a800;\n        color: #212529 !important;\n    }\n    \n    .polygon-tooltip.apartment-sold {\n        background: #dc3545 !important; \/* Red for sold *\/\n        border: 2px solid #c82333;\n    }\n    \n    .polygon-tooltip.apartment-unknown {\n        background: #6c757d !important; \/* Gray for unknown *\/\n        border: 2px solid #545b62;\n    }\n    \n    \/* Ensure apartment tooltips maintain click functionality *\/\n    .polygon-tooltip.apartment-available a,\n    .polygon-tooltip.apartment-reserved a,\n    .polygon-tooltip.apartment-sold a,\n    .polygon-tooltip.apartment-unknown a {\n        color: inherit;\n        text-decoration: none;\n        display: block;\n        width: 100%;\n        height: 100%;\n    }\n    \n\n    \n    \/* Synchronized hover effects for polygons *\/\n    #frontend-svg path.polygon-hovered,\n    #modal-canvas-scroll-container svg path.polygon-hovered {\n        fill-opacity: 0.8 !important;\n        stroke-width: 3px !important;\n        stroke: #ff6b35 !important;\n        filter: drop-shadow(0 0 8px rgba(255, 107, 53, 0.6));\n    }\n    \n    \/* Enhanced hover transitions for smooth effects *\/\n    #frontend-svg path,\n    #modal-canvas-scroll-container svg path {\n        transition: all 0.2s ease-in-out;\n    }\n    \n\n    \n    \/* Modal styles *\/\n    .websy-modal {\n        display: none;\n        position: fixed;\n        z-index: 10000;\n        left: 0;\n        top: 0;\n        width: 70%;\n        height: 100%;\n        background-color: transparent;\n        backdrop-filter: blur(3px);\n    }\n\n    @media (max-width: 768px) {\n        .websy-modal {\n          width: 100%;\n          max-height: 100vh;\n          height: auto;\n          overflow-y: auto;\n        }\n    }\n    \n    .websy-modal-content {\n        background-color: #fff;\n        margin: 0;\n        border-radius: 0;\n        width: 100%;\n        height: 100%;\n        display: flex;\n        flex-direction: column;\n        animation: websy-modal-appear 0.3s ease-out;\n    }\n    \n    @keyframes websy-modal-appear {\n        from {\n            opacity: 0;\n            transform: translateX(-100%);\n        }\n        to {\n            opacity: 1;\n            transform: translateX(0);\n        }\n    }\n    \n    .websy-modal-header {\n        padding: 20px 25px;\n        border-bottom: 1px solid #e0e0e0;\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        background: #f8f9fa;\n        flex-shrink: 0;\n    }\n    \n    .websy-modal-title-section {\n        display: flex;\n        align-items: center;\n        gap: 15px;\n        flex: 1;\n    }\n    \n    .websy-modal-back-btn {\n        background: #666;\n        color: white;\n        border: none;\n        width: 35px;\n        height: 35px;\n        border-radius: 50%;\n        cursor: pointer;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 16px;\n        font-weight: bold;\n        transition: all 0.2s ease;\n        flex-shrink: 0;\n    }\n    \n    .websy-modal-back-btn:hover {\n        background: #555;\n        transform: scale(1.05);\n    }\n    \n    .websy-modal-title {\n        margin: 0;\n        font-size: 1.4em;\n        color: #333;\n        font-weight: 600;\n        flex: 1;\n    }\n    \n    .websy-modal-close {\n        color: #666;\n        font-size: 28px;\n        font-weight: bold;\n        cursor: pointer;\n        width: 35px;\n        height: 35px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        border-radius: 50%;\n        transition: all 0.2s ease;\n    }\n    \n    .websy-modal-close:hover {\n        color: #333;\n        background: #e9ecef;\n    }\n    \n    .websy-modal-body {\n        padding: 0;\n        overflow: hidden;\n        flex: 1;\n        height: calc(100vh - 80px); \/* Account for header height *\/\n        display: flex;\n        flex-direction: row;\n    }\n    \n    .websy-modal-footer {\n        display: none; \/* Hide footer completely *\/\n    }\n    \n    .websy-full-post-link {\n        color: #007cba;\n        text-decoration: none;\n        font-weight: 500;\n        transition: color 0.2s ease;\n    }\n    \n    .websy-full-post-link:hover {\n        color: #005a87;\n        text-decoration: underline;\n    }\n    \n    .websy-modal-close-btn {\n        background: #666;\n        color: white;\n        border: none;\n        padding: 8px 16px;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 14px;\n        transition: background 0.2s ease;\n    }\n    \n    .websy-modal-close-btn:hover {\n        background: #555;\n    }\n    \n    .websy-loading {\n        text-align: center;\n        padding: 40px;\n        color: #666;\n        font-size: 16px;\n    }\n    \n    .websy-loading::after {\n        content: '';\n        display: inline-block;\n        width: 20px;\n        height: 20px;\n        margin-left: 10px;\n        border: 2px solid #e0e0e0;\n        border-top-color: #007cba;\n        border-radius: 50%;\n        animation: websy-spin 1s linear infinite;\n    }\n    \n    @keyframes websy-spin {\n        to {\n            transform: rotate(360deg);\n        }\n    }\n    \n    .websy-post-content {\n        line-height: 1.6;\n        color: #333;\n    }\n    \n    .websy-post-content h1,\n    .websy-post-content h2,\n    .websy-post-content h3,\n    .websy-post-content h4,\n    .websy-post-content h5,\n    .websy-post-content h6 {\n        color: #333;\n        margin-top: 1.5em;\n        margin-bottom: 0.5em;\n    }\n    \n    .websy-post-content p {\n        margin-bottom: 1em;\n    }\n    \n    .websy-post-content img {\n        max-width: 100%;\n        height: auto;\n        border-radius: 4px;\n        margin: 15px 0;\n    }\n    \n    .websy-fallback-content,\n    .websy-post-excerpt {\n        text-align: center;\n        padding: 40px 20px;\n        color: #666;\n    }\n    \n    .websy-view-post-btn {\n        display: inline-block;\n        background: #007cba;\n        color: white !important;\n        padding: 12px 24px;\n        text-decoration: none;\n        border-radius: 4px;\n        font-weight: 500;\n        margin-top: 15px;\n        transition: background 0.2s ease;\n    }\n    \n    .websy-view-post-btn:hover {\n        background: #005a87;\n    }\n    \n    \/* Modal map container styles *\/\n    .websy-modal-map-container {\n        width: 60%;\n        height: 100%;\n        border: none;\n        border-radius: 0;\n        overflow: hidden;\n        position: relative;\n        background: #f8f9fa;\n        flex-shrink: 0;\n    }\n    \n    \/* Modal navigation container *\/\n    .websy-modal-navigation {\n        width: 40%;\n        height: 100%;\n        background: #fff;\n        border-left: 1px solid #e0e0e0;\n        display: flex;\n        flex-direction: column;\n        overflow: hidden;\n    }\n    \n    .websy-modal-nav-header {\n        padding: 20px;\n        border-bottom: 1px solid #e0e0e0;\n        background: #f8f9fa;\n        flex-shrink: 0;\n    }\n    \n    .websy-modal-nav-title {\n        margin: 0;\n        font-size: 1.1em;\n        font-weight: 600;\n        color: #333;\n        display: flex;\n        align-items: center;\n        gap: 10px;\n    }\n    \n    .websy-modal-nav-icon {\n        width: 20px;\n        height: 20px;\n        background: #007cba;\n        border-radius: 3px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        color: white;\n        font-size: 12px;\n        font-weight: bold;\n        display: none;\n    }\n    \n    .websy-modal-nav-content {\n        flex: 1;\n        overflow-y: auto;\n        padding: 0;\n        \/* Custom scrollbar styling *\/\n        scrollbar-width: thin;\n        scrollbar-color: #007cba #f1f1f1;\n    }\n    \n    .websy-modal-nav-content::-webkit-scrollbar {\n        width: 6px;\n    }\n    \n    .websy-modal-nav-content::-webkit-scrollbar-track {\n        background: #f1f1f1;\n    }\n    \n    .websy-modal-nav-content::-webkit-scrollbar-thumb {\n        background: #007cba;\n        border-radius: 3px;\n    }\n    \n    .websy-modal-nav-content::-webkit-scrollbar-thumb:hover {\n        background: #005a87;\n    }\n    \n    .websy-nav-item {\n        display: block;\n        padding: 15px 20px;\n        border-bottom: 1px solid #f0f0f0;\n        color: #333;\n        text-decoration: none;\n        transition: all 0.2s ease;\n        cursor: pointer;\n        position: relative;\n    }\n    \n    .websy-nav-item.current {\n        background: #007cba;\n        color: white;\n        font-weight: 500;\n    }\n    \n    .websy-nav-item.linked {\n        border-left: 4px solid #007cba;\n    }\n    \n    .websy-nav-item.unlinked {\n        border-left: 4px solid #ccc;\n        opacity: 0.8;\n    }\n    \n    .websy-nav-item-title {\n        font-weight: 500;\n        margin-bottom: 4px;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n    }\n    \n    .websy-nav-item-icon {\n        font-size: 16px;\n        width: 20px;\n        flex-shrink: 0;\n        display: none;\n    }\n    \n    .websy-nav-item-meta {\n        font-size: 0.85em;\n        color: #666;\n        opacity: 0.8;\n    }\n    \n    .websy-nav-item.current .websy-nav-item-meta {\n        color: rgba(255, 255, 255, 0.8);\n    }\n    \n    .websy-nav-item.unlinked .websy-nav-item-meta {\n        color: #856404;\n        font-style: italic;\n    }\n    \n    .websy-nav-item:last-child {\n        border-bottom: none;\n    }\n    \n    .websy-nav-loading {\n        padding: 30px 20px;\n        text-align: center;\n        color: #666;\n        font-style: italic;\n    }\n    \n    .websy-nav-empty {\n        padding: 30px 20px;\n        text-align: center;\n        color: #999;\n    }\n    \n    .websy-nav-empty-icon {\n        font-size: 2em;\n        margin-bottom: 10px;\n        opacity: 0.3;\n        display: none;\n    }\n    \n    \/* Apartment hierarchy styles *\/\n    .apartment-hierarchy-container {\n        padding: 0;\n    }\n    \n    .websy-nav-item.hierarchy-item {\n        border-left: 4px solid #28a745;\n        background: #f8fff9;\n    }\n    \n    .websy-nav-item.hierarchy-item.clickable {\n        cursor: pointer;\n        border-left-color: #007cba;\n        background: #f0f8ff;\n    }\n    \n    .hierarchy-label {\n        font-weight: 600;\n        color: #495057;\n        margin-right: 5px;\n    }\n    \n    .hierarchy-value {\n        color: #333;\n        font-weight: 500;\n    }\n    \n    .websy-nav-item.hierarchy-item.clickable .hierarchy-value {\n        color: #007cba;\n        text-decoration: underline;\n    }\n    \n    .hierarchy-loading {\n        padding: 15px 20px;\n        color: #666;\n        font-style: italic;\n        background: #f8f9fa;\n        border-left: 4px solid #dee2e6;\n        animation: pulse 1.5s ease-in-out infinite alternate;\n    }\n    \n    @keyframes pulse {\n        from {\n            opacity: 0.6;\n        }\n        to {\n            opacity: 1;\n        }\n    }\n    \n    .apartment-details-separator {\n        height: 1px;\n        background: linear-gradient(to right, transparent, #dee2e6, transparent);\n        margin: 15px 0;\n        position: relative;\n    }\n    \n    .apartment-details-separator::before {\n        content: '\ud83d\udca0';\n        position: absolute;\n        left: 50%;\n        top: 50%;\n        transform: translate(-50%, -50%);\n        background: white;\n        padding: 0 10px;\n        font-size: 12px;\n        color: #6c757d;\n    }\n    \n    \/* Zoom controls for modal maps *\/\n    .websy-modal-zoom-controls {\n        position: absolute;\n        top: 20px;\n        right: 20px;\n        z-index: 1001;\n        display: flex;\n        flex-direction: column;\n        gap: 5px;\n        display: none !important;\n    }\n    \n    .websy-zoom-btn {\n        width: 40px;\n        height: 40px;\n        background: rgba(255, 255, 255, 0.9);\n        border: 1px solid #ccc;\n        border-radius: 4px;\n        cursor: pointer;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 18px;\n        font-weight: bold;\n        color: #333;\n        transition: all 0.2s ease;\n        backdrop-filter: blur(5px);\n        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n        user-select: none;\n    }\n    \n    .websy-zoom-btn:hover {\n        background: rgba(255, 255, 255, 1);\n        box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15);\n        transform: translateY(-1px);\n    }\n    \n    .websy-zoom-btn:active {\n        transform: translateY(0);\n        box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n    }\n    \n    .websy-zoom-btn.disabled {\n        opacity: 0.5;\n        cursor: not-allowed;\n        pointer-events: none;\n    }\n    \n    #modal-canvas-scroll-container {\n        width: 100%;\n        height: 100%;\n        overflow: hidden; \/* Force no scrollbars for optimized fitting *\/\n        position: relative;\n        \/* cursor: grab; *\/\n        background: #fff;\n        \/* Enable smooth scrolling *\/\n        scroll-behavior: smooth;\n        \/* Custom scrollbars for better UX - hidden by default *\/\n        scrollbar-width: none;\n        scrollbar-color: #007cba #f1f1f1;\n        \/* Allow pinch-to-zoom on mobile *\/\n        touch-action: manipulation;\n    }\n    \n    #modal-canvas-scroll-container::-webkit-scrollbar {\n        display: none; \/* Hide scrollbars completely *\/\n    }\n    \n    #modal-canvas-scroll-container.centered {\n        display: flex;\n        justify-content: center;\n        align-items: start;\n        overflow: hidden;\n        padding-top: 20px;\n        width: 100%;\n    }\n    \n    #modal-canvas-scroll-container.fit-to-container {\n        display: flex;\n        justify-content: center;\n        align-items: start;\n        overflow: hidden;\n        padding-top: 20px;\n        width: 100%;\n    }\n    \n    #modal-canvas-scroll-container.full-size {\n        \/* Only used when zoom controls are active *\/\n        overflow: auto;\n        display: block;\n    }\n    \n    #modal-canvas-scroll-container.full-size::-webkit-scrollbar {\n        width: 8px;\n        height: 8px;\n        display: block; \/* Show scrollbars only in zoom mode *\/\n    }\n    \n    #modal-canvas-scroll-container.full-size::-webkit-scrollbar-track {\n        background: #f1f1f1;\n        border-radius: 4px;\n    }\n    \n    #modal-canvas-scroll-container.full-size::-webkit-scrollbar-thumb {\n        background: #007cba;\n        border-radius: 4px;\n    }\n    \n    #modal-canvas-scroll-container.full-size::-webkit-scrollbar-thumb:hover {\n        background: #005a87;\n    }\n    \n    #modal-canvas-scroll-container.grabbing {\n        \/* cursor: grabbing !important; *\/\n        user-select: none;\n    }\n    \n    #modal-frontend-svg {\n        display: block;\n        max-width: none;\n        height: auto;\n        transition: transform 0.3s ease;\n    }\n    \n    \/* Fit to container for smaller maps *\/\n    #modal-canvas-scroll-container.fit-to-container #modal-frontend-svg {\n        width: 100%;\n        max-width: 100%;\n        max-height: 100%;\n        object-fit: contain;\n        margin: 0 auto;\n        display: block;\n    }\n    \n    \/* Full size for larger maps *\/\n    #modal-canvas-scroll-container.full-size #modal-frontend-svg {\n        width: auto;\n        height: auto;\n        min-width: 100%;\n        min-height: 100%;\n    }\n    \n    \/* Centered smaller maps *\/\n    #modal-canvas-scroll-container.centered #modal-frontend-svg {\n        width: 100%;\n        max-width: 100%;\n        max-height: 100%;\n        height: auto;\n    }\n    \n    #modal-frontend-svg path {\n        cursor: pointer;\n        transition: all 0.2s ease;\n    }\n    \n    #modal-frontend-svg path:hover {\n        opacity: 0.8;\n        filter: brightness(1.1);\n    }\n    \n    \/* Loading state for modal maps *\/\n    .websy-modal-map-container.loading {\n        background: #f8f9fa;\n    }\n    \n    .websy-modal-map-container.loading::before {\n        content: '';\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        width: 40px;\n        height: 40px;\n        border: 3px solid #e0e0e0;\n        border-top-color: #007cba;\n        border-radius: 50%;\n        animation: websy-spin 1s linear infinite;\n        z-index: 10;\n    }\n    \n    .websy-modal-map-container.loading::after {\n        content: 'Loading Map...';\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        margin-top: 30px;\n        color: #666;\n        font-size: 14px;\n        z-index: 10;\n    }\n    \n    \/* Modal tooltip adjustments *\/\n    #modal-canvas-scroll-container .polygon-tooltip {\n        z-index: 10001; \/* Higher than modal content *\/\n        pointer-events: none;\n    }\n    \n    \/* Zoom controls for modal maps *\/\n    .websy-modal-zoom-controls {\n        position: absolute;\n        top: 20px;\n        right: 20px;\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n        z-index: 10002;\n        opacity: 0.9;\n        transition: opacity 0.2s ease;\n    }\n    \n    .websy-modal-zoom-controls:hover {\n        opacity: 1;\n    }\n    \n    .websy-zoom-btn {\n        width: 40px;\n        height: 40px;\n        background: rgba(0, 0, 0, 0.8);\n        color: white;\n        border: none;\n        border-radius: 6px;\n        cursor: pointer;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 18px;\n        font-weight: bold;\n        transition: all 0.2s ease;\n        box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);\n    }\n    \n    .websy-zoom-btn:hover {\n        background: rgba(0, 0, 0, 0.9);\n        transform: scale(1.05);\n    }\n    \n    .websy-zoom-btn:active {\n        transform: scale(0.95);\n    }\n    \n    .websy-zoom-btn.zoom-reset {\n        font-size: 14px;\n        font-weight: normal;\n    }\n    \n    \/* Mobile responsiveness *\/\n    @media (max-width: 768px) {\n        .websy-modal-header {\n            padding: 15px 20px;\n        }\n        \n        .websy-modal-title {\n            font-size: 1.1em;\n        }\n        \n        .websy-modal-close {\n            width: 30px;\n            height: 30px;\n            font-size: 24px;\n        }\n        \n        .websy-modal-body {\n            height: calc(100vh - 70px); \/* Smaller header on mobile *\/\n            flex-direction: column; \/* Stack vertically on mobile *\/\n        }\n        \n        .websy-modal-map-container {\n            width: 100%; \/* Full width on mobile *\/\n            height: 50%; \/* Reduced map height to give more space to navigation *\/\n            min-height: 250px; \/* Minimum height for usability *\/\n        }\n        \n        .websy-modal-navigation {\n            width: 100%; \/* Full width on mobile *\/\n            height: 50%; \/* Increased navigation height for better usability *\/\n            border-left: none;\n            border-top: 1px solid #e0e0e0;\n        }\n        \n        .websy-modal-nav-header {\n            padding: 15px;\n        }\n        \n        .websy-modal-nav-title {\n            font-size: 1em;\n        }\n        \n        .websy-nav-item {\n            padding: 12px 15px;\n        }\n        \n        .websy-nav-item-title {\n            font-size: 0.95em;\n            flex-wrap: wrap; \/* Allow wrapping on mobile for better readability *\/\n        }\n        \n        \/* Make apartment hierarchy items inline on mobile for better space usage *\/\n        .websy-nav-item.hierarchy-item .websy-nav-item-title {\n            flex-direction: row;\n            align-items: center;\n            flex-wrap: wrap;\n            gap: 5px;\n        }\n        \n        .hierarchy-label,\n        .hierarchy-value {\n            display: inline;\n            white-space: nowrap;\n        }\n        \n        .hierarchy-label {\n            margin-right: 3px;\n        }\n        \n        .websy-nav-item-meta {\n            font-size: 0.8em;\n            margin-top: 2px; \/* Reduced margin for more compact layout *\/\n        }\n        \n        \/* Compact navigation item layout for mobile *\/\n        .websy-nav-item {\n            padding: 10px 15px; \/* Slightly reduced padding for more items to fit *\/\n        }\n        \n        \/* Make regular navigation items more compact too *\/\n        .websy-nav-item:not(.hierarchy-item) .websy-nav-item-title {\n            flex-direction: row;\n            align-items: center;\n            gap: 8px;\n        }\n        \n        \/* Ensure navigation content uses full available height *\/\n        .websy-modal-nav-content {\n            max-height: calc(50vh - 60px); \/* Account for navigation header *\/\n            display: flex;\n        }\n        \n        .websy-post-excerpt,\n        .websy-fallback-content {\n            padding: 20px 15px;\n        }\n        \n        \/* Mobile tooltip adjustments *\/\n        \/* Main shortcode map tooltips - bigger for better mobile visibility *\/\n        #canvas-scroll-container .polygon-tooltip {\n            font-size: 18px;\n            padding: 8px 12px;\n            max-width: 200px;\n            transform: translate(-50%, -50%) scale(0.4);\n            border-width: 2px;\n            box-shadow: 0 3px 12px rgba(0, 0, 0, 0.5);\n            transition: transform 0.15s ease-out; \/* Smooth transition but faster *\/\n            will-change: transform; \/* Optimize for transform changes *\/\n            \/* Allow pinch-to-zoom but prevent unwanted repositioning *\/\n            touch-action: manipulation;\n            -webkit-user-select: none;\n            user-select: none;\n            pointer-events: none;\n        }\n        \n        \/* Prevent tooltip movement on touch devices *\/\n        #canvas-scroll-container .polygon-tooltip:active {\n            transform: translate(-50%, -50%) scale(1.2) !important;\n        }\n        \n        \/* Modal map tooltips - keep them smaller to not overwhelm modal *\/\n        #modal-canvas-scroll-container .polygon-tooltip {\n            box-shadow: none;\n            border: none;\n            font-size: 8px;\n            padding: 3px;\n            max-width: 140px;\n            transform: translate(-50%, -50%) scale(0.95);\n            line-height: 1.25;\n        }\n        \n        \n        \/* Mobile modal map adjustments *\/\n        #modal-canvas-scroll-container {\n            \/* Enable momentum scrolling on iOS *\/\n            -webkit-overflow-scrolling: touch;\n            \/* Allow pinch-to-zoom on mobile devices *\/\n            touch-action: manipulation;\n        }\n        \n        #modal-canvas-scroll-container.centered {\n            \/* On mobile, always allow scrolling if content is larger *\/\n            display: block;\n            overflow: auto;\n        }\n        \n        \/* Larger touch targets for mobile *\/\n        \/* Main shortcode map paths - larger touch targets *\/\n        #canvas-scroll-container #frontend-svg path {\n            stroke-width: 3px !important;\n            min-width: 44px;\n            min-height: 44px;\n        }\n        \n        \/* Modal map paths - standard touch targets *\/\n        #modal-frontend-svg path {\n            stroke-width: 2px !important;\n            min-width: 44px;\n            min-height: 44px;\n        }\n        \n        \/* Hide scrollbars on mobile for cleaner look *\/\n        #modal-canvas-scroll-container::-webkit-scrollbar {\n            display: none;\n        }\n        \n        #modal-canvas-scroll-container {\n            scrollbar-width: none;\n        }\n    }\n    \n    \/* Tablet adjustments *\/\n    @media (max-width: 1024px) and (min-width: 769px) {\n        .polygon-tooltip {\n            font-size: 11px;\n            padding: 5px 9px;\n            max-width: 150px;\n        }\n        \n        #modal-frontend-svg path {\n            stroke-width: 1.5px !important;\n        }\n        \n        .websy-modal-body {\n            flex-direction: column; \/* Stack vertically on tablet too *\/\n        }\n        \n        .websy-modal-map-container {\n            width: 100%; \/* Full width on tablet *\/\n            height: 65%; \/* More space for map on tablet *\/\n        }\n        \n        .websy-modal-navigation {\n            width: 100%; \/* Full width on tablet *\/\n            height: 35%; \/* Less space for navigation on tablet *\/\n            border-left: none;\n            border-top: 1px solid #e0e0e0;\n        }\n        \n        .websy-modal-nav-header {\n            padding: 18px;\n        }\n        \n        .websy-nav-item {\n            padding: 14px 18px;\n        }\n    }\n    \n    \/* Main shortcode navigation styles *\/\n    .websy-main-nav-list {\n        list-style: none;\n        margin: 0;\n        padding: 0 12px;\n        display: flex;\n        flex-wrap: wrap;\n        gap: 20px;\n        align-items: center;\n    }\n    \n    .websy-main-nav-item {\n        border: 1px solid #4d40b4;\n        border-radius: 8px;\n        transition: all 0.2s ease;\n        flex-shrink: 0;\n        background: rgba(248, 249, 250, 0.8);\n        padding: 5px;\n    }\n    \n    .websy-main-nav-link {\n        display: block;\n        align-items: center;\n        justify-content: center;\n        padding: 8px 16px;\n        text-decoration: none;\n        color: #333;\n        transition: all 0.2s ease;\n        font-weight: 500;\n        font-size: 0.9em;\n        border-radius: 8px;\n        white-space: nowrap;\n        min-height: 36px;\n    }\n    \n    .websy-nav-title {\n        flex: 1;\n        text-align: left;\n        font-size: 20px;\n    }\n    \n    .websy-nav-type {\n        font-size: 0.75em;\n        color: #666;\n        font-weight: 400;\n        opacity: 0.8;\n        margin-left: 6px;\n        background: rgba(0, 124, 186, 0.1);\n        padding: 2px 6px;\n        border-radius: 4px;\n    }\n    \n    .websy-nav-toggle {\n        color: #666;\n        font-size: 12px;\n        font-weight: bold;\n        transition: transform 0.2s ease;\n        cursor: pointer;\n        padding: 5px;\n        margin-left: 10px;\n    }\n    \n    .websy-main-nav-item.expanded .websy-nav-toggle {\n        transform: rotate(180deg);\n    }\n    \n    .websy-main-nav-sublist {\n        display: none;\n        background-color: #f8f9fa;\n        border-top: 1px solid #e9ecef;\n        margin: 0;\n        padding: 0;\n        list-style: none;\n    }\n    \n    .websy-main-nav-subitem {\n        border-bottom: 1px solid #e9ecef;\n    }\n    \n    .websy-main-nav-subitem:last-child {\n        border-bottom: none;\n    }\n    \n    .websy-main-nav-sublink {\n        display: block;\n        padding: 12px 20px 12px 40px;\n        text-decoration: none;\n        color: #555;\n        transition: all 0.2s ease;\n        font-weight: 400;\n        font-size: 0.95em;\n    }\n    \n    .websy-nav-loading,\n    .websy-nav-empty,\n    .websy-nav-error {\n        padding: 12px 20px;\n        text-align: center;\n        color: #666;\n        font-style: italic;\n        font-size: 0.9em;\n    }\n    \n    .websy-nav-loading::after {\n        content: '';\n        display: inline-block;\n        width: 12px;\n        height: 12px;\n        margin-left: 8px;\n        border: 2px solid rgba(0, 124, 186, 0.3);\n        border-top: 2px solid #007cba;\n        border-radius: 50%;\n        animation: spin 1s linear infinite;\n    }\n    \n    @keyframes spin {\n        0% { transform: rotate(0deg); }\n        100% { transform: rotate(360deg); }\n    }\n    \n    .websy-nav-error {\n        color: #d32f2f;\n    }\n    \n    \/* Loading state for map container *\/\n    .websy-main-map-container.loading::after {\n        content: '';\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        width: 40px;\n        height: 40px;\n        border: 3px solid #f3f3f3;\n        border-top: 3px solid #007cba;\n        border-radius: 50%;\n        animation: spin 1s linear infinite;\n        z-index: 1000;\n    }\n    \n    \/* Responsive navigation adjustments *\/\n    @media (max-width: 768px) {\n        .websy-main-container {\n            min-height: unset !important; \/* Use more screen space on mobile *\/\n            \/* margin: 0 -15px; *\/\n            border-radius: 0;\n            border-left: none;\n            border-right: none;\n        }\n        \n        .websy-main-map-container {\n            height: 90vh; \/* Full height on mobile *\/\n            min-height: 500px;\n        }\n        \n        .websy-main-navigation {\n            bottom: 10px;\n            left: 10px;\n            right: 10px;\n            max-height: 120px;\n        }\n        \n        .websy-main-nav-header {\n            padding: 12px 16px 8px 16px;\n        }\n        \n        .websy-main-nav-title {\n            font-size: 0.9em;\n        }\n        \n        .websy-main-nav-content {\n            max-height: 80px;\n            padding: 4px 0;\n        }\n        \n        .websy-main-nav-list {\n            padding: 0 25px;\n            gap: 20px;\n        }\n        \n        .websy-main-nav-link {\n            padding: 6px 12px;\n            font-size: 0.85em;\n            min-height: 32px;\n        }\n        \n        .websy-nav-type {\n            font-size: 0.7em;\n            margin-left: 4px;\n            padding: 1px 4px;\n        }\n        \n        \/* Stack navigation items vertically on very small screens *\/\n        @media (max-width: 480px) {\n            .websy-main-nav-list {\n                flex-direction: column;\n                align-items: stretch;\n                gap: 20px;\n            }\n            \n            .websy-main-nav-item {\n                width: 100%;\n            }\n            \n            .websy-main-nav-link {\n                justify-content: center;\n                text-align: left;\n            }\n        }\n    }\n    \n    \/* Modal Breadcrumb Styles *\/\n    .websy-modal-breadcrumb {\n        background: #fff8f8;\n        color: #000000;\n        padding: 15px 20px;\n        margin: 0;\n        border-bottom: 1px solid rgba(255,255,255,0.1);\n    }\n    \n    .websy-modal-breadcrumb-content .websy-breadcrumb-nav {\n        display: flex;\n        align-items: center;\n        flex-wrap: wrap;\n        gap: 6px;\n        font-size: 14px;\n        line-height: 1.4;\n        margin: 0;\n    }\n    \n    .websy-modal-breadcrumb-content .websy-breadcrumb-nav a {\n        color: rgba(255,255,255,0.9);\n        text-decoration: none;\n        padding: 4px 10px;\n        border-radius: 15px;\n        background: rgba(255,255,255,0.1);\n        transition: all 0.2s ease;\n        font-size: 13px;\n    }\n    \n    .websy-modal-breadcrumb-content .websy-breadcrumb-nav a:hover {\n        background: rgba(255,255,255,0.2);\n        color: white;\n        transform: translateY(-1px);\n    }\n    \n    .websy-modal-breadcrumb-content .websy-breadcrumb-nav strong {\n        color: white;\n        padding: 4px 10px;\n        border-radius: 15px;\n        background: rgba(255,255,255,0.2);\n        font-weight: 600;\n        font-size: 13px;\n    }\n    \n    .websy-modal-breadcrumb-content .websy-separator {\n        color: rgba(255,255,255,0.6);\n        font-weight: 300;\n        margin: 0 2px;\n        font-size: 12px;\n    }\n\n    .websy-modal-bedrooms {\n        margin: 20px 0;\n        display: flex;\n        align-items: center;\n        gap: 10px;\n        \/* padding: 15px 25px 0px 25px;\n        border-top: 1px solid #4D40B4; *\/\n        padding: 0 25px;\n    }\n\n    .websy-modal-bedrooms-header strong {\n        font-size: 0.75rem;\n    }\n    \n    .websy-modal-bedrooms-content {\n        display: flex;\n        flex-direction: row;\n        justify-content: start;\n        gap: 10px;\n    }\n\n    .websy-modal-bedrooms-content a {\n        color: #000;\n        font-weight: 400;\n        border: 1px solid #4d40b4;\n        background: #f3f1ff;\n        width: 35px;\n        height: 35px;\n        border-radius: 2px;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        font-size: 1.25rem;\n    }\n\n    \/* Responsive breadcrumb for small modals *\/\n    @media (max-width: 768px) {\n        .websy-modal-breadcrumb {\n            padding: 12px 15px;\n        }\n        \n        .websy-modal-breadcrumb-content .websy-breadcrumb-nav {\n            font-size: 12px;\n            gap: 4px;\n        }\n        \n        .websy-modal-breadcrumb-content .websy-breadcrumb-nav a,\n        .websy-modal-breadcrumb-content .websy-breadcrumb-nav strong {\n            padding: 3px 8px;\n            font-size: 11px;\n        }\n    }\n\n    \/* Apartment Status Legend *\/\n    .websy-modal-legend {\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 8px;\n        padding: 15px;\n        margin: 15px 0;\n        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n        border: 1px solid rgba(255, 255, 255, 0.3);\n    }\n\n    .websy-modal-legend-title {\n        margin-bottom: 12px;\n        font-size: 14px;\n        color: #333;\n    }\n\n    .websy-modal-legend-title strong {\n        font-weight: 600;\n    }\n\n    .websy-modal-legend-items {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 12px;\n        align-items: center;\n    }\n\n    .websy-legend-item {\n        display: flex;\n        align-items: center;\n        gap: 6px;\n        font-size: 12px;\n        color: #555;\n    }\n\n    .websy-legend-color {\n        width: 16px;\n        height: 16px;\n        border-radius: 3px;\n        border: 1px solid rgba(0, 0, 0, 0.2);\n        flex-shrink: 0;\n    }\n\n    .websy-legend-available {\n        background: #28a745; \/* Green for available *\/\n    }\n\n    .websy-legend-reserved {\n        background: #ffc107; \/* Yellow for reserved *\/\n    }\n\n    .websy-legend-sold {\n        background: #dc3545; \/* Red for sold *\/\n    }\n\n    .websy-legend-unknown {\n        background: #6c757d; \/* Gray for unknown *\/\n    }\n\n    \/* Responsive legend for small modals *\/\n    @media (max-width: 768px) {\n        .websy-modal-legend {\n            padding: 12px;\n            margin: 12px 0;\n        }\n\n        .websy-modal-legend-title {\n            font-size: 13px;\n            margin-bottom: 10px;\n        }\n\n        .websy-legend-item {\n            font-size: 11px;\n            gap: 5px;\n        }\n\n        .websy-legend-color {\n            width: 14px;\n            height: 14px;\n        }\n\n        .websy-modal-legend-items {\n            gap: 10px;\n        }\n    }\n    \n    \/* Contact Form Styles *\/\n    .websy-contact-form-section {\n        \/* padding: 15px 20px;\n        border-top: 1px solid #e0e0e0;\n        background: #f8f9fa; *\/\n        \/* margin-top: 50px; *\/\n        padding: 25px;\n    }\n    \n    .websy-consultation-btn {\n        width: 100%;\n        color: white;\n        border: none;\n        border-radius: 6px;\n        padding: 12px 20px;\n        font-size: 14px;\n        font-weight: 600;\n        cursor: pointer;\n        transition: all 0.3s ease;\n        text-transform: uppercase;\n        letter-spacing: 0.5px;\n    }\n    \n    \/* .websy-consultation-btn:hover {\n        background: linear-gradient(135deg, #005a87 0%, #004066 100%);\n        transform: translateY(-1px);\n        box-shadow: 0 4px 12px rgba(0, 124, 186, 0.3);\n    } *\/\n    \n    .websy-consultation-btn:active {\n        transform: translateY(0);\n    }\n    \n    \/* Contact Form Modal *\/\n    .websy-modal-cf {\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 9999;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    \n    .websy-modal-cf-backdrop {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        background: rgba(0, 0, 0, 0.5);\n        backdrop-filter: blur(2px);\n    }\n    \n    .websy-modal-cf-container {\n        position: relative;\n        background: white;\n        border-radius: 10px;\n        max-width: 500px;\n        width: 90%;\n        max-height: 90vh;\n        overflow: hidden;\n        box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);\n        animation: modalFadeIn 0.3s ease-out;\n    }\n    \n    @keyframes modalFadeIn {\n        from {\n            opacity: 0;\n            transform: translateY(-30px) scale(0.9);\n        }\n        to {\n            opacity: 1;\n            transform: translateY(0) scale(1);\n        }\n    }\n    \n    .websy-modal-cf-header {\n        \/* background: linear-gradient(135deg, #007cba 0%, #005a87 100%); *\/\n        color: white;\n        padding: 20px;\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n    }\n    \n    .websy-modal-cf-header h3 {\n        margin: 0;\n        font-size: 18px;\n        font-weight: 600;\n    }\n    \n    .websy-modal-cf-close {\n        background: none;\n        border: none;\n        color: white;\n        font-size: 24px;\n        cursor: pointer;\n        padding: 0;\n        width: 30px;\n        height: 30px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        border-radius: 50%;\n        transition: background 0.2s ease;\n    }\n    \n    .websy-modal-cf-close:hover {\n        background: rgba(255, 255, 255, 0.2);\n    }\n    \n    .websy-modal-cf-content {\n        padding: 25px;\n        overflow-y: auto;\n        max-height: calc(90vh - 80px);\n    }\n    \n    \/* Contact Form *\/\n    .websy-contact-form {\n        display: flex;\n        flex-direction: column;\n        gap: 20px;\n    }\n    \n    .websy-form-group {\n        display: flex;\n        flex-direction: column;\n        gap: 6px;\n    }\n    \n    .websy-form-group label {\n        font-weight: 600;\n        color: #333;\n        font-size: 14px;\n    }\n    \n    .websy-form-group label .required {\n        color: #e74c3c;\n        margin-left: 2px;\n    }\n    \n    .websy-form-group input,\n    .websy-form-group textarea {\n        border: 2px solid #e0e0e0;\n        border-radius: 6px;\n        padding: 12px;\n        font-size: 14px;\n        transition: border-color 0.2s ease;\n        font-family: inherit;\n    }\n    \n    .websy-form-group input:focus,\n    .websy-form-group textarea:focus {\n        outline: none;\n        border-color: #007cba;\n        box-shadow: 0 0 0 3px rgba(0, 124, 186, 0.1);\n    }\n    \n    .websy-form-group textarea {\n        resize: vertical;\n        min-height: 100px;\n    }\n    \n    .websy-form-actions {\n        display: flex;\n        gap: 12px;\n        justify-content: flex-end;\n        margin-top: 10px;\n    }\n    \n    .websy-btn {\n        padding: 12px 24px;\n        border: none;\n        border-radius: 6px;\n        font-size: 14px;\n        font-weight: 600;\n        cursor: pointer;\n        transition: all 0.2s ease;\n        text-transform: uppercase;\n        letter-spacing: 0.5px;\n    }\n    \n    \/* .websy-btn-primary {\n        background: linear-gradient(135deg, #007cba 0%, #005a87 100%);\n        color: white;\n    }\n    \n    .websy-btn-primary:hover {\n        background: linear-gradient(135deg, #005a87 0%, #004066 100%);\n        transform: translateY(-1px);\n    } *\/\n    \n    .websy-btn-primary:disabled {\n        background: #ccc;\n        cursor: not-allowed;\n        transform: none;\n    }\n    \n    .websy-btn-secondary {\n        background: #f8f9fa;\n        color: #666;\n        border: 2px solid #e0e0e0;\n    }\n    \n    .websy-btn-secondary:hover {\n        background: #e9ecef;\n        border-color: #ccc;\n    }\n    \n    .websy-form-status {\n        padding: 12px;\n        border-radius: 6px;\n        font-size: 14px;\n        font-weight: 500;\n        text-align: center;\n        margin-top: 10px;\n        display: none;\n    }\n    \n    .websy-form-status.success {\n        background: #d4edda;\n        color: #155724;\n        border: 1px solid #c3e6cb;\n        display: block;\n    }\n    \n    .websy-form-status.error {\n        background: #f8d7da;\n        color: #721c24;\n        border: 1px solid #f5c6cb;\n        display: block;\n    }\n    \n    \/* Mobile Responsiveness *\/\n    @media (max-width: 768px) {\n        .websy-modal-cf-container {\n            width: 95%;\n            margin: 20px;\n        }\n        \n        .websy-modal-cf-content {\n            padding: 20px;\n        }\n        \n        .websy-form-actions {\n            flex-direction: column;\n        }\n        \n        .websy-btn {\n            width: 100%;\n        }\n    }\n    \n    \/* Apartment Contact Section Styles *\/\n    .websy-apartment-contact-section {\n        margin-top: 30px;\n        padding: 20px;\n        border: 1px solid #ddd;\n        border-radius: 5px;\n        background: #f9f9f9;\n    }\n    \n    .websy-apartment-contact-section h3 {\n        margin-top: 0;\n        margin-bottom: 10px;\n        color: #333;\n        font-size: 1.3em;\n    }\n    \n    .websy-apartment-contact-section p {\n        margin-bottom: 20px;\n        color: #666;\n        font-size: 1em;\n    }\n    \n    \/* Inline Contact Form Styles *\/\n    #websy-apartment-contact-form-container {\n        animation: slideDown 0.3s ease-out;\n    }\n    \n    #websy-apartment-contact-form {\n        background: #fff !important;\n        padding: 20px !important;\n        border-radius: 5px !important;\n        box-shadow: 0 2px 10px rgba(0,0,0,0.1) !important;\n        border: 1px solid #e0e0e0 !important;\n    }\n    \n    #websy-apartment-contact-form h4 {\n        margin-top: 0 !important;\n        margin-bottom: 20px !important;\n        color: #333 !important;\n        font-size: 1.2em !important;\n        font-weight: 600 !important;\n        border-bottom: 2px solid #007cba !important;\n        padding-bottom: 10px !important;\n    }\n    \n    .websy-form-cf-group {\n        margin-bottom: 15px !important;\n    }\n    \n    .websy-form-cf-group label {\n        display: block !important;\n        margin-bottom: 5px !important;\n        font-weight: 500 !important;\n        color: #333 !important;\n    }\n    \n    .websy-form-cf-group input,\n    .websy-form-cf-group textarea {\n        width: 100% !important;\n        padding: 10px !important;\n        border: 1px solid #ddd !important;\n        border-radius: 3px !important;\n        box-sizing: border-box !important;\n        font-size: 14px !important;\n        transition: border-color 0.3s ease !important;\n    }\n    \n    .websy-form-cf-group input:focus,\n    .websy-form-cf-group textarea:focus {\n        outline: none !important;\n        border-color: #007cba !important;\n        box-shadow: 0 0 0 2px rgba(0,123,186,0.2) !important;\n    }\n    \n    .websy-form-cf-submit {\n        text-align: right !important;\n        margin-top: 20px !important;\n        padding-top: 20px !important;\n        border-top: 1px solid #e0e0e0 !important;\n    }\n    \n    #websy-apartment-contact-form button[type=\"submit\"] {\n        background: #007cba !important;\n        color: white !important;\n        padding: 10px 16px !important;\n        border: none !important;\n        border-radius: 3px !important;\n        cursor: pointer !important;\n        transition: background-color 0.3s ease !important;\n    }\n    \n    #websy-apartment-contact-form button[type=\"submit\"]:hover {\n        background: #005a87 !important;\n    }\n    \n    #websy-apartment-contact-status {\n        margin-top: 15px !important;\n        padding: 15px !important;\n        border-radius: 3px !important;\n        font-weight: 500 !important;\n    }\n    \n    @keyframes slideDown {\n        from {\n            opacity: 0;\n            transform: translateY(-10px);\n        }\n        to {\n            opacity: 1;\n            transform: translateY(0);\n        }\n    }\n    \n    @media (max-width: 768px) {\n        .websy-apartment-contact-section {\n            margin: 20px -15px 30px -15px;\n            border-radius: 0;\n            border-left: none;\n            border-right: none;\n        }\n        \n        \n        #websy-apartment-contact-form {\n            padding: 15px !important;\n        }\n        \n        .websy-form-cf-submit {\n            text-align: center !important;\n        }\n        \n        #websy-apartment-contact-form button[type=\"submit\"] {\n            width: 100% !important;\n            margin: 5px 0 !important;\n        }\n    }\n\n    \/*svg paths*\/\n    .websy-main-map-container svg#frontend-svg path.apartment-sold-overlay {\n        fill:#000000 !important;\n        opacity: 0.8 !important;\n    }\n\n\n    <\/style>\n\n    <script>\n    document.addEventListener('DOMContentLoaded', function () {\n      const svgEl       = document.getElementById('frontend-svg');\n      const wrapper     = document.getElementById('canvas-scroll-container');\n      const mapContainer = document.querySelector('.websy-main-map-container');\n\n      \/\/ 1) Parse the JSON that was saved (it arrives as a string)\n      let savedData = {};\n      try {\n        savedData = JSON.parse(\"\");\n      } catch (e) {\n        console.error('Invalid JSON for canvas:', e);\n        return;\n      }\n\n      \/\/ 2) Helper to create an SVG node with attributes\n      function createSVG(name, attrs) {\n        const el = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', name);\n        for (let k in attrs) {\n          el.setAttribute(k, attrs[k]);\n        }\n        return el;\n      }\n\n      \/\/ Add loading state initially\n      mapContainer.classList.add('loading');\n\n      \/\/ 3) Set up zoom controls\n      setupMainZoomControls();\n\n      \/\/ 4) Once image is loaded (or if none), draw everything and center\/scroll\n      function drawEverything() {\n        \/\/ If backgroundImage was stored, savedData.backgroundImage.src holds the dataURL or URL\n        if (savedData.backgroundImage && savedData.backgroundImage.src) {\n          const img = new Image();\n          img.onload = function () {\n            const imgW = img.width;\n            const imgH = img.height;\n\n            \/\/ 3a) Make the SVG exactly match the image dimensions\n            svgEl.setAttribute('width', imgW);\n            svgEl.setAttribute('height', imgH);\n            svgEl.setAttribute('viewBox', `0 0 ${imgW} ${imgH}`);\n\n            \/\/ 3b) Insert an <image> element as the background\n            const imageNode = createSVG('image', {\n              href: savedData.backgroundImage.src,\n              x: 0,\n              y: 0,\n              width: imgW,\n              height: imgH,\n              preserveAspectRatio: 'xMidYMid meet'\n            });\n            svgEl.appendChild(imageNode);\n\n            \/\/ 3c) Draw all saved polygons (as <path>)\n            drawPaths();\n\n            \/\/ 3d) Finally, center\u2010or\u2010scroll the wrapper\n            centerOrScroll();\n            \n            \/\/ Remove loading state\n            mapContainer.classList.remove('loading');\n            \n            \/\/ Load navigation\n            loadMainNavigation();\n          };\n          img.src = savedData.backgroundImage.src;\n        } else {\n          \/\/ No background image \u2192 give a default size\n          const defaultW = 800, defaultH = 600;\n          svgEl.setAttribute('width', defaultW);\n          svgEl.setAttribute('height', defaultH);\n          svgEl.setAttribute('viewBox', `0 0 ${defaultW} ${defaultH}`);\n\n          drawPaths();\n          centerOrScroll();\n          \n          \/\/ Remove loading state\n          mapContainer.classList.remove('loading');\n          \n          \/\/ Load navigation\n          loadMainNavigation();\n        }\n      }\n\n      \/\/ 4) Convert each Fabric \u201cpolyline\u201d into an SVG <path>\n    function drawPaths() {\n        (savedData.objects || []).forEach((obj, index) => {\n            if (obj.type === 'polyline') {\n            \/\/ Build the path `d` string\n            const pts = obj.points || [];\n            if (pts.length < 2) return;\n\n            let d = `M ${pts[0].x} ${pts[0].y}`;\n            for (let i = 1; i < pts.length; i++) {\n                d += ` L ${pts[i].x} ${pts[i].y}`;\n            }\n            d += ' Z';\n\n            \/\/ Create <path> and set its attributes\n            const pathAttrs = {\n                d: d,\n                fill: obj.fill || 'none',\n                stroke: obj.stroke || '#000',\n                'stroke-width': obj.strokeWidth || 1\n            };\n            const pathEl = createSVG('path', pathAttrs);\n\n            \/\/ 1) If the JSON object had our `polygonID`, attach it to the <path> as `id`\n            if (obj.polygonID) {\n                pathEl.setAttribute('id', obj.polygonID);\n            }\n            if (obj.dataPostID) {\n                pathEl.dataset.postId = obj.dataPostID;\n            }\n\n            \/\/ Calculate polygon center for tooltip positioning\n            const center = calculatePolygonCenter(pts);\n\n            \/\/ Create individual tooltip for this polygon\n            const tooltipId = `tooltip-${obj.polygonID || index}`;\n            const tooltip = document.createElement('div');\n            tooltip.className = 'polygon-tooltip loading';\n            tooltip.id = tooltipId;\n            \n            \/\/ Position tooltip at polygon center with proper positioning\n            tooltip.style.left = center.x + 'px';\n            tooltip.style.top = center.y + 'px';\n            tooltip.style.position = 'absolute';\n            \n            \/\/ Set initial loading content\n            tooltip.innerHTML = 'Loading...';\n            \n            wrapper.appendChild(tooltip);\n\n            \/\/ Load tooltip content immediately\n            const postId = pathEl.dataset.postId;\n            const polygonId = pathEl.getAttribute('id');\n            \n            \/\/ Add simple polygon hover effect\n            \/\/setupPolygonHover(pathEl, polygonId || `polygon-${index}`);\n            \n            if (postId) {\n                fetchPostData(postId, tooltip);\n            } else {\n                \/\/ No linked post, show polygon info\n                tooltip.innerHTML = polygonId ? polygonId : 'Area';\n                tooltip.style.display = \"none\";\n                tooltip.classList.remove('loading');\n            }\n\n            \/\/ Add click and touch events to open modal directly\n            function handlePathClick(e) {\n                if (postId) {\n                \/\/ Get post title from tooltip for modal title\n                const titleLink = tooltip.querySelector('a');\n                const title = titleLink ? titleLink.textContent : 'Post';\n                const url = titleLink ? titleLink.getAttribute('onclick').match(\/openPostModal\\([^,]+,\\s*'[^']*',\\s*'([^']+)'\/)?.[1] || '#' : '#';\n                openPostModal(postId, title, url);\n                }\n                e.preventDefault();\n                e.stopPropagation();\n            }\n            \n            pathEl.addEventListener('click', handlePathClick);\n            \n            \/\/ Add touch support for mobile devices\n            pathEl.addEventListener('touchend', function(e) {\n                \/\/ Only handle if it's a tap (not a drag)\n                if (e.changedTouches.length === 1 && !isDragging) {\n                handlePathClick(e);\n                }\n            });\n\n            svgEl.appendChild(pathEl);\n            }\n        });\n    \n        \/\/ Set up inverse hover effect if enabled\n                \n        \/\/ Ensure tooltips are positioned correctly after all paths are created\n        setTimeout(() => {\n            updateMainTooltipPositions();\n\n        }, 50);\n        \n        \/\/ Now fetch apartment statuses and apply black overlays for sold units\n        const allPaths = svgEl.querySelectorAll('path[data-post-id]');\n        const pathPostIds = [];\n        allPaths.forEach(path => {\n            const postId = path.getAttribute('data-post-id');\n            if (postId) pathPostIds.push(postId);\n        });\n        \n        if (pathPostIds.length > 0) {\n            fetch(`\/wp-json\/websy\/v1\/apartment-statuses?ids=${pathPostIds.join(',')}`)\n                .then(response => response.json())\n                .then(apartmentStatuses => {\n                    \/\/ Create status map\n                    const statusMap = {};\n                    apartmentStatuses.forEach(apartment => {\n                        statusMap[apartment.id] = apartment.apartment_available;\n                    });\n                    \n                    \/\/ Apply black overlays to sold apartments\n                    applyBlackOverlaysToPaths(allPaths, statusMap);\n                })\n                .catch(error => console.error('Error fetching apartment statuses:', error));\n        }\n    }\n\n    \/\/ Apply black overlays to sold apartment paths\n    function applyBlackOverlaysToPaths(paths, statusMap) {\n        paths.forEach(path => {\n            const postId = path.getAttribute('data-post-id');\n            if (!postId) return;\n            \n            const status = statusMap[postId];\n            if (!status) return;\n            \n            const statusStr = String(status).toLowerCase();\n            const isSold = statusStr === 'sold' || statusStr === '3' || statusStr === '0' || statusStr === 'no';\n            \n            if (isSold) {\n                \/\/ Change existing path to solid black\n                path.setAttribute('fill', '#000000');\n                path.setAttribute('fill-opacity', '0.8');\n                path.classList.add('apartment-sold-overlay');\n            }\n        });\n    }\n\n\/\/ Helper function to fetch post data and update tooltip\nfunction fetchPostData(postId, tooltip) {\n  \/\/ First try WordPress's search API for any post type\n  fetch(`\/wp-json\/wp\/v2\/search?search=&subtype=any&type=post&per_page=1&include=${postId}`)\n    .then(response => {\n      if (!response.ok) {\n        throw new Error('Search API request failed');\n      }\n      return response.json();\n    })\n    .then(data => {\n      if (Array.isArray(data) && data.length > 0) {\n        const post = data[0];        \n        \/\/ Check if this is an apartment post\n        if (post.subtype === 'apartment') {\n          \/\/ For apartments: keep title, add color-based styling, keep clickable\n          tooltip.innerHTML = `<a href=\"#\" title=\"Click to view apartment details\" onclick=\"openPostModal(${postId}, '${post.title.replace(\/'\/g, \"\\\\'\")}', '${post.url}'); return false;\">${post.title}<\/a>`;\n          \n          \/\/ Fetch apartment availability status to set color\n          fetch(`\/wp-json\/websy\/v1\/posts\/apartment?per_page=-1`)\n            .then(response => response.json())\n            .then(apartmentData => {\n              const apartment = apartmentData.find(apt => String(apt.id) === String(postId));\n              \n              \/\/ Reset any existing status classes\n              tooltip.classList.remove('apartment-available', 'apartment-reserved', 'apartment-sold', 'apartment-unknown');\n              \n              if (apartment && apartment.apartment_available) {\n                const status = String(apartment.apartment_available).toLowerCase();\n                switch(status) {\n                  case 'available':\n                  case '1':\n                    tooltip.classList.add('apartment-available');\n                    break;\n                  case 'reserved':\n                  case '2':\n                    tooltip.classList.add('apartment-reserved');\n                    break;\n                  case 'sold':\n                  case '3':\n                  case '0':\n                    tooltip.classList.add('apartment-sold');\n                    break;\n                  default:\n                    tooltip.classList.add('apartment-unknown');\n                }\n              } else {\n                tooltip.classList.add('apartment-unknown');\n              }\n            })\n            .catch(() => {\n              tooltip.classList.add('apartment-unknown');\n            });\n\n            \n        } else {\n          \/\/ For non-apartments: show title as usual with apartment count\n          let tooltipHtml = `<a href=\"#\" onclick=\"openPostModal(${postId}, '${post.title.replace(\/'\/g, \"\\\\'\")}', '${post.url}'); return false;\">${post.title}<\/a>`;\n          \n          \/\/ Add apartment count for complex and building\n          if (post.subtype === 'complex' || post.subtype === 'building') {\n            const metaKey = post.subtype + '_id';\n            fetch(`\/wp-json\/websy\/v1\/posts\/apartment?meta_key=${metaKey}&meta_value=${postId}&per_page=-1`)\n              .then(response => response.json())\n              .then(apartments => {\n                if (apartments && Array.isArray(apartments)) {\n                  tooltip.classList.add('has-apartment-count');\n                  const count = apartments.length;\n                  tooltip.innerHTML = tooltipHtml + `<div>${count} avail. apartments<\/div>`;\n                }\n              })\n              .catch(() => {\n                tooltip.innerHTML = tooltipHtml;\n              });\n          } else {\n            tooltip.innerHTML = tooltipHtml;\n          }\n        }\n        \n        tooltip.classList.remove('loading');\n      } else {\n        throw new Error('Post not found in search results');\n      }\n    })\n    .catch((searchError) => {\n      console.log('Search API failed, trying AJAX fallback:', searchError);\n      \/\/ Fallback to reliable AJAX endpoint for imported posts\n      const ajaxUrl = 'https:\/\/buildingbox.isgcm.com\/wp-admin\/admin-ajax.php';\n      \n      fetch(ajaxUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application\/x-www-form-urlencoded',\n        },\n        body: `action=websy_get_post_data&post_id=${postId}&nonce=9ff130a5bb`\n      })\n      .then(response => response.json())\n      .then(data => {\n        if (data.success && data.data) {\n          tooltip.classList.remove('loading');\n          const post = data.data;\n          \n          \/\/ Create proper tooltip content with correct title and link\n          tooltip.innerHTML = `<a href=\"#\" onclick=\"openPostModal(${postId}, '${post.title.replace(\/'\/g, \"\\\\'\")}', '${post.permalink}'); return false;\">${post.title}<\/a>`;\n          \n          \/\/ Add apartment status styling if it's an apartment\n          if (post.post_type === 'apartment') {\n            const status = post.apartment_available || 'unknown';\n            let statusClass = 'apartment-unknown';\n            \n            if (status === 'available' || status === '1' || status === 'yes') {\n              statusClass = 'apartment-available';\n            } else if (status === 'reserved') {\n              statusClass = 'apartment-reserved';\n            } else if (status === 'sold' || status === '0' || status === 'no') {\n              statusClass = 'apartment-sold';\n            }\n            \n            tooltip.classList.add(statusClass);\n          }\n        } else {\n          \/\/ Final fallback if both APIs fail\n          tooltip.innerHTML = `<a href=\"#\" onclick=\"openPostModal(${postId}, 'Post', '\/?p=${postId}'); return false;\">View Post<\/a>`;\n          tooltip.classList.remove('loading');\n        }\n      })\n      .catch(error => {\n        console.error('Error with AJAX fallback:', error);\n        \/\/ Final fallback if both APIs fail\n        tooltip.innerHTML = `<a href=\"#\" onclick=\"openPostModal(${postId}, 'Post', '\/?p=${postId}'); return false;\">View Post<\/a>`;\n        tooltip.classList.remove('loading');\n      });\n    });\n}\n\n\/\/ Simplified hover effects - only for polygons\n\/\/ function setupPolygonHover(pathElement, polygonId) {\n\/\/   \/\/ Add simple polygon hover effect\n\/\/   pathElement.addEventListener('mouseenter', function() {\n\/\/     pathElement.classList.add('polygon-hovered');\n\/\/   });\n  \n\/\/   pathElement.addEventListener('mouseleave', function() {\n\/\/     pathElement.classList.remove('polygon-hovered');\n\/\/   });\n\/\/ }\n\n      \/\/ 5) Enhanced center vs. scroll logic with optimized container fitting\n      function centerOrScroll() {\n        const cw = wrapper.clientWidth;\n        const ch = wrapper.clientHeight;\n        const vb = svgEl.viewBox.baseVal;\n        const vw = vb.width;\n        const vh = vb.height;\n\n        \/\/ Reset any previous styling\n        svgEl.style.width = '';\n        svgEl.style.height = '';\n        svgEl.style.maxWidth = '';\n        svgEl.style.maxHeight = '';\n        svgEl.style.transform = '';\n        wrapper.style.display = '';\n        wrapper.style.justifyContent = '';\n        wrapper.style.alignItems = '';\n        \n        \/\/ Calculate scale factors\n        const scaleX = cw \/ vw;\n        const scaleY = ch \/ vh;\n        const optimalScale = Math.min(scaleX, scaleY);\n        \n        \/\/ Always make the SVG fill the full container at maximum possible size\n        wrapper.classList.remove('centered', 'fit-container');\n        wrapper.style.overflow = 'hidden';\n        wrapper.style.display = 'flex';\n        wrapper.style.justifyContent = 'center';\n        wrapper.style.alignItems = 'center';\n        \n        \/\/ Set SVG to fill the entire container while maintaining aspect ratio\n        if (scaleX < scaleY) {\n          \/\/ Width is the limiting factor - make it full width\n          svgEl.style.width = '100%';\n          svgEl.style.height = 'auto';\n        } else {\n          \/\/ Height is the limiting factor - make it full height\n          svgEl.style.width = 'auto';\n          svgEl.style.height = '100%';\n        }\n        \n        \/\/ Ensure SVG uses maximum available space\n        svgEl.style.maxWidth = '100%';\n        svgEl.style.maxHeight = '100%';\n        svgEl.style.objectFit = 'contain';\n      }\n\n      \/\/ Re-run on window resize (mobile orientation change, etc.)\n      window.addEventListener('resize', function() {\n        centerOrScroll();\n        \/\/ Also update tooltip positions on main map\n        setTimeout(() => updateMainTooltipPositions(), 100);\n      });\n\n      \/\/ Kick it all off\n      drawEverything();\n\n        \/\/ --- Enable desktop panning (drag to scroll) only when SVG overflows container ---\n        let isDragging = false;\n        let lastX, lastY;\n\n        wrapper.addEventListener('mousedown', function(e) {\n            \/\/ Only start panning if wrapper allows scrolling (not in centered or fit-container mode)\n            if (!wrapper.classList.contains('centered') && !wrapper.classList.contains('fit-container')) {\n                const vb = svgEl.viewBox.baseVal;\n                if (vb.width > wrapper.clientWidth || vb.height > wrapper.clientHeight) {\n                    isDragging = true;\n                    lastX = e.clientX;\n                    lastY = e.clientY;\n                    wrapper.style.cursor = 'grabbing';\n                    e.preventDefault();\n                }\n            }\n        });\n\n        wrapper.addEventListener('mousemove', function(e) {\n            if (!isDragging) return;\n            const dx = e.clientX - lastX;\n            const dy = e.clientY - lastY;\n            wrapper.scrollLeft -= dx;\n            wrapper.scrollTop  -= dy;\n            lastX = e.clientX;\n            lastY = e.clientY;\n        });\n\n        wrapper.addEventListener('mouseup', function() {\n            isDragging = false;\n            wrapper.style.cursor = '';\n            \/\/ Update tooltip positions after dragging\n            setTimeout(() => updateMainTooltipPositions(), 50);\n        });\n\n        wrapper.addEventListener('mouseleave', function() {\n            isDragging = false;\n            wrapper.style.cursor = '';\n        });\n\n        \/\/ --- Enable mobile touch panning only when needed ---\n        let touchStartTime = 0;\n        const TOUCH_TAP_TIMEOUT = 200; \/\/ Milliseconds to consider it a tap vs drag\n        \n        wrapper.addEventListener('touchstart', function(e) {\n            \/\/ Only handle single-finger touches to allow pinch-to-zoom\n            if (e.touches.length === 1 && !wrapper.classList.contains('centered') && !wrapper.classList.contains('fit-container')) {\n                const vb = svgEl.viewBox.baseVal;\n                \/\/ Only initiate if SVG is larger than container\n                if (vb.width > wrapper.clientWidth || vb.height > wrapper.clientHeight) {\n                    touchStartTime = Date.now();\n                    lastX = e.touches[0].clientX;\n                    lastY = e.touches[0].clientY;\n                    \/\/ Don't prevent default immediately - let taps through to SVG paths\n                }\n            }\n            \/\/ Allow multi-touch gestures (pinch-to-zoom) to pass through\n        }, { passive: false });\n\n        wrapper.addEventListener('touchmove', function(e) {\n            \/\/ Only handle single-finger dragging, allow multi-touch zoom\n            if (e.touches.length !== 1) return;\n            \n            const timeSinceStart = Date.now() - touchStartTime;\n            const dx = e.touches[0].clientX - lastX;\n            const dy = e.touches[0].clientY - lastY;\n            const distance = Math.sqrt(dx * dx + dy * dy);\n            \n            \/\/ Only start dragging if we've moved enough or enough time has passed\n            if (!isDragging && (distance > 10 || timeSinceStart > TOUCH_TAP_TIMEOUT)) {\n                isDragging = true;\n            }\n            \n            if (isDragging) {\n                wrapper.scrollLeft -= dx;\n                wrapper.scrollTop  -= dy;\n                lastX = e.touches[0].clientX;\n                lastY = e.touches[0].clientY;\n                e.preventDefault(); \/\/ Only prevent default when actually dragging\n            }\n        }, { passive: false });\n\n        wrapper.addEventListener('touchend', function() {\n            \/\/ Only update tooltip positions if there was actual dragging\n            if (isDragging) {\n                setTimeout(() => updateMainTooltipPositions(), 50);\n            }\n            isDragging = false;\n        });\n\n        \/\/ Remove legacy mobile zoom code - now handled by optimized container fitting\n        \/\/ All scaling is handled by the enhanced centerOrScroll function\n    });\n\n    \/\/ Helper function to calculate polygon center (global scope)\n    function calculatePolygonCenter(points) {\n      if (!points || points.length === 0) return { x: 0, y: 0 };\n      \n      \/\/ Use centroid calculation for better accuracy\n      let area = 0;\n      let centroidX = 0;\n      let centroidY = 0;\n      \n      for (let i = 0; i < points.length; i++) {\n        const j = (i + 1) % points.length;\n        const xi = points[i].x;\n        const yi = points[i].y;\n        const xj = points[j].x;\n        const yj = points[j].y;\n        \n        const a = xi * yj - xj * yi;\n        area += a;\n        centroidX += (xi + xj) * a;\n        centroidY += (yi + yj) * a;\n      }\n      \n      area *= 0.5;\n      \n      if (Math.abs(area) > 0.001) {\n        \/\/ Use centroid if area is significant - make sure centroid is positive\n        centroidX = Math.abs(centroidX \/ (6 * area));\n        centroidY = Math.abs(centroidY \/ (6 * area));\n        return { x: centroidX, y: centroidY };\n      } else {\n        \/\/ Fallback to simple average for degenerate cases\n        let totalX = 0;\n        let totalY = 0;\n        \n        points.forEach(point => {\n          totalX += point.x;\n          totalY += point.y;\n        });\n        \n        return {\n          x: totalX \/ points.length,\n          y: totalY \/ points.length\n        };\n      }\n    }\n\n    \/\/ Helper function to update tooltip positions on main map (global scope)\n    function updateMainTooltipPositions() {\n        const mainWrapper = document.getElementById('canvas-scroll-container');\n        const mainSvg = document.getElementById('frontend-svg');\n        \n        if (!mainWrapper || !mainSvg) return;\n        \n        const tooltips = mainWrapper.querySelectorAll('.polygon-tooltip');\n        tooltips.forEach(tooltip => {\n            const tooltipId = tooltip.id;\n            const pathId = tooltipId.replace('tooltip-', '');\n            const pathEl = mainSvg.querySelector(`[id=\"${pathId}\"]`);\n            \n            if (pathEl) {\n                \/\/ Get the path's bounding box\n                const bbox = pathEl.getBBox();\n                const centerX = bbox.x + bbox.width \/ 2;\n                const centerY = bbox.y + bbox.height \/ 2;\n                \n                \/\/ For main map, positioning is simpler since no complex zoom transforms\n                const svgRect = mainSvg.getBoundingClientRect();\n                const wrapperRect = mainWrapper.getBoundingClientRect();\n                \n                \/\/ Calculate scale based on SVG viewBox vs actual rendered size\n                const scaleX = svgRect.width \/ mainSvg.viewBox.baseVal.width;\n                const scaleY = svgRect.height \/ mainSvg.viewBox.baseVal.height;\n                \n                \/\/ Calculate SVG offset within wrapper\n                const svgOffsetX = svgRect.left - wrapperRect.left + mainWrapper.scrollLeft;\n                const svgOffsetY = svgRect.top - wrapperRect.top + mainWrapper.scrollTop;\n                \n                \/\/ Position tooltip\n                const scaledX = svgOffsetX + (centerX * scaleX);\n                const scaledY = svgOffsetY + (centerY * scaleY);\n                \n                tooltip.style.left = scaledX + 'px';\n                tooltip.style.top = scaledY + 'px';\n            }\n        });\n    }    \/\/ Helper function to fetch post data for modal tooltips (global scope)\n    function fetchPostDataForModal(postId, tooltip) {\n      \/\/ First try WordPress's search API for any post type\n      fetch(`\/wp-json\/wp\/v2\/search?search=&subtype=any&type=post&per_page=1&include=${postId}`)\n        .then(response => {\n          if (!response.ok) {\n            throw new Error('Search API request failed');\n          }\n          return response.json();\n        })\n        .then(data => {\n          if (Array.isArray(data) && data.length > 0) {\n            const post = data[0];\n            \n            \/\/ Check if this is an apartment post\n            if (post.subtype === 'apartment') {\n              \/\/ For apartments: keep title, add color-based styling, keep clickable\n              tooltip.innerHTML = `<a href=\"#\" onclick=\"openPostModal(${postId}, '${post.title.replace(\/'\/g, \"\\\\'\")}', '${post.url}'); return false;\">${post.title}<\/a>`;\n              \n              \/\/ Fetch ONLY this apartment's status efficiently using include parameter\n              fetch(`\/wp-json\/websy\/v1\/posts\/apartment?include=${postId}`)\n                .then(response => response.json())\n                .then(apartmentData => {\n                  \/\/ Reset any existing status classes\n                  tooltip.classList.remove('apartment-available', 'apartment-reserved', 'apartment-sold', 'apartment-unknown');\n                  \n                  if (apartmentData && apartmentData.length > 0) {\n                    const apartment = apartmentData[0];\n                    if (apartment && apartment.apartment_available) {\n                      const status = String(apartment.apartment_available).toLowerCase();\n                      switch(status) {\n                        case 'available':\n                        case '1':\n                          tooltip.classList.add('apartment-available');\n                          break;\n                        case 'reserved':\n                        case '2':\n                          tooltip.classList.add('apartment-reserved');\n                          break;\n                        case 'sold':\n                        case '3':\n                        case '0':\n                          tooltip.classList.add('apartment-sold');\n                          break;\n                        default:\n                          tooltip.classList.add('apartment-unknown');\n                      }\n                    } else {\n                      tooltip.classList.add('apartment-unknown');\n                    }\n                  } else {\n                    tooltip.classList.add('apartment-unknown');\n                  }\n                })\n                .catch(() => {\n                  tooltip.classList.add('apartment-unknown');\n                });\n            } else {\n              \/\/ For non-apartments: show title as usual\n              tooltip.innerHTML = `<a href=\"#\" onclick=\"openPostModal(${postId}, '${post.title.replace(\/'\/g, \"\\\\'\")}', '${post.url}'); return false;\">${post.title}<\/a>`;\n            }\n            \n            tooltip.classList.remove('loading');\n          } else {\n            throw new Error('Post not found in search results');\n          }\n        })\n        .catch((searchError) => {\n          console.log('Modal search API failed, trying AJAX fallback:', searchError);\n          \/\/ Fallback to reliable AJAX endpoint for imported posts\n          const ajaxUrl = 'https:\/\/buildingbox.isgcm.com\/wp-admin\/admin-ajax.php';\n          \n          fetch(ajaxUrl, {\n            method: 'POST',\n            headers: {\n              'Content-Type': 'application\/x-www-form-urlencoded',\n            },\n            body: `action=websy_get_post_data&post_id=${postId}&nonce=9ff130a5bb`\n          })\n          .then(response => response.json())\n          .then(data => {\n            if (data.success && data.data) {\n              tooltip.classList.remove('loading');\n              const post = data.data;\n              \n              \/\/ Create proper tooltip content\n              tooltip.innerHTML = `<a href=\"#\" onclick=\"openPostModal(${postId}, '${post.title.replace(\/'\/g, \"\\\\'\")}', '${post.permalink}'); return false;\">${post.title}<\/a>`;\n              \n              \/\/ Add apartment status styling if it's an apartment\n              if (post.post_type === 'apartment') {\n                const status = post.apartment_available || 'unknown';\n                let statusClass = 'apartment-unknown';\n                \n                if (status === 'available' || status === '1' || status === 'yes') {\n                  statusClass = 'apartment-available';\n                } else if (status === 'reserved') {\n                  statusClass = 'apartment-reserved';\n                } else if (status === 'sold' || status === '0' || status === 'no') {\n                  statusClass = 'apartment-sold';\n                }\n                \n                tooltip.classList.add(statusClass);\n              }\n            } else {\n              tooltip.classList.remove('loading');\n              tooltip.innerHTML = 'Post not found';\n            }\n          })\n          .catch(error => {\n            console.error('Error with modal AJAX fallback:', error);\n            tooltip.classList.remove('loading');\n            tooltip.innerHTML = 'Error loading post';\n          });\n        });\n    }\n\n    \/\/ Batch load tooltip data for better performance\n    function batchLoadTooltipData(wrapper) {\n        const tooltips = wrapper.querySelectorAll('.polygon-tooltip[data-post-id]');\n        const postIds = [];\n        const apartmentIds = [];\n        const tooltipMap = {};\n        \n        \/\/ Collect all post IDs and create tooltip lookup map\n        tooltips.forEach(tooltip => {\n            const postId = tooltip.getAttribute('data-post-id');\n            if (postId) {\n                postIds.push(postId);\n                tooltipMap[postId] = tooltip;\n            }\n        });\n        \n        if (postIds.length === 0) return;\n        \n        \/\/ Batch fetch all post data\n        fetch(`\/wp-json\/wp\/v2\/search?search=&subtype=any&type=post&per_page=-1&include=${postIds.join(',')}`)\n            .then(response => response.json())\n            .then(allPostData => {\n                \/\/ Check if the response is valid\n                if (!Array.isArray(allPostData)) {\n                    console.error('Invalid post data response:', allPostData);\n                    throw new Error('Invalid response format');\n                }\n                \n                \/\/ Identify apartments for status batch fetching\n                allPostData.forEach(post => {\n                    if (post.subtype === 'apartment') {\n                        apartmentIds.push(post.id);\n                    }\n                });\n                \n                \/\/ Batch fetch apartment statuses if needed\n                let statusPromise = Promise.resolve([]);\n                if (apartmentIds.length > 0) {\n                    statusPromise = fetch(`\/wp-json\/websy\/v1\/apartment-statuses?ids=${apartmentIds.join(',')}`)\n                        .then(response => response.json())\n                        .catch(() => []);\n                }\n                \n                statusPromise.then(apartmentStatuses => {\n                    \/\/ Create status lookup map\n                    const statusMap = {};\n                    apartmentStatuses.forEach(apartment => {\n                        statusMap[apartment.id] = apartment.apartment_available;\n                    });\n                    \n                    \/\/ Update all tooltips at once\n                    allPostData.forEach(post => {\n                        const tooltip = tooltipMap[post.id];\n                        if (!tooltip) return;\n                        \n                        if (post.subtype === 'apartment') {\n                            \/\/ For apartments: add clickable link and status styling\n                            tooltip.innerHTML = `<a href=\"#\" onclick=\"openPostModal(${post.id}, '${post.title.replace(\/'\/g, \"\\\\'\")}', '${post.url}'); return false;\">${post.title}<\/a>`;\n                            \n                            \/\/ Apply status styling\n                            tooltip.classList.remove('apartment-available', 'apartment-reserved', 'apartment-sold', 'apartment-unknown');\n                            \n                            const status = statusMap[post.id];\n                            if (status) {\n                                const statusStr = String(status).toLowerCase();\n                                switch(statusStr) {\n                                    case 'available':\n                                    case '1':\n                                        tooltip.classList.add('apartment-available');\n                                        break;\n                                    case 'reserved':\n                                    case '2':\n                                        tooltip.classList.add('apartment-reserved');\n                                        break;\n                                    case 'sold':\n                                    case '3':\n                                    case '0':\n                                        tooltip.classList.add('apartment-sold');\n                                        break;\n                                    default:\n                                        tooltip.classList.add('apartment-unknown');\n                                }\n                            } else {\n                                tooltip.classList.add('apartment-unknown');\n                            }\n                        } else {\n                            \/\/ For non-apartments: show title as usual\n                            tooltip.innerHTML = `<a href=\"#\" onclick=\"openPostModal(${post.id}, '${post.title.replace(\/'\/g, \"\\\\'\")}', '${post.url}'); return false;\">${post.title}<\/a>`;\n                        }\n                        \n                        tooltip.classList.remove('loading');\n                    });\n                });\n            })\n            .catch(error => {\n                console.error('Batch tooltip loading failed:', error);\n                \/\/ Fallback to individual loading for any remaining tooltips\n                tooltips.forEach(tooltip => {\n                    const postId = tooltip.getAttribute('data-post-id');\n                    if (postId) {\n                        fetchPostDataForModal(postId, tooltip);\n                    }\n                });\n            });\n    }\n\n    \/\/ Navigate to post page directly (no modal)\n    function openPostModal(postId, title, url) {\n        if (url && url !== '#') {\n            window.location.href = url;\n        } else {\n            \/\/ Fallback: construct URL if not provided\n            const postUrl = '\/?p=' + postId;\n            window.location.href = postUrl;\n        }\n    }\n    \n    \/\/ DEPRECATED: Modal functions no longer used\n    \/\/ Posts now open directly as pages instead of in modals\n    \/*\n    function createPostModal() {\n        const modal = document.createElement('div');\n        modal.id = 'websy-post-modal';\n        modal.className = 'websy-modal';\n        modal.innerHTML = `\n            <div class=\"websy-modal-content\">\n                <div class=\"websy-modal-header\">\n                    <div class=\"websy-modal-title-section\">\n                        <button class=\"websy-modal-back-btn\" title=\"Go Back\" style=\"display: none;\">\u2039<\/button>\n                        <h2 class=\"websy-modal-title\">Loading...<\/h2>\n                    <\/div>\n                    <span class=\"websy-modal-close\">&times;<\/span>\n                <\/div>\n                <div class=\"websy-modal-body\">\n                    <div class=\"websy-loading\">Loading...<\/div>\n                <\/div>\n            <\/div>\n        `;\n        \n        document.body.appendChild(modal);\n        \n        \/\/ Add event listeners\n        const closeBtn = modal.querySelector('.websy-modal-close');\n        const backBtn = modal.querySelector('.websy-modal-back-btn');\n        \n        closeBtn.onclick = closePostModal;\n        \n        \/\/ Back button functionality\n        backBtn.onclick = function() {\n            if (window.websyModalHistory && window.websyModalHistory.length > 1) {\n                \/\/ Remove current modal from history\n                window.websyModalHistory.pop();\n                \/\/ Get previous modal data\n                const previousModal = window.websyModalHistory[window.websyModalHistory.length - 1];\n                \/\/ Load previous modal content\n                openPostModal(previousModal.postId, previousModal.title, previousModal.url);\n            } else {\n                \/\/ No history, just close modal\n                closePostModal();\n            }\n        };\n        \n        \/\/ Close when clicking outside modal (on the backdrop)\n        modal.onclick = function(e) {\n            if (e.target === modal) {\n                closePostModal();\n            }\n        };\n        \n        \/\/ Close with Escape key\n        document.addEventListener('keydown', function(e) {\n            if (e.key === 'Escape' && modal.style.display === 'block') {\n                closePostModal();\n            }\n        });\n        \n        return modal;\n    }\n    \n    function closePostModal() {\n        const modal = document.getElementById('websy-post-modal');\n        if (modal) {\n            modal.style.display = 'none';\n            document.body.style.overflow = ''; \/\/ Restore scrolling\n            \n            \/\/ Clear modal history when closing\n            window.websyModalHistory = [];\n        }\n    }\n    *\/\n    \n    function loadPostContent(postId, modalBody, fallbackUrl) {\n        \/\/ Try to get post data with a custom AJAX call to get meta fields\n        const ajaxUrl = 'https:\/\/buildingbox.isgcm.com\/wp-admin\/admin-ajax.php';\n        \n        if (window.innerWidth <= 768) {\n            document.querySelector(\"#websy-post-modal\").style.height = '100%'; \/\/ Set full height for loading\n        }\n        \n        fetch(ajaxUrl, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application\/x-www-form-urlencoded',\n            },\n            body: `action=websy_get_post_data&post_id=${postId}&nonce=9ff130a5bb`\n        })\n        .then(response => response.json())\n        .then(data => {\n            if (data.success) {\n                if (window.innerWidth <= 768) {\n                    document.querySelector(\"#websy-post-modal\").style.height = 'auto';\n                }\n                displayPostContent(data.data, modalBody, fallbackUrl);\n            } else {\n                throw new Error('Post not found');\n            }\n        })\n        .catch(error => {\n            console.log('Failed to load post data:', error);\n            \/\/ Fallback: show a simple message with link to full post\n            modalBody.innerHTML = `\n                <div class=\"websy-fallback-content\">\n                    <h4>Content Not Available<\/h4>\n                    <p>Unable to load content for this item.<\/p>\n                    <p><a href=\"${fallbackUrl}\" target=\"_blank\" class=\"websy-view-post-btn\">View Full Post<\/a><\/p>\n                <\/div>\n            `;\n        });\n    }\n    \n    \n    function displayPostContent(post, modalBody, fallbackUrl) {\n\n        console.log('Displaying post content:', post);\n\n        \/\/ Add breadcrumb to the top if available\n        let breadcrumbHtml = '';\n        if (post.breadcrumb) {\n            breadcrumbHtml = `\n                <div class=\"websy-modal-breadcrumb\">\n                    <div class=\"websy-modal-breadcrumb-content\">\n                        ${post.breadcrumb}\n                    <\/div>\n                <\/div>\n            `;\n        }\n        \n        \/\/ Add apartment status legend for floor levels only\n        let legendHtml = '';\n        if (post.post_type === 'floor' && post.canvas_json) {\n            legendHtml = `\n                <div class=\"websy-modal-legend\">\n                    <div class=\"websy-modal-legend-title\">\n                        <strong>Apartment Status:<\/strong>\n                    <\/div>\n                    <div class=\"websy-modal-legend-items\">\n                        <div class=\"websy-legend-item\">\n                            <div class=\"websy-legend-color websy-legend-available\"><\/div>\n                            <span>Available<\/span>\n                        <\/div>\n                        <div class=\"websy-legend-item\">\n                            <div class=\"websy-legend-color websy-legend-reserved\"><\/div>\n                            <span>Reserved<\/span>\n                        <\/div>\n                        <div class=\"websy-legend-item\">\n                            <div class=\"websy-legend-color websy-legend-sold\"><\/div>\n                            <span>Sold<\/span>\n                        <\/div>\n                        <div class=\"websy-legend-item\">\n                            <div class=\"websy-legend-color websy-legend-unknown\"><\/div>\n                            <span>Unknown<\/span>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            `;\n        }\n        \n        \/\/ Check if this post has canvas data (SVG map)\n        if (post.canvas_json) {\n            \/\/ This post has a map - render the interactive SVG map with navigation\n            const mapContainer = document.createElement('div');\n            mapContainer.className = 'websy-modal-map-container';\n            mapContainer.innerHTML = `\n                <div class=\"websy-modal-zoom-controls\">\n                    <button class=\"websy-zoom-btn zoom-in\" title=\"Zoom In\">+<\/button>\n                    <button class=\"websy-zoom-btn zoom-out\" title=\"Zoom Out\">-<\/button>\n                    <button class=\"websy-zoom-btn zoom-reset\" title=\"Reset Zoom\">\u2302<\/button>\n                <\/div>\n                <div id=\"modal-canvas-scroll-container\">\n                    <svg id=\"modal-frontend-svg\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/svg>\n                <\/div>\n            `;\n            \n            \/\/ Create navigation container\n            const navContainer = document.createElement('div');\n            navContainer.className = 'websy-modal-navigation';\n            navContainer.innerHTML = `\n\n                <div class=\"websy-modal-bedrooms\">\n                    <div class=\"websy-modal-bedrooms-header\">\n                        <strong>\u0421\u043f\u0430\u043b\u043d\u0438:<\/strong>\n                    <\/div>\n                    <div class=\"websy-modal-bedrooms-content\">\n                        <a href=\"https:\/\/buildingbox.isgcm.com\/en\/apartment-map\/?post=32305&#038;type=1+bedroom\">1<\/a>\n                        <a href=\"https:\/\/buildingbox.isgcm.com\/en\/apartment-map\/?post=32305&#038;type=2+bedroom\">2<\/a>\n                        <a href=\"https:\/\/buildingbox.isgcm.com\/en\/apartment-map\/?post=32305&#038;type=3+bedroom\">3<\/a>\n                    <\/div>\n                <\/div>\n\n                <div class=\"websy-modal-nav-header\">\n                    <h3 class=\"websy-modal-nav-title\">\n                        <span class=\"websy-modal-nav-icon\"><\/span>\n                        <span>Navigation<\/span>\n                    <\/h3>\n                <\/div>\n                <div class=\"websy-modal-nav-content\">\n                    <div class=\"websy-nav-loading\">Loading navigation...<\/div>\n                <\/div>\n            `;\n            \n            modalBody.innerHTML = '';\n            if (breadcrumbHtml) {\n                modalBody.innerHTML = breadcrumbHtml;\n            }\n            if (legendHtml) {\n                modalBody.innerHTML += legendHtml;\n            }\n            modalBody.appendChild(mapContainer);\n            modalBody.appendChild(navContainer);\n            \n            \/\/ Render the map using the same logic as the main shortcode\n            renderMapInModal(post.canvas_json);\n            \n            \/\/ Load navigation based on post type\n            loadModalNavigation(post, navContainer);\n        } else {\n            \/\/ No map data - try to get regular content\n            let content = '';\n            \n            \/\/ Try to get rendered content first, then fall back to other properties\n            if (post.content) {\n                content = post.content;\n            } else if (post.excerpt) {\n                content = post.excerpt;\n            }\n            \n            \/\/ If content is empty or too short, show excerpt + link\n            if (!content || content.length < 50) {\n                modalBody.innerHTML = `\n                    ${breadcrumbHtml}\n                    ${legendHtml}\n                    <div class=\"websy-post-excerpt\">\n                        <h4>${post.title || 'Post Content'}<\/h4>\n                        ${content ? `<p>${content}<\/p>` : '<p>This post has no map or content available.<\/p>'}\n                        <p><a href=\"${post.permalink || fallbackUrl}\" target=\"_blank\" class=\"websy-view-post-btn\">View Full Post<\/a><\/p>\n                    <\/div>\n                `;\n            } else {\n                modalBody.innerHTML = `\n                    ${breadcrumbHtml}\n                    ${legendHtml}\n                    <div class=\"websy-post-content\">\n                        ${content}\n                    <\/div>\n                `;\n            }\n        }\n    }\n    \n    function renderMapInModal(savedJsonString) {\n        const svgEl = document.getElementById('modal-frontend-svg');\n        const wrapper = document.getElementById('modal-canvas-scroll-container');\n        const mapContainer = document.querySelector('.websy-modal-map-container');\n        \n        if (!svgEl || !wrapper) {\n            console.error('Modal SVG elements not found');\n            return;\n        }\n        \n        \/\/ Add loading state\n        mapContainer.classList.add('loading');\n        \n        \/\/ Parse the JSON that was saved\n        let savedData = {};\n        try {\n            savedData = JSON.parse(savedJsonString);\n        } catch (e) {\n            console.error('Invalid JSON for canvas:', e);\n            mapContainer.classList.remove('loading');\n            return;\n        }\n        \n        \/\/ Helper to create an SVG node with attributes\n        function createSVG(name, attrs) {\n            const el = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', name);\n            for (let k in attrs) {\n                el.setAttribute(k, attrs[k]);\n            }\n            return el;\n        }\n        \n        \/\/ Clear previous content\n        svgEl.innerHTML = '';\n        \n        \/\/ Draw everything and set up the modal map\n        function drawEverything() {\n            \/\/ If backgroundImage was stored, savedData.backgroundImage.src holds the dataURL or URL\n            if (savedData.backgroundImage && savedData.backgroundImage.src) {\n                const img = new Image();\n                img.onload = function () {\n                    const imgW = img.width;\n                    const imgH = img.height;\n                    \n                    \/\/ Make the SVG exactly match the image dimensions\n                    svgEl.setAttribute('width', imgW);\n                    svgEl.setAttribute('height', imgH);\n                    svgEl.setAttribute('viewBox', `0 0 ${imgW} ${imgH}`);\n                    \n                    \/\/ Insert an <image> element as the background\n                    const imageNode = createSVG('image', {\n                        href: savedData.backgroundImage.src,\n                        x: 0,\n                        y: 0,\n                        width: imgW,\n                        height: imgH,\n                        preserveAspectRatio: 'xMidYMid meet'\n                    });\n                    svgEl.appendChild(imageNode);\n                    \n                    \/\/ Draw all saved polygons\n                    drawPaths();\n                    \n                    \/\/ Batch load tooltip data for better performance\n                    setTimeout(() => {\n                        batchLoadTooltipData(wrapper);\n                    }, 50);\n                    \n                    \/\/ Center or scroll the wrapper\n                    centerOrScroll();\n                    \n                    \/\/ Ensure tooltips are positioned correctly after SVG is rendered\n                    setTimeout(() => {\n                        updateTooltipPositions();\n                    }, 100);\n                };\n                img.src = savedData.backgroundImage.src;\n            } else {\n                \/\/ No background image \u2192 give a default size\n                const defaultW = 800, defaultH = 600;\n                svgEl.setAttribute('width', defaultW);\n                svgEl.setAttribute('height', defaultH);\n                svgEl.setAttribute('viewBox', `0 0 ${defaultW} ${defaultH}`);\n                \n                drawPaths();\n                \n                \/\/ Batch load tooltip data for better performance\n                setTimeout(() => {\n                    batchLoadTooltipData(wrapper);\n                }, 50);\n                \n                centerOrScroll();\n                \n                \/\/ Ensure tooltips are positioned correctly after SVG is rendered\n                setTimeout(() => {\n                    updateTooltipPositions();\n                }, 100);\n            }\n        }\n                \n        \/\/ Convert each Fabric \"polyline\" into an SVG <path>\n        function drawPaths() {\n            (savedData.objects || []).forEach((obj, index) => {\n                if (obj.type === 'polyline') {\n                    \/\/ Build the path `d` string\n                    const pts = obj.points || [];\n                    if (pts.length < 2) return;\n                    \n                    let d = `M ${pts[0].x} ${pts[0].y}`;\n                    for (let i = 1; i < pts.length; i++) {\n                        d += ` L ${pts[i].x} ${pts[i].y}`;\n                    }\n                    d += ' Z';\n                    \n                    \/\/ Create <path> and set its attributes\n                    const pathAttrs = {\n                        d: d,\n                        fill: obj.fill || 'none',\n                        stroke: obj.stroke || '#000',\n                        'stroke-width': obj.strokeWidth || 1,\n                        style: 'cursor: pointer;'\n                    };\n                    const pathEl = createSVG('path', pathAttrs);\n                    \n                    \/\/ If the JSON object had our `polygonID`, attach it to the <path> as `id`\n                    if (obj.polygonID) {\n                        pathEl.setAttribute('id', obj.polygonID);\n                    }\n                    if (obj.dataPostID) {\n                        pathEl.dataset.postId = obj.dataPostID;\n                    }\n                    \n                    \/\/ Calculate polygon center for tooltip positioning\n                    const center = calculatePolygonCenter(pts);\n                    \n                    \/\/ Create individual tooltip for this polygon\n                    const tooltipId = `modal-tooltip-${obj.polygonID || index}`;\n                    const tooltip = document.createElement('div');\n                    tooltip.className = 'polygon-tooltip loading';\n                    tooltip.id = tooltipId;\n                    \n                    \/\/ Position tooltip at polygon center - account for SVG positioning\n                    tooltip.style.left = center.x + 'px';\n                    tooltip.style.top = center.y + 'px';\n                    tooltip.style.position = 'absolute';\n                    \n                    \/\/ Set initial loading content\n                    tooltip.innerHTML = 'Loading...';\n                    \n                    \/\/ Add data attribute for batch loading\n                    const postId = pathEl.dataset.postId;\n                    if (postId) {\n                        tooltip.setAttribute('data-post-id', postId);\n                    }\n                    \n                    wrapper.appendChild(tooltip);\n\n                    \/\/ Load tooltip content - now done individually but will be optimized with batch loading\n                    const polygonId = pathEl.getAttribute('id');\n                    \n                    if (!postId) {\n                        \/\/ No linked post, show polygon info\n                        tooltip.innerHTML = polygonId ? polygonId : 'Area';\n                        tooltip.style.display = \"none\";\n                        tooltip.classList.remove('loading');\n                    }\n\n                    \/\/ Add click and touch events to open modal directly\n                    function handleModalPathClick(e) {\n                        if (postId) {\n                            \/\/ Get post title from tooltip for modal title\n                            const titleLink = tooltip.querySelector('a');\n                            const title = titleLink ? titleLink.textContent : 'Post';\n                            const url = titleLink ? titleLink.getAttribute('onclick').match(\/openPostModal\\([^,]+,\\s*'[^']*',\\s*'([^']+)'\/)?.[1] || '#' : '#';\n                            openPostModal(postId, title, url);\n                        }\n                        e.preventDefault();\n                        e.stopPropagation();\n                    }\n                    \n                    pathEl.addEventListener('click', handleModalPathClick);\n                    \n                    \/\/ Add touch support for mobile devices\n                    pathEl.addEventListener('touchend', function(e) {\n                        \/\/ Only handle if it's a tap (not a drag)\n                        if (e.changedTouches.length === 1 && !isTouching) {\n                            handleModalPathClick(e);\n                        }\n                    });\n                    \n                    \n                    svgEl.appendChild(pathEl);\n                }\n            });\n        }\n        \n        function centerOrScroll() {\n            const cw = wrapper.clientWidth;\n            const ch = wrapper.clientHeight;\n            const vb = svgEl.viewBox.baseVal;\n            const vw = vb.width;\n            const vh = vb.height;\n            \n            \/\/ Remove loading state\n            mapContainer.classList.remove('loading');\n            \n            \/\/ Calculate optimal scale factors to fit without scrollbars\n            const scaleX = cw \/ vw;\n            const scaleY = ch \/ vh;\n            const optimalScale = Math.min(scaleX, scaleY);\n            \n            \/\/ Determine aspect ratio for intelligent scaling\n            const aspectRatio = vw \/ vh;\n            const isPortrait = aspectRatio < 0.85;\n            const isLandscape = aspectRatio > 1.15;\n            \n            \/\/ Check device type for responsive behavior\n            const isMobile = window.innerWidth <= 768;\n            const isTablet = window.innerWidth <= 1024 && window.innerWidth > 768;\n            \n            \/\/ Reset any previous transformations\n            svgEl.style.transform = '';\n            svgEl.style.transformOrigin = '';\n            svgEl.style.width = '';\n            svgEl.style.height = '';\n            svgEl.style.maxHeight = '';\n            svgEl.style.maxWidth = '';\n            \n            \/\/ Enhanced fitting logic to eliminate scrollbars completely\n            if (optimalScale >= 0.98) {\n                \/\/ Image fits naturally or nearly fits - center it and hide zoom controls\n                wrapper.classList.add('centered');\n                wrapper.classList.remove('fit-to-container', 'full-size');\n                wrapper.style.overflow = 'hidden';\n                wrapper.style.display = 'flex';\n                wrapper.style.justifyContent = 'center';\n                wrapper.style.alignItems = 'start';\n                wrapper.style.width = '100%';\n                \n                \/\/ Hide zoom controls when not needed\n                const zoomControls = mapContainer.querySelector('.websy-modal-zoom-controls');\n                if (zoomControls) zoomControls.style.display = 'none';\n            } else {\n                \/\/ Image is larger - apply intelligent scaling to avoid scrollbars\n                wrapper.classList.remove('centered', 'full-size');\n                wrapper.classList.add('fit-to-container');\n                wrapper.style.overflow = 'hidden'; \/\/ Force no scrollbars\n                wrapper.style.display = 'flex';\n                wrapper.style.justifyContent = 'center';\n                wrapper.style.alignItems = 'start';\n                wrapper.style.width = '100%';\n                \n                \/\/ Show zoom controls when scaling is applied\n                const zoomControls = mapContainer.querySelector('.websy-modal-zoom-controls');\n                if (zoomControls) zoomControls.style.display = 'flex';\n                \n                \/\/ Calculate margins for safety to prevent any edge overflow\n                const safetyMargin = 0.96; \/\/ 4% safety margin for modals\n                let targetWidth, targetHeight;\n                \n                if (isMobile) {\n                    \/\/ Mobile: Very conservative scaling to ensure no scrollbars\n                    if (isPortrait) {\n                        targetWidth = Math.floor(cw * 0.85 * safetyMargin);\n                        targetHeight = Math.floor(ch * 0.90 * safetyMargin);\n                    } else {\n                        targetWidth = Math.floor(cw * 0.92 * safetyMargin);\n                        targetHeight = Math.floor(ch * 0.92 * safetyMargin);\n                    }\n                } else if (isTablet) {\n                    \/\/ Tablet: Balanced scaling ensuring no overflow\n                    if (isPortrait) {\n                        targetWidth = Math.floor(cw * 0.72 * safetyMargin);\n                        targetHeight = Math.floor(ch * 0.83 * safetyMargin);\n                    } else {\n                        targetWidth = Math.floor(cw * 0.90 * safetyMargin);\n                        targetHeight = Math.floor(ch * 0.90 * safetyMargin);\n                    }\n                } else {\n                    \/\/ Desktop: Precise scaling optimized for larger screens\n                    if (isPortrait) {\n                        targetWidth = Math.floor(cw * 0.68 * safetyMargin);\n                        targetHeight = Math.floor(ch * 0.86 * safetyMargin);\n                    } else {\n                        targetWidth = Math.floor(cw * 0.93 * safetyMargin);\n                        targetHeight = Math.floor(ch * 0.93 * safetyMargin);\n                    }\n                }\n                \n                \/\/ Calculate final scale ensuring no dimension exceeds target\n                const finalScaleX = targetWidth \/ vw;\n                const finalScaleY = targetHeight \/ vh;\n                const finalScale = Math.min(finalScaleX, finalScaleY);\n                \n                \/\/ Apply calculated dimensions\n                const finalWidth = Math.floor(vw * finalScale);\n                const finalHeight = Math.floor(vh * finalScale);\n                \n                svgEl.style.width = finalWidth + 'px';\n                svgEl.style.height = finalHeight + 'px';\n                svgEl.style.maxWidth = '100%';\n                svgEl.style.maxHeight = '100%';\n            }\n            \n            \/\/ Update tooltip positions after scaling\n            updateTooltipPositions();\n        }\n        \n        \/\/ Function to update tooltip positions when SVG is scaled\n        function updateTooltipPositions() {\n            const tooltips = wrapper.querySelectorAll('.polygon-tooltip');\n            tooltips.forEach(tooltip => {\n                const tooltipId = tooltip.id;\n                const pathId = tooltipId.replace('modal-tooltip-', '');\n                const pathEl = svgEl.querySelector(`[id=\"${pathId}\"]`);\n                \n                if (pathEl) {\n                    \/\/ Get the path's bounding box in SVG coordinate system\n                    const bbox = pathEl.getBBox();\n                    const centerX = bbox.x + bbox.width \/ 2;\n                    const centerY = bbox.y + bbox.height \/ 2;\n                    \n                    \/\/ Get current transform scale from the SVG element\n                    const computedStyle = window.getComputedStyle(svgEl);\n                    const transform = computedStyle.transform;\n                    let currentZoomScale = 1;\n                    \n                    \/\/ Parse the transform matrix to get the scale\n                    if (transform && transform !== 'none') {\n                        const matrix = transform.match(\/matrix\\(([^)]+)\\)\/);\n                        if (matrix) {\n                            const values = matrix[1].split(',').map(parseFloat);\n                            currentZoomScale = values[0]; \/\/ scaleX is the first value\n                        }\n                    }\n                    \n                    \/\/ Get the SVG's current dimensions and position\n                    const svgRect = svgEl.getBoundingClientRect();\n                    const wrapperRect = wrapper.getBoundingClientRect();\n                    \n                    \/\/ Calculate the base scale (how the SVG is scaled to fit the container)\n                    const baseScaleX = svgRect.width \/ (svgEl.viewBox.baseVal.width * currentZoomScale);\n                    const baseScaleY = svgRect.height \/ (svgEl.viewBox.baseVal.height * currentZoomScale);\n                    \n                    \/\/ Calculate the total effective scale including zoom\n                    const effectiveScaleX = baseScaleX * currentZoomScale;\n                    const effectiveScaleY = baseScaleY * currentZoomScale;\n                    \n                    \/\/ Calculate SVG offset within the wrapper\n                    const svgOffsetX = svgRect.left - wrapperRect.left + wrapper.scrollLeft;\n                    const svgOffsetY = svgRect.top - wrapperRect.top + wrapper.scrollTop;\n                    \n                    \/\/ Position tooltip relative to the wrapper with all transformations applied\n                    const scaledX = svgOffsetX + (centerX * effectiveScaleX);\n                    const scaledY = svgOffsetY + (centerY * effectiveScaleY);\n                    \n                    tooltip.style.left = scaledX + 'px';\n                    tooltip.style.top = scaledY + 'px';\n                }\n            });\n        }\n        \n        \/\/ Enhanced dragging for maps in modal - only active when zoom controls are in use\n        let isDragging = false;\n        let lastX, lastY;\n        let dragStartTime = 0;\n        \n        \/\/ Mouse events - only enable when in full-size mode (zoom active)\n        wrapper.addEventListener('mousedown', function(e) {\n            \/\/ Only enable dragging when zoom controls are active (full-size mode)\n            if (wrapper.classList.contains('full-size')) {\n                isDragging = true;\n                lastX = e.clientX;\n                lastY = e.clientY;\n                dragStartTime = Date.now();\n                wrapper.classList.add('grabbing');\n                e.preventDefault();\n            }\n        });\n        \n        wrapper.addEventListener('mousemove', function(e) {\n            if (!isDragging) return;\n            \n            const dx = e.clientX - lastX;\n            const dy = e.clientY - lastY;\n            \n            wrapper.scrollLeft -= dx;\n            wrapper.scrollTop -= dy;\n            \n            lastX = e.clientX;\n            lastY = e.clientY;\n        });\n        \n        wrapper.addEventListener('mouseup', function(e) {\n            if (isDragging) {\n                isDragging = false;\n                wrapper.classList.remove('grabbing');\n                \n                \/\/ Update tooltip positions after dragging\n                setTimeout(() => updateTooltipPositions(), 50);\n            }\n        });\n        \n        wrapper.addEventListener('mouseleave', function() {\n            if (isDragging) {\n                isDragging = false;\n                wrapper.classList.remove('grabbing');\n            }\n        });\n        \n        \/\/ Touch events for mobile - only when zoom is active\n        let touchStartX, touchStartY;\n        let isTouching = false;\n        \n        wrapper.addEventListener('touchstart', function(e) {\n            \/\/ Only handle single-finger touches when in full-size mode, allow multi-touch zoom\n            if (e.touches.length === 1 && wrapper.classList.contains('full-size')) {\n                isTouching = true;\n                touchStartX = e.touches[0].clientX;\n                touchStartY = e.touches[0].clientY;\n                lastX = touchStartX;\n                lastY = touchStartY;\n                e.preventDefault();\n            }\n            \/\/ Allow multi-touch gestures (pinch-to-zoom) to pass through naturally\n        }, { passive: false });\n        \n        wrapper.addEventListener('touchmove', function(e) {\n            \/\/ Only handle single-finger dragging, allow multi-touch zoom\n            if (!isTouching || e.touches.length !== 1) return;\n            \n            const dx = e.touches[0].clientX - lastX;\n            const dy = e.touches[0].clientY - lastY;\n            \n            wrapper.scrollLeft -= dx;\n            wrapper.scrollTop -= dy;\n            \n            lastX = e.touches[0].clientX;\n            lastY = e.touches[0].clientY;\n            \n            e.preventDefault();\n        }, { passive: false });\n        \n        wrapper.addEventListener('touchend', function(e) {\n            if (isTouching) {\n                isTouching = false;\n                \/\/ Update tooltip positions after touch interaction\n                setTimeout(() => updateTooltipPositions(), 50);\n            }\n        });\n        \n        \/\/ Handle window resize for responsive behavior\n        window.addEventListener('resize', function() {\n            \/\/ Debounce resize events\n            clearTimeout(window.modalResizeTimeout);\n            window.modalResizeTimeout = setTimeout(function() {\n                centerOrScroll();\n            }, 250);\n        });\n        \n        \/\/ Handle scroll events to update tooltip positions when zoomed\n        wrapper.addEventListener('scroll', function() {\n            \/\/ Debounce scroll events for better performance\n            clearTimeout(window.modalScrollTimeout);\n            window.modalScrollTimeout = setTimeout(function() {\n                updateTooltipPositions();\n            }, 16); \/\/ ~60fps for smooth updates\n        });\n        \n        \/\/ Set up zoom controls\n        setupZoomControls();\n        \n        \/\/ Start the process\n        drawEverything();\n        \n        function setupZoomControls() {\n            const zoomInBtn = mapContainer.querySelector('.zoom-in');\n            const zoomOutBtn = mapContainer.querySelector('.zoom-out');\n            const zoomResetBtn = mapContainer.querySelector('.zoom-reset');\n            \n            if (!zoomInBtn || !zoomOutBtn || !zoomResetBtn) return;\n            \n            let currentScale = 1;\n            let originalSvgData = {\n                width: null,\n                height: null,\n                viewBox: null,\n                transform: null\n            };\n            \n            \/\/ Store original SVG data when first set up\n            function storeOriginalData() {\n                if (!originalSvgData.width) {\n                    const vb = svgEl.viewBox.baseVal;\n                    originalSvgData = {\n                        width: vb.width,\n                        height: vb.height,\n                        viewBox: svgEl.getAttribute('viewBox'),\n                        transform: svgEl.style.transform || '',\n                        svgWidth: svgEl.getAttribute('width'),\n                        svgHeight: svgEl.getAttribute('height')\n                    };\n                }\n            }\n            \n            function updateZoom(scaleFactor) {\n                storeOriginalData();\n                \n                currentScale *= scaleFactor;\n                currentScale = Math.max(0.25, Math.min(4, currentScale)); \/\/ Limit scale between 0.25x and 4x\n                \n                \/\/ Remove any existing classes\n                wrapper.classList.remove('centered', 'fit-to-container', 'full-size');\n                \n                if (currentScale === 1) {\n                    \/\/ Reset to original state\n                    svgEl.style.transform = originalSvgData.transform;\n                    svgEl.style.transformOrigin = '';\n                    centerOrScroll(); \/\/ Use original function for reset\n                } else {\n                    \/\/ Apply zoom transformation\n                    wrapper.classList.add('full-size');\n                    wrapper.style.overflow = 'auto';\n                    \n                    svgEl.style.transform = `scale(${currentScale})`;\n                    svgEl.style.transformOrigin = 'top left';\n                    \n                    \/\/ Scroll to center the content\n                    const scaledWidth = originalSvgData.width * currentScale;\n                    const scaledHeight = originalSvgData.height * currentScale;\n                    \n                    wrapper.scrollLeft = Math.max(0, (scaledWidth - wrapper.clientWidth) \/ 2);\n                    wrapper.scrollTop = Math.max(0, (scaledHeight - wrapper.clientHeight) \/ 2);\n                }\n                \n                \/\/ Update zoom button states\n                zoomInBtn.classList.toggle('disabled', currentScale >= 4);\n                zoomOutBtn.classList.toggle('disabled', currentScale <= 0.25);\n                \n                \/\/ Update tooltip positions after zoom - multiple updates for smooth positioning\n                requestAnimationFrame(() => {\n                    updateTooltipPositions();\n                    setTimeout(() => updateTooltipPositions(), 50);\n                    setTimeout(() => updateTooltipPositions(), 150);\n                });\n            }\n            \n            function resetZoom() {\n                currentScale = 1;\n                svgEl.style.transform = originalSvgData.transform;\n                svgEl.style.transformOrigin = '';\n                centerOrScroll(); \/\/ Use original responsive function\n                \n                \/\/ Update button states\n                zoomInBtn.classList.remove('disabled');\n                zoomOutBtn.classList.remove('disabled');\n                \n                \/\/ Update tooltip positions after reset - multiple updates for smooth positioning\n                requestAnimationFrame(() => {\n                    updateTooltipPositions();\n                    setTimeout(() => updateTooltipPositions(), 50);\n                    setTimeout(() => updateTooltipPositions(), 150);\n                });\n            }\n            \n            \/\/ Event listeners\n            zoomInBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                updateZoom(1.25);\n            });\n            \n            zoomOutBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                updateZoom(0.8);\n            });\n            \n            zoomResetBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                resetZoom();\n            });\n            \n            \/\/ Store original data once SVG is loaded\n            setTimeout(() => {\n                storeOriginalData();\n            }, 500);\n        }\n    }\n    \n    function loadModalNavigation(post, navContainer) {\n        const navContent = navContainer.querySelector('.websy-modal-nav-content');\n        const navTitle = navContainer.querySelector('.websy-modal-nav-title span:last-child');\n        \n        \/\/ Check if this is an apartment post - show apartment hierarchy instead of polygon areas\n        if (post.post_type === 'apartment') {\n            \/\/ Update navigation title and icon for apartment view\n            navTitle.textContent = 'Apartment Details';\n            \/\/ navContainer.querySelector('.websy-modal-nav-icon').textContent = '\ud83c\udfe0';\n            \n            \/\/ Display apartment hierarchy metadata\n            displayApartmentHierarchy(post, navContent);\n            return;\n        }\n        \n        \/\/ For other post types, show map areas as before\n        navTitle.textContent = 'Map Areas';\n        \/\/ navContainer.querySelector('.websy-modal-nav-icon').textContent = '\ud83d\uddfa\ufe0f';\n        \n        \/\/ Parse the canvas JSON to get polygons\n        let canvasData = {};\n        try {\n            canvasData = JSON.parse(post.canvas_json);\n        } catch (e) {\n            console.error('Failed to parse canvas JSON:', e);\n            navContent.innerHTML = `\n                <div class=\"websy-nav-empty\">\n                    <div class=\"websy-nav-empty-icon\"><\/div>\n                    <div>Invalid map data<\/div>\n                <\/div>\n            `;\n            return;\n        }\n        \n        \/\/ Extract polygons from canvas data\n        const polygons = (canvasData.objects || []).filter(obj => obj.type === 'polyline');\n        \n        if (polygons.length === 0) {\n            navContent.innerHTML = `\n                <div class=\"websy-nav-empty\">\n                    <div class=\"websy-nav-empty-icon\"><\/div>\n                    <div>No map areas found<\/div>\n                <\/div>\n            `;\n            return;\n        }\n        \n        \/\/ Process polygons and fetch linked post data\n        processPolygonsForNavigation(polygons, navContent);\n    }\n    \n    function processPolygonsForNavigation(polygons, navContent) {\n        console.log('processPolygonsForNavigation called with', polygons.length, 'polygons');\n        navContent.innerHTML = '<div class=\"websy-nav-loading\">Loading areas...<\/div>';\n        \n        \/\/ First pass: collect all post IDs and apartment IDs for batch fetching\n        const postIds = [];\n        const apartmentIds = [];\n        \n        polygons.forEach((polygon, index) => {\n            if (polygon.dataPostID) {\n                postIds.push(polygon.dataPostID);\n            }\n        });\n        \n        console.log('Found post IDs:', postIds);\n        \n        \/\/ Batch fetch all post data first\n        let postDataPromise = Promise.resolve([]);\n        if (postIds.length > 0) {\n            console.log('Fetching post data for IDs:', postIds.join(','));\n            \/\/ Use our custom endpoint that supports include parameter\n            postDataPromise = fetch(`\/wp-json\/websy\/v1\/posts\/apartment?include=${postIds.join(',')}`)\n                .then(response => {\n                    console.log('Apartment data fetch response:', response.status);\n                    if (response.ok) {\n                        return response.json().then(apartments => {\n                            return apartments.map(apt => ({\n                                id: apt.id,\n                                title: apt.title.rendered,\n                                url: `\/?p=${apt.id}`,\n                                subtype: 'apartment'\n                            }));\n                        });\n                    }\n                    return [];\n                })\n                .then(apartmentData => {\n                    \/\/ Try to fetch other post types for remaining IDs\n                    const foundIds = apartmentData.map(apt => apt.id);\n                    const remainingIds = postIds.filter(id => !foundIds.includes(parseInt(id)));\n                    \n                    if (remainingIds.length === 0) {\n                        return apartmentData;\n                    }\n                    \n                    \/\/ Try building post type for remaining IDs\n                    return fetch(`\/wp-json\/websy\/v1\/posts\/building?include=${remainingIds.join(',')}`)\n                        .then(response => {\n                            if (response.ok) {\n                                return response.json().then(buildings => {\n                                    const buildingData = buildings.map(building => ({\n                                        id: building.id,\n                                        title: building.title.rendered,\n                                        url: `\/?p=${building.id}`,\n                                        subtype: 'building'\n                                    }));\n                                    return [...apartmentData, ...buildingData];\n                                });\n                            }\n                            return apartmentData;\n                        })\n                        .then(combinedData => {\n                            \/\/ Try other post types...\n                            const foundIds2 = combinedData.map(item => item.id);\n                            const remainingIds2 = postIds.filter(id => !foundIds2.includes(parseInt(id)));\n                            \n                            if (remainingIds2.length === 0) {\n                                return combinedData;\n                            }\n                            \n                            \/\/ Try entrance and floor post types\n                            const entrancePromise = fetch(`\/wp-json\/websy\/v1\/posts\/entrance?include=${remainingIds2.join(',')}`)\n                                .then(response => response.ok ? response.json() : [])\n                                .catch(() => []);\n                                \n                            const floorPromise = fetch(`\/wp-json\/websy\/v1\/posts\/floor?include=${remainingIds2.join(',')}`)\n                                .then(response => response.ok ? response.json() : [])\n                                .catch(() => []);\n                                \n                            return Promise.all([entrancePromise, floorPromise]).then(([entrances, floors]) => {\n                                const entranceData = entrances.map(entrance => ({\n                                    id: entrance.id,\n                                    title: entrance.title.rendered,\n                                    url: `\/?p=${entrance.id}`,\n                                    subtype: 'entrance'\n                                }));\n                                \n                                const floorData = floors.map(floor => ({\n                                    id: floor.id,\n                                    title: floor.title.rendered,\n                                    url: `\/?p=${floor.id}`,\n                                    subtype: 'floor'\n                                }));\n                                \n                                return [...combinedData, ...entranceData, ...floorData];\n                            });\n                        });\n                })\n                .catch(error => {\n                    console.error('Error fetching post data:', error);\n                    return [];\n                });\n        }\n        \n        postDataPromise.then(allPostData => {\n            console.log('Fetched post data:', allPostData);\n            \n            \/\/ Identify apartments and collect their IDs for batch status fetching\n            allPostData.forEach(post => {\n                if (post.subtype === 'apartment') {\n                    apartmentIds.push(post.id);\n                }\n            });\n            \n            console.log('Found apartment IDs:', apartmentIds);\n            \n            \/\/ Batch fetch apartment statuses if there are any apartments\n            let statusPromise = Promise.resolve([]);\n            if (apartmentIds.length > 0) {\n                console.log('Fetching apartment statuses for IDs:', apartmentIds.join(','));\n                statusPromise = fetch(`\/wp-json\/websy\/v1\/apartment-statuses?ids=${apartmentIds.join(',')}`)\n                    .then(response => {\n                        console.log('Apartment status fetch response:', response.status);\n                        return response.json();\n                    })\n                    .catch(error => {\n                        console.error('Error fetching apartment statuses:', error);\n                        return [];\n                    });\n            }\n            \n            statusPromise.then(apartmentStatuses => {\n                console.log('Fetched apartment statuses:', apartmentStatuses);\n                \n                \/\/ Create lookup map for faster access\n                const postDataMap = {};\n                allPostData.forEach(post => {\n                    postDataMap[post.id] = post;\n                });\n                \n                const statusMap = {};\n                apartmentStatuses.forEach(apartment => {\n                    statusMap[apartment.id] = apartment.apartment_available;\n                });\n                \n                console.log('Status map:', statusMap);\n                \n                \/\/ Process all polygons with the fetched data\n                const polygonDataArray = polygons.map((polygon, index) => {\n                    const polygonData = {\n                        id: polygon.polygonID || `polygon-${index}`,\n                        postId: polygon.dataPostID || null,\n                        title: polygon.polygonID || `Area ${index + 1}`,\n                        isLinked: !!polygon.dataPostID\n                    };\n                    \n                    if (polygon.dataPostID && postDataMap[polygon.dataPostID]) {\n                        const post = postDataMap[polygon.dataPostID];\n                        polygonData.title = post.title;\n                        polygonData.url = post.url;\n                        polygonData.postType = post.subtype;\n                        \n                        \/\/ Add apartment status if available\n                        if (post.subtype === 'apartment' && statusMap[polygon.dataPostID]) {\n                            polygonData.apartmentStatus = statusMap[polygon.dataPostID];\n                        }\n                    }\n                    \n                    return polygonData;\n                });\n                \n                console.log('Final polygon data array:', polygonDataArray);\n                displayPolygonNavigation(polygonDataArray, navContent);\n            }).catch(error => {\n                console.error('Error in status promise:', error);\n                \/\/ Fallback: process polygons without status data\n                const polygonDataArray = polygons.map((polygon, index) => ({\n                    id: polygon.polygonID || `polygon-${index}`,\n                    postId: polygon.dataPostID || null,\n                    title: polygon.polygonID || `Area ${index + 1}`,\n                    isLinked: !!polygon.dataPostID\n                }));\n                displayPolygonNavigation(polygonDataArray, navContent);\n            });\n        }).catch(error => {\n            console.error('Error in post data promise:', error);\n            \/\/ Ultimate fallback: show basic polygon list\n            const polygonDataArray = polygons.map((polygon, index) => ({\n                id: polygon.polygonID || `polygon-${index}`,\n                postId: polygon.dataPostID || null,\n                title: polygon.polygonID || `Area ${index + 1}`,\n                isLinked: !!polygon.dataPostID\n            }));\n            displayPolygonNavigation(polygonDataArray, navContent);\n        });\n    }\n    \n    function displayPolygonNavigation(polygons, navContent) {\n        console.log('displayPolygonNavigation called with:', polygons);\n        let html = '';\n        \n        polygons.forEach((polygon, index) => {\n            console.log(`Processing polygon ${index}:`, polygon);\n            const linkClass = polygon.isLinked ? 'linked' : 'unlinked';\n            const icon = polygon.isLinked ? '\ud83c\udfe2' : '\ud83d\udccd';\n            const postTypeLabel = getPostTypeLabel(polygon.postType);\n            \n            if (polygon.isLinked && polygon.postId) {\n                console.log('polygon.apartmentStatus', polygon.apartmentStatus)\n                \/\/ Build status HTML for apartments\n                let statusHtml = '';\n                if (polygon.postType === 'apartment') {\n                    let statusText = '';\n                    let statusClass = '';\n                    \n                    if (polygon.apartmentStatus) {\n                        console.log('Processing apartment status:', polygon.apartmentStatus, typeof polygon.apartmentStatus);\n                        \n                        \/\/ Handle both string and numeric status values\n                        const status = String(polygon.apartmentStatus).toLowerCase();\n                        \n                        switch(status) {\n                            case 'available':\n                            case '1':\n                                statusText = 'Available';\n                                statusClass = 'status-available';\n                                break;\n                            case 'reserved':\n                            case '2':\n                                statusText = 'Reserved';\n                                statusClass = 'status-reserved';\n                                break;\n                            case 'sold':\n                            case '3':\n                            case '0':\n                                statusText = 'Sold';\n                                statusClass = 'status-sold';\n                                break;\n                            default:\n                                statusText = 'Unknown';\n                                statusClass = 'status-unknown';\n                        }\n                    } else {\n                        \/\/ No status found for apartment\n                        statusText = 'Status Unknown';\n                        statusClass = 'status-unknown';\n                    }\n                    statusHtml = `<div class=\"websy-nav-item-status ${statusClass}\">${statusText}<\/div>`;\n                }\n                \n                \/\/ Linked polygon - clickable to open modal\n                html += `\n                    <div class=\"websy-nav-item ${linkClass}\" data-polygon-id=\"${polygon.id}\" title=\"Click to view details\" onclick=\"handlePolygonNavigationClick('${polygon.postId}', '${polygon.title.replace(\/'\/g, \"\\\\'\")}', '${polygon.url}')\">\n                        <div class=\"websy-nav-item-title\">\n                            <span class=\"websy-nav-item-icon\"><\/span>\n                            ${polygon.title}\n                        <\/div>\n                        ${postTypeLabel ? `<div class=\"websy-nav-item-meta\">${postTypeLabel}<\/div>` : ''}\n                        ${statusHtml}\n                        <div class=\"websy-nav-item-count\" data-post-id=\"${polygon.postId}\" data-post-type=\"${polygon.postType}\" style=\"display: none;\">Loading...<\/div>\n                    <\/div>\n                `;\n            } else {\n                \/\/ Unlinked polygon - highlight on map\n                html += `\n                    <div class=\"websy-nav-item ${linkClass}\" data-polygon-id=\"${polygon.id}\" title=\"Click to highlight on map\" onclick=\"highlightPolygonOnMap('${polygon.id}')\">\n                        <div class=\"websy-nav-item-title\">\n                            <span class=\"websy-nav-item-icon\"><\/span>\n                            ${polygon.title}\n                        <\/div>\n                        <div class=\"websy-nav-item-meta\">No linked content<\/div>\n                    <\/div>\n                `;\n            }\n        });\n        \n        console.log('Generated HTML:', html);\n        navContent.innerHTML = html;\n        console.log('Navigation content updated');\n        \n        \/\/ Add hover effects for navigation items to highlight polygons\n        const navItems = navContent.querySelectorAll('.websy-nav-item[data-polygon-id]');\n        navItems.forEach(navItem => {\n            const polygonId = navItem.getAttribute('data-polygon-id');\n            \n            navItem.addEventListener('mouseenter', function() {\n                \/\/ Look for polygon by id attribute (not data-polygon-id)\n                const polygon = document.querySelector(`path[id=\"${polygonId}\"]`);\n                if (polygon) {\n                    polygon.style.opacity = '0.7';\n                }\n            });\n            \n            navItem.addEventListener('mouseleave', function() {\n                \/\/ Look for polygon by id attribute (not data-polygon-id)\n                const polygon = document.querySelector(`path[id=\"${polygonId}\"]`);\n                if (polygon) {\n                    polygon.style.opacity = '';\n                }\n            });\n        });\n        \n        \/\/ Load apartment counts for modal navigation items\n        loadModalNavigationApartmentCounts(navContent);\n        \n        \/\/ Load apartment statuses for modal navigation items (batch fetch for performance)\n        loadNavigationApartmentStatuses(navContent);\n        \n        \/\/ Navigation hover effects removed for simplified UX\n    }\n    \n    \/\/ Load apartment counts for modal navigation items\n    function loadModalNavigationApartmentCounts(navContent) {\n        const countElements = navContent.querySelectorAll('.websy-nav-item-count[data-post-id]');\n        \n        countElements.forEach(countElement => {\n            const postId = countElement.getAttribute('data-post-id');\n            const postType = countElement.getAttribute('data-post-type');\n            \n            \/\/ Skip apartment counts for apartments themselves\n            if (postType === 'apartment') {\n                countElement.style.display = 'none';\n                return;\n            }\n            \n            \/\/ Determine the meta key for apartment counting based on the post type\n            let metaKey = postType + '_id';\n            if (postType === 'complex') metaKey = 'complex_id';\n            \n            \/\/ Fetch total apartment count using the custom endpoint that includes meta data\n            const apiUrl = `\/wp-json\/websy\/v1\/posts\/apartment?meta_key=${metaKey}&meta_value=${postId}&per_page=-1`;\n            console.log(`Modal: Fetching apartment count for ${postType} ID ${postId} from: ${apiUrl}`);\n            \n            fetch(apiUrl)\n                .then(response => {\n                    console.log(`Modal API Response Headers for ${postType} ID ${postId}:`, {\n                        totalCount: response.headers.get('X-Total-Count'),\n                        contentType: response.headers.get('Content-Type')\n                    });\n                    return response.json();\n                })\n                .then(apartments => {\n                    console.log(`Modal: Received ${apartments ? apartments.length : 0} apartments for ${postType} ID ${postId}:`, apartments);\n                    \n                    if (apartments && Array.isArray(apartments)) {\n                        const totalCount = apartments.length;\n                        \n                        \/\/ Count available apartments  \n                        const availableCount = apartments.filter(apt => {\n                            const status = apt.apartment_available;\n                            return status === 'available' || status === '1' || status === 'yes';\n                        }).length;\n                        \n                        console.log(`Modal count results: total=${totalCount}, available=${availableCount}`);\n                        \n                        \/\/ Update the count display\n                        if (totalCount > 0) {\n                            countElement.innerHTML = `<span class=\"apartment-total\">${totalCount}<\/span>` + \n                                                   (availableCount > 0 ? ` <span class=\"apartment-available\">(${availableCount} available)<\/span>` : '');\n                            countElement.style.display = 'block';\n                        } else {\n                            countElement.style.display = 'none';\n                        }\n                    } else {\n                        countElement.style.display = 'none';\n                    }\n                })\n                .catch(error => {\n                    console.log('Failed to load apartment count for post', postId, error);\n                    countElement.style.display = 'none';\n                });\n        });\n    }\n    \n    function getPostTypeLabel(postType) {\n        const labels = {\n            'complex': 'Complex',\n            'building': 'Building', \n            'entrance': 'Entrance',\n            'floor': 'Floor',\n            'apartment': 'Apartment'\n        };\n        return labels[postType] || '';\n    }\n    \n    function handlePolygonNavigationClick(postId, title, url) {\n        \/\/ Load the linked post in the modal\n        openPostModal(postId, title, url);\n    }\n    \n    function highlightPolygonOnMap(polygonId) {\n        \/\/ Find and highlight the polygon on the map\n        const modalSvg = document.getElementById('modal-frontend-svg');\n        if (!modalSvg) return;\n        \n        \/\/ Remove previous highlights\n        modalSvg.querySelectorAll('path').forEach(path => {\n            path.style.filter = '';\n            path.style.strokeWidth = '';\n        });\n        \n        \/\/ Highlight the selected polygon\n        const targetPath = modalSvg.querySelector(`[id=\"${polygonId}\"]`);\n        if (targetPath) {\n            targetPath.style.filter = 'brightness(1.3) drop-shadow(0 0 10px rgba(0, 123, 186, 0.8))';\n            targetPath.style.strokeWidth = '3';\n            \n            \/\/ Scroll the polygon into view if needed\n            setTimeout(() => {\n                const bbox = targetPath.getBBox();\n                const centerX = bbox.x + bbox.width \/ 2;\n                const centerY = bbox.y + bbox.height \/ 2;\n                \n                \/\/ Basic scroll to center - you can enhance this based on your zoom logic\n                const container = document.getElementById('modal-canvas-scroll-container');\n                if (container && container.classList.contains('full-size')) {\n                    const rect = targetPath.getBoundingClientRect();\n                    const containerRect = container.getBoundingClientRect();\n                    \n                    container.scrollLeft += rect.left - containerRect.left - containerRect.width \/ 2;\n                    container.scrollTop += rect.top - containerRect.top - containerRect.height \/ 2;\n                }\n            }, 100);\n            \n            \/\/ Remove highlight after 3 seconds\n            setTimeout(() => {\n                if (targetPath) {\n                    targetPath.style.filter = '';\n                    targetPath.style.strokeWidth = '';\n                }\n            }, 3000);\n        }\n    }\n    \n    function handleNavigationClick(postId, title, url) {\n        \/\/ Load the new post in the modal\n        openPostModal(postId, title, url);\n    }\n    \n    \/\/ Localized strings for apartment hierarchy\n    const apartmentStrings = {\n        complex: 'Complex',\n        building: 'Building',\n        entrance: 'Entrance',\n        floor: 'Floor',\n        type: 'Type',\n        status: 'Status',\n        available: 'Available',\n        reserved: 'Reserved',\n        sold: 'Sold',\n        unknown: 'Unknown',\n        price: 'Price',\n        bedrooms: 'Bedrooms',\n        bathrooms: 'Bathrooms',\n        area: 'Area',\n        pricePerSqm: 'Price per sqm',\n        unknownComplex: 'Unknown Complex',\n        unknownBuilding: 'Unknown Building',\n        unknownEntrance: 'Unknown Entrance',\n        unknownFloor: 'Unknown Floor',\n        loadingComplex: 'Loading complex...',\n        loadingBuilding: 'Loading building...',\n        loadingEntrance: 'Loading entrance...',\n        loadingFloor: 'Loading floor...',\n        noHierarchyInfo: 'No hierarchy information available'\n    };\n\n    function displayApartmentHierarchy(post, navContent) {\n        \/\/ Build apartment hierarchy information from metadata\n        const hierarchyItems = [];\n        \n        \/\/ Get apartment metadata from the post object\n        const complexId = post.complex_id || null;\n        const buildingId = post.building_id || null;\n        const entranceId = post.entrance_id || null;\n        const floorId = post.floor_id || null;\n        const apartmentType = post.apartment_type || null;\n        const apartmentAvailable = post.apartment_available || null;\n        \n        \/\/ Get new apartment detail fields\n        const apartmentPrice = post.apartment_price || null;\n        const apartmentBedrooms = post.apartment_bedrooms || null;\n        const apartmentBathrooms = post.apartment_bathrooms || null;\n        const apartmentArea = post.apartment_area || null;\n        \n        \/\/ Helper function to create hierarchy item\n        function createHierarchyItem(icon, label, value, postId = null, isClickable = false) {\n            const clickHandler = isClickable && postId ? \n                `onclick=\"handleApartmentNavigationClick('${postId}', '${value.replace(\/'\/g, \"\\\\'\")}', '\/?p=${postId}')\"` : '';\n            const clickableClass = isClickable && postId ? 'clickable' : '';\n            \n            return `\n                <div class=\"websy-nav-item hierarchy-item ${clickableClass}\" ${clickHandler}>\n                    <div class=\"websy-nav-item-title\">\n                        <span class=\"websy-nav-item-icon\"><\/span>\n                        <span class=\"hierarchy-label\">${label}:<\/span>\n                        <span class=\"hierarchy-value\">${value}<\/span>\n                    <\/div>\n                <\/div>\n            `;\n        }\n        \n        \/\/ Fetch and display hierarchy information\n        let html = '<div class=\"apartment-hierarchy-container\">';\n        \n        \/\/ Complex\n        if (complexId) {\n            fetchPostTitle(complexId).then(title => {\n                if (title) {\n                    const complexHtml = createHierarchyItem('\ud83c\udfd9\ufe0f', apartmentStrings.complex, title, complexId, true);\n                    updateHierarchySection('complex', complexHtml);\n                }\n            }).catch(() => {\n                const complexHtml = createHierarchyItem('\ud83c\udfd9\ufe0f', apartmentStrings.complex, apartmentStrings.unknownComplex);\n                updateHierarchySection('complex', complexHtml);\n            });\n            html += `<div id=\"hierarchy-complex\" class=\"hierarchy-loading\">${apartmentStrings.loadingComplex}<\/div>`;\n        }\n        \n        \/\/ Building\n        if (buildingId) {\n            fetchPostTitle(buildingId).then(title => {\n                if (title) {\n                    const buildingHtml = createHierarchyItem('\ud83c\udfe2', apartmentStrings.building, title, buildingId, true);\n                    updateHierarchySection('building', buildingHtml);\n                }\n            }).catch(() => {\n                const buildingHtml = createHierarchyItem('\ud83c\udfe2', apartmentStrings.building, apartmentStrings.unknownBuilding);\n                updateHierarchySection('building', buildingHtml);\n            });\n            html += `<div id=\"hierarchy-building\" class=\"hierarchy-loading\">${apartmentStrings.loadingBuilding}<\/div>`;\n        }\n        \n        \/\/ Entrance\n        if (entranceId) {\n            fetchPostTitle(entranceId).then(title => {\n                if (title) {\n                    const entranceHtml = createHierarchyItem('\ud83d\udeaa', apartmentStrings.entrance, title, entranceId, true);\n                    updateHierarchySection('entrance', entranceHtml);\n                }\n            }).catch(() => {\n                const entranceHtml = createHierarchyItem('\ud83d\udeaa', apartmentStrings.entrance, apartmentStrings.unknownEntrance);\n                updateHierarchySection('entrance', entranceHtml);\n            });\n            html += `<div id=\"hierarchy-entrance\" class=\"hierarchy-loading\">${apartmentStrings.loadingEntrance}<\/div>`;\n        }\n        \n        \/\/ Floor\n        if (floorId) {\n            fetchPostTitle(floorId).then(title => {\n                if (title) {\n                    const floorHtml = createHierarchyItem('\ud83c\udfe0', apartmentStrings.floor, title, floorId, true);\n                    updateHierarchySection('floor', floorHtml);\n                }\n            }).catch(() => {\n                const floorHtml = createHierarchyItem('\ud83c\udfe0', apartmentStrings.floor, apartmentStrings.unknownFloor);\n                updateHierarchySection('floor', floorHtml);\n            });\n            html += `<div id=\"hierarchy-floor\" class=\"hierarchy-loading\">${apartmentStrings.loadingFloor}<\/div>`;\n        }\n\n        \/\/ Status\n        if (apartmentAvailable !== null) {\n            \/\/ Handle backward compatibility\n            let status = apartmentAvailable;\n            if (status === '1' || status === 1 || status === 'yes') {\n                status = 'available';\n            } else if (status === '0' || status === 0 || status === 'no') {\n                status = 'sold';\n            }\n            \n            let statusText = apartmentStrings.unknown;\n            let statusIcon = '\u2753';\n            \n            switch (status) {\n                case 'available':\n                    statusText = apartmentStrings.available;\n                    statusIcon = '\u2705';\n                    break;\n                case 'reserved':\n                    statusText = apartmentStrings.reserved;\n                    statusIcon = '\ud83d\udfe1';\n                    break;\n                case 'sold':\n                    statusText = apartmentStrings.sold;\n                    statusIcon = '\u274c';\n                    break;\n            }\n            \n            html += createHierarchyItem(statusIcon, apartmentStrings.status, statusText);\n        }\n\n        \/\/ Price\n        if (apartmentPrice) {\n            const formattedPrice = parseFloat(apartmentPrice).toLocaleString();\n            html += createHierarchyItem('\ud83d\udcb0', apartmentStrings.price, formattedPrice);\n        }\n        \n        \/\/ Apartment Type (if available)\n        if (apartmentType) {\n            html += createHierarchyItem('\ud83c\udfe1', apartmentStrings.type, apartmentType.charAt(0).toUpperCase() + apartmentType.slice(1));\n        }\n\n        \/\/ Area\n        if (apartmentArea) {\n            const areaText = parseFloat(apartmentArea).toFixed(0) + ' sqm';\n            html += createHierarchyItem('\ud83d\udcd0', apartmentStrings.area, areaText);\n        }\n\n        \/\/ Price per sqm (calculated if both price and area are available)\n        if (apartmentPrice && apartmentArea && apartmentArea > 0) {\n            const pricePerSqm = (parseFloat(apartmentPrice) \/ parseFloat(apartmentArea)).toFixed(2);\n            html += createHierarchyItem('\ud83d\udc8e', apartmentStrings.pricePerSqm, pricePerSqm + '\/sqm');\n        }\n        \n        \/\/ Add apartment details section if any detail is available\n        \/\/ const hasDetails = apartmentPrice || apartmentBedrooms || apartmentBathrooms || apartmentArea;\n        \/\/ if (hasDetails) {\n            \n        \/\/ Bedrooms\n        if (apartmentBedrooms) {\n            const bedroomsText = apartmentBedrooms + (apartmentBedrooms == 1 ? ' bedroom' : ' bedrooms');\n            html += createHierarchyItem('\ud83d\udecf\ufe0f', apartmentStrings.bedrooms, bedroomsText);\n        }\n        \n        \/\/ Bathrooms\n        if (apartmentBathrooms) {\n            const bathroomsText = apartmentBathrooms + (apartmentBathrooms == 1 ? ' bathroom' : ' bathrooms');\n            html += createHierarchyItem('\ud83d\udebf', apartmentStrings.bathrooms, bathroomsText);\n        }            \n\n        \/\/ }\n        \n        \/\/ If no hierarchy data is available\n        if (!complexId && !buildingId && !entranceId && !floorId && !apartmentType && apartmentAvailable === null && !hasDetails) {\n            html += `\n                <div class=\"websy-nav-empty\">\n                    <div class=\"websy-nav-empty-icon\"><\/div>\n                    <div>${apartmentStrings.noHierarchyInfo}<\/div>\n                <\/div>\n            `;\n        }\n        \n        html += '<\/div>';\n        navContent.innerHTML = html;\n        \n        \/\/ Helper function to update individual hierarchy sections\n        function updateHierarchySection(sectionId, content) {\n            const section = document.getElementById(`hierarchy-${sectionId}`);\n            if (section) {\n                section.outerHTML = content;\n            }\n        }\n        \n        \/\/ Helper function to fetch post title\n        function fetchPostTitle(postId) {\n            return fetch(`\/wp-json\/wp\/v2\/search?search=&subtype=any&type=post&per_page=1&include=${postId}`)\n                .then(response => response.json())\n                .then(data => {\n                    if (Array.isArray(data) && data.length > 0) {\n                        return data[0].title;\n                    }\n                    throw new Error('Post not found');\n                });\n        }\n    }\n    \n    function handleApartmentNavigationClick(postId, title, url) {\n        \/\/ Load the linked hierarchy post in the modal\n        openPostModal(postId, title, url);\n    }\n    \n    \/\/ Setup zoom controls for the main shortcode\n    function setupMainZoomControls() {\n        const zoomInBtn = document.querySelector('.websy-main-zoom-controls .zoom-in');\n        const zoomOutBtn = document.querySelector('.websy-main-zoom-controls .zoom-out');\n        const zoomResetBtn = document.querySelector('.websy-main-zoom-controls .zoom-reset');\n        const mapContainer = document.getElementById('canvas-scroll-container');\n        const svgEl = document.getElementById('frontend-svg');\n        \n        if (!zoomInBtn || !zoomOutBtn || !zoomResetBtn || !mapContainer || !svgEl) {\n            return;\n        }\n        \n        let currentZoom = 1;\n        const zoomStep = 0.2;\n        const minZoom = 0.5;\n        const maxZoom = 3;\n        \n        function applyZoom(zoom) {\n            currentZoom = Math.max(minZoom, Math.min(maxZoom, zoom));\n            \n            \/\/ Switch to full-size mode for zoom functionality\n            mapContainer.classList.remove('centered', 'fit-to-container');\n            mapContainer.classList.add('full-size');\n            \n            \/\/ Apply zoom transform to SVG\n            svgEl.style.transform = `scale(${currentZoom})`;\n            svgEl.style.transformOrigin = 'top left';\n            \n            \/\/ Update container dimensions to accommodate scaled SVG\n            const svgRect = svgEl.getBoundingClientRect();\n            mapContainer.style.minWidth = (svgRect.width * currentZoom) + 'px';\n            mapContainer.style.minHeight = (svgRect.height * currentZoom) + 'px';\n            \n            \/\/ Update tooltip positions after zoom\n            setTimeout(() => updateMainTooltipPositions(), 50);\n            \n            \/\/ Update button states\n            zoomInBtn.disabled = currentZoom >= maxZoom;\n            zoomOutBtn.disabled = currentZoom <= minZoom;\n            zoomResetBtn.disabled = Math.abs(currentZoom - 1) < 0.01;\n        }\n        \n        \/\/ Zoom in\n        zoomInBtn.addEventListener('click', () => {\n            applyZoom(currentZoom + zoomStep);\n        });\n        \n        \/\/ Zoom out\n        zoomOutBtn.addEventListener('click', () => {\n            applyZoom(currentZoom - zoomStep);\n        });\n        \n        \/\/ Reset zoom\n        zoomResetBtn.addEventListener('click', () => {\n            currentZoom = 1;\n            svgEl.style.transform = '';\n            svgEl.style.transformOrigin = '';\n            mapContainer.style.minWidth = '';\n            mapContainer.style.minHeight = '';\n            mapContainer.classList.remove('full-size');\n            \n            \/\/ Recenter the map\n            centerOrScroll();\n            \n            \/\/ Update tooltip positions\n            setTimeout(() => updateMainTooltipPositions(), 50);\n            \n            \/\/ Reset button states\n            zoomInBtn.disabled = false;\n            zoomOutBtn.disabled = false;\n            zoomResetBtn.disabled = true;\n        });\n        \n        \/\/ Initialize button states\n        zoomResetBtn.disabled = true;\n    }\n    \n    \/\/ Load navigation for the main shortcode\n    function loadMainNavigation() {\n        const navContent = document.querySelector('.websy-main-nav-content');\n        const postId = 59311;\n        \n        if (!navContent) {\n            return;\n        }\n        \n        \/\/ Show loading state\n        navContent.innerHTML = '<div class=\"websy-nav-loading\">Loading navigation...<\/div>';\n        \n        \/\/ Get current post data first to determine navigation strategy\n        fetch(`https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/posts\/${postId}?context=view`)\n            .then(response => {\n                if (!response.ok) {\n                    \/\/ Try the custom post types\n                    return tryCustomPostTypes(postId);\n                }\n                return response.json();\n            })\n            .then(post => {\n                if (post && post.type) {\n                    loadNavigationForPostType(post, navContent);\n                } else {\n                    throw new Error('Could not determine post type');\n                }\n            })\n            .catch(error => {\n                console.error('Error loading navigation:', error);\n                navContent.innerHTML = '<div class=\"websy-nav-error\">Unable to load navigation.<\/div>';\n            });\n    }\n    \n    \/\/ Try to fetch post from custom post types\n    function tryCustomPostTypes(postId) {\n        const customPostTypes = ['complex', 'building', 'entrance', 'floor', 'apartment'];\n        \n        const tryNextType = (index) => {\n            if (index >= customPostTypes.length) {\n                throw new Error('Post not found in any post type');\n            }\n            \n            const postType = customPostTypes[index];\n            return fetch(`https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/${postType}\/${postId}?context=view`)\n                .then(response => {\n                    if (response.ok) {\n                        return response.json();\n                    }\n                    return tryNextType(index + 1);\n                })\n                .catch(() => tryNextType(index + 1));\n        };\n        \n        return tryNextType(0);\n    }\n    \n    \/\/ Load navigation based on post type\n    function loadNavigationForPostType(post, navContent) {\n        if (['complex', 'building', 'entrance', 'floor', 'apartment'].includes(post.type)) {\n            \/\/ For hierarchy posts, show the children\/related content\n            loadHierarchyNavigation(post, navContent);\n        } else {\n            \/\/ For regular posts, show basic info\n            loadBasicNavigation(post, navContent);\n        }\n    }\n    \n    \/\/ Load hierarchy-based navigation\n    function loadHierarchyNavigation(post, navContent) {\n        const postType = post.type;\n        let childPostType = '';\n        \n        \/\/ Determine child post type\n        switch (postType) {\n            case 'complex':\n                childPostType = 'building';\n                break;\n            case 'building':\n                childPostType = 'entrance';\n                break;\n            case 'entrance':\n                childPostType = 'floor';\n                break;\n            case 'floor':\n                childPostType = 'apartment';\n                break;\n            default:\n                loadBasicNavigation(post, navContent);\n                return;\n        }\n        \n        \/\/ Fetch child posts\n        const metaKey = postType + '_id';\n        const apiUrl = `\/wp-json\/websy\/v1\/posts\/${childPostType}?meta_key=${metaKey}&meta_value=${post.id}&per_page=-1`;\n        \n        console.log(`Loading navigation for ${postType} (ID: ${post.id}), fetching ${childPostType} with ${metaKey}=${post.id}`);\n        console.log(`API URL: ${apiUrl}`);\n        \n        fetch(apiUrl)\n            .then(response => {\n                if (!response.ok) {\n                    throw new Error(`Failed to fetch ${childPostType} data`);\n                }\n                return response.json();\n            })\n            .then(children => {\n                console.log(`Found ${children.length} ${childPostType} posts for current ${postType}`);\n                buildHierarchyNavigationHtml(children, navContent, childPostType);\n            })\n            .catch(error => {\n                console.error(`Error loading ${childPostType} data:`, error);\n                console.error('API URL that failed:', apiUrl);\n                \/\/ Show error message instead of falling back to basic navigation\n                navContent.innerHTML = `<div class=\"websy-nav-error\">Unable to load ${childPostType} navigation. Check console for details.<\/div>`;\n            });\n    }\n    \n    \/\/ Build hierarchy navigation HTML\n    function buildHierarchyNavigationHtml(children, container, childPostType) {\n        if (!children || children.length === 0) {\n            container.innerHTML = `<div class=\"websy-nav-empty\">No related items found.<\/div>`;\n            return;\n        }\n        \n        const postTypeLabels = {\n            'building': 'Building',\n            'entrance': 'Entrance',\n            'floor': 'Floor',\n            'apartment': 'Apartment'\n        };\n        \n        let html = '<ul class=\"websy-main-nav-list\">';\n        \n        children.forEach(child => {\n            const typeLabel = postTypeLabels[childPostType] || childPostType;\n            \/\/ Construct URL from slug and post type\n            \/\/ const childUrl = `\/${childPostType}\/${child.slug}\/`;\n            const childUrl = `\/?p=${child.id}`;\n            html += `<li class=\"websy-main-nav-item\">`;\n            html += `<a href=\"${childUrl}\" class=\"websy-main-nav-link\" data-post-id=\"${child.id}\" title=\"Open post\">`;\n            html += `<span class=\"websy-nav-title\">${child.title.rendered}<\/span>`;\n            \/\/ html += `<span class=\"websy-nav-type\">${typeLabel}<\/span>`;\n            html += `<span class=\"websy-nav-count\" data-post-id=\"${child.id}\" data-post-type=\"${childPostType}\">Loading...<\/span>`;\n            html += `<span class=\"websy-nav-inner-link\">View ${child.title.rendered}<\/span><span style=\"font-size: 16px; color: #4d40b4;\"> \u203a<\/span>`;\n            html += `<\/a><\/li>`;\n        });\n        \n        html += '<\/ul>';\n        container.innerHTML = html;\n        \n        \/\/ Add hover effects for main navigation items to highlight polygons\n        const mainNavLinks = container.querySelectorAll('.websy-main-nav-link[data-post-id]');\n        mainNavLinks.forEach(navLink => {\n            const postId = navLink.getAttribute('data-post-id');\n            \n            navLink.addEventListener('mouseenter', function() {\n                \/\/ Find polygon by data-post-id attribute  \n                const polygon = document.querySelector(`path[data-post-id=\"${postId}\"]`);\n                if (polygon) {\n                    polygon.style.opacity = '0.7';\n                }\n            });\n            \n            navLink.addEventListener('mouseleave', function() {\n                \/\/ Find polygon by data-post-id attribute\n                const polygon = document.querySelector(`path[data-post-id=\"${postId}\"]`);\n                if (polygon) {\n                    polygon.style.opacity = '';\n                }\n            });\n        });\n        \n        \/\/ Load apartment counts for navigation items\n        loadNavigationApartmentCounts(container, childPostType);\n        \n        \/\/ Load apartment statuses for navigation items (batch fetch for performance)\n        loadNavigationApartmentStatuses(container);\n        \n        \/\/ Navigation hover effects removed for simplified UX\n    }\n    \n    \/\/ Load apartment counts for navigation items\n    function loadNavigationApartmentCounts(container, parentPostType) {\n        \/\/ Only count apartments for hierarchy items (not for apartments themselves)\n        if (parentPostType === 'apartment') return;\n        \n        const countElements = container.querySelectorAll('.websy-nav-count[data-post-id]');\n        \n        countElements.forEach(countElement => {\n            const postId = countElement.getAttribute('data-post-id');\n            const postType = countElement.getAttribute('data-post-type');\n            \n            \/\/ Determine the meta key for apartment counting based on the post type\n            let metaKey = postType + '_id';\n            if (postType === 'complex') metaKey = 'complex_id';\n            \n            \/\/ Fetch total apartment count\n            const apiUrl = `\/wp-json\/websy\/v1\/posts\/apartment?meta_key=${metaKey}&meta_value=${postId}&per_page=-1`;\n            console.log(`Fetching apartment count for ${postType} ID ${postId} from: ${apiUrl}`);\n            \n            fetch(apiUrl)\n                .then(response => {\n                    console.log(`Main Nav API Response Headers for ${postType} ID ${postId}:`, {\n                        totalCount: response.headers.get('X-Total-Count'),\n                        contentType: response.headers.get('Content-Type')\n                    });\n                    return response.json();\n                })\n                .then(apartments => {\n                    console.log(`Received ${apartments ? apartments.length : 0} apartments for ${postType} ID ${postId}:`, apartments);\n                    \n                    if (apartments && Array.isArray(apartments)) {\n                        const totalCount = apartments.length;\n                        \n                        \/\/ Count available apartments\n                        const availableCount = apartments.filter(apt => {\n                            const status = apt.apartment_available;\n                            return status === 'available' || status === '1' || status === 'yes';\n                        }).length;\n\n                        if (availableCount > 0) {\n                            countElement.parentElement.parentElement.style.backgroundColor = '#eaf6ec';\n                        }\n\n                        if (availableCount === 0) {\n                            countElement.parentElement.parentElement.style.backgroundColor = '#f5c2c8';\n                        }                  \n                        console.log(`Count results: total=${totalCount}, available=${availableCount}`);\n                        \n                        \/\/ Update the count display\n                        if (totalCount > 0) {\n                            countElement.innerHTML = `<span class=\"apartment-total\">Count:  ${totalCount}<\/span>` + \n                                (availableCount > 0 ? ` <span class=\"apartment-available\">Available: ${availableCount}<\/span>` : '');\n                        } else {\n                            countElement.style.display = 'none';\n                        }\n                    } else {\n                        countElement.style.display = 'none';\n                    }\n                })\n                .catch(error => {\n                    console.log('Failed to load apartment count for post', postId, error);\n                    countElement.style.display = 'none';\n                });\n        });\n    }\n    \n    \/\/ Batch load apartment statuses for navigation items to improve performance\n    function loadNavigationApartmentStatuses(container) {\n        const apartmentNavLinks = container.querySelectorAll('.websy-main-nav-link[data-post-id], .websy-nav-link[data-post-id]');\n        const apartmentIds = [];\n        \n        \/\/ Collect all apartment IDs from navigation items\n        apartmentNavLinks.forEach(navLink => {\n            const postType = navLink.getAttribute('data-post-type') || 'apartment';\n            const postId = navLink.getAttribute('data-post-id');\n            \n            \/\/ Only collect apartment IDs\n            if (postType === 'apartment' && postId) {\n                apartmentIds.push(postId);\n            }\n        });\n        \n        if (apartmentIds.length === 0) return;\n        \n        \/\/ Fetch all apartment statuses in a single batch request\n        fetch(`\/wp-json\/websy\/v1\/apartment-statuses?ids=${apartmentIds.join(',')}`)\n            .then(response => response.json())\n            .then(apartmentStatuses => {\n                console.log(`Batch loaded ${apartmentStatuses.length} apartment statuses`);\n                \n                \/\/ Apply status styling to each navigation item\n                apartmentStatuses.forEach(apartment => {\n                    const navLink = container.querySelector(`.websy-main-nav-link[data-post-id=\"${apartment.id}\"], .websy-nav-link[data-post-id=\"${apartment.id}\"]`).parentElement;\n                    if (navLink) {\n\n                        \/\/ transform count element to status element since we are in lowest level item\n                        navLink.querySelector('.websy-nav-count').className = 'websy-nav-apartment-status';\n                        \/\/ Remove existing status classes\n                        navLink.classList.remove('apartment-available', 'apartment-reserved', 'apartment-sold', 'apartment-unknown');\n                        \n                        \/\/ Add status class based on apartment availability\n                        if (apartment.apartment_available) {\n                            const status = String(apartment.apartment_available).toLowerCase();\n                            switch(status) {\n                                case 'available':\n                                case '1':\n                                    navLink.classList.add('apartment-available');\n                                    navLink.querySelector('.websy-nav-apartment-status').textContent = 'Available';\n                                    break;\n                                case 'reserved':\n                                case '2':\n                                    navLink.classList.add('apartment-reserved');\n                                    navLink.querySelector('.websy-nav-apartment-status').textContent = 'Reserved';\n                                    break;\n                                case 'sold':\n                                case '3':\n                                case '0':\n                                    navLink.classList.add('apartment-sold');\n                                    navLink.querySelector('.websy-nav-apartment-status').textContent = 'Sold';\n                                    break;\n                                default:\n                                    navLink.classList.add('apartment-unknown');\n                                    navLink.querySelector('.websy-nav-apartment-status').textContent = 'Unknown';\n                            }\n                        } else {\n                            navLink.classList.add('apartment-unknown');\n                        }\n                    }\n                });\n            })\n            .catch(error => {\n                console.error('Failed to batch load apartment statuses:', error);\n            });\n    }\n    \n    \/\/ Load basic navigation for regular posts\n    function loadBasicNavigation(post, container) {\n        let html = '<ul class=\"websy-main-nav-list\">';\n        html += `<li class=\"websy-main-nav-item\">`;\n        html += `<a href=\"${post.link}\" class=\"websy-main-nav-link\" data-post-id=\"${post.id}\" title=\"Open post\">`;\n        html += `<span class=\"websy-nav-title\">${post.title.rendered}<\/span>`;\n        html += `<\/a><\/li>`;\n        html += '<\/ul>';\n        \n        container.innerHTML = html;\n        \n        \/\/ Add hover effects for main navigation items to highlight polygons\n        const mainNavLinks = container.querySelectorAll('.websy-main-nav-link[data-post-id]');\n        mainNavLinks.forEach(navLink => {\n            const postId = navLink.getAttribute('data-post-id');\n            \n            navLink.addEventListener('mouseenter', function() {\n                \/\/ Find polygon by data-post-id attribute  \n                const polygon = document.querySelector(`path[data-post-id=\"${postId}\"]`);\n                if (polygon) {\n                    polygon.style.opacity = '0.7';\n                }\n            });\n            \n            navLink.addEventListener('mouseleave', function() {\n                \/\/ Find polygon by data-post-id attribute\n                const polygon = document.querySelector(`path[data-post-id=\"${postId}\"]`);\n                if (polygon) {\n                    polygon.style.opacity = '';\n                }\n            });\n        });\n        \n        \/\/ Navigation hover effects removed for simplified UX\n    }\n    \n    \/\/ Handle navigation clicks in main shortcode\n    function handleMainNavigationClick(postId, title, url) {\n        \/\/ Open the post in a modal\n        openPostModal(postId, title, url);\n    }\n    \n    \/\/ Contact Form functionality\n    const contactBtn = document.getElementById('websy-request-consultation-btn');\n    const contactModal = document.getElementById('websy-contact-modal');\n    const contactModalClose = document.getElementById('websy-contact-modal-close');\n    const contactCancelBtn = document.getElementById('websy-contact-cancel');\n    const contactForm = document.getElementById('websy-contact-form');\n    const contactStatus = document.getElementById('websy-contact-status');\n    \n    if (contactBtn && contactModal) {\n        \/\/ Open modal\n        contactBtn.addEventListener('click', function() {\n            contactModal.style.display = 'flex';\n            document.body.style.overflow = 'hidden';\n            \n            \/\/ Focus first input\n            setTimeout(() => {\n                const firstInput = contactModal.querySelector('input[type=\"text\"]');\n                if (firstInput) firstInput.focus();\n            }, 300);\n        });\n        \n        \/\/ Close modal functions\n        function closeContactModal() {\n            contactModal.style.display = 'none';\n            document.body.style.overflow = '';\n            contactForm.reset();\n            contactStatus.style.display = 'none';\n            contactStatus.className = 'websy-form-status';\n        }\n        \n        \/\/ Close modal events\n        if (contactModalClose) {\n            contactModalClose.addEventListener('click', closeContactModal);\n        }\n        \n        if (contactCancelBtn) {\n            contactCancelBtn.addEventListener('click', closeContactModal);\n        }\n        \n        \/\/ Close modal on backdrop click\n        contactModal.addEventListener('click', function(e) {\n            if (e.target === contactModal || e.target.classList.contains('websy-modal-cf-backdrop')) {\n                closeContactModal();\n            }\n        });\n        \n        \/\/ Close modal on Escape key\n        document.addEventListener('keydown', function(e) {\n            if (e.key === 'Escape' && contactModal.style.display === 'flex') {\n                closeContactModal();\n            }\n        });\n        \n        \/\/ Handle form submission\n        if (contactForm) {\n            contactForm.addEventListener('submit', function(e) {\n                e.preventDefault();\n                \n                const submitBtn = document.getElementById('websy-contact-submit');\n                const formData = new FormData(contactForm);\n                \n                \/\/ Add nonce and action\n                formData.append('action', 'websy_submit_contact_form');\n                formData.append('nonce', '30eb5788d0');\n                \n                \/\/ Show loading state\n                submitBtn.disabled = true;\n                submitBtn.textContent = 'Sending...';\n                contactStatus.style.display = 'none';\n                \n                \/\/ Submit form\n                fetch('https:\/\/buildingbox.isgcm.com\/wp-admin\/admin-ajax.php', {\n                    method: 'POST',\n                    body: formData\n                })\n                .then(response => response.json())\n                .then(data => {\n                    if (data.success) {\n                        contactStatus.className = 'websy-form-status success';\n                        contactStatus.textContent = data.data;\n                        contactStatus.style.display = 'block';\n                        \n                        \/\/ Reset form\n                        contactForm.reset();\n                        \n                        \/\/ Close modal after 3 seconds\n                        setTimeout(closeContactModal, 3000);\n                    } else {\n                        contactStatus.className = 'websy-form-status error';\n                        contactStatus.textContent = data.data;\n                        contactStatus.style.display = 'block';\n                    }\n                })\n                .catch(error => {\n                    console.error('Contact form error:', error);\n                    contactStatus.className = 'websy-form-status error';\n                    contactStatus.textContent = 'An error occurred. Please try again.';\n                    contactStatus.style.display = 'block';\n                })\n                .finally(() => {\n                    submitBtn.disabled = false;\n                    submitBtn.textContent = 'Send Request';\n                });\n            });\n        }\n    }\n    \n    \/\/ Apartment Contact Form functionality (for single apartment pages - inline form)\n    const apartmentContactForm = document.getElementById('websy-apartment-contact-form');\n    const apartmentContactStatus = document.getElementById('websy-apartment-contact-status');\n    \n    if (apartmentContactForm) {\n        \/\/ Handle apartment form submission\n        apartmentContactForm.addEventListener('submit', function(e) {\n            e.preventDefault();\n            \n            const submitBtn = apartmentContactForm.querySelector('button[type=\"submit\"]');\n            const formData = new FormData(apartmentContactForm);\n            \n            \/\/ Add nonce and action\n            formData.append('action', 'websy_submit_contact_form');\n            formData.append('nonce', '30eb5788d0');\n            \n            \/\/ Show loading state\n            submitBtn.disabled = true;\n            const originalText = submitBtn.textContent;\n            submitBtn.textContent = 'Sending...';\n            \n            \/\/ Hide any existing status\n            if (apartmentContactStatus) {\n                apartmentContactStatus.style.display = 'none';\n            }\n            \n            \/\/ Submit form\n            fetch('https:\/\/buildingbox.isgcm.com\/wp-admin\/admin-ajax.php', {\n                method: 'POST',\n                body: formData\n            })\n            .then(response => response.json())\n            .then(data => {\n                if (apartmentContactStatus) {\n                    if (data.success) {\n                        apartmentContactStatus.style.background = '#d4edda';\n                        apartmentContactStatus.style.color = '#155724';\n                        apartmentContactStatus.style.border = '1px solid #c3e6cb';\n                        apartmentContactStatus.textContent = data.data;\n                        apartmentContactStatus.style.display = 'block';\n                        \n                        \/\/ Reset form\n                        apartmentContactForm.reset();\n                        \n                        \/\/ Pre-fill the apartment information again after reset\n                        const messageField = apartmentContactForm.querySelector('#apartment-contact-message');\n                        if (messageField) {\n                            messageField.value = 'I am interested in the apartment: \u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430';\n                        }\n                    } else {\n                        apartmentContactStatus.style.background = '#f8d7da';\n                        apartmentContactStatus.style.color = '#721c24';\n                        apartmentContactStatus.style.border = '1px solid #f5c6cb';\n                        apartmentContactStatus.textContent = data.data;\n                        apartmentContactStatus.style.display = 'block';\n                    }\n                }\n            })\n            .catch(error => {\n                console.error('Apartment contact form error:', error);\n                if (apartmentContactStatus) {\n                    apartmentContactStatus.style.background = '#f8d7da';\n                    apartmentContactStatus.style.color = '#721c24';\n                    apartmentContactStatus.style.border = '1px solid #f5c6cb';\n                    apartmentContactStatus.textContent = 'An error occurred. Please try again.';\n                    apartmentContactStatus.style.display = 'block';\n                }\n            })\n            .finally(() => {\n                submitBtn.disabled = false;\n                submitBtn.textContent = originalText;\n            });\n        });\n    }\n    <\/script>\n    \n    <style>\n    \/* Apartment count styling for navigation *\/\n    .websy-nav-count, .websy-nav-item-count {\n        font-size: 16px;\n        color: #000;\n        margin-top: 4px;\n        font-weight: normal;\n    }\n\n    .websy-nav-inner-link {\n        color: #4d40b4;\n        text-decoration: underline;\n    }\n    \n    \/* .apartment-total {\n        background: #f0f9ff;\n        color: #0073aa;\n        padding: 2px 6px;\n        border-radius: 3px;\n        font-weight: 500;\n        border: 1px solid #b3d9f2;\n    }\n    \n    .apartment-available {\n        color: #008a00;\n        font-weight: 500;\n        margin-left: 4px;\n    } *\/\n\n    .apartment-total, .apartment-available {\n        display: block;\n    }\n    \n    \/* Navigation apartment status styling *\/\n    .websy-main-nav-item.apartment-available,\n    .websy-nav-link.apartment-available {\n        background-color: #f0fff0;\n    }\n    \n    .websy-main-nav-item.apartment-reserved,\n    .websy-nav-link.apartment-reserved {\n        background-color: #fff8f0;\n    }\n    \n    .websy-main-nav-item.apartment-sold,\n    .websy-nav-link.apartment-sold {\n        background-color: #fdf0f0;\n    }\n    \n    .websy-main-nav-item.apartment-unknown,\n    .websy-nav-link.apartment-unknown {\n        background-color: #f8f9fa;\n    }\n    \n    \/* Tooltip apartment status styling *\/\n    .polygon-tooltip.apartment-available {\n        background-color: #e8f5e8;\n        border-color: #008a00;\n        color: #fff;\n    }\n    \n    .polygon-tooltip.apartment-reserved {\n        background-color: #fff3e0;\n        border-color: #ff8c00;\n        color: #fff;\n    }\n    \n    .polygon-tooltip.apartment-sold {\n        background-color: #fde8e8;\n        border-color: #dc3545;\n        color: #fff;\n    }\n    \n    .polygon-tooltip.apartment-unknown {\n        background-color: #f8f9fa;\n        border-color: #6c757d;\n        color: #fff;\n    }\n    \n    \/* Main navigation apartment counts *\/\n    .websy-main-nav-link .websy-nav-count {\n        display: block;\n    }\n\n    .websy-main-nav-link .websy-nav-apartment-status {\n        display:block;\n        font-size: 16px;\n    }\n    \n    \/* Modal navigation apartment counts *\/\n    .websy-nav-item .websy-nav-item-count {\n        margin-top: 6px;\n    }\n    \n    \/* Loading state *\/\n    .websy-nav-count:empty:before,\n    .websy-nav-item-count:empty:before {\n        content: \"Loading...\";\n        color: #999;\n        font-style: italic;\n        font-size: 0.8em;\n    }\n    <\/style>\n    \n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-31cc65ce e-con-full e-flex e-con e-parent\" data-id=\"31cc65ce\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-6ce8b9f7 e-con-full e-flex e-con e-child\" data-id=\"6ce8b9f7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-16bcf383 elementor-widget elementor-widget-heading\" data-id=\"16bcf383\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u041b\u0443\u043a\u0441\u043e\u0437\u043d\u0430 \u0416\u0438\u043b\u0438\u0449\u043d\u0430 \u0421\u0433\u0440\u0430\u0434\u0430 \u0432 ....<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4cb007bf elementor-widget elementor-widget-text-editor\" data-id=\"4cb007bf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>\u201e\u041c\u0430\u0440\u0438\u0446\u0430 \u043f\u0430\u0440\u043a\u201c \u0435 \u0436\u0438\u043b\u0438\u0449\u0435\u043d \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043e\u0442 \u0437\u0430\u0442\u0432\u043e\u0440\u0435\u043d \u0442\u0438\u043f, \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d \u0432 \u0441\u0435\u0432\u0435\u0440\u043d\u0430\u0442\u0430 \u0447\u0430\u0441\u0442 \u043d\u0430 \u0433\u0440\u0430\u0434 \u041f\u043b\u043e\u0432\u0434\u0438\u0432. \u041d\u0430 \u043f\u0435\u0448\u0435\u0445\u043e\u0434\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0430 \u0412\u0430\u0448\u0435 \u0440\u0430\u0437\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0430 \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d\u0438:<br \/>&#8211; \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0442 <br \/>&#8211; \u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0438 \u043d\u0435\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0432\u0435\u0440\u0438\u0433\u0438 <br \/>&#8211; \u0441\u043f\u043e\u0440\u0442\u043d\u0430 \u0437\u0430\u043b\u0430 <br \/>&#8211; \u0435\u043b\u0438\u0442\u043d\u0438 \u0443\u0447\u0438\u043b\u0438\u0449\u0430 <br \/>&#8211; \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442 <br \/>&#8211; \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u0438 \u0441\u043f\u0438\u0440\u043a\u0438 \u043d\u0430 \u0433\u0440\u0430\u0434\u0441\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-39e04bce e-con-full e-flex e-con e-child\" data-id=\"39e04bce\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7cc2a9f elementor-widget elementor-widget-counter\" data-id=\"7cc2a9f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"counter.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-counter\">\n\t\t\t<div class=\"elementor-counter-title\">12 \u0441\u0442\u0443\u0434\u0438\u0430, 36 \u0434\u0432\u0443\u0441\u0442\u0430\u0439\u043d\u0438 \u0438 103 \u0442\u0440\u0438\u0441\u0442\u0430\u0439\u043d\u0438.<\/div>\t\t\t<div class=\"elementor-counter-number-wrapper\">\n\t\t\t\t<span class=\"elementor-counter-number-prefix\"><\/span>\n\t\t\t\t<span class=\"elementor-counter-number\" data-duration=\"2000\" data-to-value=\"151\" data-from-value=\"0\" data-delimiter=\",\">0<\/span>\n\t\t\t\t<span class=\"elementor-counter-number-suffix\"><\/span>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e57d898 elementor-widget elementor-widget-counter\" data-id=\"3e57d898\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"counter.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-counter\">\n\t\t\t<div class=\"elementor-counter-title\">155 \u0433\u0430\u0440\u0430\u0436\u0430 \u0438 87 \u043f\u0430\u0440\u043a\u043e\u043c\u0435\u0441\u0442\u0430<\/div>\t\t\t<div class=\"elementor-counter-number-wrapper\">\n\t\t\t\t<span class=\"elementor-counter-number-prefix\"><\/span>\n\t\t\t\t<span class=\"elementor-counter-number\" data-duration=\"2000\" data-to-value=\"242\" data-from-value=\"0\" data-delimiter=\",\">0<\/span>\n\t\t\t\t<span class=\"elementor-counter-number-suffix\"><\/span>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-61da90d8 elementor-widget elementor-widget-counter\" data-id=\"61da90d8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"counter.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-counter\">\n\t\t\t<div class=\"elementor-counter-title\">\u0412\u0445\u043e\u0434<\/div>\t\t\t<div class=\"elementor-counter-number-wrapper\">\n\t\t\t\t<span class=\"elementor-counter-number-prefix\"><\/span>\n\t\t\t\t<span class=\"elementor-counter-number\" data-duration=\"2000\" data-to-value=\"8\" data-from-value=\"0\" data-delimiter=\",\">0<\/span>\n\t\t\t\t<span class=\"elementor-counter-number-suffix\"><\/span>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2329d71e e-con-full e-flex e-con e-parent\" data-id=\"2329d71e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-5bc4662b e-con-full e-flex e-con e-child\" data-id=\"5bc4662b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-20549b83 elementor-widget elementor-widget-image\" data-id=\"20549b83\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"703\" src=\"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/researchers-looking-alternative-energy-souces-1-1024x703.jpg\" class=\"attachment-large size-large wp-image-32478 not-transparent\" alt=\"\" srcset=\"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/researchers-looking-alternative-energy-souces-1-1024x703.jpg 1024w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/researchers-looking-alternative-energy-souces-1-300x206.jpg 300w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/researchers-looking-alternative-energy-souces-1-768x527.jpg 768w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/researchers-looking-alternative-energy-souces-1-874x600.jpg 874w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/researchers-looking-alternative-energy-souces-1-496x340.jpg 496w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/researchers-looking-alternative-energy-souces-1.jpg 1384w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" data-has-transparency=\"false\" data-dominant-color=\"908a83\" style=\"--dominant-color: #908a83\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-74205106 e-con-full e-flex e-con e-child\" data-id=\"74205106\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-181cfbcb elementor-widget elementor-widget-heading\" data-id=\"181cfbcb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u0414\u0438\u0437\u0430\u0439\u043d \u0438 \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2a30cf13 elementor-widget elementor-widget-text-editor\" data-id=\"2a30cf13\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<div class=\"column\"><div class=\"div-4\"><div class=\"div-6\">\u201c\u041c\u0430\u0440\u0438\u0446\u0430 \u041f\u0430\u0440\u043a\u201d \u0449\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0432\u0430 \u0441\u044a\u0441 \u0441\u0432\u043e\u044f\u0442\u0430 \u043c\u043e\u0434\u0435\u0440\u043d\u0430 \u0432\u0438\u0437\u0438\u044f, \u0430 \u0443\u0441\u0435\u0449\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0436\u0438\u0432\u0443\u0449\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0430 \u0449\u0435 \u0435 \u0437\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0435\u043d, \u0445\u0430\u0440\u043c\u043e\u043d\u0438\u0447\u0435\u043d \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d \u0436\u0438\u0432\u043e\u0442! \u0418\u0434\u0435\u044f\u0442\u0430 \u0437\u0430 \u0435\u043d\u0435\u0440\u0433\u0438\u0439\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442 \u0435 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u0449\u0430 \u2013 \u0437\u0430\u0445\u0440\u0430\u043d\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0438\u0437\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u043d\u043e \u043b\u0443\u043a\u0441\u043e\u0437\u043d\u043e \u0437\u0430\u0432\u044a\u0440\u0448\u0435\u043d\u0438\u0442\u0435 \u043e\u0431\u0449\u0438 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430 \u0441\u0433\u0440\u0430\u0434\u0438\u0442\u0435 \u0449\u0435 \u0431\u044a\u0434\u0435 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0441\u043e\u043b\u0430\u0440\u043d\u0438 \u043f\u0430\u043d\u0435\u043b\u0438. \u0421\u044a\u0449\u043e \u0442\u0430\u043a\u0430 \u0441\u043c\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0438\u043b\u0438 \u0448\u0443\u043c\u043e- \u0438 \u0442\u043e\u043f\u043b\u043e\u0438\u0437\u043e\u043b\u0430\u0446\u0438\u044f \u043d\u0430 \u0432\u0441\u0435\u043a\u0438 \u0435\u0442\u0430\u0436 . \u2018\u2019\u041c\u0430\u0440\u0438\u0446\u0430 \u043f\u0430\u0440\u043a\u201c \u0441\u0435 \u0441\u044a\u0441\u0442\u043e\u0438 \u043e\u0442 \u0447\u0435\u0442\u0438\u0440\u0438 \u0441\u0433\u0440\u0430\u0434\u0438, \u0432\u0441\u044f\u043a\u0430 \u043e\u0442 \u043a\u043e\u0438\u0442\u043e \u0441 \u0435\u0434\u0438\u043d \u043f\u043e\u0434\u0437\u0435\u043c\u0435\u043d \u0438 \u0448\u0435\u0441\u0442 \u043d\u0430\u0434\u0437\u0435\u043c\u043d\u0438 \u0435\u0442\u0430\u0436\u0430. \u041c\u0435\u0436\u0434\u0443 \u0442\u044f\u0445 \u0449\u0435 \u0431\u044a\u0434\u0430\u0442 \u0438\u0437\u0433\u0440\u0430\u0434\u0435\u043d\u0438 \u0430\u043b\u0435\u0438, \u043c\u0435\u0441\u0442\u0430 \u0437\u0430 \u043e\u0442\u0434\u0438\u0445, \u043f\u044a\u0441\u0442\u0440\u0438 \u0433\u0440\u0430\u0434\u0438\u043d\u0438, \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0437\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043e\u0437\u0435\u043b\u0435\u043d\u044f\u0432\u0430\u043d\u0435, \u0434\u0432\u0430 \u0434\u0435\u0442\u0441\u043a\u0438 \u043a\u044a\u0442\u0430, \u0441\u0442\u0440\u0438\u0439\u0442 \u0444\u0438\u0442\u043d\u0435\u0441, \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438 \u0437\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0438 \u043b\u044e\u0431\u0438\u043c\u0446\u0438, \u043a\u0430\u043a\u0442\u043e \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u0435\u043d \u043c\u0430\u0433\u0430\u0437\u0438\u043d.<\/div><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-46d4a480 e-con-full e-flex e-con e-parent\" data-id=\"46d4a480\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-27a2f0ac e-con-full e-flex e-con e-child\" data-id=\"27a2f0ac\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-56a522a6 elementor-widget elementor-widget-heading\" data-id=\"56a522a6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u0423\u043d\u0438\u043a\u0430\u043b\u043d\u0438 \u0424\u0443\u043d\u043a\u0446\u0438\u0438<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a9ccf1a elementor-widget elementor-widget-text-editor\" data-id=\"a9ccf1a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<div class=\"column\"><div class=\"div-4\"><div class=\"div-6\">\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0430\u043b\u0438 \u0441\u043c\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 \u043d\u0430 \u0436\u0438\u043b\u0438\u0449\u0430 \u0437\u0430 \u0432\u0441\u0435\u043a\u0438 \u0432\u043a\u0443\u0441 &#8211; \u0430\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u0438 \u0441 \u0434\u0432\u043e\u0440\u043d\u0438 \u0432\u0435\u0440\u0430\u043d\u0434\u0438, \u043f\u0435\u043d\u0442\u0445\u0430\u0443\u0441\u0438 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043d\u0438 \u043f\u043e\u043a\u0440\u0438\u0432\u043d\u0438 \u0442\u0435\u0440\u0430\u0441\u0438, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0438 \u0442\u0440\u0438\u0441\u0442\u0430\u0439\u043d\u0438 \u0438 \u0434\u0432\u0443\u0441\u0442\u0430\u0439\u043d\u0438 \u0434\u043e\u043c\u043e\u0432\u0435, \u043a\u0430\u0442\u043e \u0441\u043c\u0435 \u0437\u0430\u043b\u043e\u0436\u0438\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0430 \u0435\u0442\u0430\u0436\u043d\u0430 \u0432\u0438\u0441\u043e\u0447\u0438\u043d\u0430 \u043e\u0442 3 \u043c\u0435\u0442\u0440\u0430.<\/div><\/div><\/div><div class=\"column-2\">\u00a0<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-22419551 e-con-full e-flex e-con e-child\" data-id=\"22419551\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2e862715 elementor-widget elementor-widget-image\" data-id=\"2e862715\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"682\" src=\"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/small-wooden-houses-with-heart-big-one-symbolizing-family-love-security-home-1-1024x682.jpg\" class=\"attachment-large size-large wp-image-32470 not-transparent\" alt=\"\" srcset=\"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/small-wooden-houses-with-heart-big-one-symbolizing-family-love-security-home-1-1024x682.jpg 1024w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/small-wooden-houses-with-heart-big-one-symbolizing-family-love-security-home-1-300x200.jpg 300w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/small-wooden-houses-with-heart-big-one-symbolizing-family-love-security-home-1-768x512.jpg 768w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/small-wooden-houses-with-heart-big-one-symbolizing-family-love-security-home-1-1536x1023.jpg 1536w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/small-wooden-houses-with-heart-big-one-symbolizing-family-love-security-home-1-2048x1364.jpg 2048w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/small-wooden-houses-with-heart-big-one-symbolizing-family-love-security-home-1-901x600.jpg 901w, https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/03\/small-wooden-houses-with-heart-big-one-symbolizing-family-love-security-home-1-496x330.jpg 496w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" data-has-transparency=\"false\" data-dominant-color=\"737868\" style=\"--dominant-color: #737868\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-26740dd0 e-con-full e-flex e-con e-parent\" data-id=\"26740dd0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-3db52fca e-con-full elementor-hidden-mobile e-flex e-con e-child\" data-id=\"3db52fca\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-30607073 elementor-widget elementor-widget-google_maps\" data-id=\"30607073\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"google_maps.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-custom-embed\">\n\t\t\t<iframe loading=\"lazy\"\n\t\t\t\t\tsrc=\"https:\/\/maps.google.com\/maps?q=%D0%B6.%D0%BA.%20%D0%9C%D0%B0%D0%BB%D0%B8%D0%BD%D0%BE%D0%B2%D0%B0%20%D0%B4%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0%2C%20ul.%20%22Eduard%20Genov%22&#038;t=m&#038;z=15&#038;output=embed&#038;iwloc=near\"\n\t\t\t\t\ttitle=\"\u0436.\u043a. \u041c\u0430\u043b\u0438\u043d\u043e\u0432\u0430 \u0434\u043e\u043b\u0438\u043d\u0430, ul. &quot;Eduard Genov&quot;\"\n\t\t\t\t\taria-label=\"\u0436.\u043a. \u041c\u0430\u043b\u0438\u043d\u043e\u0432\u0430 \u0434\u043e\u043b\u0438\u043d\u0430, ul. &quot;Eduard Genov&quot;\"\n\t\t\t><\/iframe>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9539060 e-con-full e-flex e-con e-child\" data-id=\"9539060\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-745a71c4 elementor-widget elementor-widget-heading\" data-id=\"745a71c4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u0423\u043d\u0438\u043a\u0430\u043b\u043d\u0438 \u0424\u0443\u043d\u043a\u0446\u0438\u0438<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-48b2cf7d elementor-widget elementor-widget-text-editor\" data-id=\"48b2cf7d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<div class=\"column\"><div class=\"div-4\"><div class=\"div-6\">\u201e\u041c\u0430\u0440\u0438\u0446\u0430 \u043f\u0430\u0440\u043a\u201c \u0435 , \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d \u0432 \u0440\u0430\u0439\u043e\u043d, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0438\u0440\u0430\u0449 \u0441\u0435 \u0441 \u043d\u0438\u0441\u043a\u043e \u0437\u0430\u0441\u0442\u0440\u043e\u044f\u0432\u0430\u043d\u0435, \u0432 \u0431\u043b\u0438\u0437\u043e\u0441\u0442 \u0434\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0438 \u043f\u044a\u0442\u043d\u0438 \u0430\u0440\u0442\u0435\u0440\u0438\u0438 \u0438 \u0431\u044a\u0440\u0437 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0432\u0441\u044f\u043a\u0430 \u0447\u0430\u0441\u0442 \u043d\u0430 \u0433\u0440\u0430\u0434\u0430. \u041d\u0430 \u043f\u0435\u0448\u0435\u0445\u043e\u0434\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0430 \u0412\u0430\u0448\u0435 \u0440\u0430\u0437\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043c\u0430 \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0442, \u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0438 \u043d\u0435\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0432\u0435\u0440\u0438\u0433\u0438, \u0441\u043f\u043e\u0440\u0442\u043d\u0430 \u0437\u0430\u043b\u0430, \u0435\u043b\u0438\u0442\u043d\u0438 \u0443\u0447\u0438\u043b\u0438\u0449\u0430 &#8211; \u0415\u0437\u0438\u043a\u043e\u0432\u0430 \u0433\u0438\u043c\u043d\u0430\u0437\u0438\u044f &#8211; \u041f\u043b\u043e\u0432\u0434\u0438\u0432, \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442 \u041f\u0423 &#8220;\u041f\u0430\u0438\u0441\u0438\u0439 \u0425\u0438\u043b\u0435\u043d\u0434\u0430\u0440\u0441\u043a\u0438&#8221; &#8211; \u043d\u043e\u0432\u0430 \u0441\u0433\u0440\u0430\u0434\u0430, \u043a\u0430\u043a\u0442\u043e \u0438 \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u0438 \u0441\u043f\u0438\u0440\u043a\u0438 \u043d\u0430 \u0433\u0440\u0430\u0434\u0441\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442.<\/div><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-786499d5 elementor-hidden-widescreen elementor-hidden-desktop elementor-hidden-laptop elementor-hidden-tablet elementor-widget elementor-widget-google_maps\" data-id=\"786499d5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"google_maps.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-custom-embed\">\n\t\t\t<iframe loading=\"lazy\"\n\t\t\t\t\tsrc=\"https:\/\/maps.google.com\/maps?q=%D0%B6.%D0%BA.%20%D0%9C%D0%B0%D0%BB%D0%B8%D0%BD%D0%BE%D0%B2%D0%B0%20%D0%B4%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0%2C%20ul.%20%22Eduard%20Genov%22&#038;t=m&#038;z=15&#038;output=embed&#038;iwloc=near\"\n\t\t\t\t\ttitle=\"\u0436.\u043a. \u041c\u0430\u043b\u0438\u043d\u043e\u0432\u0430 \u0434\u043e\u043b\u0438\u043d\u0430, ul. &quot;Eduard Genov&quot;\"\n\t\t\t\t\taria-label=\"\u0436.\u043a. \u041c\u0430\u043b\u0438\u043d\u043e\u0432\u0430 \u0434\u043e\u043b\u0438\u043d\u0430, ul. &quot;Eduard Genov&quot;\"\n\t\t\t><\/iframe>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5f9a2a0e e-con-full e-flex e-con e-parent\" data-id=\"5f9a2a0e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-5c6a1bc8 e-con-full e-flex e-con e-child\" data-id=\"5c6a1bc8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7fc16215 elementor-widget elementor-widget-heading\" data-id=\"7fc16215\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u0412\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0432\u0430\u0442\u0435<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-75b9d5b0 elementor-widget elementor-widget-text-editor\" data-id=\"75b9d5b0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<div class=\"column\"><div class=\"div-4\"><div class=\"div-6\">\u0421\u0433\u0440\u0430\u0434\u0430 \u0441 \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0434\u0438\u0437\u0430\u0439\u043d, \u0440\u0430\u0437\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0432 \u043f\u0440\u0435\u0441\u0442\u0438\u0436\u0435\u043d \u0440\u0430\u0439\u043e\u043d \u043d\u0430 \u0433\u0440\u0430\u0434\u0430. \u041e\u0442\u043b\u0438\u0447\u0430\u0432\u0430 \u0441\u044a\u0441 \u0441\u044a\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430 \u0435\u0441\u0442\u0435\u0442\u0438\u043a\u0430, \u0438\u0437\u0447\u0438\u0441\u0442\u0435\u043d\u0438 \u043b\u0438\u043d\u0438\u0438 \u0438 \u0432\u0438\u0441\u043e\u043a\u043e\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438. \u0412\u044a\u0442\u0440\u0435\u0448\u043d\u0438\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0441\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0430\u043d\u0438 \u0441 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u044a\u043c \u0434\u0435\u0442\u0430\u0439\u043b\u0430, \u0441 \u043c\u043e\u0434\u0435\u0440\u043d\u0438 \u0438\u043d\u0442\u0435\u0440\u0438\u043e\u0440\u043d\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043d\u043e \u0440\u0430\u0437\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043b\u043e\u0449\u0438\u0442\u0435.<\/div><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f7eb931 e-con-full e-flex e-con e-child\" data-id=\"f7eb931\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-12527703 elementor-pagination-type-bullets elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-n-carousel\" data-id=\"12527703\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;carousel_items&quot;:[{&quot;slide_title&quot;:&quot;Slide #1&quot;,&quot;_id&quot;:&quot;07266cc&quot;},{&quot;slide_title&quot;:&quot;Slide #2&quot;,&quot;_id&quot;:&quot;a8ce87f&quot;},{&quot;slide_title&quot;:&quot;Slide #3&quot;,&quot;_id&quot;:&quot;ae2e980&quot;}],&quot;slides_to_show&quot;:&quot;1&quot;,&quot;slides_to_show_tablet&quot;:&quot;2&quot;,&quot;slides_to_show_mobile&quot;:&quot;1&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;infinite&quot;:&quot;yes&quot;,&quot;speed&quot;:500,&quot;offset_sides&quot;:&quot;none&quot;,&quot;arrows&quot;:&quot;yes&quot;,&quot;pagination&quot;:&quot;bullets&quot;,&quot;image_spacing_custom&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]},&quot;image_spacing_custom_widescreen&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_laptop&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_mobile_extra&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"nested-carousel.default\">\n\t\t\t\t\t\t\t<div class=\"e-n-carousel swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"\u0412\u044a\u0440\u0442\u0435\u043b\u0435\u0436\u043a\u0430\" dir=\"ltr\">\n\t\t\t<div class=\"swiper-wrapper\" aria-live=\"off\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"1\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 of 3\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5a577c69 e-flex e-con-boxed e-con e-child\" data-id=\"5a577c69\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a877e57 elementor-widget elementor-widget-heading\" data-id=\"a877e57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u0414\u043e\u0433\u0440\u0430\u043c\u0430<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fb646db elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"fb646db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>\u041c\u043d\u043e\u0433\u043e\u043a\u0430\u043c\u0435\u0440\u043d\u0430 \u0430\u043b\u0443\u043c\u0438\u043d\u0438\u0435\u0432\u0430 \u0434\u043e\u0433\u0440\u0430\u043c\u0430 \u0441 \u0442\u0435\u0440\u043c\u043e\u043c\u043e\u0441\u0442 \u043e\u0442 \u043d\u0430\u0439-\u0432\u0438\u0441\u043e\u043a \u043a\u043b\u0430\u0441 \u0432 \u0434\u043e\u043f\u044a\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u044a\u043a\u043b\u043e \u0442\u0438\u043f \u201c4-\u0440\u0438 \u0441\u0435\u0437\u043e\u043d\u0430\u201d \u0438 \u0432\u0438\u0441\u043e\u043a\u043e\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d \u043e\u0431\u043a\u043e\u0432.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"2\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 of 3\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-18e23532 e-flex e-con-boxed e-con e-child\" data-id=\"18e23532\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0dd862d elementor-widget elementor-widget-heading\" data-id=\"0dd862d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u041e\u0442\u0434\u0438\u0445<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-28d4a0a elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"28d4a0a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>\u0417\u043e\u043d\u0438\u0442\u0435 \u0437\u0430 \u043e\u0442\u0434\u0438\u0445 \u0441\u0430 \u0441 2 \u0434\u0435\u0442\u0441\u043a\u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438, \u043f\u0435\u0439\u043a\u0438, \u0431\u043e\u0433\u0430\u0442\u043e \u043e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0430 \u0433\u0440\u0430\u0434\u0438\u043d\u0430, \u0432\u044a\u043d\u0448\u0435\u043d \u0444\u0438\u0442\u043d\u0435\u0441, \u0430\u043b\u0435\u0438 \u0438 \u0434\u0440. \u041e\u0431\u043e\u0441\u043e\u0431\u0435\u043d\u043e \u0435 \u043c\u044f\u0441\u0442\u043e \u0437\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0438 \u043b\u044e\u0431\u0438\u043c\u0446\u0438.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"3\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 of 3\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7b1fe109 e-flex e-con-boxed e-con e-child\" data-id=\"7b1fe109\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-57826ad elementor-widget elementor-widget-heading\" data-id=\"57826ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u0428\u0443\u043c\u043e\u0438\u0437\u043e\u043b\u0430\u0446\u0438\u044f<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-efb8eb0 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"efb8eb0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p class=\"carousel-text\">\u0414\u043e\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u043d\u0430 \u0432\u0438\u0441\u043e\u043a\u043e\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0430 \u0448\u0443\u043c\u043e\u0438\u0437\u043e\u043b\u0430\u0446\u0438\u044f \u043d\u0430 \u043f\u043e\u0434\u0430 \u043d\u0430 \u0432\u0441\u0435\u043a\u0438 \u0430\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442. \u041a\u0440\u0430\u0439 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438\u0442\u0435 \u0441 \u0442\u043e\u043a\u0447\u0435\u0442\u0430, \u0434\u0435\u0442\u0441\u043a\u0430 \u0438\u0433\u0440\u0430 \u0438 \u0432\u0441\u044f\u043a\u0430\u043a\u044a\u0432 \u0448\u0443\u043c \u043e\u0442 \u0441\u044a\u0441\u0435\u0434\u0438\u0442\u0435.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\" aria-label=\"\u041f\u0440\u0435\u0434\u0438\u0448\u043d\u0430\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-left\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\" aria-label=\"\u0421\u043b\u0435\u0434\u0432\u0430\u0449\u0430\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-right\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u041b\u0443\u043a\u0441\u043e\u0437\u043d\u0430 \u0416\u0438\u043b\u0438\u0449\u043d\u0430 \u0421\u0433\u0440\u0430\u0434\u0430 \u0432 &#8230;. \u201e\u041c\u0430\u0440\u0438\u0446\u0430 \u043f\u0430\u0440\u043a\u201c \u0435 \u0436\u0438\u043b\u0438\u0449\u0435\u043d \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043e\u0442 \u0437\u0430\u0442\u0432\u043e\u0440\u0435\u043d \u0442\u0438\u043f, \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d \u0432 \u0441\u0435\u0432\u0435\u0440\u043d\u0430\u0442\u0430 \u0447\u0430\u0441\u0442 \u043d\u0430 \u0433\u0440\u0430\u0434 \u041f\u043b\u043e\u0432\u0434\u0438\u0432. \u041d\u0430 \u043f\u0435\u0448\u0435\u0445\u043e\u0434\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0430 \u0412\u0430\u0448\u0435 \u0440\u0430\u0437\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0430 \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d\u0438:&#8211; \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0442 &#8211; \u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0438 \u043d\u0435\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0432\u0435\u0440\u0438\u0433\u0438 &#8211; \u0441\u043f\u043e\u0440\u0442\u043d\u0430 \u0437\u0430\u043b\u0430 &#8211; \u0435\u043b\u0438\u0442\u043d\u0438 \u0443\u0447\u0438\u043b\u0438\u0449\u0430 &#8211; \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442 &#8211; \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u0438 \u0441\u043f\u0438\u0440\u043a\u0438 \u043d\u0430 \u0433\u0440\u0430\u0434\u0441\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 12 \u0441\u0442\u0443\u0434\u0438\u0430, 36 \u0434\u0432\u0443\u0441\u0442\u0430\u0439\u043d\u0438 \u0438 103 \u0442\u0440\u0438\u0441\u0442\u0430\u0439\u043d\u0438. [&hellip;]<\/p>\n","protected":false},"featured_media":59312,"parent":0,"menu_order":0,"template":"elementor_header_footer","class_list":["post-32305","investment_property","type-investment_property","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430 - Building-Box<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430 - Building-Box\" \/>\n<meta property=\"og:description\" content=\"\u041b\u0443\u043a\u0441\u043e\u0437\u043d\u0430 \u0416\u0438\u043b\u0438\u0449\u043d\u0430 \u0421\u0433\u0440\u0430\u0434\u0430 \u0432 &#8230;. \u201e\u041c\u0430\u0440\u0438\u0446\u0430 \u043f\u0430\u0440\u043a\u201c \u0435 \u0436\u0438\u043b\u0438\u0449\u0435\u043d \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043e\u0442 \u0437\u0430\u0442\u0432\u043e\u0440\u0435\u043d \u0442\u0438\u043f, \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d \u0432 \u0441\u0435\u0432\u0435\u0440\u043d\u0430\u0442\u0430 \u0447\u0430\u0441\u0442 \u043d\u0430 \u0433\u0440\u0430\u0434 \u041f\u043b\u043e\u0432\u0434\u0438\u0432. \u041d\u0430 \u043f\u0435\u0448\u0435\u0445\u043e\u0434\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0430 \u0412\u0430\u0448\u0435 \u0440\u0430\u0437\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0430 \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d\u0438:&#8211; \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0442 &#8211; \u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0438 \u043d\u0435\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0432\u0435\u0440\u0438\u0433\u0438 &#8211; \u0441\u043f\u043e\u0440\u0442\u043d\u0430 \u0437\u0430\u043b\u0430 &#8211; \u0435\u043b\u0438\u0442\u043d\u0438 \u0443\u0447\u0438\u043b\u0438\u0449\u0430 &#8211; \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442 &#8211; \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u0438 \u0441\u043f\u0438\u0440\u043a\u0438 \u043d\u0430 \u0433\u0440\u0430\u0434\u0441\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 12 \u0441\u0442\u0443\u0434\u0438\u0430, 36 \u0434\u0432\u0443\u0441\u0442\u0430\u0439\u043d\u0438 \u0438 103 \u0442\u0440\u0438\u0441\u0442\u0430\u0439\u043d\u0438. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/\" \/>\n<meta property=\"og:site_name\" content=\"Building-Box\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-25T08:37:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/06\/canvas-map-59311-1750229540.png\" \/>\n\t<meta property=\"og:image:width\" content=\"857\" \/>\n\t<meta property=\"og:image:height\" content=\"715\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/\",\"url\":\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/\",\"name\":\"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430 - Building-Box\",\"isPartOf\":{\"@id\":\"https:\/\/buildingbox.isgcm.com\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/06\/canvas-map-59311-1750229540.png\",\"datePublished\":\"2025-03-31T07:00:38+00:00\",\"dateModified\":\"2025-06-25T08:37:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#primaryimage\",\"url\":\"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/06\/canvas-map-59311-1750229540.png\",\"contentUrl\":\"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/06\/canvas-map-59311-1750229540.png\",\"width\":857,\"height\":715},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/buildingbox.isgcm.com\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/buildingbox.isgcm.com\/en\/#website\",\"url\":\"https:\/\/buildingbox.isgcm.com\/en\/\",\"name\":\"Building-Box\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/buildingbox.isgcm.com\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430 - Building-Box","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430 - Building-Box","og_description":"\u041b\u0443\u043a\u0441\u043e\u0437\u043d\u0430 \u0416\u0438\u043b\u0438\u0449\u043d\u0430 \u0421\u0433\u0440\u0430\u0434\u0430 \u0432 &#8230;. \u201e\u041c\u0430\u0440\u0438\u0446\u0430 \u043f\u0430\u0440\u043a\u201c \u0435 \u0436\u0438\u043b\u0438\u0449\u0435\u043d \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043e\u0442 \u0437\u0430\u0442\u0432\u043e\u0440\u0435\u043d \u0442\u0438\u043f, \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d \u0432 \u0441\u0435\u0432\u0435\u0440\u043d\u0430\u0442\u0430 \u0447\u0430\u0441\u0442 \u043d\u0430 \u0433\u0440\u0430\u0434 \u041f\u043b\u043e\u0432\u0434\u0438\u0432. \u041d\u0430 \u043f\u0435\u0448\u0435\u0445\u043e\u0434\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0430 \u0412\u0430\u0448\u0435 \u0440\u0430\u0437\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0430 \u0441\u0438\u0442\u0443\u0438\u0440\u0430\u043d\u0438:&#8211; \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0442 &#8211; \u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0438 \u043d\u0435\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u0432\u0435\u0440\u0438\u0433\u0438 &#8211; \u0441\u043f\u043e\u0440\u0442\u043d\u0430 \u0437\u0430\u043b\u0430 &#8211; \u0435\u043b\u0438\u0442\u043d\u0438 \u0443\u0447\u0438\u043b\u0438\u0449\u0430 &#8211; \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442 &#8211; \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u0438 \u0441\u043f\u0438\u0440\u043a\u0438 \u043d\u0430 \u0433\u0440\u0430\u0434\u0441\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 12 \u0441\u0442\u0443\u0434\u0438\u0430, 36 \u0434\u0432\u0443\u0441\u0442\u0430\u0439\u043d\u0438 \u0438 103 \u0442\u0440\u0438\u0441\u0442\u0430\u0439\u043d\u0438. [&hellip;]","og_url":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/","og_site_name":"Building-Box","article_modified_time":"2025-06-25T08:37:40+00:00","og_image":[{"width":857,"height":715,"url":"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/06\/canvas-map-59311-1750229540.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/","url":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/","name":"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430 - Building-Box","isPartOf":{"@id":"https:\/\/buildingbox.isgcm.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#primaryimage"},"image":{"@id":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#primaryimage"},"thumbnailUrl":"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/06\/canvas-map-59311-1750229540.png","datePublished":"2025-03-31T07:00:38+00:00","dateModified":"2025-06-25T08:37:40+00:00","breadcrumb":{"@id":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#primaryimage","url":"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/06\/canvas-map-59311-1750229540.png","contentUrl":"https:\/\/buildingbox.isgcm.com\/wp-content\/uploads\/2025\/06\/canvas-map-59311-1750229540.png","width":857,"height":715},{"@type":"BreadcrumbList","@id":"https:\/\/buildingbox.isgcm.com\/en\/investors\/kompleks-uebsila\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/buildingbox.isgcm.com\/en\/"},{"@type":"ListItem","position":2,"name":"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0423\u0435\u0431\u0441\u0438\u043b\u0430"}]},{"@type":"WebSite","@id":"https:\/\/buildingbox.isgcm.com\/en\/#website","url":"https:\/\/buildingbox.isgcm.com\/en\/","name":"Building-Box","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/buildingbox.isgcm.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/investment_property\/32305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/investment_property"}],"about":[{"href":"https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/types\/investment_property"}],"version-history":[{"count":13,"href":"https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/investment_property\/32305\/revisions"}],"predecessor-version":[{"id":59374,"href":"https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/investment_property\/32305\/revisions\/59374"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/media\/59312"}],"wp:attachment":[{"href":"https:\/\/buildingbox.isgcm.com\/en\/wp-json\/wp\/v2\/media?parent=32305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}