{"id":575,"date":"2026-04-24T13:36:18","date_gmt":"2026-04-24T11:36:18","guid":{"rendered":"http:\/\/192.168.2.11\/?page_id=575"},"modified":"2026-05-11T16:08:41","modified_gmt":"2026-05-11T14:08:41","slug":"wspolpraca-z-organizacjami-pozarzadowymi","status":"publish","type":"page","link":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wspolpraca-z-organizacjami-pozarzadowymi\/","title":{"rendered":"Wsp\u00f3\u0142praca z organizacjami pozarz\u0105dowymi"},"content":{"rendered":"    <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;\">Na terenie Powiatu \u017byrardowskiego funkcjonuje blisko<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"300\"\n                                  data-suffix=\" organizacji pozarz\u0105dowych\"\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;\">WI\u0118KSZO\u015a\u0106 Z NICH PROWADZI AKTYWN\u0104 DZIA\u0141ALNO\u015a\u0106<\/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<h5 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-fd28507fed2b4f45484a2f45e6bbb72d\" style=\"color:#14357a\">Program Wsp\u00f3\u0142pracy Powiatu \u017byrardowskiego z Organizacjami Pozarz\u0105dowymi w 2025 r. zosta\u0142 uchwalony przez Rad\u0119 Powiatu \u017byrardowskiego w dniu 27 listopada 2024 r. (Uchwa\u0142a Nr VII\/56\/24).<\/h5>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h5 class=\"wp-block-heading has-text-color has-link-color wp-elements-e9340320aac6fe75ed1ba9988235147f\" style=\"color:#14357a\"><strong>Priorytetowe zadania publiczne zawarte w Programie obj\u0119\u0142y nast\u0119puj\u0105ce obszary:&nbsp;<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>propagowanie i rozw\u00f3j kultury fizycznej i sportu, w tym gimnastyki akrobatycznej i ta\u0144ca na terenie Powiatu \u017byrardowskiego, ze szczeg\u00f3lnym uwzgl\u0119dnieniem dzieci i m\u0142odzie\u017cy z teren\u00f3w wiejskich,<\/li>\n\n\n\n<li>wspieranie i organizacja wydarze\u0144 anga\u017cuj\u0105cych mieszka\u0144c\u00f3w powiatu w \u017cycie kulturalne, takich jak: konferencje, festyny, inscenizacje, konkursy, warsztaty, wystawy oraz inne maj\u0105ce znaczenie dla rozwoju kultury oraz ochrony dziedzictwa narodowego,<\/li>\n\n\n\n<li>podnoszenie bezpiecze\u0144stwa mieszka\u0144c\u00f3w Powiatu, w tym dofinansowanie do zakupu sprz\u0119tu potrzebnego do podejmowania dzia\u0142a\u0144 ratowniczych, imprez, piknik\u00f3w zwi\u0119kszaj\u0105cych \u015bwiadomo\u015b\u0107 mieszka\u0144c\u00f3w na temat bezpiecze\u0144stwa,<\/li>\n\n\n\n<li>pomoc w integracji spo\u0142ecznej, w tym pomoc rodzinom i osobom w trudnej sytuacji \u017cyciowej, wyr\u00f3wnywanie szans tych rodzin i os\u00f3b oraz wspieranie rodziny i systemu pieczy zast\u0119pczej,<\/li>\n\n\n\n<li>dzia\u0142alno\u015b\u0107 na rzecz os\u00f3b niepe\u0142nosprawnych, w tym wieloprofilowe usprawnianie dzieci i m\u0142odzie\u017cy oraz os\u00f3b w wieku emerytalnym,<\/li>\n\n\n\n<li>wspieranie przedsi\u0119wzi\u0119\u0107 maj\u0105cych na celu ochron\u0119 \u015brodowiska i przyrody, w tym dzia\u0142a\u0144 edukacyjnych z zakresu ekologii, ochrony zwierz\u0105t i dziedzictwa przyrodniczego.<br><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h5 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-33e5a25c03a07b39d4807cedea3f919c\" style=\"color:#14357a\">OTWARTE KONKURSY OFERT<\/h5>\n\n\n\n<p>Zgodnie z Rozdzia\u0142em VI Programu Wsp\u00f3\u0142pracy Powiatu \u017byrardowskiego z Organizacjami Pozarz\u0105dowymi na 2025 r.&nbsp;program by\u0142 realizowany w okresie <strong>od 1 stycznia do 31 grudnia 2025 r.&nbsp;<\/strong><br><\/p>\n\n\n\n<h5 class=\"wp-block-heading has-text-color has-link-color wp-elements-feae6d69afbc25257ca254ee167f97d7\" style=\"color:#14357a\"><strong>W roku 2025 roku Zarz\u0105d Powiatu \u017byrardowskiego og\u0142osi\u0142 otwarte konkursy ofert na realizacj\u0119 nast\u0119puj\u0105cych priorytetowych zada\u0144 publicznych:<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-black-color has-text-color has-link-color wp-elements-b859f0a3e20b21f76f579a8468d08e4e\"><a>propagowanie i rozw\u00f3j kultury fizycznej i sportu, w tym gimnastyki akrobatycznej i ta\u0144ca<br>na terenie Powiatu \u017byrardowskiego, ze szczeg\u00f3lnym uwzgl\u0119dnieniem dzieci i m\u0142odzie\u017cy z teren\u00f3w wiejskich<\/a>,<\/li>\n\n\n\n<li>wspieranie i organizacja wydarze\u0144 anga\u017cuj\u0105cych mieszka\u0144c\u00f3w powiatu w \u017cycie kulturalne,<br>takich, jak: konferencje, festyny, inscenizacje, konkursy, warsztaty, wystawy oraz inne maj\u0105ce znaczenie dla rozwoju kultury oraz ochrony dziedzictwa narodowego,<\/li>\n\n\n\n<li>podnoszenie bezpiecze\u0144stwa mieszka\u0144c\u00f3w Powiatu, w tym dofinansowanie do zakupu sprz\u0119tu potrzebnego do podejmowania dzia\u0142a\u0144 ratowniczych, imprez, piknik\u00f3w zwi\u0119kszaj\u0105cych \u015bwiadomo\u015b\u0107 mieszka\u0144c\u00f3w na temat bezpiecze\u0144stwa,<\/li>\n\n\n\n<li>pomoc w integracji spo\u0142ecznej, w tym pomoc rodzinom i osobom w trudnej sytuacji \u017cyciowej, wyr\u00f3wnywanie szans tych rodzin i os\u00f3b oraz wspieranie rodziny i systemu pieczy zast\u0119pczej,<\/li>\n\n\n\n<li>dzia\u0142alno\u015b\u0107 na rzecz os\u00f3b niepe\u0142nosprawnych, w tym wieloprofilowe usprawnianie dzieci i m\u0142odzie\u017cy oraz os\u00f3b w wieku emerytalnym,<\/li>\n\n\n\n<li class=\"has-black-color has-text-color has-link-color wp-elements-cd7b27e95afc3772a0f03befa3fa4e1a\"><a>wspieranie przedsi\u0119wzi\u0119\u0107 maj\u0105cych na celu ochron\u0119 \u015brodowiska i przyrody, w tym dzia\u0142a\u0144 edukacyjnych z zakresu ekologii, ochrony zwierz\u0105t i dziedzictwa przyrodniczego<\/a>.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h6 class=\"wp-block-heading has-text-color has-link-color wp-elements-c611ede2a54153e8f92e653c78aab865\" style=\"color:#14357a\">oraz:<\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-black-color has-text-color has-link-color wp-elements-b4ab7bd33a30ae2ceef7fbdbb4edc0af\"><a>powierzenie prowadzenia punkt\u00f3w przeznaczonych na udzielanie nieodp\u0142atnej pomocy prawnej lub \u015bwiadczenie nieodp\u0142atnego poradnictwa obywatelskiego na terenie Powiatu \u017byrardowskiego w 2026 roku<\/a>,<\/li>\n\n\n\n<li class=\"has-black-color has-text-color has-link-color wp-elements-686c8145fa68d0d536f7cf19babea8ce\"><a>powierzenie realizacji zadania publicznego Powiatu \u017byrardowskiego z zakresu wspierania rodziny i systemu pieczy zast\u0119pczej \u2013 prowadzenie plac\u00f3wki opieku\u0144czo- wychowawczej typu rodzinnego w okresie <\/a><strong><a>od 01.01.2026 r. do 31.12.2026 r<\/a>.<\/strong><\/li>\n<\/ul>\n\n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        <div class=\"section-header\">\n                                    <h2 style=\"color: #1e3c72;\">W powy\u017cszych konkursach<\/h2>\n                                            <\/div>\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: #1e3c72;\">z\u0142o\u017cono \u0142\u0105cznie<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"47\"\n                                  data-suffix=\"\"\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;\">OFERT<\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">zawarto <\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"28\"\n                                  data-suffix=\"\"\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;\">UM\u00d3W NA REALIZACJ\u0118 ZADA\u0143 PUBLICZNYCH<\/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<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-15a565add37cde5c1d1bbff60cd607c1\" style=\"color:#14357a\">z nast\u0119puj\u0105cymi organizacjami:<\/h4>\n\n\n\n<p>W konkursie&nbsp;pn. <strong>\u201ePropagowanie i rozw\u00f3j kultury fizycznej i sportu<\/strong>&nbsp;<strong>na terenie Powiatu \u017byrardowskiego, ze szczeg\u00f3lnym uwzgl\u0119dnieniem dzieci i m\u0142odzie\u017cy z teren\u00f3w wiejskich, w tym gimnastyki akrobatycznej i ta\u0144ca\u201d:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stowarzyszenie \u201ePrzyby\u0142 i z\u0142apa\u0142 \u2013 Sportowe Emocje\u201d z siedzib\u0105 w \u017byrardowie,<\/li>\n\n\n\n<li class=\"has-black-color has-text-color has-link-color wp-elements-403b3890f332d9bf655ac3abaa34735e\">Uczniowski Klub Sportowy VIS Wiskitki <a>z siedzib\u0105 w Wiskitkach<\/a>,<\/li>\n\n\n\n<li>Gminny Klub Sportowy Volley Radziejowice z siedzib\u0105 w Radziejowicach,<\/li>\n\n\n\n<li>Akademia Pi\u0142karska \u017byrard\u00f3w \u017byrardowianka z siedzib\u0105 w \u017byrardowie,<\/li>\n\n\n\n<li>Klub Sportowy Pogo\u0144 Wiskitki z siedzib\u0105 w Wiskitkach,<\/li>\n\n\n\n<li>Ko\u0142o Gospody\u0144 Wiejskich w R\u00f3\u017canowie z siedzib\u0105 w R\u00f3\u017canowie,<\/li>\n\n\n\n<li>Stowarzyszenie Kultury Fizycznej FRESH z siedzib\u0105 w Mszczonowie,<\/li>\n\n\n\n<li>Okr\u0119g Polskiego Zwi\u0105zku W\u0119dkarskiego w Skierniewicach, Ko\u0142o Nr 016 w \u017byrardowie.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>W konkursie pn. <strong>\u201eWspieranie i organizacja wydarze\u0144 anga\u017cuj\u0105cych mieszka\u0144c\u00f3w powiatu w \u017cycie kulturalne, takich, jak: konferencje, festyny, inscenizacje, konkursy, warsztaty, wystawy oraz inne maj\u0105ce znaczenie dla rozwoju kultury oraz ochrony dziedzictwa narodowego\u201d<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-black-color has-text-color has-link-color wp-elements-75b79fcee2e51ec54d3361a67499bda4\">Maria\u0144ski Ruch Inicjatyw Ekonomiczno-Spo\u0142ecznych <a>z siedzib\u0105 w <\/a>Puszczy Maria\u0144skiej,<\/li>\n\n\n\n<li>Stowarzyszenie Kobiet z Problemem Onkologicznym \u201eAMAZONKI\u201d z siedzib\u0105 w \u017byrardowie,<\/li>\n\n\n\n<li>Stowarzyszenie Senior\u00f3w Wigor w Jesionce z siedzib\u0105 w Jesionce,<\/li>\n\n\n\n<li>Towarzystwo \u015apiewacze \u201eLIRA\u201d przy Centrum Kultury z siedzib\u0105 w \u017byrardowie,<\/li>\n\n\n\n<li>Ko\u0142o Gospody\u0144 Wiejskich \u201eGuzowianki\u201d z siedzib\u0105 w Guzowie,<\/li>\n\n\n\n<li>Fundacja Gwiazd z siedzib\u0105 w \u017byrardowie,<\/li>\n\n\n\n<li>Ko\u0142o Gospody\u0144 i Gospodarzy Wiejskich Nosy Poniatki z siedzib\u0105 w Nosach Poniatkach,<\/li>\n\n\n\n<li>Stowarzyszenie Zesp\u00f3\u0142 Folkowy \u201eWiskitczanki\u201d z siedzib\u0105 w Wiskitkach,<\/li>\n\n\n\n<li>Stowarzyszenie \u201eAktorzy i Przyjaciele Teatru 36\u201d z siedzib\u0105 w Mi\u0119dzyborowie,<\/li>\n\n\n\n<li>Towarzystwo \u015apiewacze \u201eECHO\u201d przy Centrum Kultury z siedzib\u0105 w \u017byrardowie.<\/li>\n<\/ul>\n\n\n\n<p><br>W konkursie pn. \u201e<strong>Podnoszenie bezpiecze\u0144stwa mieszka\u0144c\u00f3w Powiatu, w tym dofinansowanie do zakupu sprz\u0119tu potrzebnego do podejmowania dzia\u0142a\u0144 ratowniczych, imprez, piknik\u00f3w zwi\u0119kszaj\u0105cych \u015bwiadomo\u015b\u0107 mieszka\u0144c\u00f3w mieszka\u0144c\u00f3w na temat bezpiecze\u0144stwa\u201d<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u017byrardowski Klub Sportowy Thien Long z siedzib\u0105 w \u017byrardowie,<\/li>\n\n\n\n<li>Stowarzyszenie Sport Life z siedzib\u0105 w \u017byrardowie.<br><br><\/li>\n<\/ul>\n\n\n\n<p>W konkursie pn. \u201e<strong>Pomoc w integracji spo\u0142ecznej, w tym pomoc rodzinom i osobom w trudnej sytuacji \u017cyciowej, wyr\u00f3wnywanie szans tych rodzin i os\u00f3b oraz wspieranie rodziny i systemu pieczy zast\u0119pczej<\/strong>\u201d:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201eStowarzyszenie Atypowi\u201d z siedzib\u0105 w \u017byrardowie.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>W konkursie pn. \u201e<strong>Dzia\u0142alno\u015b\u0107 na rzecz os\u00f3b niepe\u0142nosprawnych, w tym wieloprofilowe usprawnianie dzieci i m\u0142odzie\u017cy oraz os\u00f3b w wieku emerytalnym<\/strong>\u201d:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-black-color has-text-color has-link-color wp-elements-84d11c457c028d248bca8dafdb85f8d0\">Stowarzyszenie Senior\u00f3w \u201ePROMYK\u201d w Bartnikach <a>z siedzib\u0105 w Bartnikach<\/a>,<\/li>\n\n\n\n<li>Stowarzyszenie R\u00f3wnych Szans z siedzib\u0105 w \u017byrardowie,<\/li>\n\n\n\n<li>Mi\u0119dzynarodowe Stowarzyszenie Kulturalne Krzywy Teatr z siedzib\u0105 w Bartnikach,<\/li>\n\n\n\n<li>Towarzystwo Przyjaci\u00f3\u0142 Dzieci, Oddzia\u0142 Powiatowy w \u017byrardowie.<br><br><\/li>\n<\/ul>\n\n\n\n<p>W konkursie pn. \u201e<strong>Wspieranie przedsi\u0119wzi\u0119\u0107 maj\u0105cych na celu ochron\u0119 \u015brodowiska i przyrody, w tym dzia\u0142a\u0144 edukacyjnych z zakresu ekologii, ochrony zwierz\u0105t i dziedzictwa przyrodniczego<\/strong>\u201d:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Okr\u0119g Polskiego Zwi\u0105zku W\u0119dkarskiego w Skierniewicach, Ko\u0142o Nr 016 w \u017byrardowie.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>W konkursie pn. \u201e<strong>Powierzenie&nbsp;<\/strong><strong>prowadzenia punkt\u00f3w przeznaczonych na udzielanie nieodp\u0142atnej pomocy prawnej&nbsp;lub \u015bwiadczenie nieodp\u0142atnego poradnictwa obywatelskiego na terenie Powiatu \u017byrardowskiego w 2026 roku\u201d:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201eFundacja M\u0142odzi Ludziom\u201d z siedzib\u0105 w \u0141odzi przy ulicy Sienkiewicza 80\/87, lok.12A, 90-057 \u0141\u00f3d\u017a.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>W konkursie pn. <strong>\u201ePowierzenie realizacji zadania publicznego Powiatu \u017byrardowskiego z zakresu wspierania rodziny i systemu pieczy zast\u0119pczej \u2013&nbsp;prowadzenie plac\u00f3wki opieku\u0144czo \u2013 wychowawczej&nbsp;typu rodzinnego w okresie od 1 stycznia 2026 r. do 31 grudnia 2026 <\/strong><strong>r.\u201d:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Europejska Fundacja na Rzecz Os\u00f3b Potrzebuj\u0105cych, z siedzib\u0105 w Gorzowie Wielkopolskim, wpisana do Krajowego Rejestru S\u0105dowego pod numerem 0000200541, z siedzib\u0105 w Gorzowie Wielkopolskim, przy ulicy Krasi\u0144skiego 8\/1.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h5 class=\"wp-block-heading has-text-color has-link-color wp-elements-c2a864a908b9d26d63178858ed1e11d7\" style=\"color:#14357a\"><strong>Ponadto Zarz\u0105d Powiatu \u017byrardowskiego zleci\u0142 realizacj\u0119 zada\u0144 publicznych w trybie art. 19 a Ustawy o po\u017cytku publicznymi i wolontariacie (tzw.\u201d ma\u0142e granty\u201d), organizacjom pozarz\u0105dowym. <\/strong><br><br><strong>By\u0142y to:<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stowarzyszenie \u201eNiezwykli\u201d<\/strong> na rzecz wspierania dzieci i m\u0142odzie\u017cy Specjalnego O\u015brodka Szkolno-Wychowawczego im. Marii Grzegorzewskiej w \u017byrardowie na realizacj\u0119 zadania publicznego pt. \u201ePoznaj\u0119, do\u015bwiadczam i dzia\u0142am samodzielnie. Doskonalenie samodzielno\u015bci uczni\u00f3w z niepe\u0142nosprawno\u015bciami\u201d,<\/li>\n\n\n\n<li><strong>\u201eKlub Sportowy BARD13\u201d<\/strong> z siedzib\u0105 w Franciszkowie na realizacj\u0119 zadania publicznego pt.\u201d Wspieranie i upowszechnianie bryd\u017ca sportowego poprzez uczestnictwo klub\u00f3w sportowych w rozgrywkach organizowanych przez zwi\u0105zki sportowe\u201d,<\/li>\n\n\n\n<li><strong>\u201eKlub Sportowy 4 WINNERS \u017bYRARD\u00d3W\u201d<\/strong> z siedzib\u0105 w \u017byrardowie na realizacj\u0119 zadania publicznego pt. \u201eFUTSAL CUP\u201d.<\/li>\n<\/ul>\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;\">Warto\u015b\u0107 udzielonych dotacji na realizacj\u0119 priorytetowych zada\u0144 publicznych okre\u015blonych w programie wsp\u00f3\u0142pracy z organizacjami pozarz\u0105dowymi na 2025 r.<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"330000\"\n                                  data-suffix=\",00 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<h3 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-78d13cad18e799dcdb2a092689762b26\" style=\"color:#14357a\">Warto\u015b\u0107 udzielonych dotacji&nbsp;w poszczeg\u00f3lnych obszarach w&nbsp;2025 r.<\/h3>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h5 class=\"wp-block-heading has-text-color has-link-color wp-elements-98d2e874a7061d63f82a0e6b01133f42\" style=\"color:#14357a\"><strong>Powiat \u017byrardowski udzieli\u0142 dotacji w nast\u0119puj\u0105cych wysoko\u015bciach na realizacj\u0119 nast\u0119puj\u0105cych zada\u0144:<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>w zakresie zadania pn. Propagowanie i rozw\u00f3j kultury fizycznej i sportu na terenie Powiatu \u017byrardowskiego, ze szczeg\u00f3lnym uwzgl\u0119dnieniem dzieci i m\u0142odzie\u017cy z teren\u00f3w wiejskich, w tym gimnastyki akrobatycznej i ta\u0144ca \u2013&nbsp;<strong>102.000 z\u0142,<\/strong><\/li>\n\n\n\n<li>w zakresie zadania pn. Wspieranie i organizacja wydarze\u0144 anga\u017cuj\u0105cych mieszka\u0144c\u00f3w powiatu w \u017cycie kulturalne, takich, jak: konferencje, festyny, inscenizacje, konkursy, warsztaty, wystawy oraz inne maj\u0105ce znaczenie dla rozwoju kultury oraz ochrony dziedzictwa narodowego \u2013&nbsp;<strong>118.000 z\u0142,<\/strong><\/li>\n\n\n\n<li>w zakresie zadania pn. Podnoszenie bezpiecze\u0144stwa mieszka\u0144c\u00f3w Powiatu, w tym dofinansowanie do zakupu sprz\u0119tu potrzebnego do podejmowania dzia\u0142a\u0144 ratowniczych, imprez, piknik\u00f3w zwi\u0119kszaj\u0105cych \u015bwiadomo\u015b\u0107 mieszka\u0144c\u00f3w na temat bezpiecze\u0144stwa \u2013&nbsp;<strong>20.000 z\u0142,<\/strong><\/li>\n\n\n\n<li class=\"has-black-color has-text-color has-link-color wp-elements-601a0ff3a4a528ca5e71e132759c26c7\">w zakresie zadania pn. <a>Pomoc w integracji spo\u0142ecznej, w tym pomoc rodzinom i osobom w trudnej sytuacji \u017cyciowej, wyr\u00f3wnywanie szans tych rodzin i os\u00f3b oraz wspieranie rodziny i systemu pieczy zast\u0119pczej <\/a>\u2013 <strong>10.000 z\u0142,<\/strong><\/li>\n\n\n\n<li class=\"has-black-color has-text-color has-link-color wp-elements-043d0cdd00af8cfd215568647d0daef9\">w zakresie zadania pn. <a>Dzia\u0142alno\u015b\u0107 na rzecz os\u00f3b<\/a>, niepe\u0142nosprawnych, w tym wieloprofilowe usprawnianie dzieci i m\u0142odzie\u017cy oraz os\u00f3b w wieku emerytalnym \u2013 <strong>70.000 z\u0142<\/strong>,<\/li>\n\n\n\n<li class=\"has-black-color has-text-color has-link-color wp-elements-b7fb3338d255f0dc27470e4a89a27650\">w zakresie zadania pn. <a>Wspieranie przedsi\u0119wzi\u0119\u0107 maj\u0105cych na celu ochron\u0119 \u015brodowiska i przyrody, w tym dzia\u0142a\u0144 edukacyjnych z zakresu ekologii, ochrony zwierz\u0105t i dziedzictwa przyrodniczego <\/a>\u2013 <strong>10.000 z\u0142<\/strong>,<\/li>\n\n\n\n<li>w zakresie zadania pn. Powierzenie prowadzenia punkt\u00f3w przeznaczonych na udzielanie nieodp\u0142atnej pomocy prawnej lub \u015bwiadczenie nieodp\u0142atnego poradnictwa obywatelskiego na terenie Powiatu \u017byrardowskiego w 2025 roku \u2013&nbsp;<strong>139.903,68 z\u0142,<\/strong><\/li>\n\n\n\n<li>w zakresie zadania pn. Powierzenie realizacji zadania publicznego Powiatu \u017byrardowskiego z zakresu wspierania rodziny i systemu pieczy zast\u0119pczej \u2013 prowadzenie plac\u00f3wki opieku\u0144czo &#8211; wychowawczej typu rodzinnego w okresie od 01.01.2025 r do 31.12. 2025 roku &#8211; <strong>613.838, 91 z\u0142<\/strong>,<\/li>\n\n\n\n<li>w 2025 r. obowi\u0105zywa\u0142a wieloletnia umowa ze Stowarzyszeniem R\u00f3wnych Szans na prowadzenie \u015arodowiskowego Domu Samopomocy w \u017byrardowie. Ze \u015brodk\u00f3w Wojewody Mazowieckiego przekazano kwot\u0119 \u2013&nbsp;<strong>1.348.270,80 z\u0142<\/strong>.<\/li>\n<\/ul>\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;\">\u0141\u0105cznie powiat udzieli\u0142<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"2432013\"\n                                  data-suffix=\",39 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;\">DOTACJI<\/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<h3 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-f5f5f89120960fe289d816203b9c18f8\" style=\"color:#14357a\">Liczba beneficjent\u00f3w zrealizowanych um\u00f3w<\/h3>\n\n\n\n<h5 class=\"wp-block-heading has-text-color has-link-color wp-elements-90ff05c5a3b69785fe7d594373e086e7\" style=\"color:#14357a\"><strong>Na podstawie danych z przed\u0142o\u017conych przez organizacje sprawozda\u0144 z realizacji zada\u0144 w 2025 roku:<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>w zakresie zadania pn. Propagowanie i rozw\u00f3j kultury fizycznej i sportu na terenie Powiatu \u017byrardowskiego, ze szczeg\u00f3lnym uwzgl\u0119dnieniem dzieci i m\u0142odzie\u017cy z teren\u00f3w wiejskich, w tym gimnastyki akrobatycznej i ta\u0144ca \u2013&nbsp;<strong>1297 os\u00f3b<\/strong>,<\/li>\n\n\n\n<li>w zakresie zadania pn. Wspieranie i organizacja wydarze\u0144 anga\u017cuj\u0105cych mieszka\u0144c\u00f3w powiatu w \u017cycie kulturalne, takich, jak: konferencje, festyny, inscenizacje, konkursy, warsztaty, wystawy oraz inne maj\u0105ce znaczenie dla rozwoju kultury oraz ochrony dziedzictwa narodowego \u2013 <strong>2605 os\u00f3b<\/strong>,<\/li>\n\n\n\n<li>w zakresie zadania pn. podnoszenie bezpiecze\u0144stwa mieszka\u0144c\u00f3w Powiatu, w tym dofinansowanie do zakupu sprz\u0119tu potrzebnego do podejmowania dzia\u0142a\u0144 ratowniczych, imprez, piknik\u00f3w zwi\u0119kszaj\u0105cych \u015bwiadomo\u015b\u0107 mieszka\u0144c\u00f3w na temat bezpiecze\u0144stwa \u2013&nbsp;<strong>170 os\u00f3b<\/strong>,<\/li>\n\n\n\n<li>w zakresie zadania pn. Pomoc w integracji spo\u0142ecznej, w tym pomoc rodzinom i osobom w trudnej sytuacji \u017cyciowej, wyr\u00f3wnywanie szans tych rodzin i os\u00f3b oraz wspieranie rodziny i systemu pieczy zast\u0119pczej \u2013&nbsp;<strong>45 os\u00f3b<\/strong>,<\/li>\n\n\n\n<li>w zakresie zadania pn. Wyr\u00f3wnywanie szans edukacyjnych dzieci i m\u0142odzie\u017cy zagro\u017conych niedostosowaniem spo\u0142ecznym, dzieci z rodzin ubogich i niewydolnych wychowawczo \u2013&nbsp;<strong>50 os\u00f3b<\/strong>,<\/li>\n\n\n\n<li>w zakresie zadania pn. Pomoc w integracji spo\u0142ecznej poprzez prowadzenie popo\u0142udniowego klubu dla doros\u0142ych os\u00f3b niepe\u0142nosprawnych \u2013&nbsp;<strong>40 os\u00f3b<\/strong>,<\/li>\n\n\n\n<li>w zakresie zadania pn. Dzia\u0142alno\u015b\u0107 na rzecz os\u00f3b niepe\u0142nosprawnych, w tym wieloprofilowe usprawnianie dzieci i m\u0142odzie\u017cy oraz os\u00f3b w wieku emerytalnym \u2013&nbsp;<strong>102 osoby,<\/strong><\/li>\n\n\n\n<li>w zakresie zadania pn. Wspieranie przedsi\u0119wzi\u0119\u0107 maj\u0105cych na celu ochron\u0119 \u015brodowiska i przyrody, w tym dzia\u0142a\u0144 edukacyjnych z zakresu ekologii, ochrony zwierz\u0105t i dziedzictwa przyrodniczego \u2013<strong>&nbsp;zakup 7 komplet\u00f3w <\/strong><strong>specjalistycznych ubra\u0144 dla stra\u017cy rybackiej,<\/strong><\/li>\n\n\n\n<li>w zakresie zadania pn. Powierzenie prowadzenia punkt\u00f3w przeznaczonych na udzielanie nieodp\u0142atnej pomocy prawnej lub \u015bwiadczenie nieodp\u0142atnego poradnictwa obywatelskiego na terenie Powiatu \u017byrardowskiego w 2025 roku <strong>\u2013 562 porady<\/strong>,<\/li>\n\n\n\n<li>w zakresie zadania pn. Powierzenie realizacji zadania publicznego Powiatu \u017byrardowskiego z zakresu wspierania rodziny i systemu pieczy zast\u0119pczej \u2013 prowadzenie plac\u00f3wki opieku\u0144czo- wychowawczej typu rodzinnego w okresie od 01.01.2025 r do 31.12. 2025 roku \u2013 <strong>8 os\u00f3b<\/strong>.<\/li>\n<\/ul>\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;\">\u0141\u0105cznie liczba beneficjent\u00f3w<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"4789 \"\n                                  data-suffix=\"\"\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    <section class=\"photo-gallery-section gallery-block-custom caption-overlay gallery-6a0630aa3780d has-lightbox\" \n             style=\"background-color: #f5f7fa;\"\n             data-lightbox-items='[{&quot;image&quot;:&quot;https:\\\/\\\/raport2025.powiat-zyrardowski.pl\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/20250520-IMG_9637-scaled.jpg&quot;,&quot;caption&quot;:&quot;&quot;,&quot;subCaption&quot;:&quot;&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/raport2025.powiat-zyrardowski.pl\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/20250507-IMG_9259-scaled.jpg&quot;,&quot;caption&quot;:&quot;&quot;,&quot;subCaption&quot;:&quot;&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/raport2025.powiat-zyrardowski.pl\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/20250516-IMG_9594-Poprawione-Szum-scaled.jpg&quot;,&quot;caption&quot;:&quot;&quot;,&quot;subCaption&quot;:&quot;&quot;}]'>\n        <div class=\"gallery-container\">\n                        \n            <div class=\"photo-gallery-grid\" style=\"grid-template-columns: repeat(3, 1fr); gap: 30px;\" data-columns=\"3\" data-spacing=\"30\">\n                                    <div class=\"gallery-item gallery-item-lightbox\" \n                                                  data-lightbox-index=\"0\">\n                                                    <div class=\"gallery-image-wrapper\" style=\"height: 250px;\">\n                                <img decoding=\"async\" src=\"https:\/\/raport2025.powiat-zyrardowski.pl\/wp-content\/uploads\/2026\/05\/20250520-IMG_9637-scaled.jpg\" alt=\"\" loading=\"lazy\" style=\"object-fit: cover;\">\n                                                            <\/div>\n                                                                        <\/div>\n                                    <div class=\"gallery-item gallery-item-lightbox\" \n                                                  data-lightbox-index=\"1\">\n                                                    <div class=\"gallery-image-wrapper\" style=\"height: 250px;\">\n                                <img decoding=\"async\" src=\"https:\/\/raport2025.powiat-zyrardowski.pl\/wp-content\/uploads\/2026\/05\/20250507-IMG_9259-scaled.jpg\" alt=\"\" loading=\"lazy\" style=\"object-fit: cover;\">\n                                                            <\/div>\n                                                                        <\/div>\n                                    <div class=\"gallery-item gallery-item-lightbox\" \n                                                  data-lightbox-index=\"2\">\n                                                    <div class=\"gallery-image-wrapper\" style=\"height: 250px;\">\n                                <img decoding=\"async\" src=\"https:\/\/raport2025.powiat-zyrardowski.pl\/wp-content\/uploads\/2026\/05\/20250516-IMG_9594-Poprawione-Szum-scaled.jpg\" alt=\"\" loading=\"lazy\" style=\"object-fit: cover;\">\n                                                            <\/div>\n                                                                        <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    .gallery-block-custom .gallery-container {\n        max-width: 1400px;\n        margin: 0 auto;\n        padding: 80px 20px;\n    }\n    \n    .gallery-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .gallery-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .gallery-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .gallery-block-custom .photo-gallery-grid {\n        display: grid;\n    }\n    \n    .gallery-block-custom .gallery-item {\n        position: relative;\n        overflow: hidden;\n        border-radius: 12px;\n        box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease;\n    }\n    \n    .gallery-block-custom .gallery-item:hover {\n        transform: translateY(-5px);\n    }\n    \n    .gallery-block-custom .gallery-image-wrapper {\n        position: relative;\n        width: 100%;\n        overflow: hidden;\n    }\n    \n    .gallery-block-custom .gallery-image-wrapper img {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n    }\n    \n    .gallery-block-custom .gallery-caption-below {\n        padding: 12px 16px;\n        background: #fff;\n        font-size: 0.95rem;\n        text-align: center;\n    }\n    \n    .gallery-block-custom .gallery-caption-below .gallery-caption,\n    .gallery-block-custom .gallery-overlay .gallery-caption {\n        display: block;\n        text-align: center;\n        width: 100%;\n    }\n    \n    .gallery-block-custom .gallery-sub-caption {\n        display: block;\n        text-align: center;\n        width: 100%;\n        font-size: 0.85rem;\n        font-weight: 400;\n        text-transform: none !important;\n        margin-top: 4px;\n    }\n    \n    .gallery-block-custom .gallery-overlay {\n        position: absolute;\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        background: rgba(30, 60, 114, 0.9);\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        opacity: 0;\n        transition: opacity 0.3s ease;\n    }\n    \n    .gallery-block-custom .gallery-item:hover .gallery-overlay {\n        opacity: 1;\n    }\n    \n    .gallery-block-custom .gallery-caption {\n        color: white;\n        font-size: 1.1rem;\n        font-weight: 600;\n        padding: 0 20px;\n        text-align: center;\n    }\n    \n    .gallery-block-custom .gallery-arrow {\n        color: white;\n        font-size: 2rem;\n        margin-top: 15px;\n    }\n    \n    @media (max-width: 768px) {\n        .gallery-block-custom .photo-gallery-grid {\n            display: block !important;\n            grid-template-columns: 1fr !important;\n        }\n        \n        .gallery-block-custom .gallery-item {\n            width: 100% !important;\n            margin-bottom: 20px;\n        }\n        \n        .gallery-block-custom .gallery-item:last-child {\n            margin-bottom: 0;\n        }\n        \n        .gallery-block-custom .gallery-container {\n            padding-left: 10px !important;\n            padding-right: 10px !important;\n        }\n        \n        .gallery-block-custom.photo-gallery-section {\n            padding: 30px 0 !important;\n        }\n    }\n    <\/style>\n    \n        <style>\n    \/* Lightbox styles - only applied when enabled *\/\n    .gallery-block-custom.has-lightbox .gallery-item-lightbox {\n        cursor: zoom-in;\n    }\n    \n    .gallery-lightbox-overlay {\n        display: none;\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100vw;\n        height: 100vh;\n        background: rgba(0, 0, 0, 0.92);\n        z-index: 999999;\n        align-items: center;\n        justify-content: center;\n        opacity: 0;\n        transition: opacity 0.25s ease;\n    }\n    \n    .gallery-lightbox-overlay.active {\n        display: flex;\n        opacity: 1;\n    }\n    \n    .gallery-lightbox-content {\n        position: relative;\n        max-width: 92vw;\n        max-height: 88vh;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n    }\n    \n    .gallery-lightbox-image-wrapper {\n        max-width: 92vw;\n        max-height: 80vh;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n    }\n    \n    .gallery-lightbox-image {\n        max-width: 92vw;\n        max-height: 80vh;\n        width: auto;\n        height: auto;\n        object-fit: contain;\n        box-shadow: 0 8px 40px rgba(0,0,0,0.5);\n        border-radius: 4px;\n        opacity: 0;\n        transform: scale(0.96);\n        transition: opacity 0.25s ease, transform 0.25s ease;\n    }\n    \n    .gallery-lightbox-image.visible {\n        opacity: 1;\n        transform: scale(1);\n    }\n    \n    .gallery-lightbox-caption {\n        margin-top: 18px;\n        text-align: center;\n        color: #fff;\n        max-width: 92vw;\n    }\n    \n    .gallery-lightbox-caption .lb-caption-main {\n        display: block;\n        font-size: 1.15rem;\n        font-weight: 600;\n    }\n    \n    .gallery-lightbox-caption .lb-caption-sub {\n        display: block;\n        font-size: 0.9rem;\n        font-weight: 400;\n        opacity: 0.85;\n        margin-top: 4px;\n    }\n    \n    .gallery-lightbox-close,\n    .gallery-lightbox-prev,\n    .gallery-lightbox-next {\n        position: absolute;\n        background: rgba(255, 255, 255, 0.12);\n        color: #fff;\n        border: none;\n        cursor: pointer;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        transition: background 0.2s ease, transform 0.2s ease;\n        z-index: 2;\n    }\n    \n    .gallery-lightbox-close:hover,\n    .gallery-lightbox-prev:hover,\n    .gallery-lightbox-next:hover {\n        background: rgba(255, 255, 255, 0.28);\n    }\n    \n    .gallery-lightbox-close {\n        top: -50px;\n        right: 0;\n        width: 44px;\n        height: 44px;\n        border-radius: 50%;\n        font-size: 1.5rem;\n        line-height: 1;\n    }\n    \n    .gallery-lightbox-prev,\n    .gallery-lightbox-next {\n        top: 50%;\n        transform: translateY(-50%);\n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        font-size: 1.8rem;\n        line-height: 1;\n    }\n    \n    .gallery-lightbox-prev {\n        left: -70px;\n    }\n    \n    .gallery-lightbox-next {\n        right: -70px;\n    }\n    \n    .gallery-lightbox-prev:hover {\n        transform: translateY(-50%) translateX(-2px);\n    }\n    \n    .gallery-lightbox-next:hover {\n        transform: translateY(-50%) translateX(2px);\n    }\n    \n    .gallery-lightbox-counter {\n        position: absolute;\n        top: -50px;\n        left: 0;\n        color: rgba(255, 255, 255, 0.7);\n        font-size: 0.9rem;\n    }\n    \n    \/* Hide nav buttons when there's only one image *\/\n    .gallery-lightbox-overlay.single-image .gallery-lightbox-prev,\n    .gallery-lightbox-overlay.single-image .gallery-lightbox-next,\n    .gallery-lightbox-overlay.single-image .gallery-lightbox-counter {\n        display: none;\n    }\n    \n    @media (max-width: 768px) {\n        .gallery-lightbox-prev {\n            left: 8px;\n            width: 42px;\n            height: 42px;\n            font-size: 1.4rem;\n        }\n        .gallery-lightbox-next {\n            right: 8px;\n            width: 42px;\n            height: 42px;\n            font-size: 1.4rem;\n        }\n        .gallery-lightbox-close {\n            top: 8px;\n            right: 8px;\n        }\n        .gallery-lightbox-counter {\n            top: 18px;\n            left: 14px;\n        }\n    }\n    <\/style>\n    \n    <script>\n    (function() {\n        const section = document.querySelector('.gallery-6a0630aa3780d');\n        if (!section || !section.classList.contains('has-lightbox')) return;\n        \n        let items = [];\n        try {\n            items = JSON.parse(section.getAttribute('data-lightbox-items') || '[]');\n        } catch(e) {\n            return;\n        }\n        if (items.length === 0) return;\n        \n        \/\/ Build lightbox overlay (single instance per gallery)\n        const overlay = document.createElement('div');\n        overlay.className = 'gallery-lightbox-overlay';\n        if (items.length === 1) overlay.classList.add('single-image');\n        overlay.innerHTML = '' +\n            '<div class=\"gallery-lightbox-content\">' +\n                '<button type=\"button\" class=\"gallery-lightbox-close\" aria-label=\"Close\">\u00d7<\/button>' +\n                '<div class=\"gallery-lightbox-counter\"><\/div>' +\n                '<button type=\"button\" class=\"gallery-lightbox-prev\" aria-label=\"Previous\">\u2039<\/button>' +\n                '<div class=\"gallery-lightbox-image-wrapper\">' +\n                    '<img class=\"gallery-lightbox-image\" alt=\"\">' +\n                '<\/div>' +\n                '<button type=\"button\" class=\"gallery-lightbox-next\" aria-label=\"Next\">\u203a<\/button>' +\n                '<div class=\"gallery-lightbox-caption\"><\/div>' +\n            '<\/div>';\n        document.body.appendChild(overlay);\n        \n        const imgEl = overlay.querySelector('.gallery-lightbox-image');\n        const captionEl = overlay.querySelector('.gallery-lightbox-caption');\n        const counterEl = overlay.querySelector('.gallery-lightbox-counter');\n        \n        let currentIndex = 0;\n        \n        function showImage(newIndex, direction) {\n            if (newIndex < 0) newIndex = items.length - 1;\n            if (newIndex >= items.length) newIndex = 0;\n            currentIndex = newIndex;\n            const item = items[currentIndex];\n            \n            \/\/ Brief fade animation when changing\n            imgEl.classList.remove('visible');\n            \n            setTimeout(function() {\n                imgEl.src = item.image;\n                imgEl.alt = item.caption || '';\n                \n                let captionHtml = '';\n                if (item.caption) {\n                    captionHtml += '<span class=\"lb-caption-main\"><\/span>';\n                }\n                if (item.subCaption) {\n                    captionHtml += '<span class=\"lb-caption-sub\"><\/span>';\n                }\n                captionEl.innerHTML = captionHtml;\n                if (item.caption) {\n                    captionEl.querySelector('.lb-caption-main').textContent = item.caption;\n                }\n                if (item.subCaption) {\n                    captionEl.querySelector('.lb-caption-sub').textContent = item.subCaption;\n                }\n                \n                counterEl.textContent = (currentIndex + 1) + ' \/ ' + items.length;\n                \n                \/\/ Wait for image load before fading in\n                if (imgEl.complete) {\n                    requestAnimationFrame(function() {\n                        imgEl.classList.add('visible');\n                    });\n                } else {\n                    imgEl.onload = function() {\n                        imgEl.classList.add('visible');\n                    };\n                }\n            }, 150);\n        }\n        \n        function openLightbox(index) {\n            currentIndex = index;\n            overlay.classList.add('active');\n            document.body.style.overflow = 'hidden';\n            showImage(index);\n        }\n        \n        function closeLightbox() {\n            overlay.classList.remove('active');\n            document.body.style.overflow = '';\n            imgEl.classList.remove('visible');\n        }\n        \n        \/\/ Click handlers on gallery items\n        section.querySelectorAll('.gallery-item-lightbox').forEach(function(el) {\n            el.addEventListener('click', function(e) {\n                e.preventDefault();\n                e.stopPropagation();\n                const idx = parseInt(el.getAttribute('data-lightbox-index'), 10);\n                if (!isNaN(idx)) openLightbox(idx);\n            });\n        });\n        \n        \/\/ Lightbox controls\n        overlay.querySelector('.gallery-lightbox-close').addEventListener('click', closeLightbox);\n        overlay.querySelector('.gallery-lightbox-prev').addEventListener('click', function(e) {\n            e.stopPropagation();\n            showImage(currentIndex - 1);\n        });\n        overlay.querySelector('.gallery-lightbox-next').addEventListener('click', function(e) {\n            e.stopPropagation();\n            showImage(currentIndex + 1);\n        });\n        \n        \/\/ Click outside image to close\n        overlay.addEventListener('click', function(e) {\n            if (e.target === overlay) closeLightbox();\n        });\n        \n        \/\/ Keyboard navigation\n        document.addEventListener('keydown', function(e) {\n            if (!overlay.classList.contains('active')) return;\n            if (e.key === 'Escape') closeLightbox();\n            else if (e.key === 'ArrowLeft') showImage(currentIndex - 1);\n            else if (e.key === 'ArrowRight') showImage(currentIndex + 1);\n        });\n    })();\n    <\/script>\n        \n    ","protected":false},"excerpt":{"rendered":"<p>Program Wsp\u00f3\u0142pracy Powiatu \u017byrardowskiego z Organizacjami Pozarz\u0105dowymi w 2025 r. zosta\u0142 uchwalony przez Rad\u0119 Powiatu \u017byrardowskiego w dniu 27 listopada 2024 r. (Uchwa\u0142a Nr VII\/56\/24). Priorytetowe zadania publiczne zawarte w&#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-575","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/575","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=575"}],"version-history":[{"count":110,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/575\/revisions"}],"predecessor-version":[{"id":2972,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/575\/revisions\/2972"}],"wp:attachment":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/media?parent=575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}