{"id":1429,"date":"2026-08-29T17:22:09","date_gmt":"2026-08-29T15:22:09","guid":{"rendered":"https:\/\/pspuzzlowe.com\/?page_id=1429"},"modified":"2026-08-29T18:05:21","modified_gmt":"2026-08-29T16:05:21","slug":"galeria","status":"publish","type":"page","link":"http:\/\/pspuzzlowe.com\/en\/ii-mistrzostwa-polski-2026\/galeria\/","title":{"rendered":"Galeria \u2014 II Mistrzostwa Polski 2026"},"content":{"rendered":"\n<style data-wp-block-html=\"css\">\n\/* =========================================================\n   NAWIGACJA MP\n   ========================================================= *\/\n\n.mp-nav {\n    --mp-blue: #0500ff;\n    --mp-blue-dark: #0300b8;\n    --mp-lime: #b8ff00;\n    --mp-dark: #111111;\n    --mp-text: #171717;\n    --mp-white: #ffffff;\n\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 9999;\n\n    width: 100%;\n    padding: 14px 24px;\n    box-sizing: border-box;\n\n    background: rgba(255, 255, 255, 0.74);\n    border-bottom: 1px solid rgba(17, 17, 17, 0.08);\n    box-shadow: 0 10px 35px rgba(0, 0, 0, 0.05);\n\n    backdrop-filter: blur(18px);\n    -webkit-backdrop-filter: blur(18px);\n}\n\n.mp-nav-inner {\n    width: 100%;\n    max-width: 1260px;\n    margin: 0 auto;\n\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 24px;\n}\n\n.mp-nav-logo {\n    display: inline-flex;\n    align-items: center;\n    flex: 0 0 auto;\n    text-decoration: none;\n}\n\n.mp-nav-logo img {\n    display: block;\n    width: auto;\n    height: 46px;\n    object-fit: contain;\n}\n\n.mp-nav-menu {\n    display: flex;\n    align-items: center;\n    justify-content: flex-end;\n    gap: 8px;\n}\n\n.mp-nav-menu a {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n\n    min-height: 38px;\n    padding: 9px 13px;\n\n    border-radius: 999px;\n\n    color: var(--mp-text);\n    font-size: 15px;\n    font-weight: 850;\n    line-height: 1;\n    text-decoration: none;\n    white-space: nowrap;\n\n    transition:\n        background 0.2s ease,\n        color 0.2s ease,\n        transform 0.2s ease;\n}\n\n.mp-nav-menu a:hover {\n    background: var(--mp-blue);\n    color: #ffffff;\n    transform: translateY(-1px);\n}\n\n.mp-nav-menu .mp-language-switch {\n    background: var(--mp-blue);\n    color: #ffffff;\n    border: 1px solid var(--mp-blue);\n}\n\n.mp-nav-menu .mp-language-switch:hover {\n    background: var(--mp-lime);\n    color: var(--mp-dark);\n    border-color: var(--mp-lime);\n}\n\n.mp-nav-toggle {\n    display: none;\n\n    width: 44px;\n    height: 44px;\n    padding: 0;\n\n    border: 0;\n    border-radius: 999px;\n\n    background: var(--mp-blue);\n    cursor: pointer;\n\n    align-items: center;\n    justify-content: center;\n    flex-direction: column;\n    gap: 5px;\n}\n\n.mp-nav-toggle span {\n    display: block;\n    width: 20px;\n    height: 2px;\n\n    border-radius: 999px;\n    background: #ffffff;\n\n    transition:\n        transform 0.2s ease,\n        opacity 0.2s ease;\n}\n\n.mp-nav.is-open .mp-nav-toggle span:nth-child(1) {\n    transform: translateY(7px) rotate(45deg);\n}\n\n.mp-nav.is-open .mp-nav-toggle span:nth-child(2) {\n    opacity: 0;\n}\n\n.mp-nav.is-open .mp-nav-toggle span:nth-child(3) {\n    transform: translateY(-7px) rotate(-45deg);\n}\n\n\n\/* =========================================================\n   II MISTRZOSTWA POLSKI 2026 \u2014 GALERIA\n   ========================================================= *\/\n\n.mp-gallery-page {\n    --mp-blue: #0500ff;\n    --mp-blue-dark: #0300b8;\n    --mp-lime: #b8ff00;\n    --mp-dark: #111111;\n    --mp-white: #ffffff;\n    --mp-soft: #f7f7f7;\n\n    position: relative;\n    left: auto;\n\n    width: 100vw;\n    max-width: none;\n    min-height: 100vh;\n\n    margin-left: calc(50% - 50vw);\n    margin-right: calc(50% - 50vw);\n    margin-top: 0;\n    margin-bottom: 0;\n\n    padding: 0 24px 100px;\n\n    box-sizing: border-box;\n    background: #ffffff;\n    color: #111111;\n}\n\n\n\/* =========================================================\n   RESET SZABLONU WORDPRESS\n   ========================================================= *\/\n\nhtml,\nbody {\n    margin-top: 0 !important;\n    padding-top: 0 !important;\n}\n\nbody .wp-site-blocks {\n    margin: 0 !important;\n    padding: 0 !important;\n}\n\nbody .wp-site-blocks > header,\nbody .wp-site-blocks > footer,\nbody header.wp-block-template-part,\nbody footer.wp-block-template-part {\n    display: none !important;\n}\n\nbody .wp-block-post-title,\nbody .entry-title {\n    display: none !important;\n}\n\nbody main,\nbody .entry-content,\nbody .wp-block-post-content {\n    width: 100% !important;\n    max-width: none !important;\n    margin: 0 !important;\n    padding: 0 !important;\n}\n\nbody main > .wp-block-group:has(.wp-block-post-title) {\n    display: none !important;\n}\n\nbody .wp-block-post-content > .wp-block-spacer:first-child {\n    display: none !important;\n}\n\n\n\/* =========================================================\n   HERO\n   ========================================================= *\/\n\n.mp-gallery-hero {\n    position: relative;\n\n    width: calc(100% + 48px);\n    max-width: none;\n\n    margin: 0 0 50px -24px;\n    padding: 100px 24px 80px;\n\n    overflow: hidden;\n    box-sizing: border-box;\n\n    text-align: center;\n    color: #ffffff;\n\n    background:\n        radial-gradient(\n            circle at 85% 20%,\n            rgba(184, 255, 0, 0.28),\n            transparent 28%\n        ),\n        linear-gradient(\n            135deg,\n            #0500ff 0%,\n            #0300b8 100%\n        );\n}\n\n.mp-gallery-hero::before,\n.mp-gallery-hero::after {\n    content: \"\";\n    position: absolute;\n\n    width: 150px;\n    height: 150px;\n\n    border: 3px solid rgba(184, 255, 0, 0.35);\n    border-radius: 30px;\n\n    transform: rotate(18deg);\n    pointer-events: none;\n}\n\n.mp-gallery-hero::before {\n    left: -55px;\n    bottom: -65px;\n}\n\n.mp-gallery-hero::after {\n    right: -55px;\n    top: -65px;\n}\n\n.mp-gallery-kicker {\n    position: relative;\n    z-index: 1;\n\n    margin: 0 0 18px;\n\n    color: #b8ff00;\n    font-size: 14px;\n    font-weight: 800;\n    line-height: 1.3;\n    letter-spacing: 0.14em;\n    text-transform: uppercase;\n}\n\n.mp-gallery-hero h1 {\n    position: relative;\n    z-index: 1;\n\n    max-width: 1000px;\n    margin: 0 auto;\n\n    color: #ffffff !important;\n\n    font-size: clamp(52px, 7vw, 92px);\n    font-weight: 900;\n    line-height: 0.95;\n    letter-spacing: -0.055em;\n}\n\n.mp-gallery-hero > p:last-child {\n    position: relative;\n    z-index: 1;\n\n    max-width: 720px;\n    margin: 26px auto 0;\n\n    color: rgba(255, 255, 255, 0.86);\n\n    font-size: 18px;\n    line-height: 1.65;\n}\n\n\n\/* =========================================================\n   DNI\n   ========================================================= *\/\n\n.mp-gallery-tabs {\n    display: flex;\n    justify-content: center;\n    flex-wrap: wrap;\n\n    gap: 12px;\n\n    max-width: 1200px;\n    margin: 0 auto 22px;\n}\n\n.mp-gallery-tab {\n    appearance: none;\n\n    padding: 13px 26px;\n\n    border: 2px solid #0500ff !important;\n    border-radius: 999px !important;\n\n    background: #ffffff !important;\n    color: #0500ff !important;\n\n    font: inherit;\n    font-size: 15px;\n    font-weight: 800;\n\n    cursor: pointer;\n\n    transition:\n        background 0.2s ease,\n        color 0.2s ease,\n        transform 0.2s ease;\n}\n\n.mp-gallery-tab:hover {\n    transform: translateY(-2px);\n}\n\n.mp-gallery-tab.is-active {\n    background: #0500ff !important;\n    color: #ffffff !important;\n}\n\n\n\/* =========================================================\n   KONKURENCJE\n   ========================================================= *\/\n\n.mp-gallery-subtabs {\n    display: flex;\n    justify-content: center;\n    flex-wrap: wrap;\n\n    gap: 8px;\n\n    max-width: 1100px;\n    margin: 0 auto 42px;\n}\n\n.mp-gallery-subtab {\n    appearance: none;\n\n    padding: 9px 16px;\n\n    border: 1px solid rgba(5, 0, 255, 0.16) !important;\n    border-radius: 999px !important;\n\n    background: #f3f3ff !important;\n    color: #0500ff !important;\n\n    font: inherit;\n    font-size: 13px;\n    font-weight: 700;\n\n    cursor: pointer;\n\n    transition:\n        background 0.2s ease,\n        transform 0.2s ease;\n}\n\n.mp-gallery-subtab:hover {\n    background: #e9e9ff !important;\n    transform: translateY(-1px);\n}\n\n.mp-gallery-subtab.is-active {\n    border-color: #b8ff00 !important;\n    background: #b8ff00 !important;\n    color: #111111 !important;\n}\n\n\n\/* =========================================================\n   SIATKA ZDJ\u0118\u0106\n   ========================================================= *\/\n\n.mp-gallery-grid {\n    display: grid;\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n    gap: 12px;\n\n    width: 100%;\n    max-width: 1400px;\n    margin: 0 auto;\n}\n\n.mp-gallery-item {\n    position: relative;\n    display: block;\n\n    width: 100%;\n    aspect-ratio: 4 \/ 3;\n\n    margin: 0;\n    padding: 0;\n\n    overflow: hidden;\n\n    border: 0 !important;\n    border-radius: 16px !important;\n\n    background: #eeeeee;\n    cursor: zoom-in;\n}\n\n.mp-gallery-item img {\n    display: block;\n\n    width: 100%;\n    height: 100%;\n    margin: 0;\n\n    object-fit: cover;\n\n    transition: transform 0.4s ease;\n}\n\n.mp-gallery-item::after {\n    content: \"+\";\n\n    position: absolute;\n    right: 12px;\n    bottom: 12px;\n\n    display: grid;\n    place-items: center;\n\n    width: 38px;\n    height: 38px;\n\n    border-radius: 50%;\n\n    background: #b8ff00;\n    color: #111111;\n\n    font-size: 24px;\n    line-height: 1;\n\n    opacity: 0;\n    transform: translateY(6px);\n\n    transition:\n        opacity 0.25s ease,\n        transform 0.25s ease;\n}\n\n.mp-gallery-item:hover img {\n    transform: scale(1.04);\n}\n\n.mp-gallery-item:hover::after {\n    opacity: 1;\n    transform: translateY(0);\n}\n\n\n\/* =========================================================\n   POKA\u017b WI\u0118CEJ\n   ========================================================= *\/\n\n.mp-gallery-load-wrap {\n    display: flex;\n    justify-content: center;\n\n    margin-top: 42px;\n}\n\n.mp-gallery-load {\n    appearance: none;\n\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n\n    min-height: 52px;\n    padding: 0 28px;\n\n    border: 0 !important;\n    border-radius: 999px !important;\n\n    background: #b8ff00 !important;\n    color: #111111 !important;\n\n    font: inherit;\n    font-size: 15px;\n    font-weight: 900;\n\n    cursor: pointer;\n\n    transition:\n        transform 0.2s ease,\n        box-shadow 0.2s ease;\n}\n\n.mp-gallery-load:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 12px 30px rgba(17, 17, 17, 0.12);\n}\n\n\n\/* =========================================================\n   LIGHTBOX\n   ========================================================= *\/\n\n.mp-lightbox {\n    position: fixed;\n    inset: 0;\n    z-index: 999999;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    padding: 60px 90px;\n    box-sizing: border-box;\n\n    background:\n        radial-gradient(\n            circle at 50% 45%,\n            rgba(5, 0, 255, 0.28),\n            transparent 45%\n        ),\n        linear-gradient(\n            135deg,\n            #080819 0%,\n            #11115c 55%,\n            #0300b8 100%\n        );\n\n    opacity: 0;\n    visibility: hidden;\n\n    transition:\n        opacity 0.2s ease,\n        visibility 0.2s ease;\n}\n\n.mp-lightbox.is-open {\n    opacity: 1;\n    visibility: visible;\n}\n\n.mp-lightbox-content {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n\n    gap: 18px;\n\n    max-width: 100%;\n    max-height: 100%;\n}\n\n.mp-lightbox img {\n    display: block;\n\n    width: auto;\n    height: auto;\n\n    max-width: 100%;\n    max-height: calc(100vh - 170px);\n\n    margin: 0;\n\n    object-fit: contain;\n\n    border-radius: 12px;\n\n    box-shadow: 0 30px 100px rgba(0, 0, 0, 0.5);\n}\n\n.mp-lightbox-download {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n\n    min-height: 48px;\n    padding: 0 22px;\n\n    border-radius: 999px;\n\n    background: #b8ff00;\n    color: #111111 !important;\n\n    font-size: 14px;\n    font-weight: 900;\n    text-decoration: none !important;\n\n    transition:\n        transform 0.2s ease,\n        box-shadow 0.2s ease;\n}\n\n.mp-lightbox-download:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 12px 30px rgba(0, 0, 0, 0.25);\n}\n\n.mp-lightbox-counter {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    min-width: 72px;\n    height: 34px;\n    padding: 0 14px;\n\n    box-sizing: border-box;\n\n    border: 1px solid rgba(255, 255, 255, 0.18);\n    border-radius: 999px;\n\n    background: rgba(0, 0, 0, 0.25);\n\n    backdrop-filter: blur(8px);\n    -webkit-backdrop-filter: blur(8px);\n\n    color: #ffffff;\n\n    font-size: 13px;\n    font-weight: 800;\n    line-height: 1;\n    letter-spacing: 0.04em;\n}\n\n.mp-lightbox-close,\n.mp-lightbox-prev,\n.mp-lightbox-next {\n    position: absolute;\n\n    display: grid;\n    place-items: center;\n\n    padding: 0;\n\n    border: 0 !important;\n    border-radius: 50% !important;\n\n    background: #ffffff !important;\n    color: #111111 !important;\n\n    cursor: pointer;\n\n    font-family: Arial, sans-serif;\n\n    transition:\n        background 0.2s ease,\n        transform 0.2s ease;\n}\n\n.mp-lightbox-close:hover,\n.mp-lightbox-prev:hover,\n.mp-lightbox-next:hover {\n    background: #b8ff00 !important;\n}\n\n.mp-lightbox-close {\n    top: 22px;\n    right: 22px;\n\n    width: 48px;\n    height: 48px;\n\n    font-size: 32px;\n}\n\n.mp-lightbox-prev,\n.mp-lightbox-next {\n    top: 50%;\n\n    width: 54px;\n    height: 54px;\n\n    font-size: 42px;\n\n    transform: translateY(-50%);\n}\n\n.mp-lightbox-prev {\n    left: 22px;\n}\n\n.mp-lightbox-next {\n    right: 22px;\n}\n\n.mp-lightbox-prev:hover,\n.mp-lightbox-next:hover {\n    transform: translateY(-50%) scale(1.05);\n}\n\n\n\/* =========================================================\n   TABLET\n   ========================================================= *\/\n\n@media (max-width: 1000px) {\n\n    .mp-gallery-grid {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n    }\n}\n\n\n\/* =========================================================\n   NAWIGACJA \u2014 MOBILE\n   ========================================================= *\/\n\n@media (max-width: 760px) {\n\n    .mp-nav {\n        padding: 10px 16px;\n\n        background: rgba(255, 255, 255, 0.78);\n\n        backdrop-filter: blur(18px);\n        -webkit-backdrop-filter: blur(18px);\n    }\n\n    .mp-nav-inner {\n        gap: 14px;\n    }\n\n    .mp-nav-logo img {\n        height: 40px;\n    }\n\n    .mp-nav-toggle {\n        display: inline-flex !important;\n        flex: 0 0 auto;\n    }\n\n    .mp-nav-menu {\n        position: absolute;\n        top: calc(100% + 10px);\n        left: 16px;\n        right: 16px;\n\n        display: grid;\n        grid-template-columns: 1fr;\n        gap: 8px;\n\n        padding: 14px;\n\n        border: 1px solid rgba(17, 17, 17, 0.1);\n        border-radius: 22px;\n\n        background: rgba(255, 255, 255, 0.96);\n\n        box-shadow: 0 22px 55px rgba(0, 0, 0, 0.16);\n\n        opacity: 0;\n        visibility: hidden;\n        transform: translateY(-8px);\n        pointer-events: none;\n\n        transition:\n            opacity 0.2s ease,\n            visibility 0.2s ease,\n            transform 0.2s ease;\n    }\n\n    .mp-nav.is-open .mp-nav-menu {\n        opacity: 1;\n        visibility: visible;\n        transform: translateY(0);\n        pointer-events: auto;\n    }\n\n    .mp-nav-menu a {\n        width: 100%;\n        min-height: 46px;\n\n        justify-content: flex-start;\n\n        padding: 13px 15px;\n\n        box-sizing: border-box;\n\n        background: #f7f7f7;\n\n        font-size: 16px;\n        font-weight: 850;\n    }\n\n    .mp-nav-menu a:hover {\n        transform: none;\n    }\n\n    .mp-nav-menu .mp-language-switch {\n        background: #0500ff;\n        color: #ffffff;\n    }\n}\n\n\n\/* =========================================================\n   MOBILE\n   ========================================================= *\/\n\n@media (max-width: 768px) {\n\n    section.mp-gallery-page {\n        padding-top: 0 !important;\n    }\n}\n\n@media (max-width: 700px) {\n\n    html,\n    body,\n    body .wp-site-blocks,\n    body main,\n    body .entry-content,\n    body .wp-block-post-content {\n        margin-top: 0 !important;\n        padding-top: 0 !important;\n    }\n\n    body .wp-block-post-content > *:first-child {\n        margin-top: 0 !important;\n    }\n\n    body .wp-block-post-content > .wp-block-spacer:first-child,\n    body .entry-content > .wp-block-spacer:first-child,\n    body main .wp-block-spacer:first-child {\n        display: none !important;\n        height: 0 !important;\n        min-height: 0 !important;\n        margin: 0 !important;\n        padding: 0 !important;\n    }\n\n    .mp-gallery-page {\n        margin-top: 0 !important;\n        padding: 0 14px 70px !important;\n    }\n\n    .mp-gallery-hero {\n        width: calc(100% + 28px);\n\n        margin-top: 0 !important;\n        margin-left: -14px;\n        margin-bottom: 34px;\n\n        padding: 72px 20px 58px;\n    }\n\n    .mp-gallery-kicker {\n        margin-bottom: 14px;\n        font-size: 11px;\n    }\n\n    .mp-gallery-hero h1 {\n        font-size: clamp(44px, 15vw, 64px);\n    }\n\n    .mp-gallery-hero > p:last-child {\n        margin-top: 20px;\n\n        font-size: 15px;\n        line-height: 1.6;\n    }\n\n    .mp-gallery-tabs {\n        gap: 8px;\n        margin-bottom: 16px;\n    }\n\n    .mp-gallery-tab {\n        padding: 10px 16px;\n        font-size: 13px;\n    }\n\n    .mp-gallery-subtabs {\n        gap: 7px;\n        margin-bottom: 28px;\n    }\n\n    .mp-gallery-subtab {\n        padding: 8px 12px;\n        font-size: 12px;\n    }\n\n    .mp-gallery-grid {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        gap: 6px;\n    }\n\n    .mp-gallery-item {\n        border-radius: 10px !important;\n    }\n\n    .mp-gallery-item::after {\n        display: none;\n    }\n\n    .mp-lightbox {\n        padding: 70px 10px;\n        touch-action: pan-y;\n    }\n\n    .mp-lightbox img {\n        max-height: calc(100vh - 190px);\n        border-radius: 8px;\n    }\n\n    .mp-lightbox-image,\n    #mp-lightbox-image {\n        user-select: none;\n        -webkit-user-drag: none;\n    }\n\n    .mp-lightbox-close {\n        top: 14px;\n        right: 14px;\n\n        width: 44px;\n        height: 44px;\n    }\n\n    .mp-lightbox-prev,\n    .mp-lightbox-next {\n        display: none !important;\n    }\n\n    .mp-lightbox-content {\n        gap: 14px;\n    }\n\n    .mp-lightbox-download {\n        min-height: 44px;\n        padding: 0 18px;\n\n        font-size: 13px;\n    }\n\n    .mp-lightbox-counter {\n        min-width: 64px;\n        height: 30px;\n\n        padding: 0 12px;\n\n        font-size: 12px;\n    }\n}\n\n\n\/* =========================================================\n   MA\u0141E TELEFONY\n   ========================================================= *\/\n\n@media (max-width: 400px) {\n\n    .mp-gallery-grid {\n        grid-template-columns: 1fr;\n    }\n}\n\/* Usu\u0144 odst\u0119p mi\u0119dzy fixed navem a hero *\/\n\n.mp-gallery-page {\n    margin-top: 0 !important;\n}\n\n.mp-gallery-hero {\n    margin-top: 0 !important;\n}\n\nbody .wp-block-post-content,\nbody .entry-content,\nbody main {\n    padding-top: 0 !important;\n    margin-top: 0 !important;\n}\n\n@media (max-width: 768px) {\n    section.mp-gallery-page {\n        padding-top: 0 !important;\n        margin-top: 0 !important;\n    }\n\n    .mp-gallery-hero {\n        margin-top: 0 !important;\n    }\n}\n#mp-nav.mp-nav {\n    position: fixed !important;\n    top: 0 !important;\n    left: 0 !important;\n    right: 0 !important;\n\n    width: 100% !important;\n    max-width: none !important;\n    min-width: 100% !important;\n\n    margin: 0 !important;\n    padding-left: 24px !important;\n    padding-right: 24px !important;\n\n    box-sizing: border-box !important;\n\n    background: #ffffff !important;\n}\n<\/style>\n\n<script data-wp-block-html=\"js\">\ndocument.addEventListener('DOMContentLoaded', async function () {\n\n    \/* =========================================================\n       NAWIGACJA MOBILE\n       ========================================================= *\/\n\n    const nav = document.querySelector('#mp-nav');\n    const toggle = document.querySelector('.mp-nav-toggle');\n    const menuLinks = document.querySelectorAll('.mp-nav-menu a');\n\n    if (nav && toggle) {\n\n        toggle.addEventListener('click', function () {\n            nav.classList.toggle('is-open');\n\n            const isOpen = nav.classList.contains('is-open');\n\n            toggle.setAttribute(\n                'aria-expanded',\n                isOpen ? 'true' : 'false'\n            );\n        });\n\n        menuLinks.forEach(function (link) {\n            link.addEventListener('click', function () {\n                nav.classList.remove('is-open');\n                toggle.setAttribute('aria-expanded', 'false');\n            });\n        });\n\n        document.addEventListener('click', function (event) {\n            const clickedInsideNav = nav.contains(event.target);\n\n            if (!clickedInsideNav) {\n                nav.classList.remove('is-open');\n                toggle.setAttribute('aria-expanded', 'false');\n            }\n        });\n\n        window.addEventListener('resize', function () {\n            if (window.innerWidth > 760) {\n                nav.classList.remove('is-open');\n                toggle.setAttribute('aria-expanded', 'false');\n            }\n        });\n    }\n\n\n    \/* =========================================================\n       GALERIA\n       ========================================================= *\/\n\n    const API = '\/wp-json\/mp2026\/v1\/gallery';\n\n    const tabsEl = document.getElementById('mp-gallery-tabs');\n    const subtabsEl = document.getElementById('mp-gallery-subtabs');\n    const gridEl = document.getElementById('mp-gallery-grid');\n    const loadBtn = document.getElementById('mp-gallery-load');\n\n    const lightbox = document.getElementById('mp-lightbox');\n    const lightboxImage = document.getElementById('mp-lightbox-image');\n    const downloadBtn = document.getElementById('mp-lightbox-download');\n    const lightboxCounter = document.getElementById('mp-lightbox-counter');\n\n    const closeBtn = lightbox\n        ? lightbox.querySelector('.mp-lightbox-close')\n        : null;\n\n    const prevBtn = lightbox\n        ? lightbox.querySelector('.mp-lightbox-prev')\n        : null;\n\n    const nextBtn = lightbox\n        ? lightbox.querySelector('.mp-lightbox-next')\n        : null;\n\n    if (\n        !tabsEl ||\n        !subtabsEl ||\n        !gridEl ||\n        !loadBtn ||\n        !lightbox ||\n        !lightboxImage ||\n        !downloadBtn ||\n        !lightboxCounter\n    ) {\n        console.error('Brakuje wymaganych element\u00f3w galerii w HTML.');\n        return;\n    }\n\n\n    \/* =========================================================\n       ZMIENNE\n       ========================================================= *\/\n\n    let galleryData = {};\n\n    let currentDay = '';\n    let currentAlbum = '';\n\n    let currentImages = [];\n\n    let visibleCount = 24;\n    let currentIndex = 0;\n\n\n    \/* =========================================================\n       ETYKIETY\n       ========================================================= *\/\n\n    const dayLabels = {\n        '7.08.2026 - przygotowania':\n            'Przygotowania',\n\n        '8.08. 2026 - dzie\u0144 1':\n            'Dzie\u0144 1',\n\n        '8.08.2026 - dzie\u0144 1':\n            'Dzie\u0144 1',\n\n        '9.08.2026 dzie\u0144 2 + nagrody':\n            'Dzie\u0144 2',\n\n        '9.08.2026 - dzie\u0144 2 + nagrody':\n            'Dzie\u0144 2'\n    };\n\n    const albumLabels = {\n        'I runda eliminacyjna w kategorii indywidualnej':\n            'Indywidualne \u2014 runda I',\n\n        'II runda eliminacyjna w kategorii indywidualnej':\n            'Indywidualne \u2014 runda II',\n\n        'I runda eliminacyjna w kategorii par':\n            'Pary \u2014 runda I',\n\n        'II runda eliminacyjna w kategorii par':\n            'Pary \u2014 runda II',\n\n        'fina\u0142 w kategorii dru\u017cynowej':\n            'Fina\u0142 dru\u017cynowy',\n\n        'fina\u0142 w kategorii indywidualnej':\n            'Fina\u0142 indywidualny',\n\n        'fina\u0142 w kategorii par':\n            'Fina\u0142 par',\n\n        'rozdanie nagr\u00f3d':\n            'Rozdanie nagr\u00f3d'\n    };\n\n\n    \/* =========================================================\n       FUNKCJE POMOCNICZE\n       ========================================================= *\/\n\n    function normalize(path) {\n        return path.replace(\/\\\\\/g, '\/');\n    }\n\n    function splitPath(path) {\n        return normalize(path).split('\/');\n    }\n\n    function getDay(path) {\n        return splitPath(path)[0] || '';\n    }\n\n    function getAlbum(path) {\n        return splitPath(path)\n            .slice(1)\n            .join('\/') || '';\n    }\n\n    function labelDay(day) {\n        return dayLabels[day] || day;\n    }\n\n    function labelAlbum(album) {\n        return albumLabels[album] || album;\n    }\n\n\n    \/* =========================================================\n       ZAK\u0141ADKI DNI\n       ========================================================= *\/\n\n    function renderDayTabs(days) {\n\n        tabsEl.innerHTML = '';\n\n        days.forEach(function (day, index) {\n\n            const button =\n                document.createElement('button');\n\n            button.type = 'button';\n            button.className = 'mp-gallery-tab';\n            button.textContent = labelDay(day);\n\n            if (\n                day === currentDay ||\n                (!currentDay && index === 0)\n            ) {\n                button.classList.add('is-active');\n            }\n\n            button.addEventListener(\n                'click',\n                function () {\n\n                    currentDay = day;\n                    currentAlbum = '';\n                    visibleCount = 24;\n\n                    document\n                        .querySelectorAll('.mp-gallery-tab')\n                        .forEach(function (tab) {\n                            tab.classList.remove('is-active');\n                        });\n\n                    button.classList.add('is-active');\n\n                    renderSubtabs();\n                    renderGallery();\n                }\n            );\n\n            tabsEl.appendChild(button);\n        });\n    }\n\n\n    \/* =========================================================\n       PODKATEGORIE\n       ========================================================= *\/\n\n    function renderSubtabs() {\n\n        subtabsEl.innerHTML = '';\n\n        const paths = Object.keys(galleryData)\n            .filter(function (path) {\n                return getDay(path) === currentDay;\n            });\n\n        const albums = [];\n\n        paths.forEach(function (path) {\n\n            const album = getAlbum(path);\n\n            if (\n                album &&\n                !albums.includes(album)\n            ) {\n                albums.push(album);\n            }\n        });\n\n        if (albums.length === 0) {\n            subtabsEl.style.display = 'none';\n            return;\n        }\n\n        subtabsEl.style.display = 'flex';\n\n\n        \/* WSZYSTKIE *\/\n\n        const allButton =\n            document.createElement('button');\n\n        allButton.type = 'button';\n        allButton.className =\n            'mp-gallery-subtab is-active';\n\n        allButton.textContent = 'Wszystkie';\n\n        allButton.addEventListener(\n            'click',\n            function () {\n\n                currentAlbum = '';\n                visibleCount = 24;\n\n                setActiveSubtab(allButton);\n                renderGallery();\n            }\n        );\n\n        subtabsEl.appendChild(allButton);\n\n\n        \/* POSZCZEG\u00d3LNE ALBUMY *\/\n\n        albums.forEach(function (album) {\n\n            const button =\n                document.createElement('button');\n\n            button.type = 'button';\n            button.className =\n                'mp-gallery-subtab';\n\n            button.textContent =\n                labelAlbum(album);\n\n            button.addEventListener(\n                'click',\n                function () {\n\n                    currentAlbum = album;\n                    visibleCount = 24;\n\n                    setActiveSubtab(button);\n                    renderGallery();\n                }\n            );\n\n            subtabsEl.appendChild(button);\n        });\n    }\n\n\n    function setActiveSubtab(activeButton) {\n\n        subtabsEl\n            .querySelectorAll('.mp-gallery-subtab')\n            .forEach(function (button) {\n                button.classList.remove('is-active');\n            });\n\n        activeButton.classList.add('is-active');\n    }\n\n\n    \/* =========================================================\n       AKTUALNA LISTA ZDJ\u0118\u0106\n       ========================================================= *\/\n\n    function getCurrentImages() {\n\n        const images = [];\n\n        Object.entries(galleryData)\n            .forEach(function ([path, items]) {\n\n                if (\n                    getDay(path) !== currentDay\n                ) {\n                    return;\n                }\n\n                if (\n                    currentAlbum &&\n                    getAlbum(path) !== currentAlbum\n                ) {\n                    return;\n                }\n\n                if (!Array.isArray(items)) {\n                    return;\n                }\n\n                items.forEach(function (item) {\n\n                    if (\n                        item &&\n                        item.url\n                    ) {\n                        images.push(item);\n                    }\n                });\n            });\n\n        return images;\n    }\n\n\n    \/* =========================================================\n       RENDEROWANIE GALERII\n       ========================================================= *\/\n\n    function renderGallery() {\n\n        currentImages =\n            getCurrentImages();\n\n        gridEl.innerHTML = '';\n\n        const visibleImages =\n            currentImages.slice(\n                0,\n                visibleCount\n            );\n\n        visibleImages.forEach(\n            function (image, index) {\n\n                const button =\n                    document.createElement('button');\n\n                button.type = 'button';\n                button.className =\n                    'mp-gallery-item';\n\n                const img =\n                    document.createElement('img');\n\n                img.src = image.url;\n\n                img.alt =\n                    'II Mistrzostwa Polski w Uk\u0142adaniu Puzzli 2026';\n\n                img.loading = 'lazy';\n                img.decoding = 'async';\n\n                button.appendChild(img);\n\n                button.addEventListener(\n                    'click',\n                    function () {\n                        openLightbox(index);\n                    }\n                );\n\n                gridEl.appendChild(button);\n            }\n        );\n\n        if (\n            visibleCount <\n            currentImages.length\n        ) {\n            loadBtn.style.display =\n                'inline-flex';\n        } else {\n            loadBtn.style.display =\n                'none';\n        }\n    }\n\n\n    \/* =========================================================\n       LIGHTBOX\n       ========================================================= *\/\n\n    function updateCounter() {\n\n        lightboxCounter.textContent =\n            `${currentIndex + 1} \/ ${currentImages.length}`;\n    }\n\n\n    function updateLightboxImage() {\n\n        if (\n            !currentImages[currentIndex]\n        ) {\n            return;\n        }\n\n        const image =\n            currentImages[currentIndex];\n\n        lightboxImage.src =\n            image.url;\n\n        downloadBtn.href =\n            image.url;\n\n        updateCounter();\n\n        updateArrowStates();\n    }\n\n\n    function updateArrowStates() {\n\n        if (prevBtn) {\n            prevBtn.disabled =\n                currentIndex <= 0;\n\n            prevBtn.setAttribute(\n                'aria-disabled',\n                currentIndex <= 0\n                    ? 'true'\n                    : 'false'\n            );\n        }\n\n        if (nextBtn) {\n            nextBtn.disabled =\n                currentIndex >=\n                currentImages.length - 1;\n\n            nextBtn.setAttribute(\n                'aria-disabled',\n                currentIndex >=\n                currentImages.length - 1\n                    ? 'true'\n                    : 'false'\n            );\n        }\n    }\n\n\n    function openLightbox(index) {\n\n        if (\n            !currentImages[index]\n        ) {\n            return;\n        }\n\n        currentIndex = index;\n\n        updateLightboxImage();\n\n        lightbox.classList.add('is-open');\n\n        lightbox.setAttribute(\n            'aria-hidden',\n            'false'\n        );\n\n        document.body.style.overflow =\n            'hidden';\n    }\n\n\n    function closeLightbox() {\n\n        lightbox.classList.remove(\n            'is-open'\n        );\n\n        lightbox.setAttribute(\n            'aria-hidden',\n            'true'\n        );\n\n        document.body.style.overflow =\n            '';\n\n        lightboxImage.src = '';\n    }\n\n\n    function showPrevious() {\n\n        if (currentIndex <= 0) {\n            return;\n        }\n\n        currentIndex--;\n\n        updateLightboxImage();\n    }\n\n\n    function showNext() {\n\n        if (\n            currentIndex >=\n            currentImages.length - 1\n        ) {\n            return;\n        }\n\n        currentIndex++;\n\n        updateLightboxImage();\n    }\n\n\n    \/* =========================================================\n       SWIPE NA MOBILE\n       ========================================================= *\/\n\n    let touchStartX = 0;\n    let touchEndX = 0;\n\n    lightbox.addEventListener(\n        'touchstart',\n        function (event) {\n\n            if (\n                !event.changedTouches ||\n                !event.changedTouches.length\n            ) {\n                return;\n            }\n\n            touchStartX =\n                event.changedTouches[0].screenX;\n        },\n        {\n            passive: true\n        }\n    );\n\n\n    lightbox.addEventListener(\n        'touchend',\n        function (event) {\n\n            if (\n                !event.changedTouches ||\n                !event.changedTouches.length\n            ) {\n                return;\n            }\n\n            touchEndX =\n                event.changedTouches[0].screenX;\n\n            const distance =\n                touchStartX - touchEndX;\n\n            if (\n                Math.abs(distance) < 50\n            ) {\n                return;\n            }\n\n            if (distance > 0) {\n                showNext();\n            } else {\n                showPrevious();\n            }\n        },\n        {\n            passive: true\n        }\n    );\n\n\n    \/* =========================================================\n       PRZYCISK POKA\u017b WI\u0118CEJ\n       ========================================================= *\/\n\n    loadBtn.addEventListener(\n        'click',\n        function () {\n\n            visibleCount += 24;\n\n            renderGallery();\n        }\n    );\n\n\n    \/* =========================================================\n       PRZYCISKI LIGHTBOXA\n       ========================================================= *\/\n\n    if (closeBtn) {\n        closeBtn.addEventListener(\n            'click',\n            closeLightbox\n        );\n    }\n\n    if (prevBtn) {\n        prevBtn.addEventListener(\n            'click',\n            showPrevious\n        );\n    }\n\n    if (nextBtn) {\n        nextBtn.addEventListener(\n            'click',\n            showNext\n        );\n    }\n\n\n    \/* =========================================================\n       KLIKNI\u0118CIE W T\u0141O LIGHTBOXA\n       ========================================================= *\/\n\n    lightbox.addEventListener(\n        'click',\n        function (event) {\n\n            if (\n                event.target === lightbox\n            ) {\n                closeLightbox();\n            }\n        }\n    );\n\n\n    \/* =========================================================\n       KLAWIATURA\n       ========================================================= *\/\n\n    document.addEventListener(\n        'keydown',\n        function (event) {\n\n            if (\n                !lightbox.classList.contains(\n                    'is-open'\n                )\n            ) {\n                return;\n            }\n\n            if (\n                event.key === 'Escape'\n            ) {\n                closeLightbox();\n            }\n\n            if (\n                event.key === 'ArrowLeft'\n            ) {\n                showPrevious();\n            }\n\n            if (\n                event.key === 'ArrowRight'\n            ) {\n                showNext();\n            }\n        }\n    );\n\n\n    \/* =========================================================\n       WCZYTANIE DANYCH Z API\n       ========================================================= *\/\n\n    try {\n\n        const response =\n            await fetch(API);\n\n        if (!response.ok) {\n            throw new Error(\n                `B\u0142\u0105d API: ${response.status}`\n            );\n        }\n\n        const data =\n            await response.json();\n\n        galleryData =\n            data.albums || {};\n\n\n        \/* =====================================================\n           LISTA DNI\n           ===================================================== *\/\n\n        const days = [\n            ...new Set(\n                Object\n                    .keys(galleryData)\n                    .map(getDay)\n                    .filter(Boolean)\n            )\n        ];\n\n\n        if (days.length === 0) {\n\n            gridEl.innerHTML =\n                '<p>Brak zdj\u0119\u0107 w galerii.<\/p>';\n\n            loadBtn.style.display =\n                'none';\n\n            return;\n        }\n\n\n        currentDay =\n            days[0];\n\n        renderDayTabs(days);\n\n        renderSubtabs();\n\n        renderGallery();\n\n    } catch (error) {\n\n        gridEl.innerHTML =\n            '<p>Nie uda\u0142o si\u0119 za\u0142adowa\u0107 galerii.<\/p>';\n\n        loadBtn.style.display =\n            'none';\n\n        console.error(\n            'B\u0142\u0105d \u0142adowania galerii:',\n            error\n        );\n    }\n\n});\n<\/script>\n\n<!-- NAWIGACJA -->\n<header class=\"mp-nav\" id=\"mp-nav\">\n  <div class=\"mp-nav-inner\">\n\n    <a class=\"mp-nav-logo\" href=\"\/ii-mistrzostwa-polski-2026\/\" aria-label=\"Przejd\u017a do strony II Mistrzostw Polski 2026\">\n      <img decoding=\"async\" data-src=\"https:\/\/pspuzzlowe.com\/wp-content\/uploads\/2026\/01\/PSP-Logo-v1.png\" alt=\"Logo Polskiego Stowarzyszenia Puzzlowego\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" class=\"lazyload\" style=\"--smush-placeholder-width: 605px; --smush-placeholder-aspect-ratio: 605\/288;\">\n    <\/a>\n\n    <button class=\"mp-nav-toggle\" type=\"button\" aria-label=\"Otw\u00f3rz menu\" aria-expanded=\"false\">\n      <span><\/span>\n      <span><\/span>\n      <span><\/span>\n    <\/button>\n\n    <nav class=\"mp-nav-menu\" aria-label=\"Nawigacja strony mistrzostw\">\n      <a href=\"\/ii-mistrzostwa-polski-2026\/#o-wydarzeniu\">\n        O wydarzeniu\n      <\/a>\n\n      <a href=\"\/ii-mistrzostwa-polski-2026\/#harmonogram\">\n        Harmonogram\n      <\/a>\n\n      <a href=\"\/ii-mistrzostwa-polski-2026\/#sponsorzy\">\n        Sponsorzy\n      <\/a>\n\n      <a href=\"\/ii-mistrzostwa-polski-2026\/#dokumenty\">\n        Dokumenty\n      <\/a>\n\n      <a href=\"\/ii-mistrzostwa-polski-2026\/#qa\">\n        Q&amp;A\n      <\/a>\n\n      <a href=\"\/ii-mistrzostwa-polski-2026\/#kiedy-gdzie\">\n        Kiedy i gdzie\n      <\/a>\n\n      <a href=\"\/ii-mistrzostwa-polski-2026\/#kontakt\">\n        Dane kontaktowe\n      <\/a>\n\n      <a class=\"mp-language-switch\" href=\"\/en\/polish-speed-puzzling-championship-2026\/\">\n        EN\n      <\/a>\n    <\/nav>\n\n  <\/div>\n<\/header>\n<section class=\"mp-gallery-page\">\n  <div class=\"mp-gallery-hero\">\n    <p class=\"mp-gallery-kicker\">II Mistrzostwa Polski 2026<\/p>\n    <h1>Galeria zdj\u0119\u0107<\/h1>\n    <p>\n      Zobacz zdj\u0119cia z przygotowa\u0144, eliminacji, fina\u0142\u00f3w i rozdania nagr\u00f3d<br>podczas II Mistrzostw Polski w Uk\u0142adaniu Puzzli.<br> Zdj\u0119cia wykona\u0142a Aleksandra Sielewicz. Bardzo dzi\u0119kujemy!\n    <\/p>\n  <\/div>\n\n  <div class=\"mp-gallery-tabs\" id=\"mp-gallery-tabs\"><\/div>\n\n  <div class=\"mp-gallery-subtabs\" id=\"mp-gallery-subtabs\"><\/div>\n\n  <div class=\"mp-gallery-grid\" id=\"mp-gallery-grid\"><\/div>\n\n  <div class=\"mp-gallery-load-wrap\">\n    <button class=\"mp-gallery-load\" id=\"mp-gallery-load\" type=\"button\">\n      Poka\u017c wi\u0119cej zdj\u0119\u0107\n    <\/button>\n  <\/div>\n<\/section>\n\n<div class=\"mp-lightbox\" id=\"mp-lightbox\" aria-hidden=\"true\">\n\n  <button class=\"mp-lightbox-close\" type=\"button\" aria-label=\"Zamknij\">\n    \u00d7\n  <\/button>\n\n  <button class=\"mp-lightbox-prev\" type=\"button\" aria-label=\"Poprzednie zdj\u0119cie\">\n    \u2039\n  <\/button>\n\n  <div class=\"mp-lightbox-content\">\n\n    <img id=\"mp-lightbox-image\" alt=\"\">\n<div class=\"mp-lightbox-counter\" id=\"mp-lightbox-counter\">\n  1 \/ 1\n<\/div>\n    <a class=\"mp-lightbox-download\" id=\"mp-lightbox-download\" href=\"#\" download=\"\">\n      \u2193 Pobierz zdj\u0119cie\n    <\/a>\n\n  <\/div>\n\n  <button class=\"mp-lightbox-next\" type=\"button\" aria-label=\"Nast\u0119pne zdj\u0119cie\">\n    \u203a\n  <\/button>\n\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O wydarzeniu Harmonogram Sponsorzy Dokumenty Q&amp;A Kiedy i gdzie Dane kontaktowe EN II Mistrzostwa Polski 2026 Galeria zdj\u0119\u0107 Zobacz zdj\u0119cia z przygotowa\u0144, eliminacji, fina\u0142\u00f3w i rozdania nagr\u00f3dpodczas II Mistrzostw Polski w Uk\u0142adaniu Puzzli. Zdj\u0119cia wykona\u0142a Aleksandra Sielewicz. Bardzo dzi\u0119kujemy! Poka\u017c wi\u0119cej zdj\u0119\u0107 \u00d7 \u2039 1 \/ 1 \u2193 Pobierz zdj\u0119cie \u203a<\/p>","protected":false},"author":1,"featured_media":0,"parent":329,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"mp-en-packages","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-1429","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"trp-custom-language-flag":false,"mailpoet_newsletter_max":false,"woocommerce_thumbnail":false,"woocommerce_single":false,"woocommerce_gallery_thumbnail":false},"uagb_author_info":{"display_name":"admin-FBR0BkzI","author_link":"http:\/\/pspuzzlowe.com\/en\/author\/admin-fbr0bkzi\/"},"uagb_comment_info":0,"uagb_excerpt":"O wydarzeniu Harmonogram Sponsorzy Dokumenty Q&amp;A Kiedy i gdzie Dane kontaktowe EN II Mistrzostwa Polski 2026 Galeria zdj\u0119\u0107 Zobacz zdj\u0119cia z przygotowa\u0144, eliminacji, fina\u0142\u00f3w i rozdania nagr\u00f3dpodczas II Mistrzostw Polski w Uk\u0142adaniu Puzzli. Zdj\u0119cia wykona\u0142a Aleksandra Sielewicz. Bardzo dzi\u0119kujemy! Poka\u017c wi\u0119cej zdj\u0119\u0107 \u00d7 \u2039 1 \/ 1 \u2193 Pobierz zdj\u0119cie \u203a","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/pages\/1429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/comments?post=1429"}],"version-history":[{"count":27,"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/pages\/1429\/revisions"}],"predecessor-version":[{"id":1462,"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/pages\/1429\/revisions\/1462"}],"up":[{"embeddable":true,"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/pages\/329"}],"wp:attachment":[{"href":"http:\/\/pspuzzlowe.com\/en\/wp-json\/wp\/v2\/media?parent=1429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}