{"id":5783,"date":"2026-01-19T11:40:46","date_gmt":"2026-01-19T11:40:46","guid":{"rendered":"https:\/\/123park.app\/?page_id=5783"},"modified":"2026-01-22T12:18:28","modified_gmt":"2026-01-22T12:18:28","slug":"blog","status":"publish","type":"page","link":"https:\/\/123park.app\/mk\/blog\/","title":{"rendered":"\u0411\u043b\u043e\u0433"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5783\" class=\"elementor elementor-5783\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c230568 e-flex e-con-boxed e-con e-parent\" data-id=\"c230568\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d763c24 e-con-full e-flex e-con e-parent\" data-id=\"d763c24\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a520208 elementor-widget elementor-widget-html\" data-id=\"a520208\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- WordPress Blog Layout - All Posts Grid - Embed this in Gutenberg or Elementor HTML Block -->\n<style>\n    @import url('https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;700&family=Roboto:wght@400;500;700&display=swap');\n\n    .wp-blog-all-container {\n        padding: 0 56px 86px;\n        max-width: 1440px;\n        margin: 0 auto;\n        font-family: 'Inter', sans-serif;\n    }\n\n    .wp-blog-all-grid {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        gap: 32px;\n    }\n\n    \/* Blog Post Card *\/\n    .wp-blog-all-post {\n        background: #EBEDF2;\n        border-radius: 8px;\n        padding: 32px 24px;\n        display: flex;\n        flex-direction: column;\n        gap: 24px;\n        position: relative;\n        overflow: hidden;\n        border: 1px solid #D0D5DD;\n    }\n\n    \/* Featured image in its own block at the top of the card (edge-to-edge via\n       negative margins cancelling the card padding); details below on the card. *\/\n    .wp-blog-all-post-image {\n        display: block;\n        width: calc(100% + 48px);\n        height: 180px;\n        background-size: cover;\n        background-position: center;\n        background-repeat: no-repeat;\n        background-color: #DDE2EA;\n        position: relative;\n        margin: -32px -24px 0;\n        border-radius: 8px 8px 0 0;\n    }\n\n    .wp-blog-all-post > .wp-blog-btn { margin-top: auto; }\n\n    .wp-blog-all-post.has-image::before {\n        content: '';\n        position: absolute;\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        background: rgba(0, 0, 0, 0.5);\n        border-radius: 8px;\n        z-index: 1;\n    }\n\n    .wp-blog-all-post.has-image .wp-blog-all-post-content,\n    .wp-blog-all-post.has-image .wp-blog-btn {\n        position: relative;\n        z-index: 2;\n    }\n\n    .wp-blog-all-post-content {\n        display: flex;\n        flex-direction: column;\n        justify-content: flex-start;\n        gap: 24px;\n    }\n\n    .wp-blog-all-post-inner {\n        display: flex;\n        flex-direction: column;\n        gap: 24px;\n    }\n\n    .wp-blog-all-post-header {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n    }\n\n    .wp-blog-all-post-meta {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        gap: 8px;\n    }\n\n    .wp-blog-all-post-meta span {\n        font-family: 'Roboto', sans-serif;\n        font-weight: 400;\n        font-size: 14px;\n        line-height: 1.7em;\n        letter-spacing: 5.71%;\n        color: #465E8C;\n    }\n\n    .wp-blog-all-post.has-image .wp-blog-all-post-meta span {\n        color: #FFFFFF;\n    }\n\n    .wp-blog-all-post-title {\n        font-family: 'Inter', sans-serif;\n        font-weight: 700;\n        font-size: 20px;\n        line-height: 1.4em;\n        color: #15305B;\n    }\n\n    .wp-blog-all-post.has-image .wp-blog-all-post-title {\n        color: #FFFFFF;\n    }\n\n    .wp-blog-all-post-description {\n        font-family: 'Inter', sans-serif;\n        font-weight: 400;\n        font-size: 16px;\n        line-height: 1.8em;\n        color: #2E4673;\n        display: -webkit-box;\n        -webkit-line-clamp: 3;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n    }\n\n    .wp-blog-all-post-title {\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n    }\n\n    .wp-blog-all-post.has-image .wp-blog-all-post-description {\n        color: #FFFFFF;\n    }\n\n    .wp-blog-btn {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 10px 15px 10px 15px;\n        height: 36px;\n        border-radius: 4px;\n        background: transparent;\n        border: none;\n        cursor: pointer;\n        width: fit-content;\n        text-decoration: none;\n        transition: opacity 0.3s ease, transform 0.3s ease;\n    }\n\n    .wp-blog-btn:hover {\n        opacity: 0.8;\n        transform: translateX(4px);\n    }\n\n    .wp-blog-btn:hover .wp-blog-btn-icon {\n        transform: translateX(2px);\n    }\n\n    .wp-blog-btn-text {\n        font-family: 'Roboto', sans-serif;\n        font-weight: 500;\n        font-size: 14px;\n        line-height: 1.17em;\n        letter-spacing: 8.93%;\n        color: #15305B;\n    }\n\n    .wp-blog-all-post.has-image .wp-blog-btn-text {\n        color: #FFFFFF;\n    }\n\n    .wp-blog-btn-icon {\n        width: 24px;\n        height: 24px;\n        transition: transform 0.3s ease;\n    }\n\n    .wp-blog-btn-icon path {\n        fill: #15305B;\n    }\n\n    .wp-blog-all-post.has-image .wp-blog-btn-icon path {\n        fill: #FFFFFF;\n    }\n\n    \/* Play Button Overlay for Videos *\/\n    .wp-blog-play-button {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        width: 80px;\n        height: 80px;\n        background: rgba(255, 255, 255, 0.9);\n        border-radius: 50%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        cursor: pointer;\n        z-index: 3;\n        transition: all 0.3s ease;\n        box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n    }\n\n    .wp-blog-play-button:hover {\n        background: rgba(255, 255, 255, 1);\n        transform: translate(-50%, -50%) scale(1.1);\n        box-shadow: 0 6px 30px rgba(0, 0, 0, 0.4);\n    }\n\n    .wp-blog-play-button svg {\n        width: 32px;\n        height: 32px;\n        margin-left: 4px;\n    }\n\n    .wp-blog-play-button path {\n        fill: #15305B;\n    }\n\n    \/* Video Modal *\/\n    .wp-blog-video-modal {\n        display: none;\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        background: rgba(0, 0, 0, 0.7);\n        z-index: 10000;\n        align-items: center;\n        justify-content: center;\n        opacity: 0;\n        transition: opacity 0.3s ease;\n    }\n\n    .wp-blog-video-modal.active {\n        display: flex;\n        opacity: 1;\n    }\n\n    .wp-blog-video-modal-close {\n        position: absolute;\n        top: 20px;\n        right: 20px;\n        width: 40px;\n        height: 40px;\n        background: rgba(255, 255, 255, 0.2);\n        border: none;\n        border-radius: 50%;\n        color: #FFFFFF;\n        font-size: 24px;\n        cursor: pointer;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        transition: all 0.3s ease;\n        z-index: 10001;\n    }\n\n    .wp-blog-video-modal-close:hover {\n        background: rgba(255, 255, 255, 0.3);\n        transform: rotate(90deg);\n    }\n\n    .wp-blog-video-modal-content {\n        position: relative;\n        width: 72%;\n        max-width: 900px;\n        aspect-ratio: 16 \/ 9;\n        background: #000000;\n    }\n\n    .wp-blog-video-modal-iframe {\n        width: 100%;\n        height: 100%;\n        border: none;\n    }\n\n    \/* Category Filter Buttons *\/\n    .wp-blog-category-filters {\n        display: flex;\n        gap: 16px;\n        margin-bottom: 48px;\n        flex-wrap: wrap;\n        justify-content: center;\n    }\n\n    .wp-blog-filter-btn {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        padding: 12px 24px;\n        border-radius: 8px;\n        background: #EBEDF2;\n        color: #15305B;\n        font-family: 'Inter', sans-serif;\n        font-size: 16px;\n        font-weight: 500;\n        text-decoration: none;\n        transition: all 0.3s ease;\n        border: 2px solid transparent;\n        cursor: pointer;\n    }\n\n    .wp-blog-filter-btn:hover {\n        background: #0f62fe;\n        color: #FFFFFF;\n        transform: translateY(-2px);\n        box-shadow: 0 4px 12px rgba(15, 98, 254, 0.3);\n    }\n\n    .wp-blog-filter-btn.active {\n        background: #0f62fe;\n        color: #FFFFFF;\n        border-color: #0f62fe;\n    }\n\n    \/* Blog Header Section Styling *\/\n    .wp-blog-header {\n        text-align: center;\n        margin-bottom: 48px;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 24px;\n    }\n\n    .wp-blog-header img {\n        display: block;\n    }\n\n    .wp-blog-header-title {\n        font-family: \"Inter\", lato;\n        font-size: 48px;\n        font-weight: 400;\n        line-height: 48px;\n        letter-spacing: 0px;\n        word-spacing: 0px;\n        color: #101828;\n        text-align: center;\n        margin: 0;\n    }\n\n    \/* Loading State *\/\n    .wp-blog-loading {\n        text-align: center;\n        padding: 40px;\n        color: #15305B;\n    }\n\n    \/* Responsive *\/\n    @media (max-width: 1200px) {\n        .wp-blog-all-grid {\n            grid-template-columns: repeat(2, 1fr);\n        }\n    }\n\n    @media (max-width: 768px) {\n        .wp-blog-all-container {\n            padding: 0 24px 40px;\n        }\n\n        .wp-blog-category-filters {\n            margin-bottom: 32px;\n        }\n\n        .wp-blog-filter-btn {\n            padding: 10px 20px;\n            font-size: 14px;\n        }\n\n        .wp-blog-all-grid {\n            grid-template-columns: 1fr;\n            gap: 24px;\n        }\n\n        .wp-blog-all-post {\n            padding: 24px;\n        }\n    }\n<\/style>\n\n<div class=\"wp-blog-all-container\" id=\"wpBlogAllContainer\">\n    <!-- Blog Header Section -->\n    <div class=\"wp-blog-header\">\n        <img decoding=\"async\" width=\"271\" height=\"36\" src=\"\" id=\"wpBlogHeaderImage\" alt=\"\">\n        <h2 class=\"wp-blog-header-title\"><strong>From Our Blog.<\/strong><br>Latest insights, trends, and best practices.<\/h2>\n    <\/div>\n\n    <div class=\"wp-blog-category-filters\">\n        <a href=\"\/blog\" class=\"wp-blog-filter-btn wp-blog-filter-btn-all\">View All<\/a>\n        <a href=\"\/category\/cities\" class=\"wp-blog-filter-btn\">Cities<\/a>\n        <a href=\"\/category\/private\" class=\"wp-blog-filter-btn\">Private<\/a>\n    <\/div>\n    <div id=\"wpBlogPostsContent\">\n        <div class=\"wp-blog-loading\">Loading posts...<\/div>\n    <\/div>\n<\/div>\n\n<script>\n    (function () {\n        \/\/ ============================================\n        \/\/ CONFIGURATION - Category Exclusion\n        \/\/ ============================================\n        \/\/ Set to category slug to EXCLUDE posts from that category\n        \/\/ Examples:\n        \/\/   const excludeCategorySlug = 'review';  \/\/ Exclude posts from \"review\" category\n        \/\/   const excludeCategorySlug = 'private'; \/\/ Exclude posts from \"private\" category\n        \/\/   const excludeCategorySlug = null;      \/\/ Show all posts (no exclusion)\n        const excludeCategorySlug = 'reviews'; \/\/ Change this to exclude a different category\n        \/\/ ============================================\n\n        \/\/ Get WordPress site URL - automatically detects current site\n        const wpSiteUrl = window.location.origin;\n\n        \/\/ Keep the current TranslatePress language (\/mk, \/sl, \/sq) in the filter links so\n        \/\/ \"View All\" \/ category filters don't jump back to English. Read the language from\n        \/\/ <html lang> (TranslatePress always sets it) so it works even when the current URL\n        \/\/ has no \/xx\/ prefix; fall back to the URL path just in case.\n        const trpPrefix = (function () {\n            var hl = (document.documentElement.getAttribute('lang') || '').toLowerCase();\n            if (hl.indexOf('mk') === 0) return '\/mk';\n            if (hl.indexOf('sq') === 0) return '\/sq';\n            if (hl.indexOf('sl') === 0) return '\/sl';\n            var seg = window.location.pathname.split('\/')[1];\n            return (['mk', 'sl', 'sq'].indexOf(seg) !== -1) ? '\/' + seg : '';\n        })();\n\n        \/\/ Prefix a same-origin post permalink with the current language so \"Read more\"\n        \/\/ opens the translated (\/mk, \/sl, \/sq) version instead of the English default.\n        function localizeLink(url) {\n            if (!url || !trpPrefix || url.indexOf(wpSiteUrl) !== 0) return url;\n            var rest = url.slice(wpSiteUrl.length);\n            return (rest.indexOf(trpPrefix + '\/') === 0) ? url : wpSiteUrl + trpPrefix + rest;\n        }\n        if (trpPrefix) {\n            document.querySelectorAll('.wp-blog-filter-btn').forEach(function (b) {\n                var href = b.getAttribute('href') || '';\n                if (href.charAt(0) === '\/' && href.indexOf(trpPrefix + '\/') !== 0) {\n                    b.setAttribute('href', trpPrefix + href);\n                }\n            });\n        }\n\n        \/\/ Set header image source\n        const headerImage = document.getElementById('wpBlogHeaderImage');\n        if (headerImage) {\n            headerImage.src = wpSiteUrl + '\/wp-content\/uploads\/one-platform.svg';\n        }\n\n        \/\/ Get category ID from slug\n        async function getCategoryIdBySlug(slug) {\n            try {\n                const response = await fetch(wpSiteUrl + '\/wp-json\/wp\/v2\/categories?slug=' + encodeURIComponent(slug));\n                if (!response.ok) {\n                    return null;\n                }\n                const categories = await response.json();\n                if (categories && categories.length > 0) {\n                    return categories[0].id;\n                }\n                return null;\n            } catch (error) {\n                console.warn('Could not fetch category:', error);\n                return null;\n            }\n        }\n\n        \/\/ Fetch all WordPress posts\n        async function fetchBlogPosts() {\n            try {\n                let apiUrl = wpSiteUrl + '\/wp-json\/wp\/v2\/posts?per_page=100&_embed';\n\n                \/\/ If exclude category slug is set, get category ID and exclude posts\n                if (excludeCategorySlug && excludeCategorySlug.trim() !== '') {\n                    const categoryId = await getCategoryIdBySlug(excludeCategorySlug.trim());\n                    if (categoryId) {\n                        apiUrl += '&categories_exclude=' + categoryId;\n                    } else {\n                        console.warn('Category slug \"' + excludeCategorySlug + '\" not found. Showing all posts.');\n                    }\n                }\n\n                const response = await fetch(apiUrl);\n                if (!response.ok) {\n                    throw new Error('Failed to fetch posts');\n                }\n                const posts = await response.json();\n                renderBlogPosts(posts);\n            } catch (error) {\n                console.error('Error fetching posts:', error);\n                const postsContent = document.getElementById('wpBlogPostsContent');\n                if (postsContent) {\n                    postsContent.innerHTML = '<div class=\"wp-blog-loading\">Error loading posts. Please check your WordPress REST API is enabled.<\/div>';\n                }\n            }\n        }\n\n        function formatDate(dateString) {\n            const date = new Date(dateString);\n            const options = { year: 'numeric', month: 'long', day: 'numeric' };\n            return date.toLocaleDateString('en-US', options);\n        }\n\n        function getExcerpt(text, maxLength = 150) {\n            if (!text) return '';\n            const stripped = text.replace(\/<[^>]*>\/g, ''); \/\/ Remove HTML tags\n            if (stripped.length <= maxLength) return stripped;\n            return stripped.substring(0, maxLength).trim() + '...';\n        }\n\n        function getFeaturedImage(post) {\n            if (post._embedded && post._embedded['wp:featuredmedia'] && post._embedded['wp:featuredmedia'][0]) {\n                return post._embedded['wp:featuredmedia'][0].source_url;\n            }\n            return null;\n        }\n\n        function hasFeaturedImage(post) {\n            return post._embedded && post._embedded['wp:featuredmedia'] && post._embedded['wp:featuredmedia'][0];\n        }\n\n        \/\/ Check for YouTube video ID in content\n        function extractYouTubeId(content) {\n            if (!content) return null;\n            const pattern = \/\\\/\\\/(www\\.)?(youtu|youtube|youtube-nocookie)\\.(com|be)\\\/(?!.*user)(watch|embed)?\\\/?(\\?v=)?([a-zA-Z0-9\\-\\_]+)\/;\n            const match = content.match(pattern);\n            if (match && match[6]) {\n                return match[6];\n            }\n            return null;\n        }\n\n        \/\/ Check for Vimeo video ID in content\n        function extractVimeoId(content) {\n            if (!content) return null;\n            const pattern = \/\\\/\\\/(.+\\.)?(vimeo\\.com)\\\/(\\d+)\/;\n            const match = content.match(pattern);\n            if (match && match[3]) {\n                return match[3];\n            }\n            return null;\n        }\n\n        \/\/ Get video thumbnail URL\n        function getVideoThumbnail(post) {\n            const content = (post.content?.rendered || '') + ' ' + (post.excerpt?.rendered || '');\n\n            \/\/ Check for YouTube\n            const youtubeId = extractYouTubeId(content);\n            if (youtubeId) {\n                return 'https:\/\/img.youtube.com\/vi\/' + youtubeId + '\/maxresdefault.jpg';\n            }\n\n            \/\/ Check for Vimeo\n            const vimeoId = extractVimeoId(content);\n            if (vimeoId) {\n                return null;\n            }\n\n            return null;\n        }\n\n        \/\/ Get video embed URL for modal playback\n        function getVideoEmbedUrl(post) {\n            const content = (post.content?.rendered || '') + ' ' + (post.excerpt?.rendered || '');\n\n            \/\/ Check for YouTube\n            const youtubeId = extractYouTubeId(content);\n            if (youtubeId) {\n                return 'https:\/\/www.youtube.com\/embed\/' + youtubeId + '?autoplay=1&rel=0';\n            }\n\n            \/\/ Check for Vimeo\n            const vimeoId = extractVimeoId(content);\n            if (vimeoId) {\n                return 'https:\/\/player.vimeo.com\/video\/' + vimeoId + '?autoplay=1';\n            }\n\n            return null;\n        }\n\n        \/\/ Check if post has video\n        function hasVideo(post) {\n            const content = (post.content?.rendered || '') + ' ' + (post.excerpt?.rendered || '');\n            return extractYouTubeId(content) !== null || extractVimeoId(content) !== null;\n        }\n\n        function renderBlogPosts(posts) {\n            const postsContent = document.getElementById('wpBlogPostsContent');\n\n            if (!posts || posts.length === 0) {\n                postsContent.innerHTML = '<div class=\"wp-blog-loading\">No posts found.<\/div>';\n                return;\n            }\n\n            let html = '<div class=\"wp-blog-all-grid\">';\n\n            posts.forEach(post => {\n                const postHasVideo = hasVideo(post);\n                const hasImage = hasFeaturedImage(post);\n                const imageUrl = getFeaturedImage(post);\n                let backgroundUrl = imageUrl;\n                if (postHasVideo && !hasImage) {\n                    backgroundUrl = getVideoThumbnail(post);\n                }\n                html += '<div class=\"wp-blog-all-post\">';\n\n                if (backgroundUrl) {\n                    html += '<div class=\"wp-blog-all-post-image\" style=\"background-image: url(' + backgroundUrl + ');\">';\n                    if (postHasVideo) {\n                        const videoEmbedUrl = getVideoEmbedUrl(post);\n                        html += '<div class=\"wp-blog-play-button\" data-video-url=\"' + (videoEmbedUrl || '') + '\">';\n                        html += '<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8 5v14l11-7z\"\/><\/svg>';\n                        html += '<\/div>';\n                    }\n                    html += '<\/div>';\n                }\n\n                html += '<div class=\"wp-blog-all-post-content\">';\n                html += '<div class=\"wp-blog-all-post-inner\">';\n                html += '<div class=\"wp-blog-all-post-header\">';\n                html += '<div class=\"wp-blog-all-post-meta\"><span>English<\/span><span>' + formatDate(post.date) + '<\/span><\/div>';\n                html += '<div class=\"wp-blog-all-post-title\">' + post.title.rendered + '<\/div>';\n                html += '<\/div>';\n                html += '<div class=\"wp-blog-all-post-description\">' + getExcerpt(post.excerpt.rendered || post.content.rendered, 95) + '<\/div>';\n                html += '<\/div>';\n                html += '<a href=\"' + localizeLink(post.link) + '\" class=\"wp-blog-btn\">';\n                html += '<span class=\"wp-blog-btn-text\">Read more<\/span>';\n                html += '<svg class=\"wp-blog-btn-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M17.5 16.5L16.075 15.1L18.175 13H3V11H18.175L16.1 8.9L17.525 7.5L22 12L17.5 16.5Z\"\/><\/svg>';\n                html += '<\/a>';\n                html += '<\/div>';\n                html += '<\/div>';\n            });\n\n            html += '<\/div>';\n\n            postsContent.innerHTML = html;\n\n            \/\/ Add event listeners to play buttons\n            setupVideoModal();\n        }\n\n        \/\/ Setup video modal functionality\n        function setupVideoModal() {\n            \/\/ Create modal HTML if it doesn't exist\n            if (!document.getElementById('wpBlogVideoModal')) {\n                const modal = document.createElement('div');\n                modal.id = 'wpBlogVideoModal';\n                modal.className = 'wp-blog-video-modal';\n                modal.innerHTML = '<button class=\"wp-blog-video-modal-close\" aria-label=\"Close video\">\u00d7<\/button><div class=\"wp-blog-video-modal-content\"><iframe class=\"wp-blog-video-modal-iframe\" allow=\"autoplay; fullscreen\" allowfullscreen><\/iframe><\/div>';\n                document.body.appendChild(modal);\n            }\n\n            const modal = document.getElementById('wpBlogVideoModal');\n            const iframe = modal.querySelector('.wp-blog-video-modal-iframe');\n            const closeBtn = modal.querySelector('.wp-blog-video-modal-close');\n\n            \/\/ Add click handlers to all play buttons\n            const playButtons = document.querySelectorAll('.wp-blog-play-button');\n            playButtons.forEach(button => {\n                button.addEventListener('click', function (e) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    const videoUrl = this.getAttribute('data-video-url');\n                    if (videoUrl) {\n                        iframe.src = videoUrl;\n                        modal.classList.add('active');\n                        document.body.style.overflow = 'hidden'; \/\/ Prevent background scrolling\n                    }\n                });\n            });\n\n            \/\/ Close modal handlers\n            function closeModal() {\n                modal.classList.remove('active');\n                iframe.src = ''; \/\/ Stop video playback\n                document.body.style.overflow = ''; \/\/ Restore scrolling\n            }\n\n            closeBtn.addEventListener('click', closeModal);\n\n            \/\/ Close on background click\n            modal.addEventListener('click', function (e) {\n                if (e.target === modal) {\n                    closeModal();\n                }\n            });\n\n            \/\/ Close on Escape key\n            document.addEventListener('keydown', function (e) {\n                if (e.key === 'Escape' && modal.classList.contains('active')) {\n                    closeModal();\n                }\n            });\n        }\n\n        \/\/ Highlight active filter button based on current URL\n        function highlightActiveFilter() {\n            const currentPath = window.location.pathname;\n            const filterButtons = document.querySelectorAll('.wp-blog-filter-btn');\n\n            filterButtons.forEach(button => {\n                const buttonPath = new URL(button.href).pathname;\n                \n                \/\/ Check for \"View All\" button (matches \/blog or root)\n                if (button.classList.contains('wp-blog-filter-btn-all')) {\n                    var logicalPath = (trpPrefix && currentPath.indexOf(trpPrefix) === 0) ? (currentPath.slice(trpPrefix.length) || '\/') : currentPath;\n                    if (logicalPath === '\/blog' || logicalPath === '\/blog\/' || logicalPath === '\/' || logicalPath === '') {\n                        button.classList.add('active');\n                    } else {\n                        button.classList.remove('active');\n                    }\n                } \n                \/\/ Check for category buttons\n                else if (currentPath === buttonPath || currentPath.startsWith(buttonPath + '\/')) {\n                    button.classList.add('active');\n                } else {\n                    button.classList.remove('active');\n                }\n            });\n        }\n\n        \/\/ Initialize when DOM is ready\n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', function () {\n                fetchBlogPosts();\n                highlightActiveFilter();\n            });\n        } else {\n            fetchBlogPosts();\n            highlightActiveFilter();\n        }\n    })();\n<\/script>\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>From Our Blog.Latest insights, trends, and best practices. View All Cities Private Loading posts&#8230;<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-5783","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Blog - 123 Park Suite<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/123park.app\/mk\/blog\/\" \/>\n<meta property=\"og:locale\" content=\"mk_MK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blog - 123 Park Suite\" \/>\n<meta property=\"og:description\" content=\"From Our Blog.Latest insights, trends, and best practices. View All Cities Private Loading posts&#8230;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/123park.app\/mk\/blog\/\" \/>\n<meta property=\"og:site_name\" content=\"123 Park Suite\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-22T12:18:28+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/123park.app\\\/blog\\\/\",\"url\":\"https:\\\/\\\/123park.app\\\/blog\\\/\",\"name\":\"Blog - 123 Park Suite\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/123park.app\\\/mk\\\/#website\"},\"datePublished\":\"2026-01-19T11:40:46+00:00\",\"dateModified\":\"2026-01-22T12:18:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/123park.app\\\/blog\\\/#breadcrumb\"},\"inLanguage\":\"mk-MK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/123park.app\\\/blog\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/123park.app\\\/blog\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/123park.app\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/123park.app\\\/mk\\\/#website\",\"url\":\"https:\\\/\\\/123park.app\\\/mk\\\/\",\"name\":\"123 Park Suite\",\"description\":\"Smart Parking Suite for Cities and Private Operators\",\"publisher\":{\"@id\":\"https:\\\/\\\/123park.app\\\/mk\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/123park.app\\\/mk\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"mk-MK\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/123park.app\\\/mk\\\/#organization\",\"name\":\"123 Park Suite\",\"url\":\"https:\\\/\\\/123park.app\\\/mk\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"mk-MK\",\"@id\":\"https:\\\/\\\/123park.app\\\/mk\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/123park.app\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/my_image_1765185943.png\",\"contentUrl\":\"https:\\\/\\\/123park.app\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/my_image_1765185943.png\",\"width\":194,\"height\":61,\"caption\":\"123 Park Suite\"},\"image\":{\"@id\":\"https:\\\/\\\/123park.app\\\/mk\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u0411\u043b\u043e\u0433 - 123 \u041f\u0430\u0440\u043a \u0421\u0443\u0438\u0442","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/123park.app\/mk\/blog\/","og_locale":"mk_MK","og_type":"article","og_title":"Blog - 123 Park Suite","og_description":"From Our Blog.Latest insights, trends, and best practices. View All Cities Private Loading posts&#8230;","og_url":"https:\/\/123park.app\/mk\/blog\/","og_site_name":"123 Park Suite","article_modified_time":"2026-01-22T12:18:28+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/123park.app\/blog\/","url":"https:\/\/123park.app\/blog\/","name":"\u0411\u043b\u043e\u0433 - 123 \u041f\u0430\u0440\u043a \u0421\u0443\u0438\u0442","isPartOf":{"@id":"https:\/\/123park.app\/mk\/#website"},"datePublished":"2026-01-19T11:40:46+00:00","dateModified":"2026-01-22T12:18:28+00:00","breadcrumb":{"@id":"https:\/\/123park.app\/blog\/#breadcrumb"},"inLanguage":"mk-MK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/123park.app\/blog\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/123park.app\/blog\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/123park.app\/"},{"@type":"ListItem","position":2,"name":"Blog"}]},{"@type":"WebSite","@id":"https:\/\/123park.app\/mk\/#website","url":"https:\/\/123park.app\/mk\/","name":"123 Park Suite","description":"\u041f\u0430\u043c\u0435\u0442\u043d\u0430 \u043f\u0430\u0440\u043a\u0438\u043d\u0433 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0437\u0430 \u0433\u0440\u0430\u0434\u043e\u0432\u0438 \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0438","publisher":{"@id":"https:\/\/123park.app\/mk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/123park.app\/mk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"mk-MK"},{"@type":"Organization","@id":"https:\/\/123park.app\/mk\/#organization","name":"123 Park Suite","url":"https:\/\/123park.app\/mk\/","logo":{"@type":"ImageObject","inLanguage":"mk-MK","@id":"https:\/\/123park.app\/mk\/#\/schema\/logo\/image\/","url":"https:\/\/123park.app\/wp-content\/uploads\/2025\/12\/my_image_1765185943.png","contentUrl":"https:\/\/123park.app\/wp-content\/uploads\/2025\/12\/my_image_1765185943.png","width":194,"height":61,"caption":"123 Park Suite"},"image":{"@id":"https:\/\/123park.app\/mk\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/123park.app\/mk\/wp-json\/wp\/v2\/pages\/5783","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/123park.app\/mk\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/123park.app\/mk\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/123park.app\/mk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/123park.app\/mk\/wp-json\/wp\/v2\/comments?post=5783"}],"version-history":[{"count":0,"href":"https:\/\/123park.app\/mk\/wp-json\/wp\/v2\/pages\/5783\/revisions"}],"wp:attachment":[{"href":"https:\/\/123park.app\/mk\/wp-json\/wp\/v2\/media?parent=5783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}