{"id":2389,"date":"2025-11-18T18:08:31","date_gmt":"2025-11-18T18:08:31","guid":{"rendered":"https:\/\/speedpuzzling.nl\/?page_id=2389"},"modified":"2026-02-12T17:39:28","modified_gmt":"2026-02-12T17:39:28","slug":"results-puzzlerelay","status":"publish","type":"page","link":"https:\/\/speedpuzzling.nl\/en\/results-puzzlerelay\/","title":{"rendered":"Results &#8211; Puzzlerelay"},"content":{"rendered":"\n<div class=\"wp-block-stackable-hero alignfull stk-block-hero stk-has-bottom-separator stk-block stk-107a08b stk-block-background is-style-default stk--has-background-overlay\" data-v=\"2\" data-block-id=\"107a08b\"><style>.stk-107a08b-inner-blocks{justify-content:flex-start !important;}.stk-107a08b {background-color:var(--theme-palette-color-9, #222e56) !important;background-image:url(https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/02\/460671321_549495830749176_5449918812236957648_n.jpg) !important;background-position:bottom center !important;background-size:custom !important;margin-bottom:0px !important;overflow:visible !important;}.stk-107a08b:before{background-color:var(--theme-palette-color-9, #222e56) !important;opacity:0.8 !important;}.stk-107a08b .stk-container{overflow:visible !important;}.stk-107a08b .stk-block-hero__content{min-height:500px !important;align-items:center !important;display:flex !important;}.stk-107a08b > .stk-separator__bottom svg{fill:var(--theme-palette-color-6, #f9fafb) !important;}.stk-107a08b > .stk-separator__bottom .stk-separator__wrapper{height:120px !important;}@media screen and (max-width:689px){.stk-107a08b {overflow:visible !important;}.stk-107a08b .stk-container{overflow:visible !important;}.stk-107a08b .stk-block-hero__content{min-height:225px !important;}}<\/style><div class=\"stk-block-hero__content stk-content-align stk-107a08b-column alignfull stk-container stk-107a08b-container stk--no-background stk--no-padding\"><div class=\"stk-block-content stk-inner-blocks has-text-align-center stk--column-flex stk-107a08b-inner-blocks\">\n<div class=\"wp-block-stackable-spacer stk-block-spacer stk--no-padding stk-block stk-8185a51\" data-block-id=\"8185a51\"><style>.stk-8185a51 {height:240px !important;}@media screen and (max-width:689px){.stk-8185a51 {height:110px !important;}}<\/style><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-d81670c stk-block-background\" id=\"puzzlerelay-br-results\" data-block-id=\"d81670c\"><style>.stk-d81670c .stk-block-heading__bottom-line{height:0px !important;}.stk-d81670c {background-color:#00000000 !important;min-height:0px !important;align-items:center !important;display:flex !important;}.stk-d81670c:before{background-color:#00000000 !important;}.stk-d81670c .stk-block-heading__text{font-size:60px !important;color:var(--theme-palette-color-7, #FDFDFD) !important;font-weight:900 !important;font-family:\"Coolvetica\", Sans-serif !important;letter-spacing:3.3px !important;}@media screen and (max-width:999px){.stk-d81670c .stk-block-heading__text{font-size:38px !important;letter-spacing:3.3px !important;}}@media screen and (max-width:689px){.stk-d81670c .stk-block-heading__text{font-size:25px !important;}}<\/style><h2 class=\"stk-block-heading__text has-text-color has-text-align-center\">Puzzlerelay<br>Results <\/h2><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div><div class=\"stk-separator stk-separator__bottom\"><div class=\"stk-separator__wrapper\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1600 200\" class=\"stk-separator__layer-1\" preserveAspectRatio=\"none\" aria-hidden=\"true\"><path d=\"M1610.5 189.1s-128.2-82.6-138.2-89.2c-17.1-11.3-37.2-15.5-87-18.1-49.7-2.6-753.6-40.7-783.9-42.3-30.3-1.5-81.1-1.3-121.1 8.2S-9.5 163.2-9.5 163.2v50h1620v-24.1z\"><\/path><\/svg><\/div><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<div class=\"wp-block-stackable-tabs alignfull stk-block-tabs stk-block stk-1054b4c\" data-initial-tab=\"1\" data-block-id=\"1054b4c\"><style>.stk-1054b4c {--tabs-gap:0px !important;}.stk-1054b4c .stk-block-tab-content .stk-block-content .stk-block-column[hidden]{display:none !important;}<\/style><div class=\"stk-row stk-inner-blocks stk-block-content stk-block-tabs--horizontal stk-block-tabs--fade stk-content-align stk-1054b4c-column alignfull\">\n<div class=\"wp-block-stackable-tab-content stk-block-tab-content stk-block stk-6adffc9\" data-block-id=\"6adffc9\"><div class=\"stk-row stk-inner-blocks stk-block-content stk-content-align stk-6adffc9-column\">\n<div class=\"wp-block-stackable-column stk-block-column stk-column stk-block stk-ef1eef8\" data-v=\"4\" id=\"teams\" data-block-id=\"ef1eef8\"><style>.stk-ef1eef8-container{max-width:1250px !important;min-width:auto !important;margin-right:auto !important;margin-left:auto !important;}<\/style><div class=\"stk-column-wrapper stk-block-column__content stk-container stk-ef1eef8-container stk--no-background stk--no-padding\"><div class=\"stk-block-content stk-inner-blocks stk-ef1eef8-inner-blocks\">\n<div class=\"wp-block-stackable-card stk-block-card stk-block stk-404219e is-style-default\" data-v=\"2\" data-block-id=\"404219e\"><style>.stk-404219e .stk-block-card__image{height:10px !important;}<\/style><div class=\"stk--no-padding stk-container stk-404219e-container stk-hover-parent\"><figure class=\"stk-block-card__image stk-img-wrapper stk-image--shape-stretch\"><img loading=\"lazy\" decoding=\"async\" class=\"stk-img wp-image-1124\" src=\"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3.png\" width=\"3333\" height=\"3333\" srcset=\"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3.png 3333w, https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3-300x300.png 300w, https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3-1024x1024.png 1024w, https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3-150x150.png 150w, https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3-768x768.png 768w, https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3-1536x1536.png 1536w, https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3-2048x2048.png 2048w, https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3-12x12.png 12w\" sizes=\"auto, (max-width: 3333px) 100vw, 3333px\" \/><\/figure><div class=\"stk-container-padding stk-block-card__content\"><div class=\"stk-block-content stk-inner-blocks stk-404219e-inner-blocks\">\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-3d7eec3\" data-block-id=\"3d7eec3\"><p class=\"stk-block-text__text\">\n<div id=\"spnl-ranking-widget\">\n    <style>\n    \/* NOTE: All styles should be in CSS classes, not inline. *\/\n    \/* Tabs container *\/\n    #spnl-round-buttons {\n        display: flex;\n        gap: 8px;\n        flex-wrap: wrap;\n        margin-bottom: 15px;\n        justify-content: center;\n    }\n    \/* Base button style *\/\n    .spnl-round-tab {\n        border: none; \/* removed black border *\/\n        background: #EDEFF2; \/* light gray for inactive *\/\n        padding: 18px 28px; \/* less vertical padding *\/\n        cursor: pointer;\n        font-weight: 600;\n        font-size: 14px;\n        color: #222e56; \/* dark gray text *\/\n        border-radius: 50px; \/* pill shape *\/\n        user-select: none;\n        transition: background-color 0.3s ease, color 0.3s ease;\n        box-shadow: none;\n        line-height: 1.2;\n        min-height: 42px;\n    }\n    \/* Hover for non-active *\/\n    .spnl-round-tab:hover:not(.spnl-round-tab--active) {\n        background-color: #e0e0e0;\n        color: #222e56;\n    }\n    \/* Active tab style *\/\n    .spnl-round-tab--active {\n        background-color: #f0881f; \/* orange *\/\n        color: white;\n        cursor: default;\n    }\n    \/* Center tab label text *\/\n    .spnl-round-tab-label {\n        text-align: center;\n    }\n    \/* Ranking output container styling *\/\n    #spnl-ranking-output {\n        min-height: 300px;\n        transition: min-height 0.3s ease;\n        margin-top: 20px;\n    }\n    \/* Focus outline for accessibility *\/\n    .spnl-round-tab:focus-visible {\n        outline: 3px solid #ffa833;\n        outline-offset: 2px;\n    }\n    .spnl-timer-bar { display: flex; gap: 30px; align-items: center; margin-bottom: 20px; }\n    .spnl-timer-label { font-weight: bold; color: #222e56; }\n    .spnl-timer-value { font-family: monospace; font-size: 1.3em; color: #f0881f; }\n    .spnl-puzzle-row-img { width: 46px; height: 35px; object-fit: contain; display: block; border-radius: 4px; border: 1px solid #ccc; }\n    .spnl-puzzle-row-time { font-size: 0.9em; color: #888; text-align: center; }\n\n    \/* Timer card style (copied\/adapted from timer.blade.php) *\/\n    .spnl-timer-card {\n        background: #004080;\n        border-radius: 16px;\n        box-shadow: none;\n        border: none;\n        margin-right: 19px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        min-height: 56px;\n        margin-top: -10px;\n        max-width: 235px;\n        width: 235px;\n        margin-left: auto;\n    }\n    .spnl-timer-inner {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n    }\n    .spnl-timer-display {\n        font-family: 'Inter', 'Roboto Mono', 'Menlo', 'Monaco', 'Consolas', monospace;\n        font-variant-numeric: tabular-nums;\n        min-width: 120px;\n        display: inline-block;\n        font-size: 2em;\n        color: #fff;\n        text-align: center;\n        font-weight: 700;\n        letter-spacing: 0.08em;\n        line-height: 1.1;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n    \/* Custom extracted classes *\/\n    .spnl-header-outer { width: 100%; margin-bottom: 0; }\n    .spnl-header-two-col {\n        display: flex;\n        flex-direction: row;\n        align-items: flex-start;\n        width: 100%;\n        margin-top: 24px;\n    }\n    .spnl-header-left {\n        flex: 0 0 50%;\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n    }\n    .spnl-header-right {\n        flex: 0 0 50%;\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n    }\n    .spnl-header-title-row {\n        display: flex;\n        flex-direction: row;\n        align-items: flex-end;\n        justify-content: space-between;\n        width: 100%;\n        margin-bottom: 24px;\n    }\n    .spnl-header-title-main {\n        font-size: 2.1em;\n        font-weight: 900;\n        text-align: left;\n        color: #222e56;\n        letter-spacing: 0.01em;\n        flex: 1 1 0;\n    }\n    .spnl-header-title-timer {\n        flex: 0 0 auto;\n        display: flex;\n        align-items: flex-end;\n        justify-content: flex-end;\n        width: 280px;\n        margin-left: auto;\n        margin-bottom: 0;\n    }\n    .spnl-info-row { display: flex; align-items: center; gap: 12px; font-size: 1.1em; color: #222e56; }\n    .spnl-info-icon { width: 20px; height: 20px; color: #004080; }\n    .spnl-info-label { font-weight: 600; padding-top: 6px;}\n    .spnl-info-value { color: #004080; }\n    .spnl-puzzle-cards {\n        display: flex;\n        flex-direction: row;\n        align-items: stretch;\n        gap: 16px;\n        width: 100%;\n    }\n    .spnl-puzzle-card {\n        flex: 1 1 0;\n        background: #fff;\n        border: none;\n        border-radius: 12px;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: flex-start;\n        box-shadow: 0 2px 8px rgba(0,0,0,0.04);\n        padding: 16px;\n        box-sizing: border-box;\n    }\n    .spnl-puzzle-card-header {\n        width: 100%;\n        margin: 0 auto 8px auto;\n        display: flex;\n        flex-direction: row-reverse;\n        align-items: center;\n        justify-content: flex-end;\n    }\n    .spnl-puzzle-card-img { width: 100%; height: 120px; object-fit: cover; border-radius: 6px; margin-bottom: 0; display: block; border: 1.5px solid #eee; cursor: pointer; transition: box-shadow 0.2s; }\n    .spnl-puzzle-card-img:hover { box-shadow: 0 0 0 3px #f0881f44; }\n    .spnl-puzzle-card-name { font-size: 1em; font-weight: 700; text-align: left; word-break: break-word; margin: 10px 0 4px 0; width: 100%; padding-left: 4px; }\n    .spnl-puzzle-card-brand-row { display: flex; flex-direction: row; align-items: center; justify-content: space-between; gap: 8px; font-size: 1em; color: #444; text-align: left; width: 100%; padding-left: 4px; }\n    .spnl-puzzle-card-brand { flex: 1 1 0; text-align: left; }\n    .spnl-puzzle-card-pieces {\n        flex: 0 0 auto;\n        display: flex;\n        align-items: center;\n        gap: 5px;\n        text-align: right;\n    }\n    .spnl-table-header { border-bottom: 1px solid #ccc; }\n    .spnl-table-header-left { text-align: left; min-width:30px; max-width:30px; }\n    .spnl-table-header-name { text-align: left; width:45%; }\n    .spnl-table-header-time { text-align: right; width:15%;  }\n    .spnl-table-puzzle-header { text-align: center; width:230px; border-bottom: 1px solid #ccc; }\n    .spnl-table {\n        border-collapse: separate;\n        border-spacing: 0;\n        width: 100%;\n        margin-bottom: 15px;\n        margin: 0 auto;\n        border: none;\n    }\n    .spnl-table tr, .spnl-table td, .spnl-table th, .spnl-table-header {\n        border: none !important;\n    }\n    .spnl-table-header, .spnl-table-header-left, .spnl-table-header-name, .spnl-table-header-time, .spnl-table-header.spnl-table-header-name {\n        padding-left: 18px;\n        padding-right: 18px;\n        box-sizing: border-box;\n    }\n    .spnl-table td {\n        padding-left: 18px;\n        padding-right: 18px;\n        box-sizing: border-box;\n    }\n    .spnl-table tr:nth-child(even) td {\n        background: #f8f9fb;\n    }\n    .spnl-table tr:nth-child(odd) td {\n        background: #fff;\n    }\n    .spnl-table-puzzle-cell-inner {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        justify-content: flex-end;\n        text-align: right;\n        width: 100%;\n        background: #f8f8f8;\n        border-radius: 8px;\n        padding: 8px;\n        box-sizing: border-box;\n        border: 1px solid #eee;\n        margin: 0;\n        min-height: 51px;\n        gap: 0;\n    }\n    .spnl-time-span {\n        font-size: 0.92em;\n        color: #222e56;\n        font-weight: 600;\n        margin-right: 0;\n        flex: 1 1 auto;\n        text-align: right;\n    }\n    .spnl-puzzle-row-img {\n        width: 46px;\n        height: 35px;\n        object-fit: contain;\n        display: block;\n        border-radius: 4px;\n        border: 1px solid #ccc;\n        margin: 0;\n        flex: 0 0 auto;\n    }\n    .spnl-flag-img {\n        width: 30px;\n        height: 20px;\n        margin: 0 6px 0 0;\n        padding: 0;\n        border-radius: 0;\n        border: none;\n        object-fit: contain;\n        display: block;\n        flex-shrink: 0;\n        box-sizing: content-box;\n    }\n    .spnl-flag-img--global {\n        width: 22px;\n        height: 16px;\n        margin-right: 6px;\n        vertical-align: middle;\n        border-radius: 2px;\n        object-fit: contain;\n        display: inline-block;\n    }\n    .spnl-finish-cell {\n        display: flex;\n        flex-direction: column;\n        align-items: flex-end;\n        justify-content: center;\n        gap: 2px;\n        min-width: 60px;\n        width: 100%;\n        box-sizing: border-box;\n    }\n    .spnl-finish-time {\n        font-size: 1em;\n        color: #004080;\n        font-weight: 700;\n    }\n    .spnl-finish-pieces {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 0.9em;\n        color: #1672b4;\n        margin-top: 2px;\n    }\n    .spnl-finish-diff {}\n    .spnl-finish-diff-prev { color: #f0881f; }\n    .spnl-finish-diff-first { color: #1672b4; }\n    .spnl-finish-diff-sep { color: gray; }\n    .spnl-pieces-span { color:#f0881f;font-size:0.95em; }\n    .spnl-table-empty-puzzle { text-align:left; min-width:100px; max-width:180px; }\n    .spnl-starttijd-label-icon { font-size:1.2em; }\n    .spnl-tijd-label-extra { text-align:left; margin-top:2px; }\n    .spnl-table-cell-dynamic {  \/* width will be set inline by JS, but other styles here *\/ }\n    .spnl-header-card {\n        background: #fff;\n        border-radius: 24px;\n        box-shadow: 0 2px 12px rgba(0,0,0,0.10);\n        padding: 32px 32px;\n        margin-bottom: 24px;\n        width: 100%;\n        box-sizing: border-box;\n    }\n    .spnl-table-header, .spnl-table-cell {\n        font-size: 0.97em;\n        padding: 6px 8px;\n    }\n    .spnl-table-header-time, .spnl-table-cell.time-col {\n        text-align: right;\n        min-width: 160px;\n        max-width: 160px;\n        font-size: 1.05em;\n    }\n    .spnl-table-header-left, .spnl-table-header-name, .spnl-table-header-time {\n        vertical-align: middle;\n    }\n    .spnl-table-header-left, .spnl-table-cell.spnl-table-header-left {\n        text-align: left;\n        padding-left: 12px;\n        width: 36px;\n        min-width: 36px;\n        max-width: 36px;\n        color: #222e56;\n    }\n    .spnl-table-header-name, .spnl-table-header.spnl-table-header-name {\n        text-align: left;\n        min-width: 320px;\n        max-width: 520px;\n        width: 50%;\n    }\n    .spnl-participant-cell {\n        min-width: 325px;\n        max-width: 325px;\n    }\n\n    .spnl-team-cell {\n        min-width: 600px;\n        max-width: 600px;\n    }\n\n    .spnl-table-header-time, .spnl-table-cell.time-col {\n        padding-right: 4px;\n    }\n    .spnl-table tr {\n        height: 71px;\n    }\n    .spnl-table td {\n        padding: 6px 0;\n    }\n    .spnl-team-cell {\n        display: block;\n        padding: 0;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n    .spnl-team-name-row {\n        display: block;\n        width: 100%;\n        box-sizing: border-box;\n        margin-bottom: 0;\n        padding-left: 8px;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n    .spnl-team-name-row-inner {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n        font-weight: 500;\n        font-size: 1.1em;\n        flex-wrap: nowrap;\n        width: 100%;\n        justify-content: space-between;\n    }\n    .spnl-team-name {\n        font-size: 1.13em;\n        color: #222e56;\n        font-weight: 500;\n        font-style: normal;\n        overflow: hidden;\n        display: flex;\n        align-items: center;\n        margin-left: -2px;\n        width: 100%;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        word-break: normal;\n    }\n    .spnl-solo-name-row {\n        display: flex;\n        align-items: center;\n        width: 100%;\n        box-sizing: border-box;\n        margin-bottom: 0;\n        padding-left: 8px;\n        height: 48px;\n        margin-top: 4px;\n    }\n    .spnl-solo-name-row-inner {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        font-weight: 500;\n        font-size: 1em;\n        flex-wrap: nowrap;\n        width: 100%;\n        margin-top: 2px;\n    }\n    .spnl-solo-name {\n        font-size: 1em;\n        color: #222e56;\n        font-weight: 500;\n        font-style: normal;\n        overflow: hidden;\n        display: flex;\n        align-items: center;\n        margin-left: -2px;\n        width: 100%;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        word-break: normal;\n    }\n    .spnl-participant-flag {\n        width: 22px;\n        height: 16px;\n        margin-right: 6px;\n        vertical-align: middle;\n        border-radius: 2px;\n        object-fit: contain;\n    }\n    .spnl-participant-name {\n        font-size: 15px;\n        color: #222e56;\n        font-weight: 400;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        display: flex;\n        align-items: center;\n    }\n    .spnl-data-label-rank {\n        width: 50px;\n        text-align: left;\n        padding-left: 15px !important;\n    }\n    .spnl-data-label-time {\n        width: 200px;\n        text-align: left;\n        padding-right: 15px !important;\n    }\n\n    \/* Puzzle columns: fixed width and right aligned *\/\n    .spnl-table .puzzle-col, .spnl-table .spnl-table-header.spnl-table-puzzle-header {\n        width: 230px;\n        min-width: 230px;\n        max-width: 230px;\n        text-align: right;\n        justify-content: flex-end;\n        padding-right: 10px;\n    }\n    .spnl-table-puzzle-cell-inner {\n        justify-content: flex-end;\n        text-align: right;\n        width: 100%;\n    }\n    .spnl-participants-row {\n        display: flex;\n        flex-direction: row;\n        width: 100%;\n        justify-content: flex-start;\n        align-items: stretch;\n        margin-top: 2px;\n    }\n    .spnl-participants-row.duo {\n        min-height: 36px;\n        height: 36px;\n        margin-top: 0px;\n    }\n    .spnl-participants-row.team {\n        flex-direction: column;\n        min-height: 60px;\n        height: 60px;\n        gap: 2px;\n    }\n    .spnl-participants-row.team .spnl-participant-row {\n        display: flex;\n        flex-direction: row;\n        gap: 0;\n        width: 100%;\n    }\n    .spnl-participant-cell {\n        display: flex;\n        align-items: center;\n        gap: 6px;\n        font-size: 14px;\n        padding: 0 8px;\n        border: none;\n        justify-content: flex-start;\n        flex: 1 1 0;\n    }\n    \/* Duo: wider participant columns, narrower puzzle columns *\/\n    .spnl-table.duo-mode .spnl-table-header-name,\n    .spnl-table.duo-mode .spnl-table-cell.spnl-table-header-name {\n        min-width: 230px;\n        max-width: 320px;\n        width: 30%;\n    }\n    .spnl-table.duo-mode .puzzle-col {\n        min-width: 60px;\n        max-width: 80px;\n        width: 10%;\n    }\n    .spnl-participants-2col {\n        display: flex;\n        flex-direction: row;\n        gap: 12px;\n        width: 100%;\n        margin-top: 2px;\n    }\n    .spnl-participants-col {\n        flex: 1 1 0;\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n    }\n    .spnl-participant-row {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-size: 13px;\n        margin-bottom: 2px;\n    }\n    .spnl-participant-name {\n        color: #222e56;\n        font-weight: 400;\n    }\n    .spnl-stats-wrapper {\n        display: flex;\n        flex-direction: row;\n        gap: 16px;\n        align-items: center;\n        flex-wrap: wrap;\n    }\n    \/* --- Responsive\/mobile media queries --- *\/\n    @media (max-width: 900px) {\n      .spnl-header-two-col {\n        flex-direction: column;\n        min-height: unset;\n      }\n      \/* Make info blocks stack vertically *\/\n      div[style*=\"margin-top: 24px; display: flex; gap: 16px;\"] {\n        flex-direction: column !important;\n      }\n      div[style*=\"margin-top: 24px; display: flex; gap: 16px;\"] > div {\n        width: 100% !important;\n      }\n      .spnl-header-left, .spnl-header-right {\n        min-width: 0;\n        max-width: 100%;\n        width: 100%;\n      }\n      .spnl-header-right {\n        align-items: stretch;\n        min-width: 0;\n      }\n      .spnl-puzzle-cards {\n        display: flex;\n        flex-direction: column;\n        align-items: stretch;\n        gap: 16px;\n        width: 100%;\n      }\n      .spnl-puzzle-card {\n        min-width: 0;\n        max-width: 100%;\n        width: 100%;\n        margin-bottom: 8px;\n      }\n      .spnl-header-title-row {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 10px;\n      }\n      .spnl-header-title-main {\n        margin-bottom: 18px !important;\n        text-align: center !important;\n        font-size: 1.35em !important;\n        display: block !important;\n        width: 100% !important;\n      }\n      .spnl-header-title-timer {\n        margin-top: 10px !important;\n        display: flex !important;\n        justify-content: center !important;\n        align-items: center !important;\n        text-align: center !important;\n        width: 100% !important;\n      }\n      .spnl-timer-card {\n        margin: 0 auto !important;\n      }\n      .spnl-timer-display {\n        font-size: 2.1em !important;\n      }\n\n      \/* Mobile ranking card styles *\/\n      .spnl-mobile-ranking-card-full {\n        background: #fff;\n        border-radius: 16px;\n        box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n        padding: 16px 12px;\n        margin-bottom: 16px;\n        width: 100%;\n        box-sizing: border-box;\n      }\n\n      \/* Team and participant styles *\/\n      .spnl-mobile-team-name-row {\n        position: relative;\n        display: flex;\n        align-items: center;\n        gap: 0;\n        font-size: 1.13em;\n        font-weight: 600;\n        margin-bottom: 8px;\n        padding-left: 42px;\n        padding-right: 8px;\n        width: 100%;\n        max-width: 100%;\n        box-sizing: border-box;\n        min-width: 0;\n      }\n\n      .spnl-mobile-team-flag,\n      .spnl-mobile-participants-section .spnl-flag-img,\n      .spnl-flag-img {\n        position: absolute !important;\n        left: 0 !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        width: 26px !important;\n        height: 18px !important;\n        margin: 0 !important;\n        border-radius: 2px !important;\n        object-fit: contain !important;\n        flex-shrink: 0 !important;\n      }\n\n      .spnl-mobile-participants-section {\n        margin: 0 0 12px 0;\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n        padding-left: 10px !important;\n        width: 100%;\n        box-sizing: border-box;\n      }\n\n      .spnl-mobile-puzzles-section {\n        width: 100%;\n        box-sizing: border-box;\n        min-width: 0;\n      }\n\n      .spnl-mobile-puzzle-card {\n        width: 100%;\n        max-width: 100%;\n        box-sizing: border-box;\n        min-width: 0;\n        overflow: hidden;\n      }\n      .spnl-mobile-puzzle-card .spnl-puzzle-row-img {\n        flex-shrink: 0;\n      }\n\n      .spnl-mobile-value {\n        width: 100%;\n        max-width: 100%;\n        box-sizing: border-box;\n        min-width: 0;\n        flex: 1 1 0;\n      }\n\n      .spnl-mobile-card-inner {\n        width: 100%;\n        max-width: 100%;\n        box-sizing: border-box;\n        min-width: 0;\n      }\n\n      .spnl-mobile-participants-section .spnl-participant-cell {\n        position: relative;\n        display: flex !important;\n        align-items: center !important;\n        gap: 0 !important;\n        width: 100% !important;\n        max-width: 100% !important;\n        box-sizing: border-box !important;\n        margin-bottom: 4px !important;\n        padding: 0 8px 0 42px !important;\n        min-height: 26px;\n        min-width: 0 !important;\n      }\n\n      .spnl-mobile-team-name,\n      .spnl-mobile-participant-name,\n      .spnl-mobile-puzzle-name {\n        white-space: normal !important;\n        word-break: break-word !important;\n        overflow-wrap: break-word !important;\n        text-overflow: initial !important;\n        overflow: visible !important;\n        min-width: 0 !important;\n        padding-right: 8px !important;\n        box-sizing: border-box !important;\n      }\n\n      .spnl-mobile-team-name,\n      .spnl-mobile-participant-name {\n        flex: 1 1 0;\n        min-width: 0;\n        max-width: 100%;\n        width: auto;\n      }\n\n      .spnl-mobile-puzzle-name {\n        width: 100%;\n        max-width: 100%;\n      }\n\n      .spnl-mobile-team-name {\n        \/* font-size: 1.13em; *\/\n        font-weight: 600;\n        color: #222e56;\n      }\n\n      .spnl-mobile-puzzle-name {\n        font-size: 0.95em;\n        font-weight: 500;\n        color: #222e56;\n      }\n\n      .spnl-mobile-participant-name {\n        font-size: 0.92em;\n        font-weight: 500;\n        color: #222e56;\n      }\n\n      \/* Override desktop participant name styles for mobile wrapping *\/\n      .spnl-participant-name {\n        white-space: normal !important;\n        word-break: break-word !important;\n        overflow-wrap: break-word !important;\n        text-overflow: initial !important;\n        overflow: visible !important;\n        min-width: 0 !important;\n        flex: 1 1 0 !important;\n      }\n\n      .spnl-participants-section .spnl-participant-cell,\n      .spnl-mobile-participants-section .spnl-participant-cell {\n        min-width: 0 !important;\n        flex: 1 1 0 !important;\n      }\n\n      .spnl-stats-wrapper {\n        flex-direction: column;\n        gap: 4px;\n        align-items: flex-start;\n      }\n\n      .spnl-header-title-main {\n        font-size: 1.15em !important;\n        margin-bottom: 16px !important;\n      }\n\n      .spnl-timer-display {\n        font-size: 1.7em !important;\n      }\n\n      .spnl-mobile-ranking-card-full {\n        padding: 14px 10px;\n        border-radius: 14px;\n        margin-bottom: 14px;\n      }\n\n      .spnl-mobile-team-name-row {\n        font-size: 1.02em;\n      }\n\n      .spnl-mobile-puzzle-name {\n        font-size: 0.9em;\n      }\n\n      .spnl-mobile-participant-name {\n        font-size: 0.90em;\n      }\n\n      .spnl-mobile-card-inner.spnl-mobile-card-grid {\n        gap: 0.4em;\n      }\n\n      #spnl-round-buttons {\n        flex-direction: column;\n        gap: 6px;\n        padding: 0 2vw;\n      }\n\n      .spnl-round-tab {\n        width: 100%;\n        min-width: 0;\n        font-size: 1em;\n        padding: 14px 10px;\n      }\n    }\n\n    @media (max-width: 600px) {\n      .spnl-header-card {\n        padding: 16px 12px;\n        border-radius: 12px;\n      }\n      \/* Ensure info blocks stack vertically *\/\n      div[style*=\"margin-top: 24px; display: flex; gap: 16px;\"] {\n        flex-direction: column !important;\n        gap: 8px !important;\n      }\n      div[style*=\"margin-top: 24px; display: flex; gap: 16px;\"] > div {\n        width: 100% !important;\n      }\n\n      .spnl-header-title-main {\n        font-size: 1.15em !important;\n        margin-bottom: 16px !important;\n      }\n\n      .spnl-timer-display {\n        font-size: 1.7em !important;\n      }\n\n      .spnl-mobile-ranking-card-full {\n        padding: 14px 10px;\n        border-radius: 14px;\n        margin-bottom: 14px;\n      }\n\n      .spnl-mobile-team-name-row {\n        font-size: 1.02em;\n      }\n\n      .spnl-mobile-puzzle-name {\n        font-size: 0.9em;\n      }\n\n      .spnl-mobile-participant-name {\n        font-size: 0.90em;\n      }\n\n      .spnl-mobile-card-inner.spnl-mobile-card-grid {\n        gap: 0.4em;\n      }\n\n      #spnl-round-buttons {\n        flex-direction: column;\n        gap: 6px;\n        padding: 0 2vw;\n      }\n\n      .spnl-round-tab {\n        width: 100%;\n        min-width: 0;\n        font-size: 1em;\n        padding: 14px 10px;\n      }\n    }\n    .spnl-team-name {\n        font-size: 1.13em;\n        color: #222e56;\n        font-weight: 500;\n        font-style: normal;\n        overflow: hidden;\n        display: flex;\n        align-items: center;\n        margin-left: -2px;\n        width: 100%;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        word-break: normal;\n    }\n    .spnl-team-name-row .spnl-flag-img,\n    .spnl-team-name-row .spnl-flag-img--global,\n    .spnl-participant-cell .spnl-flag-img {\n        width: 22px;\n        height: 16px;\n        margin-right: 6px;\n        vertical-align: middle;\n        border-radius: 2px;\n        object-fit: contain;\n        display: inline-block;\n        border: none;\n    }\n    .spnl-team-name-row .spnl-flag-img--global,\n    .spnl-participant-cell .spnl-flag-img--global {\n        width: 22px;\n        height: 16px;\n        margin-right: 6px;\n        vertical-align: middle;\n        border-radius: 2px;\n        object-fit: contain;\n        display: inline-block;\n        border: none;\n      }\n    .spnl-lightbox-overlay {\n        position: fixed;\n        top: 0; left: 0; right: 0; bottom: 0;\n        background: rgba(0,0,0,0.85);\n        z-index: 9999;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        cursor: zoom-out;\n        animation: fadeIn 0.2s;\n    }\n    .spnl-lightbox-img {\n        max-width: 90vw;\n        max-height: 90vh;\n        border-radius: 12px;\n        box-shadow: 0 4px 32px rgba(0,0,0,0.25);\n        background: #fff;\n        padding: 8px;\n        cursor: auto;\n        animation: popIn 0.2s;\n    }\n    @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n    @keyframes popIn { from { transform: scale(0.95); opacity: 0; } to { transform: scale(1); opacity: 1; } }\n    .spnl-table tr:nth-child(even) {\n        background: #f8f9fb;\n    }\n    .spnl-table tr:nth-child(odd) {\n        background: #fff;\n    }\n    .spnl-disqualified-row,\n    .spnl-disqualified-row td,\n    .spnl-disqualified-row th,\n    .spnl-disqualified-row .spnl-team-cell,\n    .spnl-disqualified-row .spnl-participant-cell,\n    .spnl-disqualified-row .spnl-data-label-rank,\n    .spnl-disqualified-row .spnl-data-label-time,\n    .spnl-disqualified-row td .spnl-table-puzzle-cell-inner {\n        \/* background: #ffcccc !important; *\/\n        \/* box-shadow: none !important; *\/\n    }\n    .spnl-disqualified-row td .spnl-table-puzzle-cell-inner {\n        \/* background: #f8a8a8 !important; *\/\n        \/* border: 1px solid #e57373 !important; *\/\n    }\n    .spnl-disqualified-label {\n        display: flex;\n        align-items: center;\n        justify-content: flex-end;\n        background: #e53935;\n        color: #fff;\n        font-size: 0.80em;\n        font-weight: 700;\n        border-radius: 8px;\n        padding: 2px 10px;\n        margin-left: 12px;\n        letter-spacing: 0.04em;\n        vertical-align: middle;\n        min-width: 120px;\n        height: 28px;\n    }\n    .spnl-disqualified-cross {\n        color: #e53935;\n        font-size: 1.05em;\n        vertical-align: middle;\n        display: inline-block;\n        line-height: 1;\n        position: relative;\n        top: 1px;\n        margin-left: -2px;\n        font-family: inherit;\n    }\n    <\/style>\n\n    <div id=\"spnl-round-buttons\" role=\"tablist\" aria-label=\"Rounds\">Loading rounds\u2026<\/div>\n    <div id=\"spnl-ranking-output\"><\/div>\n\n    <script>\n    \/\/ Language detection and translations\n    function isEnglish() {\n        return window.location.pathname.indexOf('\/en\/') !== -1;\n    }\n    var translations = {\n        nl: {\n            participants: \"Deelnemers:\",\n            pairs: \"Duo's:\",\n            teams: \"Teams:\",\n            finished: \"Gefinisht:\",\n            disqualified: \"Gediskwalificeerd:\",\n            disqualifiedLabel: \"GEDISKWALIFICEERD\"\n        },\n        en: {\n            participants: \"Participants:\",\n            pairs: \"Pairs:\",\n            teams: \"Teams:\",\n            finished: \"Finished:\",\n            disqualified: \"Disqualified:\",\n            disqualifiedLabel: \"DISQUALIFIED\"\n        }\n    };\n    function t(key) {\n        var lang = isEnglish() ? 'en' : 'nl';\n        return translations[lang][key] || key;\n    }\n    \n    \/\/ Translate round names from JSON data (just Round 1, Round 2)\n    function translateRoundName(name) {\n        if (!name || !isEnglish()) return name;\n        \/\/ Simple translations for relay rounds\n        return name\n            .replace(\/Ronde\\s+1\/gi, 'Round 1')\n            .replace(\/Ronde\\s+2\/gi, 'Round 2')\n            .replace(\/Ronde\/gi, 'Round');\n    }\n    \n    \/\/ Timer and formatting helpers (global)\n    function pad2(n) { return n < 10 ? '0' + n : n; }\n    function formatTime(seconds) {\n        if (typeof seconds === 'string' && seconds.indexOf(':') !== -1) {\n            \/\/ If already formatted, ensure it's HH:MM:SS\n            var parts = seconds.split(':');\n            while (parts.length < 3) parts.unshift('00');\n            return parts.map(function(p) { return p.length < 2 ? '0' + p : p; }).join(':');\n        }\n        seconds = Math.max(0, parseInt(seconds, 10) || 0);\n        var h = Math.floor(seconds \/ 3600);\n        var m = Math.floor((seconds % 3600) \/ 60);\n        var s = seconds % 60;\n        return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;\n    }\n    function formatTimeShort(seconds) {\n        if (typeof seconds === 'string' && seconds.indexOf(':') !== -1) {\n            var parts = seconds.split(':');\n            while (parts.length < 2) parts.unshift('00');\n            \/\/ Only MM:SS\n            return (parts[1].length < 2 ? '0' + parts[1] : parts[1]) + ':' + (parts[2] && parts[2].length < 2 ? '0' + parts[2] : (parts[2] || '00'));\n        }\n        seconds = Math.max(0, parseInt(seconds, 10) || 0);\n        var m = Math.floor(seconds \/ 60);\n        var s = seconds % 60;\n        return (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;\n    }\n    \/\/ Format for orange '+diff to previous' (always mm:ss)\n    function formatDiffPrev(seconds) {\n        if (typeof seconds !== 'number') seconds = parseInt(seconds, 10) || 0;\n        seconds = Math.max(0, seconds);\n        var m = Math.floor(seconds \/ 60);\n        var s = seconds % 60;\n        return (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;\n    }\n    \/\/ Format for blue '+diff to first' (hh:mm:ss if over 1 hour, else mm:ss)\n    function formatDiffFirst(seconds) {\n        if (typeof seconds !== 'number') seconds = parseInt(seconds, 10) || 0;\n        seconds = Math.max(0, seconds);\n        if (seconds >= 3600) {\n            var h = Math.floor(seconds \/ 3600);\n            var m = Math.floor((seconds % 3600) \/ 60);\n            var s = seconds % 60;\n            return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;\n        } else {\n            var m = Math.floor(seconds \/ 60);\n            var s = seconds % 60;\n            return (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;\n        }\n    }\n    function formatHM(date) {\n        if (!date) return '-';\n        return pad2(date.getHours()) + ':' + pad2(date.getMinutes());\n    }\n\n    function formatDate(date) {\n        if (!date) return '-';\n        return pad2(date.getDate()) + '-' + pad2(date.getMonth() + 1) + '-' + date.getFullYear();\n    }\n\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        var container = document.getElementById(\"spnl-round-buttons\");\n        var output = document.getElementById(\"spnl-ranking-output\");\n\n         fetch(\"https:\/\/speedpuzzling.nl\/puzzle-relay\/rounds.json\")\n            .then(function(response) { return response.json(); })\n            .then(function(result) {\n                var rounds = result.data || [];\n                if (!rounds.length) {\n                    container.innerHTML = \"No rounds found.\";\n                    return;\n                }\n\n                container.innerHTML = \"\";\n                rounds.forEach(function(round) {\n                    var btn = document.createElement(\"button\");\n                    btn.className = \"spnl-round-tab\";\n                    btn.setAttribute(\"role\", \"tab\");\n                    btn.setAttribute(\"aria-selected\", \"false\");\n                    btn.setAttribute(\"tabindex\", \"-1\");\n                    btn.textContent = translateRoundName(round.name);\n                    btn.style.margin = \"0\";\n\n                    btn.onclick = function(event) {\n                        event.preventDefault();\n                        document.querySelectorAll(\".spnl-round-tab\").forEach(function(b) {\n                            b.classList.remove(\"spnl-round-tab--active\");\n                            b.setAttribute(\"aria-selected\", \"false\");\n                            b.setAttribute(\"tabindex\", \"-1\");\n                        });\n                        btn.classList.add(\"spnl-round-tab--active\");\n                        btn.setAttribute(\"aria-selected\", \"true\");\n                        btn.setAttribute(\"tabindex\", \"0\");\n                        fetchRanking(round.id);\n                    };\n                    container.appendChild(btn);\n                });\n                var firstBtn = container.querySelector(\"button.spnl-round-tab\");\n                if (firstBtn) {\n                    firstBtn.classList.add(\"spnl-round-tab--active\");\n                    firstBtn.setAttribute(\"aria-selected\", \"true\");\n                    firstBtn.setAttribute(\"tabindex\", \"0\");\n                    fetchRanking(rounds[0].id);\n                }\n            })\n            .catch(function(err) {\n                console.error(\"Fetch error:\", err);\n                container.innerHTML = \"Error loading rounds.\";\n            });\n\n        function fetchRanking(roundId) {\n            output.innerHTML = '';\n            fetch(\"https:\/\/speedpuzzling.nl\/puzzle-relay\/round_\"+roundId+\".json\")\n                .then(function(res) { return res.json(); })\n                .then(function(data) {\n                    if (!data || !data.data) {\n                        output.innerHTML = \"No ranking data available.\";\n                        return;\n                    }\n                    var puzzles = Array.isArray(data.data.puzzles) ? data.data.puzzles : [];\n                    var ranking = Array.isArray(data.data.ranking) ? data.data.ranking : [];\n                    var round = data.data.round || {};\n                    var actualStart = round.actual_start_datetime || null;\n                    var actualEnd = round.actual_end_datetime || null;\n                    var currentTime = data.data.current_time || null;\n                    var html = \"\";\n\n                    \/\/ Sort puzzles by elapsed_time in ascending order\n                    puzzles.sort(function(a, b) {\n                        var timeA = a.elapsed_time ? parseInt(a.elapsed_time) : Infinity;\n                        var timeB = b.elapsed_time ? parseInt(b.elapsed_time) : Infinity;\n                        return timeA - timeB;\n                    });\n\n                    \/\/ Always define these variables\n                    var plannedStart = round.start_datetime ? new Date(round.start_datetime) : null;\n                    var plannedEnd = round.end_datetime ? new Date(round.end_datetime) : null;\n                    var actualStart = round.actual_start_datetime ? new Date(round.actual_start_datetime) : null;\n                    var actualEnd = round.actual_end_datetime ? new Date(round.actual_end_datetime) : null;\n\n                    function formatHM(date) {\n                        if (!date) return '-';\n                        return pad2(date.getHours()) + ':' + pad2(date.getMinutes());\n                    }\n\n                    function formatDate(date) {\n                        if (!date) return '-';\n                        return pad2(date.getDate()) + '-' + pad2(date.getMonth() + 1) + '-' + date.getFullYear();\n                    }\n\n                    \/\/ Move round header outside and update left side content\n                    html += \"<link href='https:\/\/fonts.googleapis.com\/icon?family=Material+Icons' rel='stylesheet'>\";\n\n                    \/\/ Always render the timer, even if actualStart is not set\n                    html += \"<div class='spnl-header-card'><div class='spnl-header-outer'>\";\n                    html += \"<div class='spnl-header-title-row'>\";\n                    html += \"<div class='spnl-header-title-main' style='text-align:left;'>\" + (translateRoundName(round.competition_name) || '') + (round.name ? (round.competition_name ? ' \u2013 ' : '') + translateRoundName(round.name) : '') + \"<\/div>\";\n                        html += \"<div class='spnl-header-title-timer'><div class='spnl-timer-card'><span id='spnl-live-timer' class='spnl-timer-display' data-start='\" + (actualStart ? actualStart.toISOString() : \"\") + \"' data-end='\" + (actualEnd ? actualEnd.toISOString() : \"\") + \"'><\/span><\/div><\/div>\";\n                    html += \"<\/div>\";\n\n                    \/\/ Calculate finishers and disqualified counts\n                    var finishersCount = ranking.filter(function(entry) {\n                        \/\/ A finisher is someone who:\n                        \/\/ 1. Has a time that's not \"-\"\n                        \/\/ 2. Is not disqualified\n                        \/\/ 3. Must NOT have pieces (if pieces exists, they're not a finisher)\n                        return entry.time &&\n                               entry.time !== \"-\" &&\n                               !entry.is_disqualified &&\n                               !entry.pieces;\n                    }).length;\n                    var disqualifiedCount = ranking.filter(function(entry) {\n                        return entry.is_disqualified;\n                    }).length;\n\n                    html += \"<div style='margin-top: 24px; display: flex; gap: 16px;'>\";\n                    \/\/ Left column\n                    html += \"<div style='flex: 1; display: flex; flex-direction: column; gap: 8px;'>\";\n                    \/\/ Planned schedule\n                    html += \"<div class='spnl-info-row' style='display: flex; align-items: center; gap: 12px; background: #f8f8f8; border-radius: 8px; padding: 8px; border: 1px solid #eee;'>\" +\n                        \"<span class='material-icons spnl-info-icon' style='color: #004080; width: 40px; text-align: center;'>event<\/span>\" +\n                        \"<span class='spnl-info-label' style='font-size: 0.95em; font-weight: 500; color: #222e56;'>\" + formatDate(plannedStart) + \", \" + formatHM(plannedStart) + \" - \" + formatHM(plannedEnd) + \"<\/span>\" +\n                        \"<\/div>\";\n                    \/\/ Actual schedule\n                    html += \"<div class='spnl-info-row' style='display: flex; align-items: center; gap: 12px; background: #f8f8f8; border-radius: 8px; padding: 8px; border: 1px solid #eee;'>\" +\n                        \"<span class='material-icons spnl-info-icon' style='color: #004080; width: 40px; text-align: center;'>schedule<\/span>\" +\n                        \"<span class='spnl-info-label' style='font-size: 0.95em; font-weight: 500; color: #222e56;'>\" + formatHM(actualStart) + \" - \" + formatHM(actualEnd) + \"<\/span>\" +\n                        \"<\/div>\";\n                    html += \"<\/div>\";\n\n                    \/\/ Right column\n                    html += \"<div style='flex: 1; display: flex; flex-direction: column; gap: 8px;'>\";\n                    \/\/ Team count\n                    var teamIcon = round.category === 'solo' ? 'person' : (round.category === 'pair' ? 'group' : 'groups');\n                    html += \"<div class='spnl-info-row' style='display: flex; align-items: center; gap: 12px; background: #f8f8f8; border-radius: 8px; padding: 8px; border: 1px solid #eee;'>\" +\n                        \"<span class='material-icons spnl-info-icon' style='color: #004080; width: 40px; text-align: center;'>\" + teamIcon + \"<\/span>\" +\n                        \"<div class='spnl-info-label' style='display: flex; gap: 8px; font-size: 0.95em; font-weight: 500; color: #222e56;'>\";\n\n                    if (round.category === 'solo') {\n                        html += \"<div>\" + t('participants') + \"<\/div><div id='participants-count'>\" + round.number_of_teams + \"<\/div>\";\n                    } else if (round.category === 'pair') {\n                        html += \"<div>\" + t('pairs') + \"<\/div><div id='duos-count'>\" + round.number_of_teams + \"<\/div>\";\n                    } else {\n                        html += \"<div>\" + t('teams') + \"<\/div><div id='teams-count'>\" + round.number_of_teams + \"<\/div>\";\n                    }\n\n                    html += \"<\/div><\/div>\";\n                    \/\/ Stats info\n                    html += \"<div class='spnl-info-row' style='display: flex; align-items: center; gap: 12px; background: #f8f8f8; border-radius: 8px; padding: 8px; border: 1px solid #eee;'>\" +\n                        \"<span class='material-icons spnl-info-icon' style='color: #004080; width: 40px; text-align: center;'>info<\/span>\" +\n                        \"<div class='spnl-stats-wrapper'>\" +\n                            \"<div class='spnl-info-label' style='display: flex; gap: 8px; font-size: 0.95em; font-weight: 500; color: #222e56;'>\" +\n                                \"<span>\" + t('finished') + \"<\/span><div id='finishers-count'>\" + finishersCount + \"<\/div>\" +\n                            \"<\/div>\" +\n                            (disqualifiedCount > 0 ?\n                            \"<div class='spnl-info-label' style='display: flex; gap: 8px; font-size: 0.95em; font-weight: 500; color: #222e56;'>\" +\n                                \"<span>\" + t('disqualified') + \"<\/span><div id='disqualified-count'>\" + disqualifiedCount + \"<\/div>\" +\n                            \"<\/div>\" : \"\") +\n                        \"<\/div>\" +\n                    \"<\/div>\";\n                    html += \"<\/div>\";\n                    html += \"<\/div>\";\n                    html += \"<div class='spnl-header-two-col'>\";\n                        html += \"<\/div>\";\n                    \/\/ Right: Puzzles\n                    html += \"<div class='spnl-header-right'>\";\n                    html += \"<div class='spnl-puzzle-cards'>\";\n                    if (puzzles.length) {\n                        puzzles.forEach(function(puzzle, idx) {\n                            var imgUrl = (puzzle.image && puzzle.image.url ? puzzle.image.url : \"\");\n                            html += \"<div class='spnl-puzzle-card'>\" +\n                                \"<div class='spnl-puzzle-card-header'>\" +\n                                    (imgUrl ? (\"<img class='spnl-puzzle-card-img' src='\" + imgUrl + \"' alt='\" + (puzzle.name || \"\") + \"' data-large='\" + imgUrl + \"' data-idx='\" + idx + \"'>\") : \"\") +\n                                \"<\/div>\" +\n                                \"<div class='spnl-puzzle-card-name'>\" + (puzzle.name || \"\") + \"<\/div>\" +\n                                \"<div class='spnl-puzzle-card-brand-row'>\" +\n                                    \"<span class='spnl-puzzle-card-brand'>\" + (puzzle.brand ? puzzle.brand : \"\") + \"<\/span>\" +\n                                    (puzzle.pieces ? (\"<span class='spnl-puzzle-card-pieces'><span class='material-icons spnl-puzzle-piece-icon'>extension<\/span> \" + puzzle.pieces + \"<\/span>\") : \"\") +\n                                \"<\/div>\" +\n                            \"<\/div>\";\n                        });\n                    }\n                    html += \"<\/div>\";\n                    html += \"<\/div>\";\n                    html += \"<\/div>\";\n                    html += \"<\/div><\/div>\";\n\n                    if (ranking.length) {\n                        var isSolo = (round.category && round.category.toLowerCase() === 'solo');\n                        \/\/ Table header: #, Name\/Team, [combined puzzle block], Final time, +diff prev, +diff first\n                        \/\/ Always show only one puzzle header for combined block\n                        var puzzleHeaders = \"<th class='spnl-table-header spnl-table-puzzle-header'><\/th>\";\n                        html += \"<table class='spnl-table'>\";\n                        var index = 1;\n                        var firstTime = null;\n                        var prevTime = null;\n                        var prevCompletionTime = null;\n                        var prevRank = null;\n                        ranking.forEach(function(entry, i) {\n                            \/\/ Sort puzzles by elapsed_time or completion_time for this entry\n                            if (Array.isArray(entry.puzzles)) {\n                                entry.puzzles.sort(function(a, b) {\n                                    function timeToSeconds(t) {\n                                        if (!t) return Infinity;\n                                        var parts = t.split(\":\").map(Number);\n                                        if (parts.length === 3) return parts[0]*3600 + parts[1]*60 + parts[2];\n                                        if (parts.length === 2) return parts[0]*60 + parts[1];\n                                        return Infinity;\n                                    }\n                                    var timeA = timeToSeconds(a.completion_time);\n                                    var timeB = timeToSeconds(b.completion_time);\n                                    return timeA - timeB;\n                                });\n                            }\n\n                            var name = isSolo && Array.isArray(entry.participants) && entry.participants.length ? entry.participants[0].name : (entry.team_name || \"\");\n                            var nationality = isSolo && Array.isArray(entry.participants) && entry.participants.length ? entry.participants[0].nationality : (entry.team_nationality || \"\");\n                            var flag = \"\";\n                            if (nationality) {\n                                if (nationality.toLowerCase() === 'global') {\n                                    flag = \"<img src='https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/earth-globe.png' alt='' class='spnl-flag-img spnl-flag-img--global'>\";\n                                } else {\n                                    flag = \"<img src='https:\/\/flagcdn.com\/w20\/\"+nationality.toLowerCase()+\".png' alt='' class='spnl-flag-img'>\";\n                                }\n                            }\n                            var finalTime = entry.time || \"-\";\n                            var plusPrev = \"\";\n                            var plusFirst = \"\";\n                            var pieces = entry.pieces;\n                            \/\/ Parse time as seconds for diff\n                            function parseTime(t) {\n                                if (!t || t === \"-\") return null;\n                                if (typeof t === 'number') return t;\n                                var parts = t.split(\":\").map(Number);\n                                if (parts.length === 3) return parts[0]*3600 + parts[1]*60 + parts[2];\n                                if (parts.length === 2) return parts[0]*60 + parts[1];\n                                return null;\n                            }\n                            var thisTime = parseTime(entry.time);\n                            if (i === 0) {\n                                firstTime = thisTime;\n                                prevTime = thisTime;\n                            }\n                            \/\/ Delta with previous\n                            if (thisTime !== null && prevTime !== null && i > 0) {\n                                var diffPrev = thisTime - prevTime;\n                                plusPrev = diffPrev > 0 ? \"+\" + formatDiffPrev(diffPrev) : \"\";\n                            }\n                            \/\/ Delta with first\n                            if (thisTime !== null && firstTime !== null && i > 0) {\n                                var diffFirst = thisTime - firstTime;\n                                plusFirst = diffFirst > 0 ? \"+\" + formatDiffFirst(diffFirst) : \"\";\n                            }\n                            \/\/ If no time, show max time and pieces if available\n                            if (!entry.time || entry.time === \"-\") {\n                                if (round && round.actual_end_datetime) {\n                                    var maxTime = parseTime(formatTime((new Date(round.actual_end_datetime) - new Date(round.actual_start_datetime))\/1000));\n                                    finalTime = formatTime(maxTime);\n                                }\n                                if (entry.pieces) {\n                                    finalTime += \"<br><span class='spnl-pieces-span'>pieces: \" + entry.pieces + \"<\/span>\";\n                                }\n                            }\n                            prevTime = thisTime;\n                            \/\/ Only show the rank if it is different from the previous row\n                            var showRank = true;\n                            var currentRank = entry.rank || entry.position || index;\n                            if (prevRank !== null && currentRank === prevRank) {\n                                showRank = false;\n                            }\n                            prevRank = currentRank;\n                            \/\/ Display combined puzzle block: both puzzles in one cell with one time\n                            var puzzleCells = \"\";\n                            if (Array.isArray(entry.puzzles) && entry.puzzles.length > 0) {\n                                \/\/ Get both puzzle images\n                                var puzzleImages = [];\n                                entry.puzzles.forEach(function(puzzle) {\n                                    var globalPuzzle = puzzles.find(function(p) { return p.id === puzzle.puzzle_id || p.puzzle_id === puzzle.puzzle_id; });\n                                    var imgUrl = (globalPuzzle && globalPuzzle.image && globalPuzzle.image.url) ? globalPuzzle.image.url : \"\";\n                                    if (imgUrl) {\n                                        puzzleImages.push(\"<img class='spnl-puzzle-row-img' src='\" + imgUrl + \"' alt='' style='margin-right: 4px;'>\");\n                                    }\n                                });\n                                \/\/ Use the final time for the combined block\n                                var combinedTime = entry.time || \"-\";\n                                if (combinedTime === \"-\" && entry.puzzles.length > 0) {\n                                    \/\/ If no final time, try to get the last puzzle's time\n                                    var lastPuzzle = entry.puzzles[entry.puzzles.length - 1];\n                                    combinedTime = lastPuzzle.elapsed_time || lastPuzzle.completion_time || \"-\";\n                                }\n                                var cellContent = \"<span class='spnl-time-span'>\" + combinedTime + \"<\/span>\";\n                                puzzleCells = \"<td class='spnl-table-cell spnl-table-cell-dynamic time-col puzzle-col' data-label='Puzzles'>\" +\n                                    \"<div class='spnl-table-puzzle-cell-inner' style='display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: nowrap;'>\" +\n                                    puzzleImages.join(\"\") + cellContent +\n                                    \"<\/div><\/td>\";\n                            } else {\n                                puzzleCells = \"<td class='spnl-table-cell spnl-table-cell-dynamic time-col puzzle-col'><\/td>\";\n                            }\n\n                            \/\/ Compose finish cell: time, then +prev | +first\n                            function formatDiff(val) {\n                                if (!val) return \"-\";\n                                var v = val.replace('+','');\n                                var parts = v.split(':').map(Number);\n                                var seconds = 0;\n                                if (parts.length === 3) {\n                                    seconds = parts[0]*3600 + parts[1]*60 + parts[2];\n                                } else if (parts.length === 2) {\n                                    seconds = parts[0]*60 + parts[1];\n                                } else if (parts.length === 1) {\n                                    seconds = parts[0];\n                                }\n                                if (seconds >= 3600) {\n                                    \/\/ Show as hh:mm:ss\n                                    var h = Math.floor(seconds \/ 3600);\n                                    var m = Math.floor((seconds % 3600) \/ 60);\n                                    var s = seconds % 60;\n                                    return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;\n                                } else {\n                                    \/\/ Show as mm:ss\n                                    var m = Math.floor(seconds \/ 60);\n                                    var s = seconds % 60;\n                                    return (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;\n                                }\n                            }\n                            var finishCell = \"\";\n                            if (entry.pieces != null) {\n                                finishCell = \"<div class='spnl-finish-cell'><span class='spnl-finish-time'>\" + formatTime(entry.time) + \"<\/span>\" +\n                                    \"<span class='spnl-finish-pieces'><span class='material-icons spnl-puzzle-piece-icon' style='font-size:1em;margin-right:4px;vertical-align:middle;'>extension<\/span>\" + entry.pieces + \"<\/span><\/div>\";\n                            } else {\n                                finishCell = \"<div class='spnl-finish-cell'><span class='spnl-finish-time'>\" + formatTime(entry.time) + \"<\/span>\";\n                                if (plusPrev || plusFirst) {\n                                    finishCell += \"<div class='spnl-finish-diff'>\" +\n                                        (plusPrev ? (\"<span class='spnl-finish-diff-prev'>\" + plusPrev + \"<\/span>\") : \"\") + ((plusPrev && plusFirst) ? \" <span class='spnl-finish-diff-sep'>|<\/span> \" : \"\") + (plusFirst ? (\"<span class='spnl-finish-diff-first'>\" + plusFirst + \"<\/span>\") : \"\") + \"<\/div>\";\n                                }\n                                finishCell += \"<\/div>\";\n                            }\n                            \/\/ If disqualified, replace --:--:-- with label\n                            if (entry.is_disqualified) {\n                                finishCell = \"<div class='spnl-finish-cell'><span class='spnl-disqualified-label'>\" + t('disqualifiedLabel') + \"<\/span><\/div>\";\n                            }\n\n                            \/\/ --- PARTICIPANTS BELOW TEAM\/DUO NAME ---\n                            var teamCellHtml = \"\";\n                            if (isSolo) {\n                                teamCellHtml = \"<div class='spnl-solo-name-row'><div class='spnl-solo-name-row-inner'><span>\" + flag + \"<\/span><span class='spnl-solo-name'>\" + name + \"<\/span><\/div><\/div>\";\n                            } else {\n                                \/\/ Duo\/Team: only show team name if present\n                                if (name && name.trim() !== \"\") {\n                                    teamCellHtml = \"<div class='spnl-team-name-row'><div class='spnl-team-name-row-inner'><span>\" + flag + \"<\/span><span class='spnl-team-name'>\" + name + \"<\/span><\/div><\/div>\";\n                                }\n                                \/\/ Show participants below\n                                if (Array.isArray(entry.participants) && entry.participants.length) {\n                                    if (entry.participants.length === 2) {\n                                        \/\/ Duo: two participants, one row\n                                        var participantsHtml = entry.participants.map(function(p) {\n                                            var pflag = '';\n                                            if (p.nationality) {\n                                                if (p.nationality.toLowerCase() === 'global') {\n                                                    pflag = \"<img src='https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/earth-globe.png' alt='' class='spnl-flag-img'>\";\n                                                } else {\n                                                    pflag = \"<img src='https:\/\/flagcdn.com\/w40\/\"+p.nationality.toLowerCase()+\".png' alt='' class='spnl-flag-img'>\";\n                                                }\n                                            }\n                                            var pname = p.display_name || p.name || '-';\n                                            return \"<div class='spnl-participant-cell'>\" + pflag + \"<span class='spnl-participant-name'>\" + pname + \"<\/span><\/div>\";\n                                        }).join('');\n                                        teamCellHtml += \"<div class='spnl-participants-row duo'>\" + participantsHtml + \"<\/div>\";\n                                    } else if (entry.participants.length === 4 || entry.participants.length === 3) {\n                                        \/\/ Team: 2x2 grid, fill empty if only 3\n                                        var rows = [[], []];\n                                        for (var i = 0; i < 4; i++) {\n                                            var p = entry.participants[i];\n                                            if (p) {\n                                                var pflag = '';\n                                                if (p.nationality) {\n                                                    if (p.nationality.toLowerCase() === 'global') {\n                                                        pflag = \"<img src='https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/earth-globe.png' alt='' class='spnl-flag-img'>\";\n                                                    } else {\n                                                        pflag = \"<img src='https:\/\/flagcdn.com\/w40\/\"+p.nationality.toLowerCase()+\".png' alt='' class='spnl-flag-img'>\";\n                                                    }\n                                                }\n                                                var pname = p.display_name || p.name || '-';\n                                                var cell = \"<div class='spnl-participant-cell'>\" + pflag + \"<span class='spnl-participant-name'>\" + pname + \"<\/span><\/div>\";\n                                                if (i < 2) rows[0].push(cell); else rows[1].push(cell);\n                                            } else {\n                                                \/\/ Empty cell for missing participant\n                                                var emptyCell = \"<div class='spnl-participant-cell'><\/div>\";\n                                                if (i < 2) rows[0].push(emptyCell); else rows[1].push(emptyCell);\n                                            }\n                                        }\n                                        teamCellHtml += \"<div class='spnl-participants-row team'><div class='spnl-participant-row'>\" + rows[0].join('') + \"<\/div><div class='spnl-participant-row'>\" + rows[1].join('') + \"<\/div><\/div>\";\n                                    } else {\n                                        \/\/ Fallback: show all in one row\n                                        var participantsHtml = entry.participants.map(function(p) {\n                                            var pflag = '';\n                                            if (p.nationality) {\n                                                if (p.nationality.toLowerCase() === 'global') {\n                                                    pflag = \"<img src='https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/earth-globe.png' alt='' class='spnl-flag-img'>\";\n                                                } else {\n                                                    pflag = \"<img src='https:\/\/flagcdn.com\/w40\/\"+p.nationality.toLowerCase()+\".png' alt='' class='spnl-flag-img'>\";\n                                                }\n                                            }\n                                            var pname = p.display_name || p.name || '-';\n                                            return \"<div class='spnl-participant-cell'>\" + pflag + \"<span class='spnl-participant-name'>\" + pname + \"<\/span><\/div>\";\n                                        }).join('');\n                                        teamCellHtml += \"<div class='spnl-participants-row'>\" + participantsHtml + \"<\/div>\";\n                                    }\n                                }\n                            }\n\n                            \/\/ Add duo-mode class to table if duo\n                            var tableClass = isSolo ? '' : (entry.participants && entry.participants.length === 2 ? ' duo-mode' : '');\n\n                            if (window.innerWidth <= 900) {\n                                \/\/ MOBILE BLOCK LAYOUT (true two-column grid, full card)\n                                html += \"<div class='spnl-mobile-ranking-card spnl-mobile-ranking-card-full\" + (entry.is_disqualified ? \" spnl-disqualified-row\" : \"\") + \"'\";\n                                html += \">\";\n                                html += \"<div class='spnl-mobile-card-inner' style='display: grid; grid-template-columns: auto 1fr; gap: 12px; align-items: start;'>\";\n                                \/\/ If disqualified, show only the label at the top, skip rank\/time\n                                if (entry.is_disqualified) {\n                                    html += \"<div style='grid-column: 1 \/ span 2; display: flex; justify-content: center; margin: 12px 0 16px 0;'><span class='spnl-disqualified-label' style='margin: 0;'>\" + t('disqualifiedLabel') + \"<\/span><\/div>\";\n                                } else {\n                                    \/\/ Rank\n                                    html += \"<div class='spnl-mobile-label' style='min-width: 80px;'>Rank:<\/div>\";\n                                    html += \"<div class='spnl-mobile-value spnl-mobile-rank-row' style='padding-left: 10px;'><span style='font-size: 1.2em; font-weight: 600; color: #222e56;'>\" + (showRank ? currentRank : \"\") + \"<\/span><\/div>\";\n                                }\n                                \/\/ Team\/Name\n                                html += \"<div class='spnl-mobile-label' style='min-width: 80px;'>\" + (isSolo ? \"Name:\" : \"Team:\") + \"<\/div>\";\n                                html += \"<div class='spnl-mobile-value' style='padding-left: 10px;'><div class='spnl-mobile-team-name-row'><span class='spnl-flag-img spnl-mobile-team-flag'>\" + flag + \"<\/span><span class='spnl-mobile-team-name'>\" + name + \"<\/span><\/div><\/div>\";\n                                \/\/ Participants (duo\/team)\n                                if (!isSolo && Array.isArray(entry.participants) && entry.participants.length) {\n                                    \/\/ REMOVE the label for participants\n                                    \/\/ html += \"<div class='spnl-mobile-label'>Participants:<\/div>\"; \/\/ REMOVE THIS LINE\n                                    html += \"<div class='spnl-mobile-label' style='min-width: 80px;'><\/div>\";\n                                    html += \"<div class='spnl-mobile-value spnl-mobile-participants-section'>\";\n                                    entry.participants.forEach(function(p) {\n                                        var pflag = '';\n                                        if (p.nationality) {\n                                            if (p.nationality.toLowerCase() === 'global') {\n                                                pflag = \"<img src='https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/earth-globe.png' alt='' class='spnl-flag-img spnl-mobile-participant-flag'>\";\n                                            } else {\n                                                pflag = \"<img src='https:\/\/flagcdn.com\/w40\/\"+p.nationality.toLowerCase()+\".png' alt='' class='spnl-flag-img spnl-mobile-participant-flag'>\";\n                                            }\n                                        }\n                                        var pname = p.display_name || p.name || '-';\n                                        html += \"<div class='spnl-participant-cell'><span class='spnl-flag-img spnl-mobile-participant-flag'>\" + pflag + \"<\/span><span class='spnl-mobile-participant-name'>\" + pname + \"<\/span><\/div>\";\n                                    });\n                                    html += \"<\/div>\";\n                                }\n                                \/\/ Puzzle - Combined block showing both puzzles with one time\n                                if (Array.isArray(entry.puzzles) && entry.puzzles.length) {\n                                    html += \"<div class='spnl-mobile-label' style='min-width: 80px; padding-top: 12px;'><\/div>\";\n                                    html += \"<div class='spnl-mobile-value spnl-mobile-puzzles-section'>\";\n                                    var cardBackground = '#f8f8f8';\n                                    var cardBorder = '#eee';\n                                    html += \"<div class='spnl-mobile-puzzle-card' style='display: flex; align-items: center; gap: 12px; background: \" + cardBackground + \"; border-radius: 8px; padding: 8px; margin-bottom: 8px; border: 1px solid \" + cardBorder + \";'>\";\n                                    \/\/ Show both puzzle images side by side, then time\n                                    entry.puzzles.forEach(function(puzzle) {\n                                        var globalPuzzle = puzzles.find(function(p) { return p.id === puzzle.puzzle_id || p.puzzle_id === puzzle.puzzle_id; });\n                                        var imgUrl = (globalPuzzle && globalPuzzle.image && globalPuzzle.image.url) ? globalPuzzle.image.url : \"\";\n                                        if (imgUrl) {\n                                            html += \"<img class='spnl-puzzle-row-img' src='\" + imgUrl + \"' alt='' style='width: 55px; height: 42px; object-fit: contain; border-radius: 4px; border: 1px solid #ddd; flex-shrink: 0;'>\";\n                                        }\n                                    });\n                                    \/\/ Show combined time next to images\n                                    var combinedTime = entry.time || \"-\";\n                                    if (combinedTime === \"-\" && entry.puzzles.length > 0) {\n                                        var lastPuzzle = entry.puzzles[entry.puzzles.length - 1];\n                                        combinedTime = lastPuzzle.elapsed_time || lastPuzzle.completion_time || \"-\";\n                                    }\n                                    html += \"<div style='font-size: 0.9em; color: #004080; font-weight: 600; margin-left: auto;'>\" + combinedTime + \"<\/div>\";\n                                    html += \"<\/div>\";\n                                    html += \"<\/div>\";\n                                }\n                                \/\/ Time (skip if disqualified)\n                                if (!entry.is_disqualified) {\n                                    html += \"<div class='spnl-mobile-label' style='min-width: 80px;'>Time:<\/div>\";\n                                    html += \"<div class='spnl-mobile-value spnl-mobile-finish-time' style='color: #004080; font-weight: 600; padding: 2px 0; padding-left: 8px;'>\" + formatTime(entry.time) + \"<\/div>\";\n\n                                    \/\/ Pieces\n                                    if (entry.pieces != null) {\n                                        html += \"<div class='spnl-mobile-label' style='min-width: 80px;'>Pieces:<\/div>\";\n                                        html += \"<div class='spnl-mobile-value spnl-mobile-finish-pieces' style='padding-left: 8px;'>\" +\n                                            \"<span class='spnl-finish-pieces' style='justify-content: flex-start; margin-top: 0;'>\" +\n                                                \"<span class='material-icons spnl-puzzle-piece-icon' style='font-size:1.1em;margin-right:4px;vertical-align:middle;'>extension<\/span>\" +\n                                                entry.pieces +\n                                            \"<\/span>\" +\n                                        \"<\/div>\";\n                                    } else if (plusPrev || plusFirst) {\n                                        html += \"<div class='spnl-mobile-label' style='min-width: 80px;'><\/div>\";\n                                        html += \"<div class='spnl-mobile-value spnl-mobile-deltas'>\" +\n                                            (plusPrev ? (\"<span class='spnl-finish-diff-prev'>\" + plusPrev + \"<\/span>\") : \"\") + ((plusPrev && plusFirst) ? \" <span class='spnl-finish-diff-sep'>|<\/span> \" : \"\") + (plusFirst ? (\"<span class='spnl-finish-diff-first'>\" + plusFirst + \"<\/span>\") : \"\") + \"<\/div>\";\n                                    }\n                                }\n                                html += \"<\/div><\/div>\";\n                            } else {\n                                \/\/ DESKTOP\/TABLET (unchanged)\n                                html += \"<tr\" + (entry.is_disqualified ? \" class='spnl-disqualified-row'\" : \"\") + \">\";\n                                html += \"<td class='spnl-data-label-rank'>\" + (entry.is_disqualified ? \"<span class='spnl-disqualified-cross'>\u274c<\/span>\" : (showRank ? currentRank : \"\")) + \"<\/td>\";\n                                html += (isSolo ?\n                                    (\"<td class='spnl-team-cell' data-label='Name'>\" + teamCellHtml + \"<\/td>\") :\n                                    (\"<td class='spnl-team-cell' data-label='Name' colspan='2'>\" + teamCellHtml + \"<\/td>\")\n                                );\n                                html += puzzleCells;\n                                html += \"<td class='spnl-data-label-time'>\" + finishCell + \"<\/td>\";\n                                html += \"<\/tr>\";\n                            }\n                        });\n                        html += \"<\/table>\";\n                    } else {\n                        html += \"<div><\/div>\";\n                    }\n                    output.innerHTML = html;\n\n                    \/\/ Timer logic (run after rendering)\n                    var timerEl = document.getElementById('spnl-live-timer');\n                    if (timerEl) {\n                        var startAttr = timerEl.getAttribute('data-start');\n                        var endAttr = timerEl.getAttribute('data-end');\n                        var start = startAttr ? new Date(startAttr) : null;\n                        var end = endAttr ? new Date(endAttr) : null;\n                        function updateTimer() {\n                            if (!startAttr) {\n                                timerEl.textContent = '00:00:00';\n                                return;\n                            }\n                            if (!start || !end || !timerEl) return;\n                            var now = new Date();\n                            var total = Math.floor((end - start) \/ 1000);\n                            var elapsed = Math.floor((now - start) \/ 1000);\n                            if (now < start) {\n                                timerEl.textContent = '00:00:00';\n                            } else if (now >= end) {\n                                timerEl.textContent = formatTime(total);\n                            } else {\n                                timerEl.textContent = formatTime(elapsed);\n                                setTimeout(updateTimer, 1000);\n                            }\n                        }\n                        updateTimer();\n                    }\n\n                    \/\/ Lightbox logic for puzzle card images\n                    var lightboxOverlay = null;\n                    function closeLightbox() {\n                        if (lightboxOverlay) {\n                            document.body.removeChild(lightboxOverlay);\n                            lightboxOverlay = null;\n                            document.removeEventListener('keydown', escListener);\n                        }\n                    }\n                    function escListener(e) {\n                        if (e.key === 'Escape') closeLightbox();\n                    }\n                    output.querySelectorAll('.spnl-puzzle-card-img').forEach(function(img) {\n                        img.addEventListener('click', function(e) {\n                            e.stopPropagation();\n                            var largeUrl = img.getAttribute('data-large');\n                            if (!largeUrl) return;\n                            closeLightbox();\n                            lightboxOverlay = document.createElement('div');\n                            lightboxOverlay.className = 'spnl-lightbox-overlay';\n                            lightboxOverlay.innerHTML = \"<img class='spnl-lightbox-img' src='\" + largeUrl + \"' alt=''>\";\n                            lightboxOverlay.onclick = closeLightbox;\n                            document.body.appendChild(lightboxOverlay);\n                            setTimeout(function() { document.addEventListener('keydown', escListener); }, 10);\n                        });\n                    });\n                })\n                .catch(function(error) {\n                    console.error(\"Error fetching ranking:\", error);\n                    output.innerHTML = \"Error loading ranking data.\";\n                    alert(error);\n                });\n        }\n    });\n    <\/script>\n <\/div>\n\n\n\n<\/p><\/div>\n<\/div><\/div><\/div><\/div>\n<\/div><\/div><\/div>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PuzzlerelayResults<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2389","page","type-page","status-publish","hentry"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Results - Puzzlerelay<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/speedpuzzling.nl\/en\/results-puzzlerelay\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:locale:alternate\" content=\"nl_NL\" \/>\n<meta property=\"og:locale:alternate\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Results - Puzzlerelay\" \/>\n<meta property=\"og:description\" content=\"PuzzlerelayResults\" \/>\n<meta property=\"og:url\" content=\"https:\/\/speedpuzzling.nl\/en\/results-puzzlerelay\/\" \/>\n<meta property=\"og:site_name\" content=\"Speedpuzzling The Netherlands\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/share\/19s5jqzsSg\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-12T17:39:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"3333\" \/>\n\t<meta property=\"og:image:height\" content=\"3333\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/results-puzzlerelay\\\/\",\"url\":\"https:\\\/\\\/speedpuzzling.nl\\\/results-puzzlerelay\\\/\",\"name\":\"Results - Puzzlerelay\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/results-puzzlerelay\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/results-puzzlerelay\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/speedpuzzling.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Pictogrammen-zonder-voorgrond-3.png\",\"datePublished\":\"2025-11-18T18:08:31+00:00\",\"dateModified\":\"2026-02-12T17:39:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/results-puzzlerelay\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/speedpuzzling.nl\\\/results-puzzlerelay\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/results-puzzlerelay\\\/#primaryimage\",\"url\":\"https:\\\/\\\/speedpuzzling.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Pictogrammen-zonder-voorgrond-3.png\",\"contentUrl\":\"https:\\\/\\\/speedpuzzling.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Pictogrammen-zonder-voorgrond-3.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/results-puzzlerelay\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/speedpuzzling.nl\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Puzzel Relay &#8211; Resultaten\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/#website\",\"url\":\"https:\\\/\\\/speedpuzzling.nl\\\/\",\"name\":\"Speedpuzzling The Netherlands\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/speedpuzzling.nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/#organization\",\"name\":\"Speedpuzzling The Netherlands\",\"url\":\"https:\\\/\\\/speedpuzzling.nl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/speedpuzzling.nl\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/cropped-logo-1.jpg\",\"contentUrl\":\"https:\\\/\\\/speedpuzzling.nl\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/cropped-logo-1.jpg\",\"width\":512,\"height\":512,\"caption\":\"Speedpuzzling The Netherlands\"},\"image\":{\"@id\":\"https:\\\/\\\/speedpuzzling.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/share\\\/19s5jqzsSg\\\/\",\"https:\\\/\\\/www.instagram.com\\\/speedpuzzling.the.netherlands\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Results - Puzzlerelay","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/speedpuzzling.nl\/en\/results-puzzlerelay\/","og_locale":"en_GB","og_type":"article","og_title":"[:en]Results - Puzzlerelay[:nl]Puzzel Relay - Resultaten[:] - Speedpuzzling The Netherlands","og_description":"PuzzlerelayResults","og_url":"https:\/\/speedpuzzling.nl\/en\/results-puzzlerelay\/","og_site_name":"Speedpuzzling The Netherlands","article_publisher":"https:\/\/www.facebook.com\/share\/19s5jqzsSg\/","article_modified_time":"2026-02-12T17:39:28+00:00","og_image":[{"width":3333,"height":3333,"url":"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/speedpuzzling.nl\/results-puzzlerelay\/","url":"https:\/\/speedpuzzling.nl\/results-puzzlerelay\/","name":"Results - Puzzlerelay","isPartOf":{"@id":"https:\/\/speedpuzzling.nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/speedpuzzling.nl\/results-puzzlerelay\/#primaryimage"},"image":{"@id":"https:\/\/speedpuzzling.nl\/results-puzzlerelay\/#primaryimage"},"thumbnailUrl":"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3.png","datePublished":"2025-11-18T18:08:31+00:00","dateModified":"2026-02-12T17:39:28+00:00","breadcrumb":{"@id":"https:\/\/speedpuzzling.nl\/results-puzzlerelay\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/speedpuzzling.nl\/results-puzzlerelay\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/speedpuzzling.nl\/results-puzzlerelay\/#primaryimage","url":"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3.png","contentUrl":"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/03\/Pictogrammen-zonder-voorgrond-3.png"},{"@type":"BreadcrumbList","@id":"https:\/\/speedpuzzling.nl\/results-puzzlerelay\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/speedpuzzling.nl\/en\/"},{"@type":"ListItem","position":2,"name":"Puzzel Relay &#8211; Resultaten"}]},{"@type":"WebSite","@id":"https:\/\/speedpuzzling.nl\/#website","url":"https:\/\/speedpuzzling.nl\/","name":"Speedpuzzling The Netherlands","description":"","publisher":{"@id":"https:\/\/speedpuzzling.nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/speedpuzzling.nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/speedpuzzling.nl\/#organization","name":"Speedpuzzling The Netherlands","url":"https:\/\/speedpuzzling.nl\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/speedpuzzling.nl\/#\/schema\/logo\/image\/","url":"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/02\/cropped-logo-1.jpg","contentUrl":"https:\/\/speedpuzzling.nl\/wp-content\/uploads\/2025\/02\/cropped-logo-1.jpg","width":512,"height":512,"caption":"Speedpuzzling The Netherlands"},"image":{"@id":"https:\/\/speedpuzzling.nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/share\/19s5jqzsSg\/","https:\/\/www.instagram.com\/speedpuzzling.the.netherlands\/"]}]}},"_links":{"self":[{"href":"https:\/\/speedpuzzling.nl\/en\/wp-json\/wp\/v2\/pages\/2389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/speedpuzzling.nl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/speedpuzzling.nl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/speedpuzzling.nl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/speedpuzzling.nl\/en\/wp-json\/wp\/v2\/comments?post=2389"}],"version-history":[{"count":10,"href":"https:\/\/speedpuzzling.nl\/en\/wp-json\/wp\/v2\/pages\/2389\/revisions"}],"predecessor-version":[{"id":2591,"href":"https:\/\/speedpuzzling.nl\/en\/wp-json\/wp\/v2\/pages\/2389\/revisions\/2591"}],"wp:attachment":[{"href":"https:\/\/speedpuzzling.nl\/en\/wp-json\/wp\/v2\/media?parent=2389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}