{"id":13353,"date":"2026-08-25T17:00:07","date_gmt":"2026-08-25T15:00:07","guid":{"rendered":"https:\/\/astraopen.pl\/?page_id=13353"},"modified":"2026-08-25T19:14:40","modified_gmt":"2026-08-25T17:14:40","slug":"livescore","status":"publish","type":"page","link":"https:\/\/astraopen.pl\/en\/livescore\/","title":{"rendered":"Livescore"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"13353\" class=\"elementor elementor-13353\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-932ce49 gpwf-pagehead e-flex e-con-boxed e-con e-parent\" data-id=\"932ce49\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5a948cc gpwf-eyebrow elementor-widget elementor-widget-text-editor\" data-id=\"5a948cc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span class=\"gpwf-ed\">Astra Coffee &amp; More Open 2026<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-776e938 gpwf-ph-title elementor-widget elementor-widget-heading\" data-id=\"776e938\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">LIVESCORE<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-85a36d9 e-flex e-con-boxed e-con e-parent\" data-id=\"85a36d9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1840de9 elementor-widget elementor-widget-html\" data-id=\"1840de9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- =====================================================================\n     ASTRA OPEN \u2014 WYNIKI NA \u017bYWO (LIVESCORE)\n     Blok samodzielny. Wklejasz CA\u0141O\u015a\u0106 do jednego wid\u017cetu Elementora \u201eHTML\".\n     Namespace CSS: .ao-sc \u2014 nie koliduje z .gpwf ani z .ao-ls (livestream).\n\n     ---------------------------------------------------------------------\n     JAK TO JEST ZBUDOWANE \u2014 I DLACZEGO TAK\n     ---------------------------------------------------------------------\n     Warstwa prezentacji (to, co widzisz) jest CA\u0141KOWICIE oddzielona od\n     \u017ar\u00f3d\u0142a danych. Blok nie wie i nie musi wiedzie\u0107, sk\u0105d bior\u0105 si\u0119 wyniki.\n     Pyta tylko o jedn\u0105 funkcj\u0119 \u2014 \u201eprovider\" \u2014 kt\u00f3ra ma zwr\u00f3ci\u0107 tablic\u0119\n     mecz\u00f3w w ustalonym formacie (opis ni\u017cej).\n\n     Dzi\u0119ki temu, kiedy przyjdzie dost\u0119p do API Infrontu, NIE przebudowujemy\n     tego pliku. Podmieniamy jedn\u0105 funkcj\u0119. To jest zmiana konfiguracji,\n     nie budowa od nowa.\n\n     Dane podaje wtyczka \u201eWyniki na \u017cywo \u2014 Astra Open\", kt\u00f3ra ustawia\n     AO_SCORE.provider i pobiera je z \/wp-json\/astra\/v1\/livescore.\n     Je\u015bli providera nie ma (wtyczka wy\u0142\u0105czona), blok pokazuje stan pusty \u2014\n     NIGDY danych demonstracyjnych. Podgl\u0105d demo w\u0142\u0105cza si\u0119 r\u0119cznie:\n     AO_SCORE.provider = AO_SCORE.demo.\n\n     ---------------------------------------------------------------------\n     KONTRAKT DANYCH \u2014 format, kt\u00f3ry musi zwr\u00f3ci\u0107 provider\n     ---------------------------------------------------------------------\n     Tablica obiekt\u00f3w. Jeden obiekt = jeden mecz:\n\n     {\n       kort:      \"Kort 1\",              \/\/ nazwa kortu, grupuje kolumny\n       konkurencja: \"Gra pojedyncza\",    \/\/ np. Gra pojedyncza \/ Gra podw\u00f3jna\n       runda:     \"3 runda eliminacji\",  \/\/ etykieta rundy\n       status:    \"live\" | \"przed\" | \"po\",\n       start:     \"10:00\",               \/\/ godzina lub \"nie przed 13:00\"\n       czas:      \"1:24\",                \/\/ czas trwania, tylko przy live\n       serwis:    0 | 1 | null,          \/\/ indeks zawodnika przy serwisie\n       zawodnicy: [\n         {\n           nazwa: \"P. Pohjola\",\n           kraj:  \"FIN\",\n           rozstawienie: \"4\",            \/\/ \"\" je\u015bli brak\n           sety:  [6, 3],                \/\/ gemy w zamkni\u0119tych\/trwaj\u0105cych setach\n           gem:   \"40\",                  \/\/ punkty w bie\u017c\u0105cym gemie (\"\", gdy nie live)\n           wygral: false                 \/\/ true = zwyci\u0119zca (tylko status \"po\")\n         },\n         { ... }                          \/\/ dok\u0142adnie dw\u00f3ch\n       ]\n     }\n\n     Wersja EN: pola tekstowe (kort\/konkurencja\/runda\/start) provider ma\n     zwr\u00f3ci\u0107 ju\u017c w odpowiednim j\u0119zyku. Blok sam t\u0142umaczy wy\u0142\u0105cznie w\u0142asne\n     napisy interfejsu.\n\n     ---------------------------------------------------------------------\n     PODPI\u0118CIE PRAWDZIWYCH DANYCH \u2014 jedyna rzecz do zrobienia p\u00f3\u017aniej\n     ---------------------------------------------------------------------\n     Gdziekolwiek na stronie, PRZED tym blokiem albo po nim:\n\n         AO_SCORE.provider = async function () {\n             const r = await fetch('\/wp-json\/astra\/v1\/livescore');\n             return await r.json();          \/\/ w formacie jak wy\u017cej\n         };\n\n     Uwaga architektoniczna: fetch idzie do NASZEGO endpointu w WordPressie,\n     nie bezpo\u015brednio do dostawcy. Powody: klucz API nie mo\u017ce wyl\u0105dowa\u0107\n     w kodzie strony, chcemy cache (jedno zapytanie na 15 s dla wszystkich\n     odwiedzaj\u0105cych zamiast jednego na osob\u0119), i chcemy m\u00f3c zmieni\u0107 dostawc\u0119\n     bez ruszania frontu.\n     ===================================================================== -->\n\n<div class=\"ao-sc\" id=\"ao-sc\">\n\n  <!-- Tytul i podtytul zdjete swiadomie: strona nazywa sie LIVESCORE\n       i ma wlasny naglowek, wiec powtarzanie tego samego dwa razy pod\n       soba tylko odsuwalo wyniki w dol. Zostaje pasek stanu \u2014 plakietka\n       NA ZYWO i godzina aktualizacji \u2014 bo to jedyne, czego nie widac\n       nigdzie indziej. -->\n  <div class=\"ao-sc-head\">\n    <div class=\"ao-sc-meta\">\n      <span class=\"ao-sc-pill\" hidden>\n        <span class=\"ao-sc-blink\"><\/span><span data-i18n=\"live\">Na \u017cywo<\/span>\n      <\/span>\n      <span class=\"ao-sc-stamp\"><\/span>\n    <\/div>\n  <\/div>\n\n  <div class=\"ao-sc-korty\" aria-live=\"polite\"><\/div>\n\n  <div class=\"ao-sc-pusto\" hidden>\n    <div class=\"ao-sc-pusto-ikona\" aria-hidden=\"true\">\n      <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n        <circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/>\n      <\/svg>\n    <\/div>\n    <p data-i18n=\"pusto\">W tej chwili nie toczy si\u0119 \u017caden mecz. Wyniki pojawi\u0105 si\u0119 tu automatycznie po rozpocz\u0119ciu gry.<\/p>\n  <\/div>\n\n  <!-- Linki do planu gier i drabinek zdjete \u2014 sa w menu glownym.\n       Zostaje podpis zrodla danych: to nie ozdoba, tylko wskazanie,\n       skad biora sie wyniki. -->\n  <div class=\"ao-sc-foot\">\n    <div class=\"ao-sc-zrodlo\"><\/div>\n  <\/div>\n\n<\/div>\n\n<style>\n\/* Kontener Elementora bywa ustawiony w wiersz (flex-row) \u2014 wtedy wid\u017cet\n   kurczy si\u0119 do szeroko\u015bci tre\u015bci. Ta regu\u0142a dotyczy wy\u0142\u0105cznie wid\u017cetu,\n   w kt\u00f3rym siedzi nasz blok. *\/\n.elementor-widget:has(> .elementor-widget-container > .ao-sc){width:100%;flex:1 1 100%}\n\n.ao-sc{\n  --navy:#241A12; --navy-2:#1A120C; --navy-3:#3A2A1C;\n  --gold:#E8A857; --gold-2:#F3C98A;\n  --clay:#A9541F; --clay-2:#C2703A;\n  --live:#D4802F;\n  --line:rgba(255,255,255,.12);\n  --mut:#A9957B;\n  width:100%;max-width:1240px;margin:0 auto;\n  background:var(--navy-2);color:#fff;\n  \/* Bez bocznego paddingu \u2014 tlo strony i tlo bloku sa tego samego koloru,\n     wiec wciecie nie tworzylo karty, tylko zwezalo kolumny kortow. *\/\n  padding:14px 0 22px;\n  font-family:'Inter',system-ui,-apple-system,sans-serif;\n  -webkit-font-smoothing:antialiased;\n  box-sizing:border-box\n}\n.ao-sc *{box-sizing:border-box}\n\/* Atrybut hidden przegrywa z display:grid\/flex ustawionym ni\u017cej \u2014 wymuszamy. *\/\n.ao-sc [hidden]{display:none !important}\n\n\/* ---------- pasek stanu ---------- *\/\n.ao-sc-head{display:flex;justify-content:flex-end;min-height:26px}\n.ao-sc-meta{display:flex;align-items:center;gap:14px}\n.ao-sc-pill{display:inline-flex;align-items:center;gap:8px;background:var(--live);color:#fff;\n  padding:5px 12px;border-radius:20px;font-family:'Oswald','Archivo',sans-serif;font-size:12px;\n  letter-spacing:.1em;text-transform:uppercase;font-weight:600}\n.ao-sc-blink{width:8px;height:8px;border-radius:50%;background:#fff;animation:ao-sc-blink 1.1s infinite}\n@keyframes ao-sc-blink{0%,100%{opacity:1}50%{opacity:.25}}\n.ao-sc-stamp{font-size:12px;color:var(--mut);white-space:nowrap}\n\n\/* ---------- siatka kort\u00f3w ---------- *\/\n.ao-sc-korty{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:12px}\n.ao-sc-kort{min-width:0}\n.ao-sc-kort-nag{font-family:'Oswald','Archivo',sans-serif;font-size:12px;font-weight:600;\n  letter-spacing:.14em;text-transform:uppercase;color:var(--gold-2);\n  padding:0 0 8px;border-bottom:1px solid var(--line);margin-bottom:12px}\n\n\/* ---------- karta meczu ---------- *\/\n.ao-sc-mecz{background:linear-gradient(180deg,#3A2E25,#2E241D);border:1px solid var(--line);\n  border-radius:13px;padding:13px 14px;margin-bottom:11px}\n.ao-sc-mecz--live{border-color:rgba(232,168,87,.55);box-shadow:0 0 0 1px rgba(232,168,87,.18),0 10px 26px rgba(0,0,0,.28)}\n.ao-sc-mecz--po{opacity:.72}\n\n.ao-sc-mecz-nag{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}\n.ao-sc-kat{font-family:'Oswald','Archivo',sans-serif;text-transform:uppercase;letter-spacing:.07em;\n  font-size:10.5px;color:var(--gold-2);line-height:1.3;min-width:0}\n.ao-sc-kat b{display:block;font-weight:600;color:var(--gold-2)}\n.ao-sc-kat span{display:block;color:var(--mut);font-weight:400;letter-spacing:.05em}\n.ao-sc-st{font-family:'Oswald','Archivo',sans-serif;font-size:10px;letter-spacing:.1em;\n  text-transform:uppercase;white-space:nowrap;padding:3px 8px;border-radius:20px}\n.ao-sc-st--live{background:var(--live);color:#fff;display:inline-flex;align-items:center;gap:6px}\n.ao-sc-st--live .ao-sc-blink{width:6px;height:6px}\n.ao-sc-st--przed{background:rgba(255,255,255,.08);color:#D9CBB6}\n.ao-sc-st--po{background:rgba(255,255,255,.06);color:var(--mut)}\n\n\/* ---------- wiersz zawodnika ---------- *\/\n.ao-sc-gracz{display:flex;align-items:center;gap:6px;padding:6px 0}\n.ao-sc-gracz + .ao-sc-gracz{border-top:1px solid rgba(255,255,255,.07)}\n.ao-sc-serw{width:7px;height:7px;border-radius:50%;background:var(--gold);flex:0 0 7px}\n.ao-sc-serw--brak{background:transparent}\n.ao-sc-kraj{font-family:'Oswald','Archivo',sans-serif;font-size:9.5px;letter-spacing:.05em;\n  color:var(--mut);background:rgba(255,255,255,.07);border-radius:3px;padding:2px 4px;flex:0 0 auto}\n.ao-sc-nazwa{font-family:'Oswald','Archivo',sans-serif;font-size:14px;letter-spacing:.02em;\n  color:#D2BA9A;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ao-sc-gracz--wygral .ao-sc-nazwa{color:#fff;font-weight:600}\n.ao-sc-rozst{color:var(--mut);font-size:11.5px;margin-left:4px}\n.ao-sc-sety{display:flex;gap:3px;flex:0 0 auto}\n.ao-sc-sety span{width:16px;text-align:center;font-family:'Oswald','Archivo',sans-serif;font-size:15px;\n  color:#D2BA9A;font-variant-numeric:tabular-nums}\n.ao-sc-gracz--wygral .ao-sc-sety span{color:var(--gold-2)}\n.ao-sc-gem{width:23px;text-align:center;font-family:'Oswald','Archivo',sans-serif;font-size:15px;\n  color:var(--navy-2);background:var(--gold);border-radius:4px;flex:0 0 23px;margin-left:3px;\n  font-variant-numeric:tabular-nums}\n\n.ao-sc-czas{font-size:11px;color:var(--mut);margin-top:8px;text-align:right}\n\n\/* ---------- stan pusty ---------- *\/\n.ao-sc-pusto{display:flex;flex-direction:column;align-items:center;gap:12px;text-align:center;\n  padding:44px 20px;margin-top:22px;border:1px dashed var(--line);border-radius:14px;color:var(--mut)}\n.ao-sc-pusto-ikona{color:var(--gold-2);opacity:.7}\n.ao-sc-pusto p{margin:0;font-size:14px;line-height:1.6;max-width:46ch}\n\n\/* ---------- stopka ---------- *\/\n.ao-sc-foot{margin-top:18px;padding-top:14px;border-top:1px solid var(--line)}\n.ao-sc-zrodlo{font-family:'Oswald','Archivo',sans-serif;font-size:10.5px;font-weight:600;\n  letter-spacing:.13em;text-transform:uppercase;color:var(--mut)}\n\n@media(max-width:1100px){.ao-sc-korty{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:767px){\n  .ao-sc{padding:10px 0 16px}\n  .ao-sc-korty{grid-template-columns:1fr;gap:6px}\n}\n@media(prefers-reduced-motion:reduce){.ao-sc-blink{animation:none}}\n<\/style>\n\n<script>\n(function () {\n  'use strict';\n\n  \/* ================================================================\n     PUNKT PODPI\u0118CIA DANYCH.\n     Zostawiamy globalny obiekt, \u017ceby da\u0142o si\u0119 podmieni\u0107 provider\n     z zewn\u0105trz \u2014 bez ruszania tego pliku.\n     ================================================================ *\/\n  var AO = window.AO_SCORE = window.AO_SCORE || {};\n\n  var ODSWIEZANIE = 20000;   \/* ms \u2014 co ile pytamy o nowe dane *\/\n\n  \/* ---------- j\u0119zyk ---------- *\/\n  function czyEN() {\n    var lang = (document.documentElement.getAttribute('lang') || '').toLowerCase();\n    if (lang.indexOf('en') === 0) return true;\n    return \/^\\\/en(\\\/|$)\/i.test(location.pathname);\n  }\n  var EN = czyEN();\n\n  var SLOWNIK = {\n    live:     'Live',\n    pusto:    'No match is in progress right now. Scores will appear here automatically once play begins.',\n    zaktual:  'Updated',\n    demo:     'Demonstration data \u2014 awaiting official feed',\n    zrodlo:   'Live scoring data: ITF World Tennis Tour',\n    blad:     'Scores are temporarily unavailable. Trying again in a moment.'\n  };\n  function t(klucz, domyslne) { return EN ? (SLOWNIK[klucz] || domyslne) : domyslne; }\n\n  \/* ---------- provider demonstracyjny ----------\n     Jedyne zadanie: pokaza\u0107, jak blok wygl\u0105da z danymi, zanim dane\n     b\u0119d\u0105 dost\u0119pne. Po podpi\u0119ciu prawdziwego providera ta funkcja\n     przestaje by\u0107 u\u017cywana (i mo\u017cna j\u0105 usun\u0105\u0107). *\/\n  AO.demo = function () {\n    var g = function (nazwa, kraj, rozst, sety, gem, wygral) {\n      return { nazwa: nazwa, kraj: kraj, rozstawienie: rozst, sety: sety, gem: gem, wygral: !!wygral };\n    };\n    return Promise.resolve([\n      { kort: EN ? 'Court 1' : 'Kort 1', konkurencja: EN ? 'Singles' : 'Gra pojedyncza',\n        runda: EN ? 'Qualifying Third Round' : '3 runda eliminacji',\n        status: 'live', start: '10:00', czas: '1:12', serwis: 0,\n        zawodnicy: [ g('P. Pohjola','FIN','4',[6,3],'40'), g('P. Michocki','POL','16',[4,3],'30') ] },\n      { kort: EN ? 'Court 1' : 'Kort 1', konkurencja: EN ? 'Singles' : 'Gra pojedyncza',\n        runda: EN ? 'First Round' : '1 runda',\n        status: 'przed', start: EN ? 'not before 13:00' : 'nie przed 13:00', serwis: null,\n        zawodnicy: [ g('F. Lechno-Wasiuty\u0144ski','POL','8',[],''), g('H. Rytelewski','POL','WC',[],'') ] },\n\n      { kort: EN ? 'Court 2' : 'Kort 2', konkurencja: EN ? 'Singles' : 'Gra pojedyncza',\n        runda: EN ? 'Qualifying Third Round' : '3 runda eliminacji',\n        status: 'po', start: '10:00', serwis: null,\n        zawodnicy: [ g('M. Savano','USA','3',[6,7],'',true), g('W. Marek','POL','9',[4,6],'') ] },\n      { kort: EN ? 'Court 2' : 'Kort 2', konkurencja: EN ? 'Singles' : 'Gra pojedyncza',\n        runda: EN ? 'Qualifying Third Round' : '3 runda eliminacji',\n        status: 'live', start: '11:40', czas: '0:38', serwis: 1,\n        zawodnicy: [ g('J. Szajrych','POL','1',[7,1],'15'), g('D. Wi\u015bniewski','POL','',[5,2],'40') ] },\n\n      { kort: EN ? 'Court 3' : 'Kort 3', konkurencja: EN ? 'Singles' : 'Gra pojedyncza',\n        runda: EN ? 'Qualifying Third Round' : '3 runda eliminacji',\n        status: 'live', start: '10:00', czas: '2:04', serwis: 1,\n        zawodnicy: [ g('B. Kokot','POL','',[4,6,5],'30'), g('J. Ch\u0142odnicki','POL','10',[6,3,6],'40') ] },\n\n      { kort: EN ? 'Court 4' : 'Kort 4', konkurencja: EN ? 'Doubles' : 'Gra podw\u00f3jna',\n        runda: EN ? 'First Round' : '1 runda',\n        status: 'przed', start: EN ? 'to follow' : 'nast\u0119pnie', serwis: null,\n        zawodnicy: [ g('Cerny \/ Mashtakov','CZE','',[],''), g('Catini \/ Matta','ITA','',[],'') ] }\n    ]);\n  };\n\n  \/* ---------- pomocnicze ---------- *\/\n  function esc(s) {\n    return String(s == null ? '' : s)\n      .replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;')\n      .replace(\/\"\/g, '&quot;');\n  }\n\n  function dwaCyfry(n) { return (n < 10 ? '0' : '') + n; }\n\n  function znacznikCzasu() {\n    var d = new Date();\n    return t('zaktual', 'Aktualizacja') + ' ' + dwaCyfry(d.getHours()) + ':' + dwaCyfry(d.getMinutes());\n  }\n\n  \/* ---------- render jednego zawodnika ---------- *\/\n  function wierszGracza(z, serwuje, live) {\n    var sety = (z.sety || []).map(function (s) { return '<span>' + esc(s) + '<\/span>'; }).join('');\n    var gem  = (live && z.gem !== '' && z.gem != null) ? '<div class=\"ao-sc-gem\">' + esc(z.gem) + '<\/div>' : '';\n    var rozst = z.rozstawienie ? '<i class=\"ao-sc-rozst\">[' + esc(z.rozstawienie) + ']<\/i>' : '';\n\n    return '' +\n      '<div class=\"ao-sc-gracz' + (z.wygral ? ' ao-sc-gracz--wygral' : '') + '\">' +\n        '<span class=\"ao-sc-serw' + (serwuje ? '' : ' ao-sc-serw--brak') + '\"' +\n          (serwuje ? ' title=\"' + esc(EN ? 'Serving' : 'Serwis') + '\"' : ' aria-hidden=\"true\"') + '><\/span>' +\n        (z.kraj ? '<span class=\"ao-sc-kraj\">' + esc(z.kraj) + '<\/span>' : '') +\n        '<span class=\"ao-sc-nazwa\">' + esc(z.nazwa) + rozst + '<\/span>' +\n        '<span class=\"ao-sc-sety\">' + sety + '<\/span>' +\n        gem +\n      '<\/div>';\n  }\n\n  \/* ---------- render jednej karty meczu ---------- *\/\n  function kartaMeczu(m) {\n    var live = m.status === 'live';\n    var etykieta, klasaSt;\n    if (live)                    { etykieta = '<span class=\"ao-sc-blink\"><\/span>' + esc(t('live', 'Na \u017cywo')); klasaSt = 'live'; }\n    else if (m.status === 'po')  { etykieta = esc(EN ? 'Finished' : 'Po meczu'); klasaSt = 'po'; }\n    else                         { etykieta = esc(m.start || (EN ? 'Scheduled' : 'Zaplanowany')); klasaSt = 'przed'; }\n\n    var gracze = (m.zawodnicy || []).map(function (z, i) {\n      return wierszGracza(z, live && m.serwis === i, live);\n    }).join('');\n\n    var czas = (live && m.czas) ? '<div class=\"ao-sc-czas\">' + esc(m.czas) + '<\/div>' : '';\n\n    return '' +\n      '<article class=\"ao-sc-mecz ao-sc-mecz--' + esc(m.status) + '\">' +\n        '<div class=\"ao-sc-mecz-nag\">' +\n          '<div class=\"ao-sc-kat\"><b>' + esc(m.konkurencja || '') + '<\/b><span>' + esc(m.runda || '') + '<\/span><\/div>' +\n          '<div class=\"ao-sc-st ao-sc-st--' + klasaSt + '\">' + etykieta + '<\/div>' +\n        '<\/div>' +\n        gracze + czas +\n      '<\/article>';\n  }\n\n  \/* ---------- render ca\u0142o\u015bci ---------- *\/\n  function render(mecze, blok, opcje) {\n    opcje = opcje || {};\n    var siatka = blok.querySelector('.ao-sc-korty');\n    var pusto  = blok.querySelector('.ao-sc-pusto');\n    var pill   = blok.querySelector('.ao-sc-pill');\n    var stamp  = blok.querySelector('.ao-sc-stamp');\n    var zrodlo = blok.querySelector('.ao-sc-zrodlo');\n\n    if (!mecze || !mecze.length) {\n      siatka.innerHTML = '';\n      siatka.hidden = true;\n      pusto.hidden = false;\n      pill.hidden = true;\n    } else {\n      \/* grupujemy po kortach, zachowuj\u0105c kolejno\u015b\u0107 pierwszego wyst\u0105pienia *\/\n      var korty = [], wg = {};\n      mecze.forEach(function (m) {\n        var k = m.kort || (EN ? 'Court' : 'Kort');\n        if (!wg[k]) { wg[k] = []; korty.push(k); }\n        wg[k].push(m);\n      });\n\n      \/* KOLEJNO\u015a\u0106 = HARMONOGRAM. Nie sortujemy mecz\u00f3w po statusie.\n         Wcze\u015bniej trwaj\u0105ce sz\u0142y na g\u00f3r\u0119 kortu, co wydawa\u0142o si\u0119 sensowne,\n         ale rozje\u017cd\u017ca\u0142o blok z planem gier: ten sam kort, ta sama pora,\n         a mecze w innej kolejno\u015bci. Kibic czyta kort z g\u00f3ry na d\u00f3\u0142 jak\n         program dnia \u2014 pierwszy, potem nast\u0119pny \u2014 i tak ma zosta\u0107.\n         Dane przychodz\u0105 z API ju\u017c w kolejno\u015bci rozgrywania. *\/\n\n      siatka.innerHTML = korty.map(function (k) {\n        return '<div class=\"ao-sc-kort\">' +\n                 '<div class=\"ao-sc-kort-nag\">' + esc(k) + '<\/div>' +\n                 wg[k].map(kartaMeczu).join('') +\n               '<\/div>';\n      }).join('');\n\n      siatka.hidden = false;\n      pusto.hidden = true;\n      pill.hidden = !mecze.some(function (m) { return m.status === 'live'; });\n    }\n\n    stamp.textContent = opcje.blad ? t('blad', 'Wyniki chwilowo niedost\u0119pne. Ponawiam za moment.')\n                                   : znacznikCzasu();\n    zrodlo.textContent = opcje.demo\n      ? t('demo', 'Dane demonstracyjne \u2014 czekamy na oficjalny feed')\n      : t('zrodlo', 'Dane wynik\u00f3w na \u017cywo: ITF World Tennis Tour');\n  }\n\n  \/* ---------- t\u0142umaczenie napis\u00f3w interfejsu ---------- *\/\n  function przetlumaczUI(blok) {\n    if (!EN) return;\n    blok.querySelectorAll('[data-i18n]').forEach(function (el) {\n      var k = el.getAttribute('data-i18n');\n      if (SLOWNIK[k]) el.textContent = SLOWNIK[k];\n    });\n  }\n\n  \/* ---------- p\u0119tla ---------- *\/\n  function start(blok) {\n    przetlumaczUI(blok);\n\n    var pobieram = false;\n\n    var pierwszy = true;\n\n    function tick() {\n      if (pobieram) return;\n      \/* Kart\u0119 w tle odpytujemy tylko raz \u2014 \u017ceby po prze\u0142\u0105czeniu si\u0119 na ni\u0105\n         zasta\u0107 gotow\u0105 tre\u015b\u0107, a nie pustk\u0119. Kolejnych cykli w tle nie ma:\n         nie ma po co m\u0119czy\u0107 serwera dla nikogo, kto nie patrzy. *\/\n      if (document.hidden && !pierwszy) return;\n      pierwszy = false;\n      pobieram = true;\n\n      \/* Brak dostawcy danych = pokazujemy stan pusty, nigdy danych\n         demonstracyjnych. Wersja demo istnieje wylacznie do podgladu\n         wygladu i wlacza sie ja recznie: AO_SCORE.provider = AO_SCORE.demo.\n         Gdyby demo bylo domyslka, awaria wtyczki oznaczalaby zmyslone\n         wyniki na stronie turnieju \u2014 a to gorsze niz pusta sekcja. *\/\n      if (typeof AO.provider !== 'function') {\n        render([], blok, {});\n        pobieram = false;\n        return;\n      }\n\n      Promise.resolve()\n        .then(function () { return AO.provider(); })\n        .then(function (dane) {\n          render(Array.isArray(dane) ? dane : [], blok, {});\n        })\n        .catch(function () {\n          render(null, blok, { blad: true });\n        })\n        .then(function () { pobieram = false; });\n    }\n\n    tick();\n    setInterval(tick, ODSWIEZANIE);\n    document.addEventListener('visibilitychange', function () { if (!document.hidden) tick(); });\n  }\n\n  var blok = document.getElementById('ao-sc') || document.querySelector('.ao-sc');\n  if (blok) start(blok);\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>LIVESCORE Na \u017cywo W tej chwili nie toczy si\u0119 \u017caden mecz. Wyniki pojawi\u0105 si\u0119 tu automatycznie po rozpocz\u0119ciu gry.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/blocks.php","meta":{"footnotes":""},"class_list":["post-13353","page","type-page","status-publish"],"_links":{"self":[{"href":"https:\/\/astraopen.pl\/en\/wp-json\/wp\/v2\/pages\/13353","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/astraopen.pl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/astraopen.pl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/astraopen.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/astraopen.pl\/en\/wp-json\/wp\/v2\/comments?post=13353"}],"version-history":[{"count":19,"href":"https:\/\/astraopen.pl\/en\/wp-json\/wp\/v2\/pages\/13353\/revisions"}],"predecessor-version":[{"id":13386,"href":"https:\/\/astraopen.pl\/en\/wp-json\/wp\/v2\/pages\/13353\/revisions\/13386"}],"wp:attachment":[{"href":"https:\/\/astraopen.pl\/en\/wp-json\/wp\/v2\/media?parent=13353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}