{"id":536,"date":"2026-04-24T13:32:36","date_gmt":"2026-04-24T11:32:36","guid":{"rendered":"http:\/\/192.168.2.11\/?page_id=536"},"modified":"2026-05-12T13:52:43","modified_gmt":"2026-05-12T11:52:43","slug":"budzet","status":"publish","type":"page","link":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/budzet\/","title":{"rendered":"Bud\u017cet"},"content":{"rendered":"\n<h1 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-f79cf8c8fab477bd85a471249270b597\" style=\"color:#14357a\">DOCHODY<\/h1>\n\n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        \n            <div class=\"stats-grid stats-grid-1\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Dochody Og\u00f3\u0142em wykonane w 2025 r.<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"190904878.32\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        \n            <div class=\"stats-grid stats-grid-3\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Dochody na mieszka\u0144ca<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"2551\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Dochody bierz\u0105ce na mieszka\u0144ca<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"2324\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Dochody maj\u0105tkowe na mieszka\u0144ca<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"227\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n    <section class=\"pie-chart-section\" id=\"pie-chart-6a062f85814d4\">\n        <div class=\"pie-chart-container\">\n                        <div class=\"section-header\">\n                                    <h2>Struktura dochod\u00f3w<\/h2>\n                                            <\/div>\n                        \n            <div class=\"pie-chart-content\">\n                <div class=\"pie-chart-wrapper\">\n                    <svg class=\"pie-chart-svg\" viewBox=\"0 0 400 400\" width=\"400\" height=\"400\">\n                        <g transform=\"translate(200, 200)\">\n                            <path class=\"pie-segment\" data-index=\"0\" data-name=\"Dochody bie\u017c\u0105ce\" data-value=\"173910168.99\" data-percentage=\"91.1\" data-offset-x=\"3.31\" data-offset-y=\"11.53\" transform=\"translate(0, 0)\" d=\"M 0 0 L 1.1021821192326E-14 -180 A 180 180 0 1 1 -95.5129794186 -152.56890496619 Z\" fill=\"#078236\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"1\" data-name=\"Dochody maj\u0105tkowe\" data-value=\"16994709.33\" data-percentage=\"8.9\" data-offset-x=\"-3.31\" data-offset-y=\"-11.53\" transform=\"translate(0, 0)\" d=\"M 0 0 L -95.5129794186 -152.56890496619 A 180 180 0 0 1 -3.3065463576979E-14 -180 Z\" fill=\"#ec6a8a\" stroke=\"#fff\" stroke-width=\"2\" \/>                        <\/g>\n                    <\/svg>\n                <\/div>\n                \n                <div class=\"pie-legend\">\n                                            <div class=\"legend-item\" data-index=\"0\">\n                            <span class=\"legend-color\" style=\"background-color: #078236;\"><\/span>\n                            <span class=\"legend-label\">Dochody bie\u017c\u0105ce<\/span>\n                            <span class=\"legend-value\">173 910 168,99 (91,1%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"1\">\n                            <span class=\"legend-color\" style=\"background-color: #ec6a8a;\"><\/span>\n                            <span class=\"legend-label\">Dochody maj\u0105tkowe<\/span>\n                            <span class=\"legend-value\">16 994 709,33 (8,9%)<\/span>\n                        <\/div>\n                                    <\/div>\n            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    .pie-chart-section {\n        padding: 80px 20px;\n        background: #f5f7fa;\n    }\n    \n    .pie-chart-container {\n        max-width: 1200px;\n        margin: 0 auto;\n    }\n    \n    .pie-chart-section .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .pie-chart-section .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .pie-chart-section .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n        max-width: 800px;\n        margin: 0 auto;\n    }\n    \n    .pie-chart-content {\n        display: grid;\n        grid-template-columns: 450px 1fr;\n        gap: 60px;\n        align-items: start;\n    }\n    \n    .pie-chart-wrapper {\n        position: relative;\n        background: white;\n        border-radius: 12px;\n        padding: 30px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n    }\n    \n    .pie-chart-svg {\n        display: block;\n        margin: 0 auto;\n    }\n    \n    .pie-segment {\n        cursor: pointer;\n        \/* CSS transition tylko na stroke i filter - transform jest animowany przez JS\n           bezpo\u015brednio przez setAttribute na atrybucie SVG (nie CSS) *\/\n        transition: stroke 0.2s ease, stroke-width 0.2s ease, filter 0.2s ease;\n    }\n    \n    .pie-segment:hover,\n    .pie-segment.active {\n        filter: brightness(1.1);\n    }\n    \n    .pie-segment.active {\n        stroke: #333;\n        stroke-width: 3;\n    }\n    \n    .pie-legend {\n        background: white;\n        border-radius: 12px;\n        padding: 30px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        max-height: 600px;\n        overflow-y: auto;\n    }\n    \n    .legend-item {\n        display: grid;\n        grid-template-columns: 20px 1fr auto;\n        gap: 15px;\n        align-items: center;\n        padding: 12px;\n        border-radius: 6px;\n        transition: background 0.2s ease;\n        cursor: pointer;\n    }\n    \n    .legend-item:hover {\n        background: #f5f7fa;\n    }\n    \n    .legend-item.active {\n        background: #e8f4f8;\n        border-left: 4px solid #1e3c72;\n        padding-left: 8px;\n    }\n    \n    .legend-color {\n        width: 20px;\n        height: 20px;\n        border-radius: 50%;\n        display: block;\n    }\n    \n    .legend-label {\n        font-weight: 500;\n        color: #333;\n    }\n    \n    .legend-value {\n        font-weight: 600;\n        color: #2a5298;\n        white-space: nowrap;\n    }\n    \n    @media (max-width: 968px) {\n        .pie-chart-content {\n            grid-template-columns: 1fr;\n            gap: 40px;\n        }\n        \n        .pie-chart-wrapper {\n            max-width: 450px;\n            margin: 0 auto;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .pie-chart-wrapper {\n            padding: 20px;\n        }\n        \n        .pie-chart-svg {\n            width: 100%;\n            height: auto;\n        }\n        \n        .pie-legend {\n            padding: 20px;\n        }\n        \n        .legend-item {\n            grid-template-columns: 16px 1fr;\n            gap: 10px;\n        }\n        \n        .legend-value {\n            grid-column: 2;\n            font-size: 0.9rem;\n        }\n    }\n    <\/style>\n    \n    <script>\n    (function() {\n        try {\n            \/\/ Znajd\u017a wszystkie sekcje wykres\u00f3w ko\u0142owych na stronie (nie polegamy na ID)\n            const allPieSections = document.querySelectorAll('.pie-chart-section');\n            \n            allPieSections.forEach(function(chartSection) {\n                \/\/ Sprawd\u017a czy ju\u017c zainicjowano (zapobiega podw\u00f3jnemu attachowaniu)\n                if (chartSection.dataset.pieInitialized === 'true') return;\n                chartSection.dataset.pieInitialized = 'true';\n                \n                const segments = chartSection.querySelectorAll('.pie-segment');\n                const legendItems = chartSection.querySelectorAll('.legend-item');\n                \n                if (segments.length === 0) return;\n                \n                \/\/ Mapa pozycji (klucz = element, warto\u015b\u0107 = {x, y})\n                const positions = new Map();\n                const animFrames = new Map();\n                \n                segments.forEach(function(s) {\n                    positions.set(s, { x: 0, y: 0 });\n                });\n                \n                function animateTo(element, targetX, targetY, duration) {\n                    \/\/ Pobierz AKTUALN\u0104 pozycj\u0119 - parsuj atrybut transform (nie z mapy!)\n                    \/\/ Mapa mo\u017ce mie\u0107 nieaktualne dane je\u015bli poprzednia animacja zosta\u0142a przerwana\n                    let startX = 0;\n                    let startY = 0;\n                    const currentTransform = element.getAttribute('transform');\n                    if (currentTransform) {\n                        const match = currentTransform.match(\/translate\\(([-\\d.]+)[\\s,]+([-\\d.]+)\\)\/);\n                        if (match) {\n                            startX = parseFloat(match[1]);\n                            startY = parseFloat(match[2]);\n                        }\n                    }\n                    \n                    \/\/ Anuluj poprzedni\u0105 animacj\u0119\n                    if (animFrames.has(element)) {\n                        cancelAnimationFrame(animFrames.get(element));\n                        animFrames.delete(element);\n                    }\n                    \n                    \/\/ Sprawdz czy juz jestesmy na miejscu\n                    const dx = Math.abs(startX - targetX);\n                    const dy = Math.abs(startY - targetY);\n                    if (dx < 0.1) {\n                        if (dy < 0.1) {\n                            \/\/ Ju\u017c na miejscu - zapisz ko\u0144cow\u0105 pozycj\u0119\n                            positions.set(element, { x: targetX, y: targetY });\n                            return;\n                        }\n                    }\n                    \n                    const startTime = performance.now();\n                    \n                    function easeOutBack(t) {\n                        const c1 = 1.70158;\n                        const c3 = c1 + 1;\n                        return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n                    }\n                    \n                    function step(now) {\n                        const progress = Math.min((now - startTime) \/ duration, 1);\n                        const eased = easeOutBack(progress);\n                        const x = startX + (targetX - startX) * eased;\n                        const y = startY + (targetY - startY) * eased;\n                        \n                        element.setAttribute('transform', 'translate(' + x.toFixed(2) + ' ' + y.toFixed(2) + ')');\n                        \/\/ Aktualizuj map\u0119 z LIVE pozycj\u0105 (nie tylko ko\u0144cow\u0105) - aby kolejne wywo\u0142anie mia\u0142o aktualne dane\n                        positions.set(element, { x: x, y: y });\n                        \n                        if (progress < 1) {\n                            animFrames.set(element, requestAnimationFrame(step));\n                        } else {\n                            \/\/ Animacja zako\u0144czona - upewnij si\u0119 \u017ce jeste\u015bmy dok\u0142adnie na targetX\/Y\n                            positions.set(element, { x: targetX, y: targetY });\n                            element.setAttribute('transform', 'translate(' + targetX.toFixed(2) + ' ' + targetY.toFixed(2) + ')');\n                            animFrames.delete(element);\n                        }\n                    }\n                    \n                    animFrames.set(element, requestAnimationFrame(step));\n                }\n                \n                function activateSegment(segment) {\n                    const offsetX = parseFloat(segment.getAttribute('data-offset-x')) || 0;\n                    const offsetY = parseFloat(segment.getAttribute('data-offset-y')) || 0;\n                    segment.classList.add('active');\n                    animateTo(segment, offsetX, offsetY, 350);\n                }\n                \n                function deactivateAll() {\n                    segments.forEach(function(s) {\n                        s.classList.remove('active');\n                        animateTo(s, 0, 0, 300);\n                    });\n                    legendItems.forEach(function(l) {\n                        l.classList.remove('active');\n                    });\n                }\n                \n                \/\/ Pomocnicza funkcja: przewija kontener legendy aby aktywna pozycja by\u0142a widoczna\n                \/\/ (NIE u\u017cywamy scrollIntoView bo przewija ca\u0142\u0105 stron\u0119 - tylko wewn\u0119trzny kontener)\n                function scrollLegendToItem(legendItem) {\n                    const legendContainer = chartSection.querySelector('.pie-legend');\n                    if (!legendContainer) return;\n                    if (!legendItem) return;\n                    \n                    \/\/ Sprawdz czy element jest poza widoczn\u0105 cz\u0119\u015bci\u0105 kontenera\n                    const containerRect = legendContainer.getBoundingClientRect();\n                    const itemRect = legendItem.getBoundingClientRect();\n                    \n                    \/\/ Je\u015bli element jest powy\u017cej widocznej cz\u0119\u015bci\n                    if (itemRect.top < containerRect.top) {\n                        const offset = itemRect.top - containerRect.top;\n                        legendContainer.scrollBy({ top: offset - 10, behavior: 'smooth' });\n                    }\n                    \/\/ Je\u015bli element jest poni\u017cej widocznej cz\u0119\u015bci\n                    else if (itemRect.bottom > containerRect.bottom) {\n                        const offset = itemRect.bottom - containerRect.bottom;\n                        legendContainer.scrollBy({ top: offset + 10, behavior: 'smooth' });\n                    }\n                }\n                \n                segments.forEach(function(segment) {\n                    segment.addEventListener('mouseenter', function() {\n                        const idx = segment.getAttribute('data-index');\n                        \n                        segments.forEach(function(s) {\n                            if (s !== segment) {\n                                s.classList.remove('active');\n                                animateTo(s, 0, 0, 300);\n                            }\n                        });\n                        legendItems.forEach(function(l) {\n                            l.classList.remove('active');\n                        });\n                        \n                        activateSegment(segment);\n                        \n                        const legendItem = chartSection.querySelector('.legend-item[data-index=\"' + idx + '\"]');\n                        if (legendItem) {\n                            legendItem.classList.add('active');\n                            \/\/ Auto-scroll legenda do aktywnej pozycji\n                            scrollLegendToItem(legendItem);\n                        }\n                    });\n                    \n                    segment.addEventListener('mouseleave', deactivateAll);\n                });\n                \n                legendItems.forEach(function(item) {\n                    item.addEventListener('mouseenter', function() {\n                        const idx = item.getAttribute('data-index');\n                        \n                        segments.forEach(function(s) {\n                            s.classList.remove('active');\n                            animateTo(s, 0, 0, 300);\n                        });\n                        legendItems.forEach(function(l) {\n                            l.classList.remove('active');\n                        });\n                        \n                        item.classList.add('active');\n                        \n                        const segment = chartSection.querySelector('.pie-segment[data-index=\"' + idx + '\"]');\n                        if (segment) {\n                            activateSegment(segment);\n                        }\n                    });\n                    \n                    item.addEventListener('mouseleave', deactivateAll);\n                });\n            });\n        } catch (e) {\n            console.error('Pie chart init error:', e);\n        }\n    })();\n    <\/script>\n    \n    \n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n    <section class=\"pie-chart-section\" id=\"pie-chart-6a062f858159e\">\n        <div class=\"pie-chart-container\">\n                        <div class=\"section-header\">\n                                    <h2>Dochody bie\u017c\u0105ce<\/h2>\n                                            <\/div>\n                        \n            <div class=\"pie-chart-content\">\n                <div class=\"pie-chart-wrapper\">\n                    <svg class=\"pie-chart-svg\" viewBox=\"0 0 400 400\" width=\"400\" height=\"400\">\n                        <g transform=\"translate(200, 200)\">\n                            <path class=\"pie-segment\" data-index=\"0\" data-name=\"Udzia\u0142y w PIT i CIT\" data-value=\"93336324.17\" data-percentage=\"53.7\" data-offset-x=\"11.92\" data-offset-y=\"1.38\" transform=\"translate(0, 0)\" d=\"M 0 0 L 1.1021821192326E-14 -180 A 180 180 0 1 1 -41.131859256102 175.23746789467 Z\" fill=\"#078236\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"1\" data-name=\"Dotacje i dochody celowe\" data-value=\"31443604.13\" data-percentage=\"18.1\" data-offset-x=\"-8.60\" data-offset-y=\"8.37\" transform=\"translate(0, 0)\" d=\"M 0 0 L -41.131859256102 175.23746789467 A 180 180 0 0 1 -176.25929093537 36.505648315871 Z\" fill=\"#ec6a8a\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"2\" data-name=\"Subwencja og\u00f3lna\" data-value=\"23225163.37\" data-percentage=\"13.4\" data-offset-x=\"-11.72\" data-offset-y=\"-2.56\" transform=\"translate(0, 0)\" d=\"M 0 0 L -176.25929093537 36.505648315871 A 180 180 0 0 1 -144.92635206922 -106.75370005722 Z\" fill=\"#ECE80A\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"3\" data-name=\"Pozosta\u0142e dochody bie\u017c\u0105ce\" data-value=\"20025789.75\" data-percentage=\"11.5\" data-offset-x=\"-6.52\" data-offset-y=\"-10.08\" transform=\"translate(0, 0)\" d=\"M 0 0 L -144.92635206922 -106.75370005722 A 180 180 0 0 1 -37.947341320763 -175.9545375564 Z\" fill=\"#0ab4f1\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"4\" data-name=\"Wp\u0142ywy z podatk\u00f3w i op\u0142at\" data-value=\"5879287.57\" data-percentage=\"3.4\" data-offset-x=\"-1.27\" data-offset-y=\"-11.93\" transform=\"translate(0, 0)\" d=\"M 0 0 L -37.947341320763 -175.9545375564 A 180 180 0 0 1 -3.3065463576979E-14 -180 Z\" fill=\"#e52727\" stroke=\"#fff\" stroke-width=\"2\" \/>                        <\/g>\n                    <\/svg>\n                <\/div>\n                \n                <div class=\"pie-legend\">\n                                            <div class=\"legend-item\" data-index=\"0\">\n                            <span class=\"legend-color\" style=\"background-color: #078236;\"><\/span>\n                            <span class=\"legend-label\">Udzia\u0142y w PIT i CIT<\/span>\n                            <span class=\"legend-value\">93 336 324,17 (53,7%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"1\">\n                            <span class=\"legend-color\" style=\"background-color: #ec6a8a;\"><\/span>\n                            <span class=\"legend-label\">Dotacje i dochody celowe<\/span>\n                            <span class=\"legend-value\">31 443 604,13 (18,1%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"2\">\n                            <span class=\"legend-color\" style=\"background-color: #ECE80A;\"><\/span>\n                            <span class=\"legend-label\">Subwencja og\u00f3lna<\/span>\n                            <span class=\"legend-value\">23 225 163,37 (13,4%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"3\">\n                            <span class=\"legend-color\" style=\"background-color: #0ab4f1;\"><\/span>\n                            <span class=\"legend-label\">Pozosta\u0142e dochody bie\u017c\u0105ce<\/span>\n                            <span class=\"legend-value\">20 025 789,75 (11,5%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"4\">\n                            <span class=\"legend-color\" style=\"background-color: #e52727;\"><\/span>\n                            <span class=\"legend-label\">Wp\u0142ywy z podatk\u00f3w i op\u0142at<\/span>\n                            <span class=\"legend-value\">5 879 287,57 (3,4%)<\/span>\n                        <\/div>\n                                    <\/div>\n            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    .pie-chart-section {\n        padding: 80px 20px;\n        background: #f5f7fa;\n    }\n    \n    .pie-chart-container {\n        max-width: 1200px;\n        margin: 0 auto;\n    }\n    \n    .pie-chart-section .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .pie-chart-section .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .pie-chart-section .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n        max-width: 800px;\n        margin: 0 auto;\n    }\n    \n    .pie-chart-content {\n        display: grid;\n        grid-template-columns: 450px 1fr;\n        gap: 60px;\n        align-items: start;\n    }\n    \n    .pie-chart-wrapper {\n        position: relative;\n        background: white;\n        border-radius: 12px;\n        padding: 30px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n    }\n    \n    .pie-chart-svg {\n        display: block;\n        margin: 0 auto;\n    }\n    \n    .pie-segment {\n        cursor: pointer;\n        \/* CSS transition tylko na stroke i filter - transform jest animowany przez JS\n           bezpo\u015brednio przez setAttribute na atrybucie SVG (nie CSS) *\/\n        transition: stroke 0.2s ease, stroke-width 0.2s ease, filter 0.2s ease;\n    }\n    \n    .pie-segment:hover,\n    .pie-segment.active {\n        filter: brightness(1.1);\n    }\n    \n    .pie-segment.active {\n        stroke: #333;\n        stroke-width: 3;\n    }\n    \n    .pie-legend {\n        background: white;\n        border-radius: 12px;\n        padding: 30px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        max-height: 600px;\n        overflow-y: auto;\n    }\n    \n    .legend-item {\n        display: grid;\n        grid-template-columns: 20px 1fr auto;\n        gap: 15px;\n        align-items: center;\n        padding: 12px;\n        border-radius: 6px;\n        transition: background 0.2s ease;\n        cursor: pointer;\n    }\n    \n    .legend-item:hover {\n        background: #f5f7fa;\n    }\n    \n    .legend-item.active {\n        background: #e8f4f8;\n        border-left: 4px solid #1e3c72;\n        padding-left: 8px;\n    }\n    \n    .legend-color {\n        width: 20px;\n        height: 20px;\n        border-radius: 50%;\n        display: block;\n    }\n    \n    .legend-label {\n        font-weight: 500;\n        color: #333;\n    }\n    \n    .legend-value {\n        font-weight: 600;\n        color: #2a5298;\n        white-space: nowrap;\n    }\n    \n    @media (max-width: 968px) {\n        .pie-chart-content {\n            grid-template-columns: 1fr;\n            gap: 40px;\n        }\n        \n        .pie-chart-wrapper {\n            max-width: 450px;\n            margin: 0 auto;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .pie-chart-wrapper {\n            padding: 20px;\n        }\n        \n        .pie-chart-svg {\n            width: 100%;\n            height: auto;\n        }\n        \n        .pie-legend {\n            padding: 20px;\n        }\n        \n        .legend-item {\n            grid-template-columns: 16px 1fr;\n            gap: 10px;\n        }\n        \n        .legend-value {\n            grid-column: 2;\n            font-size: 0.9rem;\n        }\n    }\n    <\/style>\n    \n    <script>\n    (function() {\n        try {\n            \/\/ Znajd\u017a wszystkie sekcje wykres\u00f3w ko\u0142owych na stronie (nie polegamy na ID)\n            const allPieSections = document.querySelectorAll('.pie-chart-section');\n            \n            allPieSections.forEach(function(chartSection) {\n                \/\/ Sprawd\u017a czy ju\u017c zainicjowano (zapobiega podw\u00f3jnemu attachowaniu)\n                if (chartSection.dataset.pieInitialized === 'true') return;\n                chartSection.dataset.pieInitialized = 'true';\n                \n                const segments = chartSection.querySelectorAll('.pie-segment');\n                const legendItems = chartSection.querySelectorAll('.legend-item');\n                \n                if (segments.length === 0) return;\n                \n                \/\/ Mapa pozycji (klucz = element, warto\u015b\u0107 = {x, y})\n                const positions = new Map();\n                const animFrames = new Map();\n                \n                segments.forEach(function(s) {\n                    positions.set(s, { x: 0, y: 0 });\n                });\n                \n                function animateTo(element, targetX, targetY, duration) {\n                    \/\/ Pobierz AKTUALN\u0104 pozycj\u0119 - parsuj atrybut transform (nie z mapy!)\n                    \/\/ Mapa mo\u017ce mie\u0107 nieaktualne dane je\u015bli poprzednia animacja zosta\u0142a przerwana\n                    let startX = 0;\n                    let startY = 0;\n                    const currentTransform = element.getAttribute('transform');\n                    if (currentTransform) {\n                        const match = currentTransform.match(\/translate\\(([-\\d.]+)[\\s,]+([-\\d.]+)\\)\/);\n                        if (match) {\n                            startX = parseFloat(match[1]);\n                            startY = parseFloat(match[2]);\n                        }\n                    }\n                    \n                    \/\/ Anuluj poprzedni\u0105 animacj\u0119\n                    if (animFrames.has(element)) {\n                        cancelAnimationFrame(animFrames.get(element));\n                        animFrames.delete(element);\n                    }\n                    \n                    \/\/ Sprawdz czy juz jestesmy na miejscu\n                    const dx = Math.abs(startX - targetX);\n                    const dy = Math.abs(startY - targetY);\n                    if (dx < 0.1) {\n                        if (dy < 0.1) {\n                            \/\/ Ju\u017c na miejscu - zapisz ko\u0144cow\u0105 pozycj\u0119\n                            positions.set(element, { x: targetX, y: targetY });\n                            return;\n                        }\n                    }\n                    \n                    const startTime = performance.now();\n                    \n                    function easeOutBack(t) {\n                        const c1 = 1.70158;\n                        const c3 = c1 + 1;\n                        return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n                    }\n                    \n                    function step(now) {\n                        const progress = Math.min((now - startTime) \/ duration, 1);\n                        const eased = easeOutBack(progress);\n                        const x = startX + (targetX - startX) * eased;\n                        const y = startY + (targetY - startY) * eased;\n                        \n                        element.setAttribute('transform', 'translate(' + x.toFixed(2) + ' ' + y.toFixed(2) + ')');\n                        \/\/ Aktualizuj map\u0119 z LIVE pozycj\u0105 (nie tylko ko\u0144cow\u0105) - aby kolejne wywo\u0142anie mia\u0142o aktualne dane\n                        positions.set(element, { x: x, y: y });\n                        \n                        if (progress < 1) {\n                            animFrames.set(element, requestAnimationFrame(step));\n                        } else {\n                            \/\/ Animacja zako\u0144czona - upewnij si\u0119 \u017ce jeste\u015bmy dok\u0142adnie na targetX\/Y\n                            positions.set(element, { x: targetX, y: targetY });\n                            element.setAttribute('transform', 'translate(' + targetX.toFixed(2) + ' ' + targetY.toFixed(2) + ')');\n                            animFrames.delete(element);\n                        }\n                    }\n                    \n                    animFrames.set(element, requestAnimationFrame(step));\n                }\n                \n                function activateSegment(segment) {\n                    const offsetX = parseFloat(segment.getAttribute('data-offset-x')) || 0;\n                    const offsetY = parseFloat(segment.getAttribute('data-offset-y')) || 0;\n                    segment.classList.add('active');\n                    animateTo(segment, offsetX, offsetY, 350);\n                }\n                \n                function deactivateAll() {\n                    segments.forEach(function(s) {\n                        s.classList.remove('active');\n                        animateTo(s, 0, 0, 300);\n                    });\n                    legendItems.forEach(function(l) {\n                        l.classList.remove('active');\n                    });\n                }\n                \n                \/\/ Pomocnicza funkcja: przewija kontener legendy aby aktywna pozycja by\u0142a widoczna\n                \/\/ (NIE u\u017cywamy scrollIntoView bo przewija ca\u0142\u0105 stron\u0119 - tylko wewn\u0119trzny kontener)\n                function scrollLegendToItem(legendItem) {\n                    const legendContainer = chartSection.querySelector('.pie-legend');\n                    if (!legendContainer) return;\n                    if (!legendItem) return;\n                    \n                    \/\/ Sprawdz czy element jest poza widoczn\u0105 cz\u0119\u015bci\u0105 kontenera\n                    const containerRect = legendContainer.getBoundingClientRect();\n                    const itemRect = legendItem.getBoundingClientRect();\n                    \n                    \/\/ Je\u015bli element jest powy\u017cej widocznej cz\u0119\u015bci\n                    if (itemRect.top < containerRect.top) {\n                        const offset = itemRect.top - containerRect.top;\n                        legendContainer.scrollBy({ top: offset - 10, behavior: 'smooth' });\n                    }\n                    \/\/ Je\u015bli element jest poni\u017cej widocznej cz\u0119\u015bci\n                    else if (itemRect.bottom > containerRect.bottom) {\n                        const offset = itemRect.bottom - containerRect.bottom;\n                        legendContainer.scrollBy({ top: offset + 10, behavior: 'smooth' });\n                    }\n                }\n                \n                segments.forEach(function(segment) {\n                    segment.addEventListener('mouseenter', function() {\n                        const idx = segment.getAttribute('data-index');\n                        \n                        segments.forEach(function(s) {\n                            if (s !== segment) {\n                                s.classList.remove('active');\n                                animateTo(s, 0, 0, 300);\n                            }\n                        });\n                        legendItems.forEach(function(l) {\n                            l.classList.remove('active');\n                        });\n                        \n                        activateSegment(segment);\n                        \n                        const legendItem = chartSection.querySelector('.legend-item[data-index=\"' + idx + '\"]');\n                        if (legendItem) {\n                            legendItem.classList.add('active');\n                            \/\/ Auto-scroll legenda do aktywnej pozycji\n                            scrollLegendToItem(legendItem);\n                        }\n                    });\n                    \n                    segment.addEventListener('mouseleave', deactivateAll);\n                });\n                \n                legendItems.forEach(function(item) {\n                    item.addEventListener('mouseenter', function() {\n                        const idx = item.getAttribute('data-index');\n                        \n                        segments.forEach(function(s) {\n                            s.classList.remove('active');\n                            animateTo(s, 0, 0, 300);\n                        });\n                        legendItems.forEach(function(l) {\n                            l.classList.remove('active');\n                        });\n                        \n                        item.classList.add('active');\n                        \n                        const segment = chartSection.querySelector('.pie-segment[data-index=\"' + idx + '\"]');\n                        if (segment) {\n                            activateSegment(segment);\n                        }\n                    });\n                    \n                    item.addEventListener('mouseleave', deactivateAll);\n                });\n            });\n        } catch (e) {\n            console.error('Pie chart init error:', e);\n        }\n    })();\n    <\/script>\n    \n    \n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-db35e39c1e063ab9e189e1c656a40894\" style=\"color:#14357a\">Dochody Powiatu \u017byrardowskiego wed\u0142ug klasyfikacji bud\u017cetowej<\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Paragraf<\/th><th>Opis<\/th><th class=\"has-text-align-right\" data-align=\"right\">Warto\u015b\u0107&nbsp;w&nbsp;z\u0142<\/th><\/tr><\/thead><tbody><tr><td>001<\/td><td>Wp\u0142ywy podatku dochodowego od os\u00f3b fizycznych<\/td><td class=\"has-text-align-right\" data-align=\"right\">81&nbsp;994&nbsp;578,41<\/td><\/tr><tr><td>083<\/td><td>Wp\u0142ywy z us\u0142ug<\/td><td class=\"has-text-align-right\" data-align=\"right\">17 026 144,84<\/td><\/tr><tr><td>292<\/td><td>Subwencje og\u00f3lne z bud\u017cetu pa\u0144stwa<\/td><td class=\"has-text-align-right\" data-align=\"right\">14 926 055,38<\/td><\/tr><tr><td>211<\/td><td>Dotacja celowa otrzymana z bud\u017cetu pa\u0144stwa na zadania bie\u017c\u0105ce z zakresu administracji rz\u0105dowej oraz inne zadania zlecone ustawami realizowane przez powiat<\/td><td class=\"has-text-align-right\" data-align=\"right\">14 839 216,23<\/td><\/tr><tr><td>002<\/td><td>Wp\u0142ywy z podatku dochodowego od os\u00f3b prawnych<\/td><td class=\"has-text-align-right\" data-align=\"right\">11 341 745,76<\/td><\/tr><tr><td>276<\/td><td>\u015arodki na uzupe\u0142nienie dochod\u00f3w powiat\u00f3w<\/td><td class=\"has-text-align-right\" data-align=\"right\">8 299 107,99<\/td><\/tr><tr><td>629<\/td><td>\u015arodki na dofinansowanie w\u0142asnych inwestycji gmin, powiat\u00f3w (zwi\u0105zk\u00f3w gmin, zwi\u0105zk\u00f3w powiatowo-gminnych, zwi\u0105zk\u00f3w powiat\u00f3w), samorz\u0105d\u00f3w wojew\u00f3dztw, pozyskane z innych \u017ar\u00f3de\u0142<\/td><td class=\"has-text-align-right\" data-align=\"right\">6&nbsp;000&nbsp;000,00<\/td><\/tr><tr><td>682<\/td><td>\u015arodki na uzupe\u0142nienie dochod\u00f3w powiat\u00f3w<\/td><td class=\"has-text-align-right\" data-align=\"right\">4&nbsp;721&nbsp;602,00<\/td><\/tr><tr><td>213<\/td><td>Dotacja celowa otrzymana z bud\u017cetu pa\u0144stwa na realizacj\u0119 bie\u017c\u0105cych zada\u0144 w\u0142asnych powiatu<\/td><td class=\"has-text-align-right\" data-align=\"right\">4&nbsp;281&nbsp;826,51<\/td><\/tr><tr><td>290<\/td><td>Wp\u0142ywy z wp\u0142at gmin i powiat\u00f3w na rzecz innych jednostek samorz\u0105du terytorialnego oraz zwi\u0105zk\u00f3w gmin, zwi\u0105zk\u00f3w powiatowo-gminnych, zwi\u0105zk\u00f3w powiat\u00f3w, zwi\u0105zk\u00f3w metropolitalnych na dofinansowanie zada\u0144 bie\u017c\u0105cych<\/td><td class=\"has-text-align-right\" data-align=\"right\">3&nbsp;588&nbsp;547,55<\/td><\/tr><tr><td>210<\/td><td>\u015arodki z Funduszu Pomocy na finansowanie lub dofinansowanie zada\u0144 bie\u017c\u0105cych w zakresie pomocy obywatelom Ukrainy<\/td><td class=\"has-text-align-right\" data-align=\"right\">3&nbsp;473&nbsp;737,96<\/td><\/tr><tr><td>270<\/td><td>\u015arodki na dofinansowanie w\u0142asnych zada\u0144 bie\u017c\u0105cych gmin, powiat\u00f3w (zwi\u0105zk\u00f3w gmin, zwi\u0105zk\u00f3w powiatowo-gminnych, zwi\u0105zk\u00f3w powiat\u00f3w), samorz\u0105d\u00f3w wojew\u00f3dztw, pozyskane z innych \u017ar\u00f3de\u0142<\/td><td class=\"has-text-align-right\" data-align=\"right\">2&nbsp;633&nbsp;407,77<\/td><\/tr><tr><td>625<\/td><td>europejskich oraz \u015brodk\u00f3w, o kt\u00f3rych mowa w art. 5 ust. 3 pkt 5 lit. a i b ustawy, lub p\u0142atno\u015bci w ramach bud\u017cetu \u015brodk\u00f3w europejskich, realizowanych przez jednostki samorz\u0105du terytorialnego<\/td><td class=\"has-text-align-right\" data-align=\"right\">2&nbsp;571&nbsp;710,45<\/td><\/tr><tr><td>069<\/td><td>Wp\u0142ywy z r\u00f3\u017cnych op\u0142at<\/td><td class=\"has-text-align-right\" data-align=\"right\">2&nbsp;199&nbsp;669,80<\/td><\/tr><tr><td>630<\/td><td>Dotacja celowa otrzymana z tytu\u0142u pomocy finansowej udzielanej mi\u0119dzy jednostkami samorz\u0105du terytorialnego na dofinansowanie w\u0142asnych zada\u0144 inwestycyjnych i zakup\u00f3w inwestycyjnych<\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;749&nbsp;879,93<\/td><\/tr><tr><td>042<\/td><td>Wp\u0142ywy z op\u0142aty komunikacyjnej<\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;571&nbsp;471,75<\/td><\/tr><tr><td>062<\/td><td>Wp\u0142ywy z op\u0142at za zezwolenia, akredytacje oraz op\u0142aty ewidencyjne, w tym op\u0142aty za cz\u0119stotliwo\u015bci<\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;564&nbsp;330,17<\/td><\/tr><tr><td>232<\/td><td>Dotacja celowa otrzymana z powiatu na zadania bie\u017c\u0105ce<\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;068&nbsp;891,34<\/td><\/tr><tr><td>643<\/td><td>Dotacja celowa otrzymana z bud\u017cetu pa\u0144stwa na realizacj\u0119 inwestycji i zakup\u00f3w inwestycyjnych w\u0142asnych powiatu<\/td><td class=\"has-text-align-right\" data-align=\"right\">954&nbsp;570,00<\/td><\/tr><tr><td>236<\/td><td>Dochody jednostek samorz\u0105du terytorialnego zwi\u0105zane z realizacj\u0105 zada\u0144 z zakresu administracji rz\u0105dowej oraz innych zada\u0144 zleconych ustawami<\/td><td class=\"has-text-align-right\" data-align=\"right\">694&nbsp;697,35<\/td><\/tr><tr><td>092<\/td><td>Wp\u0142ywy z pozosta\u0142ych odsetek<\/td><td class=\"has-text-align-right\" data-align=\"right\">661&nbsp;762,67<\/td><\/tr><tr><td>299<\/td><td>Wp\u0142ata \u015brodk\u00f3w finansowych z niewykorzystanych w terminie wydatk\u00f3w, kt\u00f3re nie wygasaj\u0105 z up\u0142ywem roku bud\u017cetowego<\/td><td class=\"has-text-align-right\" data-align=\"right\">626&nbsp;934,49<\/td><\/tr><tr><td>269<\/td><td>\u015arodki z Funduszu Pracy otrzymane na realizacj\u0119 zada\u0144 wynikaj\u0105cych z odr\u0119bnych ustaw<\/td><td class=\"has-text-align-right\" data-align=\"right\">607&nbsp;461,30<\/td><\/tr><tr><td>635<\/td><td>\u015arodki otrzymane z pa\u0144stwowych funduszy celowych na finansowanie lub dofinansowanie koszt\u00f3w realizacji inwestycji i zakup\u00f3w inwestycyjnych jednostek sektora finans\u00f3w publicznych<\/td><td class=\"has-text-align-right\" data-align=\"right\">604&nbsp;000,00<\/td><\/tr><tr><td>097<\/td><td>Wp\u0142ywy z r\u00f3\u017cnych dochod\u00f3w<\/td><td class=\"has-text-align-right\" data-align=\"right\">556&nbsp;746,59<\/td><\/tr><tr><td>271<\/td><td>Dotacja celowa otrzymana z tytu\u0142u pomocy finansowej udzielanej mi\u0119dzy jednostkami samorz\u0105du terytorialnego na dofinansowanie w\u0142asnych zada\u0144 bie\u017c\u0105cych<\/td><td class=\"has-text-align-right\" data-align=\"right\">552&nbsp;183,05<\/td><\/tr><tr><td>065<\/td><td>Wp\u0142ywy z op\u0142at za wydanie prawa jazdy oraz innych dokument\u00f3w uprawniaj\u0105cych do kierowania pojazdami<\/td><td class=\"has-text-align-right\" data-align=\"right\">313&nbsp;379,00<\/td><\/tr><tr><td>668<\/td><td>Wp\u0142ata \u015brodk\u00f3w finansowych z niewykorzystanych w terminie wydatk\u00f3w, kt\u00f3re nie wygasaj\u0105 z up\u0142ywem roku bud\u017cetowego<\/td><td class=\"has-text-align-right\" data-align=\"right\">295&nbsp;830,00<\/td><\/tr><tr><td>205<\/td><td>Dotacja celowa w ramach program\u00f3w finansowanych z udzia\u0142em \u015brodk\u00f3w europejskich oraz \u015brodk\u00f3w, o kt\u00f3rych mowa w art. 5 ust. 3 pkt 5 lit. a i b ustawy, lub p\u0142atno\u015bci w ramach bud\u017cetu \u015brodk\u00f3w europejskich, realizowanych przez jednostki samorz\u0105du terytorialnego<\/td><td class=\"has-text-align-right\" data-align=\"right\">247&nbsp;025,58<\/td><\/tr><tr><td>075<\/td><td>Wp\u0142ywy z najmu i dzier\u017cawy sk\u0142adnik\u00f3w maj\u0105tkowych Skarbu Pa\u0144stwa, jednostek samorz\u0105du terytorialnego lub innych jednostek zaliczanych do sektora finans\u00f3w publicznych oraz innych um\u00f3w o podobnym charakterze<\/td><td class=\"has-text-align-right\" data-align=\"right\">180&nbsp;257,84<\/td><\/tr><tr><td>049<\/td><td>Wp\u0142ywy z innych lokalnych op\u0142at pobieranych przez jednostki samorz\u0105du terytorialnego na podstawie odr\u0119bnych ustaw<\/td><td class=\"has-text-align-right\" data-align=\"right\">144&nbsp;338,95<\/td><\/tr><tr><td>212<\/td><td>Dotacja celowa otrzymana z bud\u017cetu pa\u0144stwa na zadania bie\u017c\u0105ce realizowane przez powiat na podstawie porozumie\u0144 z organami administracji rz\u0105dowej<\/td><td class=\"has-text-align-right\" data-align=\"right\">128&nbsp;850,24<\/td><\/tr><tr><td>096<\/td><td>Wp\u0142ywy z otrzymanych spadk\u00f3w, zapis\u00f3w i darowizn w postaci pieni\u0119\u017cnej<\/td><td class=\"has-text-align-right\" data-align=\"right\">109&nbsp;520,00<\/td><\/tr><tr><td>058<\/td><td>Wp\u0142ywy z tytu\u0142u grzywien i innych kar pieni\u0119\u017cnych od os\u00f3b prawnych i innych jednostek organizacyjnych<\/td><td class=\"has-text-align-right\" data-align=\"right\">74&nbsp;588,00<\/td><\/tr><tr><td>057<\/td><td>Wp\u0142ywy z tytu\u0142u grzywien, mandat\u00f3w i innych kar pieni\u0119\u017cnych od os\u00f3b fizycznych<\/td><td class=\"has-text-align-right\" data-align=\"right\">70&nbsp;930,00<\/td><\/tr><tr><td>087<\/td><td>Wp\u0142ywy ze sprzeda\u017cy sk\u0142adnik\u00f3w maj\u0105tkowych<\/td><td class=\"has-text-align-right\" data-align=\"right\">69&nbsp;116,95<\/td><\/tr><tr><td>059<\/td><td>Wp\u0142ywy z op\u0142at za koncesje i licencje<\/td><td class=\"has-text-align-right\" data-align=\"right\">63&nbsp;711,20<\/td><\/tr><tr><td>626<\/td><td>Dotacja otrzymana z pa\u0144stwowego funduszu celowego na finansowanie lub dofinansowanie koszt\u00f3w realizacji inwestycji i zakup\u00f3w inwestycyjnych jednostek sektora finans\u00f3w publicznych<\/td><td class=\"has-text-align-right\" data-align=\"right\">28&nbsp;000,00<\/td><\/tr><tr><td>231<\/td><td>Dotacja celowa otrzymana z gminy na zadania bie\u017c\u0105ce realizowane na podstawie porozumie\u0144 (um\u00f3w) mi\u0119dzy jednostkami samorz\u0105du terytorialnego<\/td><td class=\"has-text-align-right\" data-align=\"right\">18&nbsp;681,60<\/td><\/tr><tr><td>094<\/td><td>Wp\u0142ywy z rozlicze\u0144\/zwrot\u00f3w z lat ubieg\u0142ych<\/td><td class=\"has-text-align-right\" data-align=\"right\">17&nbsp;944,85<\/td><\/tr><tr><td>067<\/td><td>Wp\u0142ywy z op\u0142at za korzystanie z wy\u017cywienia w jednostkach realizuj\u0105cych zadania z zakresu wychowania przedszkolnego<\/td><td class=\"has-text-align-right\" data-align=\"right\">12&nbsp;050,00<\/td><\/tr><tr><td>047<\/td><td>Wp\u0142ywy z op\u0142at za trwa\u0142y zarz\u0105d, u\u017cytkowanie i s\u0142u\u017cebno\u015bci<\/td><td class=\"has-text-align-right\" data-align=\"right\">4&nbsp;489,70<\/td><\/tr><tr><td>095<\/td><td>Wp\u0142ywy z tytu\u0142u kar i odszkodowa\u0144 wynikaj\u0105cych z um\u00f3w<\/td><td class=\"has-text-align-right\" data-align=\"right\">4&nbsp;258,11<\/td><\/tr><tr><td>217<\/td><td>\u015arodki otrzymane z pa\u0144stwowych funduszy celowych na realizacj\u0119 zada\u0144 bie\u017c\u0105cych jednostek sektora finans\u00f3w publicznych<\/td><td class=\"has-text-align-right\" data-align=\"right\">3&nbsp;775,00<\/td><\/tr><tr><td>063<\/td><td>Wp\u0142ywy z tytu\u0142u op\u0142at i koszt\u00f3w s\u0105dowych oraz innych op\u0142at uiszczanych na rzecz Skarbu Pa\u0144stwa z tytu\u0142u post\u0119powania s\u0105dowego i prokuratorskiego<\/td><td class=\"has-text-align-right\" data-align=\"right\">2&nbsp;535,58<\/td><\/tr><tr><td>061<\/td><td>Wp\u0142ywy z op\u0142at egzaminacyjnych oraz op\u0142at za wydawanie \u015bwiadectw, dyplom\u00f3w, za\u015bwiadcze\u0144, certyfikat\u00f3w i ich duplikat\u00f3w<\/td><td class=\"has-text-align-right\" data-align=\"right\">2&nbsp;243,00<\/td><\/tr><tr><td>291<\/td><td>Wp\u0142ywy ze zwrot\u00f3w dotacji oraz p\u0142atno\u015bci wykorzystanych niezgodnie z przeznaczeniem lub wykorzystanych z naruszeniem procedur, o kt\u00f3rych mowa w art. 184 ustawy, pobranych nienale\u017cnie lub w nadmiernej wysoko\u015bci<\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;634,03<\/td><\/tr><tr><td>064<\/td><td>Wp\u0142ywy z tytu\u0142u koszt\u00f3w egzekucyjnych, op\u0142aty komorniczej i koszt\u00f3w upomnie\u0144<\/td><td class=\"has-text-align-right\" data-align=\"right\">672,00<\/td><\/tr><tr><td>295<\/td><td>Wp\u0142ywy ze zwrot\u00f3w niewykorzystanych dotacji oraz p\u0142atno\u015bci<\/td><td class=\"has-text-align-right\" data-align=\"right\">370,98<\/td><\/tr><tr><td>068<\/td><td>Wp\u0142ywy od rodzic\u00f3w z tytu\u0142u op\u0142aty za pobyt dziecka w pieczy zast\u0119pczej<\/td><td class=\"has-text-align-right\" data-align=\"right\">280,42<\/td><\/tr><tr><td>055<\/td><td>Wp\u0142ywy z op\u0142at z tytu\u0142u u\u017cytkowania wieczystego nieruchomo\u015bci<\/td><td class=\"has-text-align-right\" data-align=\"right\">116,00<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n    <section class=\"bar-chart-section bar-chart-vertical-stacked\" id=\"bar-chart-6a062f85821cc\">\n        <div class=\"bar-chart-container\">\n                        <div class=\"section-header\">\n                                    <h2>Struktura dochod\u00f3w Powiatu \u017byrardowskiego w 2025 r.<\/h2>\n                                            <\/div>\n                        \n                        <div class=\"chart-legend-top\">\n                                    <div class=\"legend-item-inline\" data-value-index=\"0\">\n                        <span class=\"legend-color-box\" style=\"background-color: #078236;\"><\/span>\n                        <span class=\"legend-text\" style=\"color: #333333;\">Dotacje<\/span>\n                    <\/div>\n                                    <div class=\"legend-item-inline\" data-value-index=\"1\">\n                        <span class=\"legend-color-box\" style=\"background-color: #c71e1d;\"><\/span>\n                        <span class=\"legend-text\" style=\"color: #333333;\">PIT i CIT<\/span>\n                    <\/div>\n                                    <div class=\"legend-item-inline\" data-value-index=\"2\">\n                        <span class=\"legend-color-box\" style=\"background-color: #ffca76;\"><\/span>\n                        <span class=\"legend-text\" style=\"color: #333333;\">Subwencja<\/span>\n                    <\/div>\n                                    <div class=\"legend-item-inline\" data-value-index=\"3\">\n                        <span class=\"legend-color-box\" style=\"background-color: #0bc0da;\"><\/span>\n                        <span class=\"legend-text\" style=\"color: #333333;\">Dochody w\u0142asne<\/span>\n                    <\/div>\n                            <\/div>\n                        \n            <div class=\"bar-chart-wrapper bar-chart-wrapper-vertical-stacked\">\n                                    <!-- Vertical Stacked Layout -->\n                                            <div class=\"bar-column\" data-index=\"0\">\n                            <div class=\"bar-column-label\" style=\"color: #1e3c72;\">2021<\/div>\n                            <div class=\"bar-column-chart bar-column-chart-stacked\" style=\"height: 100%;\">\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 45.415841584158%; background-color: #0bc0da;\"\n                                         data-value=\"45.87\"\n                                         data-formatted=\"45,87  %\"\n                                         data-label=\"Dochody w\u0142asne\"\n                                         data-value-index=\"3\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">45,87  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 25.287128712871%; background-color: #ffca76;\"\n                                         data-value=\"25.54\"\n                                         data-formatted=\"25,54  %\"\n                                         data-label=\"Subwencja\"\n                                         data-value-index=\"2\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">25,54  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 16.673267326733%; background-color: #c71e1d;\"\n                                         data-value=\"16.84\"\n                                         data-formatted=\"16,84  %\"\n                                         data-label=\"PIT i CIT\"\n                                         data-value-index=\"1\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">16,84  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 12.623762376238%; background-color: #078236;\"\n                                         data-value=\"12.75\"\n                                         data-formatted=\"12,75  %\"\n                                         data-label=\"Dotacje\"\n                                         data-value-index=\"0\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">12,75  %<\/span>\n                                                                            <\/div>\n                                                            <\/div>\n                        <\/div>\n                                            <div class=\"bar-column\" data-index=\"1\">\n                            <div class=\"bar-column-label\" style=\"color: #1e3c72;\">2022<\/div>\n                            <div class=\"bar-column-chart bar-column-chart-stacked\" style=\"height: 99.009900990099%;\">\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 38.14%; background-color: #0bc0da;\"\n                                         data-value=\"38.14\"\n                                         data-formatted=\"38,14  %\"\n                                         data-label=\"Dochody w\u0142asne\"\n                                         data-value-index=\"3\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">38,14  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 28.55%; background-color: #ffca76;\"\n                                         data-value=\"28.55\"\n                                         data-formatted=\"28,55  %\"\n                                         data-label=\"Subwencja\"\n                                         data-value-index=\"2\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">28,55  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 20.74%; background-color: #c71e1d;\"\n                                         data-value=\"20.74\"\n                                         data-formatted=\"20,74  %\"\n                                         data-label=\"PIT i CIT\"\n                                         data-value-index=\"1\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">20,74  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 12.57%; background-color: #078236;\"\n                                         data-value=\"12.57\"\n                                         data-formatted=\"12,57  %\"\n                                         data-label=\"Dotacje\"\n                                         data-value-index=\"0\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">12,57  %<\/span>\n                                                                            <\/div>\n                                                            <\/div>\n                        <\/div>\n                                            <div class=\"bar-column\" data-index=\"2\">\n                            <div class=\"bar-column-label\" style=\"color: #1e3c72;\">2023<\/div>\n                            <div class=\"bar-column-chart bar-column-chart-stacked\" style=\"height: 99.009900990099%;\">\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 43.36%; background-color: #0bc0da;\"\n                                         data-value=\"43.36\"\n                                         data-formatted=\"43,36  %\"\n                                         data-label=\"Dochody w\u0142asne\"\n                                         data-value-index=\"3\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">43,36  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 31.61%; background-color: #ffca76;\"\n                                         data-value=\"31.61\"\n                                         data-formatted=\"31,61  %\"\n                                         data-label=\"Subwencja\"\n                                         data-value-index=\"2\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">31,61  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 13.34%; background-color: #c71e1d;\"\n                                         data-value=\"13.34\"\n                                         data-formatted=\"13,34  %\"\n                                         data-label=\"PIT i CIT\"\n                                         data-value-index=\"1\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">13,34  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 11.69%; background-color: #078236;\"\n                                         data-value=\"11.69\"\n                                         data-formatted=\"11,69  %\"\n                                         data-label=\"Dotacje\"\n                                         data-value-index=\"0\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">11,69  %<\/span>\n                                                                            <\/div>\n                                                            <\/div>\n                        <\/div>\n                                            <div class=\"bar-column\" data-index=\"3\">\n                            <div class=\"bar-column-label\" style=\"color: #1e3c72;\">2024<\/div>\n                            <div class=\"bar-column-chart bar-column-chart-stacked\" style=\"height: 99.009900990099%;\">\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 46.34%; background-color: #0bc0da;\"\n                                         data-value=\"46.34\"\n                                         data-formatted=\"46,34  %\"\n                                         data-label=\"Dochody w\u0142asne\"\n                                         data-value-index=\"3\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">46,34  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 29.06%; background-color: #ffca76;\"\n                                         data-value=\"29.06\"\n                                         data-formatted=\"29,06  %\"\n                                         data-label=\"Subwencja\"\n                                         data-value-index=\"2\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">29,06  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 14.71%; background-color: #c71e1d;\"\n                                         data-value=\"14.71\"\n                                         data-formatted=\"14,71  %\"\n                                         data-label=\"PIT i CIT\"\n                                         data-value-index=\"1\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">14,71  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 9.89%; background-color: #078236;\"\n                                         data-value=\"9.89\"\n                                         data-formatted=\"9,89  %\"\n                                         data-label=\"Dotacje\"\n                                         data-value-index=\"0\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">9,89  %<\/span>\n                                                                            <\/div>\n                                                            <\/div>\n                        <\/div>\n                                            <div class=\"bar-column\" data-index=\"4\">\n                            <div class=\"bar-column-label\" style=\"color: #1e3c72;\">2025<\/div>\n                            <div class=\"bar-column-chart bar-column-chart-stacked\" style=\"height: 99.009900990099%;\">\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 30%; background-color: #0bc0da;\"\n                                         data-value=\"30\"\n                                         data-formatted=\"30,00  %\"\n                                         data-label=\"Dochody w\u0142asne\"\n                                         data-value-index=\"3\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #000000;\">30,00  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 7.82%; background-color: #ffca76;\"\n                                         data-value=\"7.82\"\n                                         data-formatted=\"7,82  %\"\n                                         data-label=\"Subwencja\"\n                                         data-value-index=\"2\">\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 48.89%; background-color: #c71e1d;\"\n                                         data-value=\"48.89\"\n                                         data-formatted=\"48,89  %\"\n                                         data-label=\"PIT i CIT\"\n                                         data-value-index=\"1\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">48,89  %<\/span>\n                                                                            <\/div>\n                                                                    <div class=\"bar-stacked-segment\" \n                                         style=\"height: 13.29%; background-color: #078236;\"\n                                         data-value=\"13.29\"\n                                         data-formatted=\"13,29  %\"\n                                         data-label=\"Dotacje\"\n                                         data-value-index=\"0\">\n                                                                                    <span class=\"bar-value-stacked\" style=\"color: #ffffff;\">13,29  %<\/span>\n                                                                            <\/div>\n                                                            <\/div>\n                        <\/div>\n                                                <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    .bar-chart-section {\n        padding: 80px 20px;\n        background: #f5f7fa;\n    }\n    \n    .bar-chart-container {\n        max-width: 1200px;\n        margin: 0 auto;\n    }\n    \n    .bar-chart-section .section-header {\n        text-align: center;\n        margin-bottom: 40px;\n    }\n    \n    .bar-chart-section .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .bar-chart-section .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n        max-width: 800px;\n        margin: 0 auto;\n    }\n    \n    .chart-legend-top {\n        display: flex;\n        justify-content: center;\n        flex-wrap: wrap;\n        gap: 20px;\n        margin-bottom: 40px;\n        padding: 20px;\n        background: white;\n        border-radius: 8px;\n        box-shadow: 0 2px 10px rgba(0,0,0,0.05);\n    }\n    \n    .legend-item-inline {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n        padding: 8px 12px;\n        border-radius: 6px;\n        transition: background 0.2s ease;\n        cursor: pointer;\n    }\n    \n    .legend-item-inline:hover,\n    .legend-item-inline.active {\n        background: #e8f4f8;\n    }\n    \n    .legend-color-box {\n        width: 24px;\n        height: 24px;\n        border-radius: 4px;\n        display: block;\n    }\n    \n    .legend-text {\n        font-weight: 600;\n        color: #333;\n        font-size: 1rem;\n    }\n    \n    \/* Horizontal Layout *\/\n    .bar-chart-wrapper-horizontal {\n        background: white;\n        border-radius: 12px;\n        padding: 40px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n    }\n    \n    \/* Siatka t\u0142a wykresu - w\u0142\u0105czana opcj\u0105 showGrid *\/\n    .bar-chart-with-grid {\n        position: relative;\n    }\n    \n    \/* Siatka pozioma w uk\u0142adzie horizontal (linie pionowe co 25%) *\/\n    .bar-chart-wrapper-horizontal.bar-chart-with-grid {\n        background-image:\n            linear-gradient(to right, var(--grid-color) 1px, transparent 1px);\n        background-size: 25% 100%;\n        background-position: 40px 0;\n        background-repeat: repeat-x;\n    }\n    \n    \/* Siatka pozioma w uk\u0142adzie vertical i vertical-stacked *\/\n    .bar-chart-wrapper-vertical.bar-chart-with-grid,\n    .bar-chart-wrapper-vertical-stacked.bar-chart-with-grid {\n        background-image:\n            linear-gradient(to top, var(--grid-color) 1px, transparent 1px);\n        background-size: 100% 25%;\n        background-position: 0 -1px;\n        background-repeat: repeat-y;\n    }\n    \n    .bar-item {\n        margin-bottom: 50px;\n        padding-bottom: 50px;\n        border-bottom: 1px solid #e0e0e0;\n    }\n    \n    .bar-item:last-child {\n        margin-bottom: 0;\n        padding-bottom: 0;\n        border-bottom: none;\n    }\n    \n    .bar-label {\n        font-weight: 600;\n        color: #1e3c72;\n        margin-bottom: 10px;\n        font-size: 1.1rem;\n    }\n    \n    .bars-container {\n        display: flex;\n        flex-direction: column;\n        gap: 5px;\n    }\n    \n    .bar-wrapper {\n        position: relative;\n        height: 40px;\n        background: #f0f0f0;\n        border-radius: 6px;\n        overflow: hidden;\n    }\n    \n    .bar-fill {\n        height: 100%;\n        display: flex;\n        align-items: center;\n        justify-content: flex-end;\n        padding-right: 15px;\n        border-radius: 6px;\n        transition: all 0.3s ease;\n        position: relative;\n        cursor: pointer;\n    }\n    \n    .bar-fill:hover {\n        filter: brightness(1.1);\n        transform: scaleX(1.02);\n        transform-origin: left;\n    }\n    \n    .bar-value {\n        color: white;\n        font-weight: 700;\n        font-size: 0.95rem;\n        text-shadow: 0 1px 2px rgba(0,0,0,0.2);\n    }\n    \n    \/* Vertical Layout *\/\n    .bar-chart-wrapper-vertical {\n        background: white;\n        border-radius: 12px;\n        padding: 40px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        display: flex;\n        justify-content: space-evenly;\n        align-items: flex-end;\n        gap: 50px;\n        min-height: 400px;\n        width: 100%;\n    }\n    \n    .bar-column {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 15px;\n        flex: 1 1 auto;\n        min-width: 60px;\n        max-width: none;\n    }\n    \n    .bar-column-chart {\n        display: flex;\n        gap: 5px;\n        height: 300px;\n        align-items: flex-end;\n        width: 100%;\n    }\n    \n    .bar-vertical-wrapper {\n        flex: 1;\n        height: 100%;\n        background: #f0f0f0;\n        border-radius: 6px 6px 0 0;\n        display: flex;\n        flex-direction: column;\n        justify-content: flex-end;\n        overflow: hidden;\n    }\n    \n    .bar-vertical-fill {\n        width: 100%;\n        border-radius: 6px 6px 0 0;\n        transition: all 0.3s ease;\n        position: relative;\n        display: flex;\n        align-items: flex-start;\n        justify-content: center;\n        padding-top: 8px;\n        cursor: pointer;\n    }\n    \n    .bar-vertical-fill:hover {\n        filter: brightness(1.1);\n        transform: scaleY(1.02);\n        transform-origin: bottom;\n    }\n    \n    .bar-value-vertical {\n        color: white;\n        font-weight: 700;\n        font-size: 0.85rem;\n        text-shadow: 0 1px 2px rgba(0,0,0,0.2);\n        writing-mode: horizontal-tb;\n    }\n    \n    \/* Vertical Stacked Layout *\/\n    .bar-column-chart-stacked {\n        display: flex !important;\n        flex-direction: column;\n        gap: 0;\n        align-items: stretch;\n        justify-content: flex-start;\n        background: #f0f0f0;\n        border-radius: 6px 6px 0 0;\n        overflow: hidden;\n    }\n    \n    .bar-stacked-segment {\n        width: 100%;\n        transition: all 0.3s ease;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        cursor: pointer;\n        min-height: 2px;\n    }\n    \n    .bar-stacked-segment:hover {\n        filter: brightness(1.1);\n    }\n    \n    .bar-value-stacked {\n        color: white;\n        font-weight: 700;\n        font-size: 0.85rem;\n        text-shadow: 0 1px 2px rgba(0,0,0,0.3);\n    }\n    \n    \/* Stacked layout container needs proper alignment *\/\n    .bar-chart-wrapper-vertical-stacked {\n        display: flex;\n        gap: 50px;\n        align-items: flex-end;\n        height: 400px;\n    }\n    \n    .bar-chart-wrapper-vertical-stacked .bar-column {\n        flex: 1;\n        display: flex;\n        flex-direction: column;\n        justify-content: flex-end;\n        height: 100%;\n    }\n    \n    .bar-chart-wrapper-vertical-stacked .bar-column-label {\n        order: 2;\n        margin-top: 10px;\n        text-align: center;\n    }\n    \n    .bar-chart-wrapper-vertical-stacked .bar-column-chart-stacked {\n        order: 1;\n    }\n    \n    .bar-column-label {\n        font-weight: 600;\n        color: #1e3c72;\n        font-size: 0.95rem;\n        text-align: center;\n        word-break: break-word;\n        max-width: 100%;\n        overflow: hidden;\n        transition: transform 0.3s ease;\n    }\n    \n    \/* Rotate labels if they don't fit (when column is narrow) *\/\n    @media (max-width: 768px) {\n        .bar-column-label {\n            font-size: 0.85rem;\n            text-align: center;\n            word-break: keep-all;\n            white-space: normal;\n            line-height: 1.3;\n            max-width: 100%;\n        }\n    }\n    \n    \/* Also rotate when many columns (8+) make each one narrow *\/\n    .bar-column:has(+ .bar-column + .bar-column + .bar-column + .bar-column + .bar-column + .bar-column + .bar-column) .bar-column-label {\n        writing-mode: vertical-rl;\n        transform: rotate(180deg);\n        text-align: left;\n        max-height: 80px;\n    }\n    \n    @media (max-width: 968px) {\n        .bar-chart-wrapper-vertical,\n        .bar-chart-wrapper-vertical-stacked {\n            overflow-x: auto;\n            overflow-y: hidden;\n            justify-content: flex-start;\n            gap: 15px;\n            padding: 30px 20px;\n            -webkit-overflow-scrolling: touch;\n        }\n        \n        .bar-chart-wrapper-vertical .bar-column,\n        .bar-chart-wrapper-vertical-stacked .bar-column {\n            min-width: 110px;\n            flex: 0 0 auto;\n        }\n    }\n    \n    @media (max-width: 768px) {\n        .chart-legend-top {\n            gap: 15px;\n        }\n        \n        .bar-chart-wrapper-horizontal {\n            padding: 20px;\n        }\n        \n        .bar-label {\n            font-size: 1rem;\n        }\n        \n        .bar-wrapper {\n            height: 35px;\n        }\n        \n        .bar-value {\n            font-size: 0.85rem;\n        }\n        \n        .bar-chart-wrapper-vertical,\n        .bar-chart-wrapper-vertical-stacked {\n            padding: 20px 15px;\n            gap: 12px;\n            overflow-x: auto;\n            overflow-y: hidden;\n            -webkit-overflow-scrolling: touch;\n        }\n        \n        .bar-chart-wrapper-vertical .bar-column,\n        .bar-chart-wrapper-vertical-stacked .bar-column {\n            min-width: 100px;\n            flex: 0 0 auto;\n        }\n        \n        .bar-column-chart {\n            height: 250px;\n        }\n        \n        .bar-column-label {\n            font-size: 0.85rem;\n            line-height: 1.3;\n        }\n    }\n    \n    @media (max-width: 480px) {\n        .bar-chart-wrapper-vertical,\n        .bar-chart-wrapper-vertical-stacked {\n            padding: 15px 10px;\n        }\n        \n        .bar-chart-wrapper-vertical .bar-column,\n        .bar-chart-wrapper-vertical-stacked .bar-column {\n            min-width: 90px;\n        }\n        \n        .bar-column-chart {\n            height: 200px;\n        }\n        \n        .bar-value-vertical {\n            font-size: 0.7rem;\n        }\n        \n        .bar-column-label {\n            font-size: 0.8rem;\n        }\n    }\n    <\/style>\n    \n    <script>\n    (function() {\n        const chartId = 'bar-chart-6a062f85821cc';\n        const chartSection = document.getElementById(chartId);\n        if (!chartSection) return;\n        \n        const legendItems = chartSection.querySelectorAll('.legend-item-inline');\n        const barFills = chartSection.querySelectorAll('.bar-fill, .bar-vertical-fill, .bar-stacked-segment');\n        \n        \/\/ Najechanie na s\u0142upek - pod\u015bwietla legend\u0119 i ustawia tooltip\n        barFills.forEach(bar => {\n            bar.addEventListener('mouseenter', function() {\n                const valueIndex = this.dataset.valueIndex;\n                const label = this.dataset.label;\n                \n                \/\/ Pod\u015bwietl odpowiedni\u0105 pozycj\u0119 legendy\n                legendItems.forEach(item => {\n                    item.classList.remove('active');\n                    if (item.dataset.valueIndex === valueIndex) {\n                        item.classList.add('active');\n                    }\n                });\n                \n                \/\/ Tooltip: u\u017cyj data-formatted (zawsze zawiera pe\u0142ne formatowanie\n                \/\/ z separatorem dziesi\u0119tnym i jednostk\u0105, nawet gdy <span> nie jest\n                \/\/ wyrenderowany - np. dla bardzo ma\u0142ych segment\u00f3w stacked)\n                const formattedValue = this.dataset.formatted || this.dataset.value;\n                this.setAttribute('title', label + ': ' + formattedValue);\n            });\n            \n            bar.addEventListener('mouseleave', function() {\n                legendItems.forEach(item => item.classList.remove('active'));\n            });\n        });\n        \n        \/\/ Legend hover highlights bars\n        legendItems.forEach(item => {\n            item.addEventListener('mouseenter', function() {\n                const valueIndex = this.dataset.valueIndex;\n                \n                \/\/ Highlight all bars with this value index\n                barFills.forEach(bar => {\n                    if (bar.dataset.valueIndex === valueIndex) {\n                        bar.style.filter = 'brightness(1.2)';\n                    } else {\n                        bar.style.opacity = '0.5';\n                    }\n                });\n            });\n            \n            item.addEventListener('mouseleave', function() {\n                barFills.forEach(bar => {\n                    bar.style.filter = '';\n                    bar.style.opacity = '';\n                });\n            });\n        });\n    })();\n    <\/script>\n    \n    \n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        \n            <div class=\"stats-grid stats-grid-1\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">dotacje i \u015brodki na inwestycje<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"16925592.38\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n\n<h1 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-79b8c014776e1a50996133466179a5d1\" style=\"color:#14357a\">WYDATKI<\/h1>\n\n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        \n            <div class=\"stats-grid stats-grid-1\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Wydatki Og\u00f3\u0142em wykonane w 2025 r.<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"197657485.04\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        \n            <div class=\"stats-grid stats-grid-3\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Wydatki og\u00f3\u0142em na mieszka\u0144ca<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"2641\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Wydatki bie\u017c\u0105ce na mieszka\u0144ca<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"2221\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Wydatki maj\u0105tkowe na mieszka\u0144ca<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"420\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n    <section class=\"pie-chart-section\" id=\"pie-chart-6a062f858246a\">\n        <div class=\"pie-chart-container\">\n                        <div class=\"section-header\">\n                                    <h2>Struktura wydatk\u00f3w wykonanych w 2025 r.<\/h2>\n                                            <\/div>\n                        \n            <div class=\"pie-chart-content\">\n                <div class=\"pie-chart-wrapper\">\n                    <svg class=\"pie-chart-svg\" viewBox=\"0 0 400 400\" width=\"400\" height=\"400\">\n                        <g transform=\"translate(200, 200)\">\n                            <path class=\"pie-segment\" data-index=\"0\" data-name=\"Wydatki bie\u017c\u0105ce\" data-value=\"166214359.52\" data-percentage=\"84.1\" data-offset-x=\"5.75\" data-offset-y=\"10.53\" transform=\"translate(0, 0)\" d=\"M 0 0 L 1.1021821192326E-14 -180 A 180 180 0 1 1 -151.39216842702 -97.367403883256 Z\" fill=\"#1c8572\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"1\" data-name=\"Wydatki maj\u0105tkowe\" data-value=\"31433098.52\" data-percentage=\"15.9\" data-offset-x=\"-5.75\" data-offset-y=\"-10.53\" transform=\"translate(0, 0)\" d=\"M 0 0 L -151.39216842702 -97.367403883256 A 180 180 0 0 1 -3.3065463576979E-14 -180 Z\" fill=\"#ffca76\" stroke=\"#fff\" stroke-width=\"2\" \/>                        <\/g>\n                    <\/svg>\n                <\/div>\n                \n                <div class=\"pie-legend\">\n                                            <div class=\"legend-item\" data-index=\"0\">\n                            <span class=\"legend-color\" style=\"background-color: #1c8572;\"><\/span>\n                            <span class=\"legend-label\">Wydatki bie\u017c\u0105ce<\/span>\n                            <span class=\"legend-value\">166 214 359,52 (84,1%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"1\">\n                            <span class=\"legend-color\" style=\"background-color: #ffca76;\"><\/span>\n                            <span class=\"legend-label\">Wydatki maj\u0105tkowe<\/span>\n                            <span class=\"legend-value\">31 433 098,52 (15,9%)<\/span>\n                        <\/div>\n                                    <\/div>\n            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    .pie-chart-section {\n        padding: 80px 20px;\n        background: #f5f7fa;\n    }\n    \n    .pie-chart-container {\n        max-width: 1200px;\n        margin: 0 auto;\n    }\n    \n    .pie-chart-section .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .pie-chart-section .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .pie-chart-section .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n        max-width: 800px;\n        margin: 0 auto;\n    }\n    \n    .pie-chart-content {\n        display: grid;\n        grid-template-columns: 450px 1fr;\n        gap: 60px;\n        align-items: start;\n    }\n    \n    .pie-chart-wrapper {\n        position: relative;\n        background: white;\n        border-radius: 12px;\n        padding: 30px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n    }\n    \n    .pie-chart-svg {\n        display: block;\n        margin: 0 auto;\n    }\n    \n    .pie-segment {\n        cursor: pointer;\n        \/* CSS transition tylko na stroke i filter - transform jest animowany przez JS\n           bezpo\u015brednio przez setAttribute na atrybucie SVG (nie CSS) *\/\n        transition: stroke 0.2s ease, stroke-width 0.2s ease, filter 0.2s ease;\n    }\n    \n    .pie-segment:hover,\n    .pie-segment.active {\n        filter: brightness(1.1);\n    }\n    \n    .pie-segment.active {\n        stroke: #333;\n        stroke-width: 3;\n    }\n    \n    .pie-legend {\n        background: white;\n        border-radius: 12px;\n        padding: 30px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        max-height: 600px;\n        overflow-y: auto;\n    }\n    \n    .legend-item {\n        display: grid;\n        grid-template-columns: 20px 1fr auto;\n        gap: 15px;\n        align-items: center;\n        padding: 12px;\n        border-radius: 6px;\n        transition: background 0.2s ease;\n        cursor: pointer;\n    }\n    \n    .legend-item:hover {\n        background: #f5f7fa;\n    }\n    \n    .legend-item.active {\n        background: #e8f4f8;\n        border-left: 4px solid #1e3c72;\n        padding-left: 8px;\n    }\n    \n    .legend-color {\n        width: 20px;\n        height: 20px;\n        border-radius: 50%;\n        display: block;\n    }\n    \n    .legend-label {\n        font-weight: 500;\n        color: #333;\n    }\n    \n    .legend-value {\n        font-weight: 600;\n        color: #2a5298;\n        white-space: nowrap;\n    }\n    \n    @media (max-width: 968px) {\n        .pie-chart-content {\n            grid-template-columns: 1fr;\n            gap: 40px;\n        }\n        \n        .pie-chart-wrapper {\n            max-width: 450px;\n            margin: 0 auto;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .pie-chart-wrapper {\n            padding: 20px;\n        }\n        \n        .pie-chart-svg {\n            width: 100%;\n            height: auto;\n        }\n        \n        .pie-legend {\n            padding: 20px;\n        }\n        \n        .legend-item {\n            grid-template-columns: 16px 1fr;\n            gap: 10px;\n        }\n        \n        .legend-value {\n            grid-column: 2;\n            font-size: 0.9rem;\n        }\n    }\n    <\/style>\n    \n    <script>\n    (function() {\n        try {\n            \/\/ Znajd\u017a wszystkie sekcje wykres\u00f3w ko\u0142owych na stronie (nie polegamy na ID)\n            const allPieSections = document.querySelectorAll('.pie-chart-section');\n            \n            allPieSections.forEach(function(chartSection) {\n                \/\/ Sprawd\u017a czy ju\u017c zainicjowano (zapobiega podw\u00f3jnemu attachowaniu)\n                if (chartSection.dataset.pieInitialized === 'true') return;\n                chartSection.dataset.pieInitialized = 'true';\n                \n                const segments = chartSection.querySelectorAll('.pie-segment');\n                const legendItems = chartSection.querySelectorAll('.legend-item');\n                \n                if (segments.length === 0) return;\n                \n                \/\/ Mapa pozycji (klucz = element, warto\u015b\u0107 = {x, y})\n                const positions = new Map();\n                const animFrames = new Map();\n                \n                segments.forEach(function(s) {\n                    positions.set(s, { x: 0, y: 0 });\n                });\n                \n                function animateTo(element, targetX, targetY, duration) {\n                    \/\/ Pobierz AKTUALN\u0104 pozycj\u0119 - parsuj atrybut transform (nie z mapy!)\n                    \/\/ Mapa mo\u017ce mie\u0107 nieaktualne dane je\u015bli poprzednia animacja zosta\u0142a przerwana\n                    let startX = 0;\n                    let startY = 0;\n                    const currentTransform = element.getAttribute('transform');\n                    if (currentTransform) {\n                        const match = currentTransform.match(\/translate\\(([-\\d.]+)[\\s,]+([-\\d.]+)\\)\/);\n                        if (match) {\n                            startX = parseFloat(match[1]);\n                            startY = parseFloat(match[2]);\n                        }\n                    }\n                    \n                    \/\/ Anuluj poprzedni\u0105 animacj\u0119\n                    if (animFrames.has(element)) {\n                        cancelAnimationFrame(animFrames.get(element));\n                        animFrames.delete(element);\n                    }\n                    \n                    \/\/ Sprawdz czy juz jestesmy na miejscu\n                    const dx = Math.abs(startX - targetX);\n                    const dy = Math.abs(startY - targetY);\n                    if (dx < 0.1) {\n                        if (dy < 0.1) {\n                            \/\/ Ju\u017c na miejscu - zapisz ko\u0144cow\u0105 pozycj\u0119\n                            positions.set(element, { x: targetX, y: targetY });\n                            return;\n                        }\n                    }\n                    \n                    const startTime = performance.now();\n                    \n                    function easeOutBack(t) {\n                        const c1 = 1.70158;\n                        const c3 = c1 + 1;\n                        return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n                    }\n                    \n                    function step(now) {\n                        const progress = Math.min((now - startTime) \/ duration, 1);\n                        const eased = easeOutBack(progress);\n                        const x = startX + (targetX - startX) * eased;\n                        const y = startY + (targetY - startY) * eased;\n                        \n                        element.setAttribute('transform', 'translate(' + x.toFixed(2) + ' ' + y.toFixed(2) + ')');\n                        \/\/ Aktualizuj map\u0119 z LIVE pozycj\u0105 (nie tylko ko\u0144cow\u0105) - aby kolejne wywo\u0142anie mia\u0142o aktualne dane\n                        positions.set(element, { x: x, y: y });\n                        \n                        if (progress < 1) {\n                            animFrames.set(element, requestAnimationFrame(step));\n                        } else {\n                            \/\/ Animacja zako\u0144czona - upewnij si\u0119 \u017ce jeste\u015bmy dok\u0142adnie na targetX\/Y\n                            positions.set(element, { x: targetX, y: targetY });\n                            element.setAttribute('transform', 'translate(' + targetX.toFixed(2) + ' ' + targetY.toFixed(2) + ')');\n                            animFrames.delete(element);\n                        }\n                    }\n                    \n                    animFrames.set(element, requestAnimationFrame(step));\n                }\n                \n                function activateSegment(segment) {\n                    const offsetX = parseFloat(segment.getAttribute('data-offset-x')) || 0;\n                    const offsetY = parseFloat(segment.getAttribute('data-offset-y')) || 0;\n                    segment.classList.add('active');\n                    animateTo(segment, offsetX, offsetY, 350);\n                }\n                \n                function deactivateAll() {\n                    segments.forEach(function(s) {\n                        s.classList.remove('active');\n                        animateTo(s, 0, 0, 300);\n                    });\n                    legendItems.forEach(function(l) {\n                        l.classList.remove('active');\n                    });\n                }\n                \n                \/\/ Pomocnicza funkcja: przewija kontener legendy aby aktywna pozycja by\u0142a widoczna\n                \/\/ (NIE u\u017cywamy scrollIntoView bo przewija ca\u0142\u0105 stron\u0119 - tylko wewn\u0119trzny kontener)\n                function scrollLegendToItem(legendItem) {\n                    const legendContainer = chartSection.querySelector('.pie-legend');\n                    if (!legendContainer) return;\n                    if (!legendItem) return;\n                    \n                    \/\/ Sprawdz czy element jest poza widoczn\u0105 cz\u0119\u015bci\u0105 kontenera\n                    const containerRect = legendContainer.getBoundingClientRect();\n                    const itemRect = legendItem.getBoundingClientRect();\n                    \n                    \/\/ Je\u015bli element jest powy\u017cej widocznej cz\u0119\u015bci\n                    if (itemRect.top < containerRect.top) {\n                        const offset = itemRect.top - containerRect.top;\n                        legendContainer.scrollBy({ top: offset - 10, behavior: 'smooth' });\n                    }\n                    \/\/ Je\u015bli element jest poni\u017cej widocznej cz\u0119\u015bci\n                    else if (itemRect.bottom > containerRect.bottom) {\n                        const offset = itemRect.bottom - containerRect.bottom;\n                        legendContainer.scrollBy({ top: offset + 10, behavior: 'smooth' });\n                    }\n                }\n                \n                segments.forEach(function(segment) {\n                    segment.addEventListener('mouseenter', function() {\n                        const idx = segment.getAttribute('data-index');\n                        \n                        segments.forEach(function(s) {\n                            if (s !== segment) {\n                                s.classList.remove('active');\n                                animateTo(s, 0, 0, 300);\n                            }\n                        });\n                        legendItems.forEach(function(l) {\n                            l.classList.remove('active');\n                        });\n                        \n                        activateSegment(segment);\n                        \n                        const legendItem = chartSection.querySelector('.legend-item[data-index=\"' + idx + '\"]');\n                        if (legendItem) {\n                            legendItem.classList.add('active');\n                            \/\/ Auto-scroll legenda do aktywnej pozycji\n                            scrollLegendToItem(legendItem);\n                        }\n                    });\n                    \n                    segment.addEventListener('mouseleave', deactivateAll);\n                });\n                \n                legendItems.forEach(function(item) {\n                    item.addEventListener('mouseenter', function() {\n                        const idx = item.getAttribute('data-index');\n                        \n                        segments.forEach(function(s) {\n                            s.classList.remove('active');\n                            animateTo(s, 0, 0, 300);\n                        });\n                        legendItems.forEach(function(l) {\n                            l.classList.remove('active');\n                        });\n                        \n                        item.classList.add('active');\n                        \n                        const segment = chartSection.querySelector('.pie-segment[data-index=\"' + idx + '\"]');\n                        if (segment) {\n                            activateSegment(segment);\n                        }\n                    });\n                    \n                    item.addEventListener('mouseleave', deactivateAll);\n                });\n            });\n        } catch (e) {\n            console.error('Pie chart init error:', e);\n        }\n    })();\n    <\/script>\n    \n    \n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n    <section class=\"pie-chart-section\" id=\"pie-chart-6a062f8582510\">\n        <div class=\"pie-chart-container\">\n                        <div class=\"section-header\">\n                                    <h2>WYDATKI WED\u0141UG RODZAJU<\/h2>\n                                            <\/div>\n                        \n            <div class=\"pie-chart-content\">\n                <div class=\"pie-chart-wrapper\">\n                    <svg class=\"pie-chart-svg\" viewBox=\"0 0 400 400\" width=\"400\" height=\"400\">\n                        <g transform=\"translate(200, 200)\">\n                            <path class=\"pie-segment\" data-index=\"0\" data-name=\"Wydatki na realizacj\u0119 zada\u0144 edukacyjnych (Dz. 801&#044; 854)\" data-value=\"75140498.28\" data-percentage=\"38.0\" data-offset-x=\"11.16\" data-offset-y=\"-4.41\" transform=\"translate(0, 0)\" d=\"M 0 0 L 1.1021821192326E-14 -180 A 180 180 0 0 1 123.09051776529 131.33439928774 Z\" fill=\"#078236\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"1\" data-name=\"Pomoc spo\u0142eczna (Dz. 852&#044; 853&#044;  855)\" data-value=\"43043957.75\" data-percentage=\"21.8\" data-offset-x=\"0.83\" data-offset-y=\"11.97\" transform=\"translate(0, 0)\" d=\"M 0 0 L 123.09051776529 131.33439928774 A 180 180 0 0 1 -103.89439345155 146.989642524 Z\" fill=\"#ec6a8a\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"2\" data-name=\"Administracja publiczna (Dz. 750)\" data-value=\"26224327.56\" data-percentage=\"13.3\" data-offset-x=\"-10.30\" data-offset-y=\"6.16\" transform=\"translate(0, 0)\" d=\"M 0 0 L -103.89439345155 146.989642524 A 180 180 0 0 1 -178.66459642392 21.885200128774 Z\" fill=\"#ECE80A\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"3\" data-name=\"Transport i \u0142\u0105czno\u015b\u0107 (Dz. 600)\" data-value=\"19358839.25\" data-percentage=\"9.8\" data-offset-x=\"-11.79\" data-offset-y=\"-2.22\" transform=\"translate(0, 0)\" d=\"M 0 0 L -178.66459642392 21.885200128774 A 180 180 0 0 1 -158.52264698135 -85.267639782189 Z\" fill=\"#0693E3\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"4\" data-name=\"Bezpiecze\u0144stwo publiczne i ochrona przeciwpo\u017carowa oraz obrona narodowa (Dz. 752&#044; 754)\" data-value=\"13907635.39\" data-percentage=\"7.0\" data-offset-x=\"-9.06\" data-offset-y=\"-7.86\" transform=\"translate(0, 0)\" d=\"M 0 0 L -158.52264698135 -85.267639782189 A 180 180 0 0 1 -106.80082080363 -144.89163079927 Z\" fill=\"#FE0000\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"5\" data-name=\"Gospodarka mieszkaniowa (Dz. 700)\" data-value=\"10446140.39\" data-percentage=\"5.3\" data-offset-x=\"-5.43\" data-offset-y=\"-10.70\" transform=\"translate(0, 0)\" d=\"M 0 0 L -106.80082080363 -144.89163079927 A 180 180 0 0 1 -53.732414710232 -171.79297892931 Z\" fill=\"#5f27cd\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"6\" data-name=\"Pozosta\u0142e (Dz. 010&#044; 020&#044; 100&#044; 755&#044; 757&#044; 900&#044; 921&#044; 926)\" data-value=\"4630951\" data-percentage=\"2.3\" data-offset-x=\"-2.73\" data-offset-y=\"-11.69\" transform=\"translate(0, 0)\" d=\"M 0 0 L -53.732414710232 -171.79297892931 A 180 180 0 0 1 -27.95287930236 -177.81629998037 Z\" fill=\"#00d2d3\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"7\" data-name=\"Ochrona zdrowia (Dz. 851)\" data-value=\"2940858.93\" data-percentage=\"1.5\" data-offset-x=\"-1.31\" data-offset-y=\"-11.93\" transform=\"translate(0, 0)\" d=\"M 0 0 L -27.95287930236 -177.81629998037 A 180 180 0 0 1 -11.231909053362 -179.64922548961 Z\" fill=\"#ee16d2\" stroke=\"#fff\" stroke-width=\"2\" \/><path class=\"pie-segment\" data-index=\"8\" data-name=\"Dzia\u0142alno\u015b\u0107 us\u0142ugowa (Dz. 710)\" data-value=\"1964249.49\" data-percentage=\"1.0\" data-offset-x=\"-0.37\" data-offset-y=\"-11.99\" transform=\"translate(0, 0)\" d=\"M 0 0 L -11.231909053362 -179.64922548961 A 180 180 0 0 1 -3.3065463576979E-14 -180 Z\" fill=\"#54a0ff\" stroke=\"#fff\" stroke-width=\"2\" \/>                        <\/g>\n                    <\/svg>\n                <\/div>\n                \n                <div class=\"pie-legend\">\n                                            <div class=\"legend-item\" data-index=\"0\">\n                            <span class=\"legend-color\" style=\"background-color: #078236;\"><\/span>\n                            <span class=\"legend-label\">Wydatki na realizacj\u0119 zada\u0144 edukacyjnych (Dz. 801&#044; 854)<\/span>\n                            <span class=\"legend-value\">75 140 498,28 (38,0%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"1\">\n                            <span class=\"legend-color\" style=\"background-color: #ec6a8a;\"><\/span>\n                            <span class=\"legend-label\">Pomoc spo\u0142eczna (Dz. 852&#044; 853&#044;  855)<\/span>\n                            <span class=\"legend-value\">43 043 957,75 (21,8%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"2\">\n                            <span class=\"legend-color\" style=\"background-color: #ECE80A;\"><\/span>\n                            <span class=\"legend-label\">Administracja publiczna (Dz. 750)<\/span>\n                            <span class=\"legend-value\">26 224 327,56 (13,3%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"3\">\n                            <span class=\"legend-color\" style=\"background-color: #0693E3;\"><\/span>\n                            <span class=\"legend-label\">Transport i \u0142\u0105czno\u015b\u0107 (Dz. 600)<\/span>\n                            <span class=\"legend-value\">19 358 839,25 (9,8%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"4\">\n                            <span class=\"legend-color\" style=\"background-color: #FE0000;\"><\/span>\n                            <span class=\"legend-label\">Bezpiecze\u0144stwo publiczne i ochrona przeciwpo\u017carowa oraz obrona narodowa (Dz. 752&#044; 754)<\/span>\n                            <span class=\"legend-value\">13 907 635,39 (7,0%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"5\">\n                            <span class=\"legend-color\" style=\"background-color: #5f27cd;\"><\/span>\n                            <span class=\"legend-label\">Gospodarka mieszkaniowa (Dz. 700)<\/span>\n                            <span class=\"legend-value\">10 446 140,39 (5,3%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"6\">\n                            <span class=\"legend-color\" style=\"background-color: #00d2d3;\"><\/span>\n                            <span class=\"legend-label\">Pozosta\u0142e (Dz. 010&#044; 020&#044; 100&#044; 755&#044; 757&#044; 900&#044; 921&#044; 926)<\/span>\n                            <span class=\"legend-value\">4 630 951,00 (2,3%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"7\">\n                            <span class=\"legend-color\" style=\"background-color: #ee16d2;\"><\/span>\n                            <span class=\"legend-label\">Ochrona zdrowia (Dz. 851)<\/span>\n                            <span class=\"legend-value\">2 940 858,93 (1,5%)<\/span>\n                        <\/div>\n                                            <div class=\"legend-item\" data-index=\"8\">\n                            <span class=\"legend-color\" style=\"background-color: #54a0ff;\"><\/span>\n                            <span class=\"legend-label\">Dzia\u0142alno\u015b\u0107 us\u0142ugowa (Dz. 710)<\/span>\n                            <span class=\"legend-value\">1 964 249,49 (1,0%)<\/span>\n                        <\/div>\n                                    <\/div>\n            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    .pie-chart-section {\n        padding: 80px 20px;\n        background: #f5f7fa;\n    }\n    \n    .pie-chart-container {\n        max-width: 1200px;\n        margin: 0 auto;\n    }\n    \n    .pie-chart-section .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .pie-chart-section .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .pie-chart-section .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n        max-width: 800px;\n        margin: 0 auto;\n    }\n    \n    .pie-chart-content {\n        display: grid;\n        grid-template-columns: 450px 1fr;\n        gap: 60px;\n        align-items: start;\n    }\n    \n    .pie-chart-wrapper {\n        position: relative;\n        background: white;\n        border-radius: 12px;\n        padding: 30px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n    }\n    \n    .pie-chart-svg {\n        display: block;\n        margin: 0 auto;\n    }\n    \n    .pie-segment {\n        cursor: pointer;\n        \/* CSS transition tylko na stroke i filter - transform jest animowany przez JS\n           bezpo\u015brednio przez setAttribute na atrybucie SVG (nie CSS) *\/\n        transition: stroke 0.2s ease, stroke-width 0.2s ease, filter 0.2s ease;\n    }\n    \n    .pie-segment:hover,\n    .pie-segment.active {\n        filter: brightness(1.1);\n    }\n    \n    .pie-segment.active {\n        stroke: #333;\n        stroke-width: 3;\n    }\n    \n    .pie-legend {\n        background: white;\n        border-radius: 12px;\n        padding: 30px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        max-height: 600px;\n        overflow-y: auto;\n    }\n    \n    .legend-item {\n        display: grid;\n        grid-template-columns: 20px 1fr auto;\n        gap: 15px;\n        align-items: center;\n        padding: 12px;\n        border-radius: 6px;\n        transition: background 0.2s ease;\n        cursor: pointer;\n    }\n    \n    .legend-item:hover {\n        background: #f5f7fa;\n    }\n    \n    .legend-item.active {\n        background: #e8f4f8;\n        border-left: 4px solid #1e3c72;\n        padding-left: 8px;\n    }\n    \n    .legend-color {\n        width: 20px;\n        height: 20px;\n        border-radius: 50%;\n        display: block;\n    }\n    \n    .legend-label {\n        font-weight: 500;\n        color: #333;\n    }\n    \n    .legend-value {\n        font-weight: 600;\n        color: #2a5298;\n        white-space: nowrap;\n    }\n    \n    @media (max-width: 968px) {\n        .pie-chart-content {\n            grid-template-columns: 1fr;\n            gap: 40px;\n        }\n        \n        .pie-chart-wrapper {\n            max-width: 450px;\n            margin: 0 auto;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .pie-chart-wrapper {\n            padding: 20px;\n        }\n        \n        .pie-chart-svg {\n            width: 100%;\n            height: auto;\n        }\n        \n        .pie-legend {\n            padding: 20px;\n        }\n        \n        .legend-item {\n            grid-template-columns: 16px 1fr;\n            gap: 10px;\n        }\n        \n        .legend-value {\n            grid-column: 2;\n            font-size: 0.9rem;\n        }\n    }\n    <\/style>\n    \n    <script>\n    (function() {\n        try {\n            \/\/ Znajd\u017a wszystkie sekcje wykres\u00f3w ko\u0142owych na stronie (nie polegamy na ID)\n            const allPieSections = document.querySelectorAll('.pie-chart-section');\n            \n            allPieSections.forEach(function(chartSection) {\n                \/\/ Sprawd\u017a czy ju\u017c zainicjowano (zapobiega podw\u00f3jnemu attachowaniu)\n                if (chartSection.dataset.pieInitialized === 'true') return;\n                chartSection.dataset.pieInitialized = 'true';\n                \n                const segments = chartSection.querySelectorAll('.pie-segment');\n                const legendItems = chartSection.querySelectorAll('.legend-item');\n                \n                if (segments.length === 0) return;\n                \n                \/\/ Mapa pozycji (klucz = element, warto\u015b\u0107 = {x, y})\n                const positions = new Map();\n                const animFrames = new Map();\n                \n                segments.forEach(function(s) {\n                    positions.set(s, { x: 0, y: 0 });\n                });\n                \n                function animateTo(element, targetX, targetY, duration) {\n                    \/\/ Pobierz AKTUALN\u0104 pozycj\u0119 - parsuj atrybut transform (nie z mapy!)\n                    \/\/ Mapa mo\u017ce mie\u0107 nieaktualne dane je\u015bli poprzednia animacja zosta\u0142a przerwana\n                    let startX = 0;\n                    let startY = 0;\n                    const currentTransform = element.getAttribute('transform');\n                    if (currentTransform) {\n                        const match = currentTransform.match(\/translate\\(([-\\d.]+)[\\s,]+([-\\d.]+)\\)\/);\n                        if (match) {\n                            startX = parseFloat(match[1]);\n                            startY = parseFloat(match[2]);\n                        }\n                    }\n                    \n                    \/\/ Anuluj poprzedni\u0105 animacj\u0119\n                    if (animFrames.has(element)) {\n                        cancelAnimationFrame(animFrames.get(element));\n                        animFrames.delete(element);\n                    }\n                    \n                    \/\/ Sprawdz czy juz jestesmy na miejscu\n                    const dx = Math.abs(startX - targetX);\n                    const dy = Math.abs(startY - targetY);\n                    if (dx < 0.1) {\n                        if (dy < 0.1) {\n                            \/\/ Ju\u017c na miejscu - zapisz ko\u0144cow\u0105 pozycj\u0119\n                            positions.set(element, { x: targetX, y: targetY });\n                            return;\n                        }\n                    }\n                    \n                    const startTime = performance.now();\n                    \n                    function easeOutBack(t) {\n                        const c1 = 1.70158;\n                        const c3 = c1 + 1;\n                        return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n                    }\n                    \n                    function step(now) {\n                        const progress = Math.min((now - startTime) \/ duration, 1);\n                        const eased = easeOutBack(progress);\n                        const x = startX + (targetX - startX) * eased;\n                        const y = startY + (targetY - startY) * eased;\n                        \n                        element.setAttribute('transform', 'translate(' + x.toFixed(2) + ' ' + y.toFixed(2) + ')');\n                        \/\/ Aktualizuj map\u0119 z LIVE pozycj\u0105 (nie tylko ko\u0144cow\u0105) - aby kolejne wywo\u0142anie mia\u0142o aktualne dane\n                        positions.set(element, { x: x, y: y });\n                        \n                        if (progress < 1) {\n                            animFrames.set(element, requestAnimationFrame(step));\n                        } else {\n                            \/\/ Animacja zako\u0144czona - upewnij si\u0119 \u017ce jeste\u015bmy dok\u0142adnie na targetX\/Y\n                            positions.set(element, { x: targetX, y: targetY });\n                            element.setAttribute('transform', 'translate(' + targetX.toFixed(2) + ' ' + targetY.toFixed(2) + ')');\n                            animFrames.delete(element);\n                        }\n                    }\n                    \n                    animFrames.set(element, requestAnimationFrame(step));\n                }\n                \n                function activateSegment(segment) {\n                    const offsetX = parseFloat(segment.getAttribute('data-offset-x')) || 0;\n                    const offsetY = parseFloat(segment.getAttribute('data-offset-y')) || 0;\n                    segment.classList.add('active');\n                    animateTo(segment, offsetX, offsetY, 350);\n                }\n                \n                function deactivateAll() {\n                    segments.forEach(function(s) {\n                        s.classList.remove('active');\n                        animateTo(s, 0, 0, 300);\n                    });\n                    legendItems.forEach(function(l) {\n                        l.classList.remove('active');\n                    });\n                }\n                \n                \/\/ Pomocnicza funkcja: przewija kontener legendy aby aktywna pozycja by\u0142a widoczna\n                \/\/ (NIE u\u017cywamy scrollIntoView bo przewija ca\u0142\u0105 stron\u0119 - tylko wewn\u0119trzny kontener)\n                function scrollLegendToItem(legendItem) {\n                    const legendContainer = chartSection.querySelector('.pie-legend');\n                    if (!legendContainer) return;\n                    if (!legendItem) return;\n                    \n                    \/\/ Sprawdz czy element jest poza widoczn\u0105 cz\u0119\u015bci\u0105 kontenera\n                    const containerRect = legendContainer.getBoundingClientRect();\n                    const itemRect = legendItem.getBoundingClientRect();\n                    \n                    \/\/ Je\u015bli element jest powy\u017cej widocznej cz\u0119\u015bci\n                    if (itemRect.top < containerRect.top) {\n                        const offset = itemRect.top - containerRect.top;\n                        legendContainer.scrollBy({ top: offset - 10, behavior: 'smooth' });\n                    }\n                    \/\/ Je\u015bli element jest poni\u017cej widocznej cz\u0119\u015bci\n                    else if (itemRect.bottom > containerRect.bottom) {\n                        const offset = itemRect.bottom - containerRect.bottom;\n                        legendContainer.scrollBy({ top: offset + 10, behavior: 'smooth' });\n                    }\n                }\n                \n                segments.forEach(function(segment) {\n                    segment.addEventListener('mouseenter', function() {\n                        const idx = segment.getAttribute('data-index');\n                        \n                        segments.forEach(function(s) {\n                            if (s !== segment) {\n                                s.classList.remove('active');\n                                animateTo(s, 0, 0, 300);\n                            }\n                        });\n                        legendItems.forEach(function(l) {\n                            l.classList.remove('active');\n                        });\n                        \n                        activateSegment(segment);\n                        \n                        const legendItem = chartSection.querySelector('.legend-item[data-index=\"' + idx + '\"]');\n                        if (legendItem) {\n                            legendItem.classList.add('active');\n                            \/\/ Auto-scroll legenda do aktywnej pozycji\n                            scrollLegendToItem(legendItem);\n                        }\n                    });\n                    \n                    segment.addEventListener('mouseleave', deactivateAll);\n                });\n                \n                legendItems.forEach(function(item) {\n                    item.addEventListener('mouseenter', function() {\n                        const idx = item.getAttribute('data-index');\n                        \n                        segments.forEach(function(s) {\n                            s.classList.remove('active');\n                            animateTo(s, 0, 0, 300);\n                        });\n                        legendItems.forEach(function(l) {\n                            l.classList.remove('active');\n                        });\n                        \n                        item.classList.add('active');\n                        \n                        const segment = chartSection.querySelector('.pie-segment[data-index=\"' + idx + '\"]');\n                        if (segment) {\n                            activateSegment(segment);\n                        }\n                    });\n                    \n                    item.addEventListener('mouseleave', deactivateAll);\n                });\n            });\n        } catch (e) {\n            console.error('Pie chart init error:', e);\n        }\n    })();\n    <\/script>\n    \n    \n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-24db0bbb888abc2551f549f64dcd9012\" style=\"color:#14357a\">Wydatki Powiatu \u017byrardowskiego wed\u0142ug dzia\u0142\u00f3w<\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Dzia\u0142<\/th><th>Opis<\/th><th class=\"has-text-align-right\" data-align=\"right\">Warto\u015b\u0107 w z\u0142<\/th><\/tr><\/thead><tbody><tr><td>801<\/td><td>O\u015bwiata i wychowanie<\/td><td class=\"has-text-align-right\" data-align=\"right\">64 858 616,09<\/td><\/tr><tr><td>852<\/td><td>Pomoc spo\u0142eczna<\/td><td class=\"has-text-align-right\" data-align=\"right\">27 546 151,50<\/td><\/tr><tr><td>750<\/td><td>Administracja publiczna<\/td><td class=\"has-text-align-right\" data-align=\"right\">26&nbsp;224&nbsp;327,56<\/td><\/tr><tr><td>600<\/td><td>Transport i \u0142\u0105czno\u015b\u0107<\/td><td class=\"has-text-align-right\" data-align=\"right\">19&nbsp;358&nbsp;839,25<\/td><\/tr><tr><td>754<\/td><td>Bezpiecze\u0144stwo publiczne i ochrona przeciwpo\u017carowa<\/td><td class=\"has-text-align-right\" data-align=\"right\">11&nbsp;557&nbsp;629,09<\/td><\/tr><tr><td>700<\/td><td>Gospodarka mieszkaniowa<\/td><td class=\"has-text-align-right\" data-align=\"right\">10&nbsp;446&nbsp;140,39<\/td><\/tr><tr><td>854<\/td><td>Edukacyjna opieka wychowawcza <\/td><td class=\"has-text-align-right\" data-align=\"right\">10&nbsp;281&nbsp;882,19<\/td><\/tr><tr><td>855<\/td><td>Rodzina<\/td><td class=\"has-text-align-right\" data-align=\"right\">9&nbsp;989&nbsp;144,73<\/td><\/tr><tr><td>853<\/td><td>Pozosta\u0142e zadania w zakresie polityki spo\u0142ecznej<\/td><td class=\"has-text-align-right\" data-align=\"right\">5&nbsp;508&nbsp;661,52<\/td><\/tr><tr><td>851<\/td><td>Ochrona zdrowia <\/td><td class=\"has-text-align-right\" data-align=\"right\">2&nbsp;940&nbsp;858,93<\/td><\/tr><tr><td>752<\/td><td>Obrona narodowa <\/td><td class=\"has-text-align-right\" data-align=\"right\">2&nbsp;350&nbsp;006,30<\/td><\/tr><tr><td>710<\/td><td>Dzia\u0142alno\u015b\u0107 us\u0142ugowa <\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;964&nbsp;249,49<\/td><\/tr><tr><td>757<\/td><td>Obs\u0142uga d\u0142ugu publicznego <\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;775&nbsp;453,74<\/td><\/tr><tr><td>921<\/td><td>Kultura i ochrona dziedzictwa narodowego <\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;690&nbsp;107,49<\/td><\/tr><tr><td>900<\/td><td>Gospodarka komunalna i ochrona \u015brodowiska <\/td><td class=\"has-text-align-right\" data-align=\"right\">523&nbsp;078,85<\/td><\/tr><tr><td>926<\/td><td>Kultura fizyczna <\/td><td class=\"has-text-align-right\" data-align=\"right\">307&nbsp;254,25<\/td><\/tr><tr><td>755<\/td><td>Wymiar sprawiedliwo\u015bci <\/td><td class=\"has-text-align-right\" data-align=\"right\">219&nbsp;739,95<\/td><\/tr><tr><td>010<\/td><td>Rolnictwo i \u0142owiectwo <\/td><td class=\"has-text-align-right\" data-align=\"right\">82&nbsp;158,56<\/td><\/tr><tr><td>100<\/td><td>G\u00f3rnictwo i kopalnictwo <\/td><td class=\"has-text-align-right\" data-align=\"right\">31&nbsp;316,04<\/td><\/tr><tr><td>020<\/td><td>Le\u015bnictwo <\/td><td class=\"has-text-align-right\" data-align=\"right\">1&nbsp;842,12<\/td><\/tr><tr><td><\/td><td><strong>Razem<\/strong><\/td><td class=\"has-text-align-right\" data-align=\"right\"><strong>197<\/strong>&nbsp;<strong>657<\/strong>&nbsp;<strong>458,04<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W 2025 r. Powiat \u017byrardowski najwi\u0119cej \u015brodk\u00f3w przeznacza\u0142 na realizacj\u0119 zada\u0144 z obszaru edukacji i wychowania. Uwzgl\u0119dniaj\u0105c wydatki poniesione w dziale 854 \u2013 Edukacyjna opieka wychowawcza, og\u00f3\u0142 wydatk\u00f3w o\u015bwiatowych wyni\u00f3s\u0142 ponad 75,14 mln z\u0142 i stanowi\u0142 38,02% og\u00f3\u0142u wydatk\u00f3w. Obecno\u015b\u0107 wydatk\u00f3w o\u015bwiatowych na pierwszym miejscu w strukturze wydatk\u00f3w powiatu wpisuje si\u0119 w standardowy obraz tej cz\u0119\u015bci bud\u017cetu wi\u0119kszo\u015bci powiat\u00f3w w Polsce.<br>Drugim co do wielko\u015bci obszarem wydatk\u00f3w by\u0142y zadania realizowane w zakresie wsparcia mieszka\u0144c\u00f3w w ramach pomocy spo\u0142ecznej, wsparcia rodziny i pozosta\u0142ych zada\u0144 z zakresu polityki spo\u0142ecznej \u2013 obszar wi\u0105\u017c\u0105cy si\u0119 w g\u0142\u00f3wnej mierze z kosztami pieczy zast\u0119pczej i utrzymaniem dom\u00f3w pomocy spo\u0142ecznej. W 2025 r. zrealizowano wydatki na poziomie 43,04 mln z\u0142 (suma wydatk\u00f3w w dziale 852 \u2013 Pomoc spo\u0142eczna, 853 \u2013 Pozosta\u0142e zadania w zakresie pomocy spo\u0142ecznej, 855 \u2013 Rodzina). Istotne by\u0142o r\u00f3wnie\u017c utrzymanie administracji, kt\u00f3re wynios\u0142o prawie 26,22 mln z\u0142, co stanowi\u0142o blisko 13,27% wydatk\u00f3w bud\u017cetowych powiatu. Du\u017c\u0105 wag\u0119 stanowi\u0142y wydatki przeznaczone na transport i \u0142\u0105czno\u015b\u0107, w tym remont i budow\u0119 dr\u00f3g, kt\u00f3re stanowi\u0142y 9,79 % og\u00f3\u0142u wydatk\u00f3w bud\u017cetowych. Kolejnym co do wielko\u015bci kierunkiem wydatk\u00f3w by\u0142o bezpiecze\u0144stwo publiczne i ochrona przeciwpo\u017carowa oraz obrona narodowa (suma wydatk\u00f3w w dziale 752 i 754). Wydatki w tym obszarze zrealizowano w kwocie prawie 13,91 mln z\u0142, w tym na zadania z programu Ochrony Ludno\u015bci i Obrony Cywilnej. Sz\u00f3stym co do wielko\u015bci dzia\u0142em by\u0142a gospodarka mieszkaniowa na kt\u00f3r\u0105 wydatkowano 10,45 mln z\u0142otych co stanowi 5,28 % og\u00f3\u0142u wydatk\u00f3w . Sze\u015b\u0107 wymienionych powy\u017cej obszar\u00f3w dzia\u0142alno\u015bci Powiatu stanowi\u0142o \u0142\u0105cznie 95,18% bud\u017cetu wydatk\u00f3w.<\/p>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-ab69f22ff780fd076b755009d5d4f57f\" style=\"color:#14357a\">ZAD\u0141U\u017bENIE<\/h1>\n\n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        \n            <div class=\"stats-grid stats-grid-2\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Zad\u0142u\u017cenie powiatu na koniec 2025 r.<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"44080642.96\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Zad\u0142u\u017cenie na mieszka\u0144ca na koniec 2025 r.<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"589\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        \n            <div class=\"stats-grid stats-grid-3\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Wynik bud\u017cetu bie\u017c\u0105cego<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"7695809.47\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">Zad\u0142u\u017cenie w stosunku do dochod\u00f3w<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"23.09\"\n                                  data-suffix=\" %\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #14357a;\">kOSZT OBS\u0141UGI D\u0141UGU NA MIESZKA\u0143CA<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"23.72\"\n                                  data-suffix=\" z\u0142\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #14357a;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n\n<p>Zad\u0142u\u017cenie Powiatu \u017byrardowskiego na koniec 2025 r. wynios\u0142o 44,08 mln z\u0142, tj, 23,09 % dochod\u00f3w. Poziom wygenerowanej w 2025 r. nadwy\u017cki operacyjnej zapewnia bezpiecze\u0144stwo finansowe, r\u00f3wnie\u017c w zakresie spe\u0142nienia ustawowej relacji zad\u0142u\u017cenia, o kt\u00f3rej mowa w art. 242-244 ustawy o finansach publicznych.<\/p>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-fbf25b02584d0f51d60712194fd2b5f3\" style=\"color:#14357a\">WYNIK BUD\u017bETU 2025 ROKU<\/h1>\n\n\n\n<p>W 2025 roku Powiat \u017byrardowski zaplanowa\u0142 deficyt w wysoko\u015bci <strong>15.000.000,00 z\u0142<\/strong>. <br>Ostatecznie deficyt okaza\u0142 si\u0119 du\u017co ni\u017cszy i wyni\u00f3s\u0142 tylko <strong>6.752.579,72 z\u0142<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>DOCHODY Dochody Powiatu \u017byrardowskiego wed\u0142ug klasyfikacji bud\u017cetowej Paragraf Opis Warto\u015b\u0107&nbsp;w&nbsp;z\u0142 001 Wp\u0142ywy podatku dochodowego od os\u00f3b fizycznych 81&nbsp;994&nbsp;578,41 083 Wp\u0142ywy z us\u0142ug 17 026 144,84 292 Subwencje og\u00f3lne z bud\u017cetu&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-536","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/536","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/comments?post=536"}],"version-history":[{"count":153,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/536\/revisions"}],"predecessor-version":[{"id":2979,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/536\/revisions\/2979"}],"wp:attachment":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/media?parent=536"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}