/**
 * Tryb ciemny + style kontrolek nagłówka (przełącznik motywu, przełącznik języka).
 *
 * Zasady:
 * - Plik jest ADDYTYWNY: nie zmienia trybu jasnego. Wszystkie nadpisania kolorów
 *   mają prefiks [data-theme="dark"], więc błąd tutaj nie psuje domyślnego wyglądu.
 * - Ładowany z partials/header.php (początek body), czyli PO całym CSS z <head>.
 *   Nadpisania wygrywają kolejnością kaskady i specyficznością atrybutu.
 * - UWAGA: dotyczy to wyłącznie arkuszy z <head>. Kilka komponentów wpina swój
 *   arkusz dalej w treści strony (np. css/comments.css z partials/comments-section.php)
 *   i wtedy kolejność jest ODWROTNA - przy równej specyficzności wygrywa tamten plik.
 *   Nadpisanie selektora z dwiema klasami (.comment--reply .comment-card) wymaga
 *   tam trzech, bo [data-theme="dark"] .comment-card to nadal tylko (0,2,0).
 * - Szerokie nadpisania elementów (a, h1-h6) używają :where(), żeby nie wygrywać
 *   z bardziej szczegółowymi regułami komponentów (np. .menu a, .footer-links a).
 * - Paleta semantyczna zdefiniowana niżej: zamiast 269 hexów ze style.css
 *   używamy kilku zmiennych (--bg-..., --text-..., --border-...).
 */

/* ============================================================
   PRZEŁĄCZNIKI motywu i języka NA PASKU HEADERA (niezależne od motywu)
   Pozycjonowane absolutnie względem <header> (sticky = positioned), przy samej
   prawej krawędzi ekranu, w pustym bocznym pasie granatu poza treścią (container
   max 1200px). Kolumna: switch motywu nad switchem języka. Bez tła boxa.
   Wyjęte z flow <nav>, więc nie poszerzają menu ani go nie dotykają.
   Switch języka: flaga w gałce (PL biało-czerwona / EN Union Jack).
   Switch motywu: słońce/księżyc w gałce.
   ============================================================ */

.nav-switches {
    position: absolute;
    top: 50%;
    right: 20px;
    transform: translateY(-50%);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;
    z-index: 5;
}

/* Switch motywu z bocznymi etykietami Light / Dark (analogicznie do PL/EN) */
.fs-theme {
    display: flex;
    align-items: center;
    gap: 8px;
}

.fs-theme-label {
    font-size: 0.62rem;
    font-weight: 700;
    color: rgba(255, 255, 255, 0.5);
    letter-spacing: 0.3px;
    user-select: none;
}

/* Aktywna etykieta podświetlona na złoto: Light w trybie jasnym, Dark w ciemnym.
   Motyw ustala JS (data-theme na <html>), więc active sterujemy tu, nie w PHP. */
.fs-theme-label--light {
    color: #FFEFA7;
}

[data-theme="dark"] .fs-theme-label--light {
    color: rgba(255, 255, 255, 0.5);
}

[data-theme="dark"] .fs-theme-label--dark {
    color: #FFEFA7;
}

/* Oba switche jeden pod drugim: wspólna szerokość bocznych etykiet wypionowuje
   gałki (Light/Dark są dłuższe niż PL/EN, więc bez tego środki by się rozjeżdżały).
   Lewa etykieta wyrównana do prawej, prawa do lewej - obie dosunięte do switcha. */
.nav-switches .fs-theme,
.nav-switches .fs-lang {
    gap: 8px;
}

.nav-switches .fs-theme-label,
.nav-switches .fs-lang-label {
    min-width: 38px;
    font-size: 0.62rem;
}

.nav-switches .fs-theme-label--light,
.nav-switches .fs-lang-label:first-child {
    text-align: right;
}

.nav-switches .fs-theme-label--dark,
.nav-switches .fs-lang-label:last-child {
    text-align: left;
}

/* Węższe ekrany (poniżej ~1570px boczny pas granatu jest za wąski, by pomieścić
   blok switchy obok treści): switche zjeżdżają tuż POD pasek headera, wciąż przy
   prawej krawędzi ekranu i jeden pod drugim. Ponieważ leżą wtedy na treści strony
   (nie na granatowym pasku), dostają delikatne półprzezroczyste tło dla czytelności
   etykiet. Powyżej 1570px obowiązuje wariant bazowy - na samym pasku, bez tła.
   Zakres min 769px: poniżej tego działa menu mobilne (switche w rozwijanym menu). */
@media (min-width: 769px) and (max-width: 1569px) {
    .nav-switches {
        top: 100%;
        right: 10px;
        transform: translateY(9px);
        gap: 8px;
        padding: 10px 13px;
        background: rgba(20, 27, 43, 0.72);
        -webkit-backdrop-filter: blur(6px);
        backdrop-filter: blur(6px);
        border: 1px solid rgba(255, 255, 255, 0.14);
        border-radius: 14px;
    }
}

/* Geometria z !important: ui-enhancements.js na urządzeniach dotykowych dodaje
   wszystkim buttonom klasę .touch-friendly (min 44x44px z fixes.css), a mobilne
   reguły fixes.css nadają buttonom padding/margin - to rozciągało switche. */
.fs-switch {
    position: relative;
    width: 58px !important;
    height: 26px !important;
    min-width: 0 !important;
    min-height: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
    border: none;
    border-radius: 999px !important;
    box-sizing: border-box;
    cursor: pointer;
    background: #dfe4ee;
    box-shadow: inset 0 2px 4px rgba(15, 23, 42, 0.3);
    transition: background-color 0.25s ease;
    flex-shrink: 0;
    line-height: 1;
}

/* Gałka wypełnia niemal całą wysokość tracka (1px luzu na obwodzie) */
.fs-knob {
    position: absolute;
    top: 1px;
    left: 1px;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 1px 4px rgba(15, 23, 42, 0.35);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 13px;
    transition: transform 0.25s ease;
}

/* Switch motywu: słońce (jasny, gałka po lewej) / księżyc (ciemny, gałka po prawej) */
.fs-switch--theme .fa-sun {
    color: #d4af37;
    display: block;
}

.fs-switch--theme .fa-moon {
    display: none;
}

[data-theme="dark"] .fs-switch--theme {
    background: #2c3548;
}

[data-theme="dark"] .fs-switch--theme .fs-knob {
    transform: translateX(32px);
    background: #12161f;
}

[data-theme="dark"] .fs-switch--theme .fa-sun {
    display: none;
}

[data-theme="dark"] .fs-switch--theme .fa-moon {
    display: block;
    color: #FFEFA7;
}

/* Switch języka: etykiety PL / EN po bokach, flaga w gałce */
.fs-lang {
    display: flex;
    align-items: center;
    gap: 6px;
}

.fs-lang-label {
    font-size: 0.66rem;
    font-weight: 700;
    color: rgba(255, 255, 255, 0.5);
    letter-spacing: 0.4px;
    user-select: none;
}

.fs-lang-label.active {
    color: #FFEFA7;
}

/* Gałka-flaga: domyślnie flaga Polski, w trybie EN Union Jack (inline SVG) */
.fs-knob--flag {
    overflow: hidden;
    border: 1px solid rgba(15, 23, 42, 0.3);
    background: linear-gradient(to bottom, #ffffff 0 50%, #DC143C 50% 100%);
}

.fs-switch--lang.is-en .fs-knob {
    transform: translateX(32px);
}

.fs-switch--lang.is-en .fs-knob--flag {
    background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 30'%3E%3CclipPath id='a'%3E%3Cpath d='M0 0v30h60V0z'/%3E%3C/clipPath%3E%3Cpath d='M0 0v30h60V0z' fill='%23012169'/%3E%3Cpath d='M0 0l60 30m0-30L0 30' stroke='%23fff' stroke-width='6'/%3E%3Cpath d='M0 0l60 30m0-30L0 30' clip-path='url(%23a)' stroke='%23C8102E' stroke-width='4'/%3E%3Cpath d='M30 0v30M0 15h60' stroke='%23fff' stroke-width='10'/%3E%3Cpath d='M30 0v30M0 15h60' stroke='%23C8102E' stroke-width='6'/%3E%3C/svg%3E") center / cover no-repeat;
}

[data-theme="dark"] .fs-switch--lang {
    background: #2c3548;
}

/* Pozycja z przełącznikami w rozwijanym menu - widoczna tylko na mobile */
.menu-switches {
    display: none;
}

/* Notka "artykuł dostępny tylko po polsku" (tryb EN, wstrzykiwana przez js/i18n.js) */
.i18n-notice {
    background: rgba(26, 76, 139, 0.08);
    border-left: 4px solid #1a4c8b;
    border-radius: 6px;
    padding: 12px 16px;
    margin-bottom: 20px;
    font-size: 0.92rem;
    font-style: italic;
}

[data-theme="dark"] .i18n-notice {
    background: rgba(143, 179, 232, 0.1);
    border-left-color: #8fb3e8;
    color: var(--text-secondary);
}

@media (max-width: 768px) {
    /* Mobile: switche w pasku znikają, żyją w rozwijanym menu (hamburger) */
    .nav-switches {
        display: none;
    }

    .menu-switches {
        display: flex !important;
        align-items: center;
        justify-content: center;
        flex-wrap: wrap;
        gap: 14px 22px;
        padding: 16px 0 6px;
        margin-top: 6px;
        border-top: 1px solid rgba(255, 255, 255, 0.15);
    }
}

/* Płynne przejście kolorów przy przełączaniu motywu (klasa nadawana na 300ms w theme.js).
   Celowo NIE działa przy ładowaniu strony - tylko przy kliknięciu przełącznika. */
html.theme-transition,
html.theme-transition *,
html.theme-transition *::before,
html.theme-transition *::after {
    transition: background-color 0.25s ease, color 0.25s ease, border-color 0.25s ease !important;
}

/* ============================================================
   PALETA TRYBU CIEMNEGO
   ============================================================ */

:root[data-theme="dark"] {
    color-scheme: dark;

    /* Zmienne semantyczne trybu ciemnego */
    --bg-page: #12161f;         /* tło strony */
    --bg-surface: #1a2130;      /* karty, panele, dropdowny (zastępuje #fff, #f9f9f9, #fffdf0) */
    --bg-surface-alt: #212a3d;  /* hover, naprzemienne wiersze */
    --bg-navy-dark: #141b2b;    /* header i footer (ciemniejszy wariant granatu) */
    --text-primary: #e8eaf0;
    --text-secondary: #9aa3b5;
    --border-color: #2c3548;
    --link-color: #8fb3e8;      /* jaśniejszy niebieski dla linków na ciemnym tle */
    --gold: #d4af37;

    /* Nadpisanie zmiennych legacy ze style.css - body i wiele komponentów
       konsumuje je bezpośrednio, więc przełączają się automatycznie.
       UWAGA: --primary-color i --secondary-color celowo bez zmian
       (to jednocześnie tła headera/przycisków i kolory tekstu na granacie). */
    --light-gray: var(--bg-page);
    --text-color: var(--text-primary);
    --gray: var(--border-color);
    --dark-gray: var(--text-secondary);
}

/* ============================================================
   BAZA: tekst, nagłówki, linki
   ============================================================ */

/* :where() = zerowa specyficzność wnętrza; reguły komponentów (np. .logo-text h1,
   .footer-about h3) zachowują swoje kolory bez dodatkowych wyjątków */
[data-theme="dark"] :where(h1, h2, h3, h4, h5, h6) {
    color: var(--text-primary);
}

[data-theme="dark"] :where(a) {
    color: var(--link-color);
}

/* ============================================================
   CHROME: header, menu, dropdowny
   ============================================================ */

[data-theme="dark"] header {
    background-color: var(--bg-navy-dark);
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4);
}

[data-theme="dark"] .menu li .dropdown {
    background-color: var(--bg-surface);
    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
}

[data-theme="dark"] .menu .dropdown li a {
    color: var(--text-primary);
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .menu .dropdown li a:hover {
    background-color: var(--bg-surface-alt);
}

@media (max-width: 768px) {
    /* Rozwinięte menu mobilne dziedziczy ciemniejszy granat headera */
    [data-theme="dark"] .menu {
        background-color: var(--bg-navy-dark);
    }

    [data-theme="dark"] .menu li .dropdown {
        background-color: var(--bg-surface);
    }
}

/* ============================================================
   CHROME: wyszukiwarka
   ============================================================ */

[data-theme="dark"] .search-form {
    background-color: var(--bg-surface);
    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
}

[data-theme="dark"] #site-search input {
    background-color: var(--bg-surface);
    color: var(--text-primary);
}

[data-theme="dark"] #site-search input::placeholder {
    color: var(--text-secondary);
}

[data-theme="dark"] .search-results-container {
    background-color: var(--bg-surface);
}

[data-theme="dark"] .search-results-close {
    color: var(--text-primary);
    background-color: var(--bg-surface-alt);
}

[data-theme="dark"] .search-results-close:hover {
    background-color: var(--border-color);
}

[data-theme="dark"] .search-results-close i {
    color: var(--text-primary);
}

/* ============================================================
   CHROME: auth (dropdown konta, modal "Otwórz w przeglądarce")
   ============================================================ */

[data-theme="dark"] .auth-dropdown {
    background: var(--bg-surface);
    color: var(--text-primary);
    border-color: var(--border-color);
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
}

[data-theme="dark"] .auth-dropdown__name {
    color: var(--text-primary);
}

[data-theme="dark"] .auth-dropdown__email {
    color: var(--text-secondary);
}

[data-theme="dark"] .auth-dropdown__sep {
    background: var(--border-color);
}

[data-theme="dark"] .auth-dropdown__item {
    color: var(--text-primary);
}

[data-theme="dark"] .auth-dropdown__item:hover,
[data-theme="dark"] .auth-dropdown__item:focus-visible {
    background: rgba(143, 179, 232, 0.12);
}

[data-theme="dark"] .auth-dropdown__item i {
    color: var(--link-color);
}

/* Wylogowanie: jaśniejsza czerwień, czytelna na ciemnym tle */
[data-theme="dark"] .auth-dropdown__item--logout,
[data-theme="dark"] .auth-dropdown__item--logout i {
    color: #f87171;
}

[data-theme="dark"] .inapp-modal__card {
    background: var(--bg-surface);
    color: var(--text-primary);
}

[data-theme="dark"] .inapp-modal__title,
[data-theme="dark"] .inapp-modal__steps strong {
    color: var(--text-primary);
}

[data-theme="dark"] .inapp-modal__lead,
[data-theme="dark"] .inapp-modal__steps li {
    color: var(--text-secondary);
}

[data-theme="dark"] .inapp-modal__steps {
    background: var(--bg-surface-alt);
}

[data-theme="dark"] .inapp-modal__close:hover,
[data-theme="dark"] .inapp-modal__close:focus-visible {
    background: rgba(255, 255, 255, 0.08);
    color: var(--text-primary);
}

/* ============================================================
   CHROME: footer
   ============================================================ */

[data-theme="dark"] footer {
    background-color: var(--bg-navy-dark);
}

/* ============================================================
   PRZYCISKI
   ============================================================ */

/* .btn-primary zostaje granatowy (marka klubu, na ciemnym tle wygląda dobrze).
   .btn-secondary miał białe tło - w trybie ciemnym dostaje powierzchnię i złoty akcent. */
[data-theme="dark"] .btn-secondary {
    background-color: var(--bg-surface);
    color: var(--text-primary);
    border-color: var(--gold);
}

/* ============================================================
   STRONA GŁÓWNA: karuzela aktualności, tabela ligowa, mecze
   ============================================================ */

[data-theme="dark"] .news-slider-box,
[data-theme="dark"] .league-table-box {
    background-color: var(--bg-surface);
    box-shadow: 0 5px 20px rgba(0, 0, 0, 0.35);
}

/* Karty "Aktualności meczowe" (.mcard) - w fixes.css maja jaskrawy granatowy
   gradient (#111d3a -> #1E3A8A), ktory gryzl sie z prawie czarnym tlem strony.
   Dajemy stonowany ciemny gradient - ten sam jezyk co karty zawodnikow w dark
   mode - plus subtelna ramka dla odciecia od tla. */
[data-theme="dark"] .mcard {
    background: linear-gradient(160deg, #242f47 0%, #1a2233 55%, #161c29 100%);
    border: 1px solid var(--border-color);
}

/* Sekcja "O naszym klubie" (.about-parallax) - overlay w index.php to mocny navy
   rgba(30,58,138,0.85), ktory na dark mode swiecil jasnym niebieskim pasem. Ciemny
   granatowy gradient wtapia sekcje w reszte strony, zdjecie kibicow zostaje widoczne,
   bialy tekst nadal czytelny. */
[data-theme="dark"] .about-parallax-overlay {
    background: linear-gradient(135deg, rgba(20, 27, 43, 0.92) 0%, rgba(12, 16, 24, 0.94) 100%);
}

[data-theme="dark"] .section-header {
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .section-header h2,
[data-theme="dark"] .news-slide-content h3 {
    color: var(--text-primary);
}

[data-theme="dark"] .news-slide-content p {
    color: var(--text-secondary);
}

[data-theme="dark"] .read-more {
    color: var(--link-color);
}

/* Przyciski "Czytaj więcej" z białym tłem (inline style w index.php i aktualnosci.php) */
[data-theme="dark"] .news-slide .read-more,
[data-theme="dark"] .news-card .read-more {
    background-color: var(--bg-surface-alt);
    color: var(--link-color);
    border-color: var(--link-color);
}

/* Karty aktualności na liście (aktualnosci.php) */
[data-theme="dark"] .news-card {
    background-color: var(--bg-surface);
}

/* Tytuly kart - ten sam jasniejszy niebieski co przycisk "Czytaj wiecej" */
[data-theme="dark"] .news-card h3 {
    color: var(--link-color);
}

/* Hover tytulu - zloto, tak jak przycisk "Czytaj wiecej".
   Wyzsza specyficznosc (0,3,1) niz regula bazowa powyzej (0,2,1),
   inaczej regula bazowa nadpisalaby stan :hover. */
[data-theme="dark"] .news-card:hover h3 {
    color: var(--gold);
}

/* Nagłówek "Filtruj aktualności" - navy (--primary-color) za ciemny na ciemnym
   tle. Ujednolicony z pigułkami filtrów poniżej (jaśniejszy niebieski). */
[data-theme="dark"] .news-filter h2 {
    color: var(--link-color);
}

/* Pigułki filtrów aktualności - w trybie ciemnym navy (--primary-color) jest
   za ciemny na tle strony (za słaby kontrast). Nieaktywne: jaśniejszy niebieski
   (--link-color, ten sam co tytuły kart i linki) z przygaszoną ramką. Aktywny
   i hover: wyraźniejsze niebieskie wypełnienie z białym tekstem - tak jak wariant
   jasny, tylko rozjaśnione pod ciemne tło. */
[data-theme="dark"] .filter-btn,
[data-theme="dark"] .btn-filter {
    color: var(--link-color);
    border-color: #3f5488;
}

[data-theme="dark"] .filter-btn:hover,
[data-theme="dark"] .filter-btn.active,
[data-theme="dark"] .btn-filter:hover,
[data-theme="dark"] .btn-filter.active {
    background-color: #3f6ad1;
    border-color: #3f6ad1;
    color: #fff;
}

[data-theme="dark"] .dot {
    background-color: var(--border-color);
}

[data-theme="dark"] .dot.active {
    background-color: var(--gold);
}

[data-theme="dark"] .league-name {
    color: var(--text-secondary);
}

/* Tabela ligowa (strona główna i terminarz) */
[data-theme="dark"] .league-table {
    background-color: var(--bg-surface);
}

[data-theme="dark"] .league-table th {
    background-color: var(--bg-surface-alt);
    color: var(--text-primary);
}

[data-theme="dark"] .league-table td {
    border-bottom-color: var(--border-color);
}

/* Zebra z fixes.css (nth-child even) */
[data-theme="dark"] .league-table tr:nth-child(even) {
    background-color: var(--bg-surface-alt);
}

[data-theme="dark"] .league-table tbody tr:hover {
    background-color: var(--bg-surface-alt);
}

/* Nasza drużyna. W jasnym motywie to złoto z alfą na bieli, tutaj ta sama alfa
   dałaby brudny brąz na granacie - dlatego kolor jest jaśniejszy i mocniejszy.
   'tbody' jest konieczne, żeby pokonać zebrę powyżej (remis specyficzności
   rozstrzyga kolejność, a zebra stoi wcześniej). */
[data-theme="dark"] .league-table tbody tr.our-team {
    background-color: rgba(255, 199, 44, 0.20);
}

/* Bez tej reguły nasz wiersz jako jedyny nie reagowałby na kursor: powyższa
   ma tę samą specyficzność co ogólny hover i stoi po nim. */
[data-theme="dark"] .league-table tbody tr.our-team:hover {
    background-color: rgba(255, 199, 44, 0.30);
}

/* Awans i spadek: w jasnym motywie mają !important (style.css), więc nadpisanie
   ich w ciemnym wymaga tego samego. Bez tego blade rgba na granacie ledwo widać. */
[data-theme="dark"] .league-table tbody tr.promotion {
    background-color: rgba(64, 140, 255, 0.20) !important;
}

[data-theme="dark"] .league-table tbody tr.relegation {
    background-color: rgba(255, 90, 106, 0.18) !important;
}

[data-theme="dark"] .league-table tbody tr.our-team.relegation {
    background-color: rgba(255, 90, 106, 0.26) !important;
}

/* Kropki legendy pod tabelą muszą trzymać się kolorów wierszy powyżej,
   inaczej legenda opisywałaby inne barwy niż te na ekranie. */
[data-theme="dark"] .legend-item.promotion::before {
    background-color: rgba(64, 140, 255, 0.55);
}

[data-theme="dark"] .legend-item.our-team-legend::before {
    background-color: rgba(255, 199, 44, 0.55);
}

[data-theme="dark"] .legend-item.relegation-legend::before {
    background-color: rgba(255, 90, 106, 0.5);
}

[data-theme="dark"] .table-footer {
    border-top-color: var(--border-color);
}

/* Sekcja najbliższych meczów + karty meczowe.
   !important konieczne: fixes.css ustawia tło tej sekcji z !important. */
[data-theme="dark"] .upcoming-matches {
    background: var(--bg-page) !important;
}

[data-theme="dark"] .upcoming-matches > .container > h2 {
    color: var(--text-primary);
}

[data-theme="dark"] .match-card {
    background-color: var(--bg-surface);
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.35);
}

[data-theme="dark"] .match-date {
    background-color: var(--bg-surface-alt);
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .match-date .month,
[data-theme="dark"] .match-date .year,
[data-theme="dark"] .match-info,
[data-theme="dark"] .match-stadium {
    color: var(--text-secondary);
}

[data-theme="dark"] .match-date .time,
[data-theme="dark"] .match-score,
[data-theme="dark"] .vs {
    color: var(--text-primary);
}

[data-theme="dark"] .match-stadium {
    border-top-color: var(--border-color);
}

/* Sponsorzy: sekcja ciemna, ale kafle sponsorów ZOSTAJĄ jasne
   (loga sponsorów zakładają jasne tło) */
[data-theme="dark"] .sponsors {
    background-color: var(--bg-page);
}

[data-theme="dark"] .sponsor-card {
    background-color: #f0f1f3;
}

/* ============================================================
   TERMINARZ (mecze/terminarz.php - system zmiennych --v3-*)
   Strona konsumuje własne zmienne, więc wystarczy je przestawić.
   UWAGA: NIE dotykamy struktury .match-card ani dat - parsują je
   match-notifications.js, match-cards-auto.js i sidebar-sport-integration.js.
   ============================================================ */

:root[data-theme="dark"] {
    --v3-bg: #12161f;
    --v3-card: #1a2130;
    --v3-text: #e8eaf0;
    --v3-text-secondary: #9aa3b5;
    --v3-border: #2c3548;
    --v3-blue: #8fb3e8;
    --v3-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.25);
    --v3-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.3);
    --v3-shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.5);
}

/* Elementy z tekstem w kolorze var(--v3-navy) - ciemny granat nieczytelny na ciemnym tle */
[data-theme="dark"] .v3-tab.active {
    color: var(--text-primary);
}

[data-theme="dark"] .mc3-score--final {
    color: var(--text-primary);
}

/* Rzuty karne pod wynikiem: --v3-gold-dark (#8A6520) daje na ciemnym tle 3:1,
   za mało dla tak małego tekstu. Jaśniejsze złoto wraca do czytelnego kontrastu. */
[data-theme="dark"] .mc3-pens {
    color: var(--v3-gold-mid, #D4B96A);
}

/* Hardcodowane jasne tła w inline <style> terminarza */
[data-theme="dark"] .cv3-score--final {
    color: var(--text-primary);
    background: var(--bg-surface-alt);
}

[data-theme="dark"] .cv3-score--pending {
    background: var(--bg-surface-alt);
}

/* Wiersz naszej druzyny (.cv3--ours) oraz hover dowolnego wiersza maja
   hardkodowane JASNE tla (kremowe/biale, inline w terminarzu). W dark mode
   --v3-text jest jasny, wiec nazwy druzyn i data znikaja na jasnym tle.
   Wymuszamy ciemny tekst (--v3-navy nie jest w dark mode remapowany = ~czarny). */
[data-theme="dark"] .cv3--ours .cv3-name,
[data-theme="dark"] .cv3--ours .cv3-datetime,
[data-theme="dark"] .cv3:hover .cv3-name,
[data-theme="dark"] .cv3:hover .cv3-datetime {
    color: var(--v3-navy);
}

[data-theme="dark"] .mc3-comment,
[data-theme="dark"] .cv3-comment {
    color: #d4b96a;
    background: rgba(212, 175, 55, 0.1);
    border-color: rgba(212, 175, 55, 0.3);
}

/* Komórki tabeli ligowej (oryginał: hardcodowane białe tło) */
[data-theme="dark"] .v3-league-table td {
    background: var(--bg-surface);
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .v3-league-table tbody tr:hover td {
    background: var(--bg-surface-alt);
}

[data-theme="dark"] .v3-league-table tr.v3-our td {
    background: #2e2a1c !important;
}

/* Sticky kolumny tabeli na mobile (oryginał używa białych teł i !important) */
@media (max-width: 768px) {
    [data-theme="dark"] .v3-league-table td:first-child,
    [data-theme="dark"] .v3-league-table td:nth-child(2) {
        background: var(--bg-surface);
    }
    [data-theme="dark"] .v3-league-table td:nth-child(2) {
        border-right-color: var(--border-color);
    }
    [data-theme="dark"] .v3-league-table tr.v3-our td:first-child,
    [data-theme="dark"] .v3-league-table tr.v3-our td:nth-child(2) {
        background: #2e2a1c !important;
    }
    [data-theme="dark"] .v3-league-table tr.v3-promotion td:first-child,
    [data-theme="dark"] .v3-league-table tr.v3-promotion td:nth-child(2) {
        background: #1c2740 !important;
    }
    [data-theme="dark"] .v3-league-table tr.v3-relegation td:first-child,
    [data-theme="dark"] .v3-league-table tr.v3-relegation td:nth-child(2) {
        background: #3a1f24 !important;
    }
}

/* ============================================================
   ARTYKUŁY (aktualnosci/*.php + article.php)
   Wspólne klasy bloków - statyczne artykuły mają style inline,
   ale nadpisania [data-theme] wygrywają specyficznością.
   ============================================================ */

[data-theme="dark"] .article-breadcrumbs {
    background-color: var(--bg-page);
}

[data-theme="dark"] .article-content {
    background-color: var(--bg-surface);
    color: var(--text-primary);
}

[data-theme="dark"] .article-content p,
[data-theme="dark"] .article-content li {
    color: var(--text-primary);
}

/* Nagłówki akapitów - w jasnym motywie ciemny granat (#1a4c8b / #1a2332),
   na czarnym tle nieczytelny. Używamy tego samego jasnego niebieskiego
   co tytuły kart w "Zobacz również". */
[data-theme="dark"] .article-content h2 {
    color: var(--link-color);
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .article-content h3,
[data-theme="dark"] .article-content h4 {
    color: var(--text-primary);
}

[data-theme="dark"] .article-content strong {
    color: var(--link-color);
}

/* Bloki treści (info-box, highlight-box, summary-box, event-box itd.) */
[data-theme="dark"] .info-box,
[data-theme="dark"] .highlight-box,
[data-theme="dark"] .summary-box,
[data-theme="dark"] .event-box,
[data-theme="dark"] .intro-box,
[data-theme="dark"] .feature-card,
[data-theme="dark"] .checklist,
[data-theme="dark"] .levels-table {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
    border-color: var(--border-color);
}

[data-theme="dark"] .info-box h3,
[data-theme="dark"] .info-box h4,
[data-theme="dark"] .highlight-box h3,
[data-theme="dark"] .highlight-box h4,
[data-theme="dark"] .summary-box h3,
[data-theme="dark"] .event-box h3,
[data-theme="dark"] .feature-card h3,
[data-theme="dark"] .info-box p,
[data-theme="dark"] .highlight-box p,
[data-theme="dark"] .summary-box p,
[data-theme="dark"] .event-box p,
[data-theme="dark"] .feature-card p,
[data-theme="dark"] .summary-box li,
[data-theme="dark"] .checklist li {
    color: var(--text-primary);
}

/* Blok cytatu (blockquote.article-quote z edytora blokowego).
   W jasnym motywie to jasny gradient z granatową listwą po lewej. Na ciemnym
   tle zostawał białą wyspą, a akapity w środku i tak dostawały jasny tekst
   z reguły ".article-content p" powyżej - stąd biały tekst na białym tle.
   Ciemny gradient trzyma ten sam rysunek bloku, listwa idzie na jaśniejszy
   niebieski (granat na czerni jest niewidoczny - tak samo jak przy h2). */
[data-theme="dark"] .article-quote {
    background: linear-gradient(135deg, var(--bg-surface-alt) 0%, var(--bg-surface) 100%);
    border-left-color: var(--link-color);
    color: var(--text-primary);
    /* Cytat ze zdjeciem osoby - w ciemnym motywie zmieniamy tylko zmienne,
       rysunek portretu i cala siatka ukladow zostaja z article-blocks.css.
       Tlo kola musi byc ciemne, bo zdjecia kadry to wycinanki z przezroczystym
       tlem: na bialym krazku swiecilyby jak latarnia. */
    --aq-ring-bg: #131c29;
    --aq-role: var(--text-secondary);
    --aq-line: rgba(255, 255, 255, 0.16);
    --aq-shadow: 0 6px 18px rgba(0, 0, 0, 0.5);
}

[data-theme="dark"] .article-quote p {
    color: var(--text-primary);
}

/* Podpis pod cytatem - drugorzędny tak samo jak w jasnym motywie */
[data-theme="dark"] .article-quote cite {
    color: var(--text-secondary);
}

/* Kafelki statystyk - ten sam problem jasnej wyspy co cytat */
[data-theme="dark"] .article-stat-item {
    background: var(--bg-surface-alt);
    border-color: var(--border-color);
}

[data-theme="dark"] .article-stat-number {
    color: var(--link-color);
}

[data-theme="dark"] .article-stat-label {
    color: var(--text-secondary);
}

/* Lista zadań - kreski rozdzielające w jasnym szarym są na czerni za mocne */
[data-theme="dark"] .article-checklist li {
    border-bottom-color: var(--border-color);
    color: var(--text-primary);
}

[data-theme="dark"] .article-table-wrapper {
    border-color: var(--border-color);
}

[data-theme="dark"] .article-table th,
[data-theme="dark"] .article-table td {
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .article-table tbody tr:nth-child(even) {
    background: var(--bg-surface-alt);
}

/* Podpisy pod zdjęciem i filmem - w jasnym motywie #6b7280, na czerni za ciemne */
[data-theme="dark"] .article-image figcaption,
[data-theme="dark"] .article-youtube figcaption {
    color: var(--text-secondary);
}

/* ---- Blok galerii (slider / showcase / karuzela / siatka / mozaika) ----
   Podpisy w ukladach przewijanych leza na przyciemnionym zdjeciu, wiec wygladaja
   tak samo w obu motywach. Tutaj dociagamy to, co w jasnym motywie jest biale:
   tlo kadru, strzalki, kropki, miniatury i podpisy pod kafelkami. */
[data-theme="dark"] .article-gallery {
    --ksp-gal-frame: var(--bg-surface-alt);
    --ksp-gal-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
}
[data-theme="dark"] .article-gallery__arrow {
    background: rgba(26, 33, 48, 0.92);
    border-color: var(--border-color);
    color: var(--text-primary);
}
[data-theme="dark"] .article-gallery__arrow:hover {
    background: var(--gold);
    color: #1a2332;
}
[data-theme="dark"] .article-gallery__dot {
    background: var(--border-color);
}
[data-theme="dark"] .article-gallery__dot:hover {
    background: var(--text-secondary);
}
[data-theme="dark"] .article-gallery__dot[aria-current="true"] {
    background: var(--link-color);
}
[data-theme="dark"] .article-gallery__thumb[aria-current="true"] {
    border-color: var(--gold);
}
[data-theme="dark"] .article-gallery--grid .article-gallery__cap,
[data-theme="dark"] .article-gallery--masonry .article-gallery__cap {
    color: var(--text-secondary);
}
/* Obramowania fokusu - granat #1a4c8b na czerni jest praktycznie niewidoczny */
[data-theme="dark"] button.article-gallery__frame:focus-visible,
[data-theme="dark"] .article-gallery__track:focus-visible,
[data-theme="dark"] .article-gallery__arrow:focus-visible,
[data-theme="dark"] .article-gallery__thumb:focus-visible {
    outline-color: var(--link-color);
}

[data-theme="dark"] .article-share {
    border-top-color: var(--border-color);
}

[data-theme="dark"] .category-pill {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
}

/* Sekcja komentarzy i powiązane artykuły */
[data-theme="dark"] .article-comments {
    background: var(--bg-page);
}

[data-theme="dark"] .comments-form-skeleton,
[data-theme="dark"] .comments-empty,
[data-theme="dark"] .comments-loading {
    background: var(--bg-surface);
    color: var(--text-secondary);
    border-color: var(--border-color);
}

[data-theme="dark"] .comments-form-skeleton__bar {
    background: linear-gradient(90deg, var(--bg-surface-alt) 25%, var(--border-color) 50%, var(--bg-surface-alt) 75%);
    background-size: 200% 100%;
}

[data-theme="dark"] .comments-header {
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .comments-header h2 {
    color: var(--text-primary);
}

[data-theme="dark"] .comments-header h2 i {
    color: var(--link-color);
}

[data-theme="dark"] .comments-count,
[data-theme="dark"] .comment-time,
[data-theme="dark"] .comment-edited,
[data-theme="dark"] .comments-form__counter {
    color: var(--text-secondary);
}

[data-theme="dark"] .comments-form,
[data-theme="dark"] .comment-card {
    background: var(--bg-surface);
    border-color: var(--border-color);
}

/* Podświetlenie komentarza po wejściu z linku #comment-N. W jasnym motywie
   rozbłysk idzie do bieli - na ciemnym tle musi wracać do powierzchni panelu,
   inaczej karta na moment zabielałaby się z czarnym tekstem. */
[data-theme="dark"] .comment--highlighted .comment-card {
    border-color: var(--link-color);
    box-shadow: 0 0 0 3px rgba(143, 179, 232, 0.22);
    animation-name: kspCommentFlashDark;
}

@keyframes kspCommentFlashDark {
    0%   { background: #24314a; }
    100% { background: #1a2130; }
}

[data-theme="dark"] .comments-form textarea,
[data-theme="dark"] .comment-edit-form textarea {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
    border-color: var(--border-color);
}

[data-theme="dark"] .comment-author,
[data-theme="dark"] .comment-body {
    color: var(--text-primary);
}

[data-theme="dark"] .comment-action {
    color: var(--text-secondary);
}

[data-theme="dark"] .related-articles {
    background-color: var(--bg-page);
}

/* Nagłówek "Zobacz również" - jasny niebieski zamiast granatu */
[data-theme="dark"] .related-articles h2 {
    color: var(--link-color);
}

/* ============================================================
   STRONY KLUBOWE (klub/*.php): podmenu, karty informacyjne
   ============================================================ */

[data-theme="dark"] .submenu {
    background-color: var(--bg-navy-dark);
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .submenu a {
    color: var(--text-primary);
}

/* Wspolny design system trzech podstron klubowych (css/klub.css, .club-hub).
   Nadpisujemy WYLACZNIE zmienne --kl-*, dokladnie jak przy .sponsors-hub -
   reguly komponentow zostaja jedne dla obu motywow. Naglowki i wartosci
   (--kl-navy) musza w ciemnym byc jasne, bo to kolory tekstu, nie tla. */
[data-theme="dark"] .club-hub {
    --kl-surface: #1a2130;
    --kl-bg-light: #12161f;
    --kl-navy: #e8eaf0;
    --kl-text: #e8eaf0;
    --kl-text-muted: #9aa3b5;
    --kl-border: #2c3548;
    --kl-blue: #8fb3e8;
    --kl-blue-link: #8fb3e8;
    --kl-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.25);
    --kl-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4);
    --kl-shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.5);
}

/* Ikony w kolowych plakietkach: na ciemnym tle granatowa poswiata znika,
   wiec podbijamy ja do koloru linkow. */
[data-theme="dark"] .club-hub .club-card__icon,
[data-theme="dark"] .club-hub .season-card__rank {
    background: rgba(143, 179, 232, 0.14);
}

/* Odznaki medalowe zostaja kolorowe (zloto, srebro, braz), a ikona w srodku
   ciemna - to jasne tla, nie powierzchnie motywu. */
[data-theme="dark"] .club-hub .season-card--gold .season-card__rank {
    background: linear-gradient(135deg, #AE802F 0%, #FFEFA7 100%);
}

[data-theme="dark"] .club-hub .season-card--silver .season-card__rank {
    background: linear-gradient(135deg, #94a3b8 0%, #e2e8f0 100%);
}

[data-theme="dark"] .club-hub .season-card--bronze .season-card__rank {
    background: linear-gradient(135deg, #b45309 0%, #fbbf24 100%);
}

/* Plakietka roku na osi czasu. Wariant zloty musi zostac zloty, dlatego
   celujemy w :not(.club-tl--gold) - bez tego dark-theme.css wygralby kolejnoscia
   (obie reguly maja te sama specyficznosc) i zloty rok stalby sie ciemnym
   napisem na blekitnym tle. */
[data-theme="dark"] .club-hub .club-tl:not(.club-tl--gold) .club-tl__year {
    background: rgba(143, 179, 232, 0.16);
}

/* Strona Sponsorzy (klub/sponsorzy.php - zmienne --sp-* na .sponsors-hub) */
[data-theme="dark"] .sponsors-hub {
    --sp-surface: #1a2130;
    --sp-bg-light: #12161f;
    --sp-navy: #e8eaf0;         /* naglowki/nazwy - na ciemnym tle musza byc jasne
                                   (nazwy pakietow, nazwy sponsorow, wartosci kontaktowe,
                                   motto, pogrubienia w listach korzysci) */
    --sp-text: #e8eaf0;
    --sp-text-muted: #9aa3b5;
    --sp-border: #2c3548;
    --sp-blue: #8fb3e8;
    --sp-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.25);
    --sp-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4);
    --sp-shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.5);
}

/* Kafle z logami sponsorów zostają jasne (logotypy zakładają jasne tło) */
[data-theme="dark"] .sponsors-hub .sponsor-card__logo {
    background: #f0f1f3;
}

/* Strona Kontakt */
[data-theme="dark"] .contact-section {
    background-color: var(--bg-page);
}

[data-theme="dark"] .contact-info,
[data-theme="dark"] .map-container {
    background-color: var(--bg-surface);
}

[data-theme="dark"] .contact-info h2,
[data-theme="dark"] .contact-info h3 {
    color: var(--link-color);
}

/* Galeria (media/galeria.php) */
[data-theme="dark"] .gallery-section,
[data-theme="dark"] .facebook-gallery-section {
    background-color: var(--bg-page);
}

[data-theme="dark"] .album-info,
[data-theme="dark"] .album-header {
    background-color: var(--bg-surface);
}

[data-theme="dark"] .album-header h1,
[data-theme="dark"] .album-header h2 {
    color: var(--link-color);
}

[data-theme="dark"] .album-info h3 {
    color: var(--text-primary);
}

/* Kalendarium (strefa-kibica/kalendarium.php - zmienne --kal-* na .kalendarium-hub) */
[data-theme="dark"] .kalendarium-hub {
    --kal-bg-light: #12161f;
    --kal-surface: #1a2130;
    --kal-text: #e8eaf0;
    --kal-text-muted: #9aa3b5;
    --kal-border: #2c3548;
    --kal-border-soft: #232c3f;
    --kal-blue: #8fb3e8;
    --kal-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.25);
    --kal-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4);
    --kal-shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.5);
}

/* Rozwijany panel subskrypcji - .kal-subscribe-details ma zahardkodowane
   background:#fff w kalendarium.css, wiec w dark mode zostawal bialy (jasny
   naglowek --kal-text na bieli = nieczytelny). Dajemy ciemna powierzchnie, tekst
   juz jest jasny. Hover odwrocony: zamiast ciemniejszego (--kal-bg-light) robimy
   subtelnie JASNIEJSZY, tekst pozostaje jasny i czytelny. */
[data-theme="dark"] .kalendarium-hub .kal-subscribe-details {
    background: var(--kal-surface);
}
[data-theme="dark"] .kalendarium-hub .kal-subscribe-summary:hover {
    background: var(--bg-surface-alt);
}
[data-theme="dark"] .kalendarium-hub .kal-subscribe-summary-chevron {
    background: var(--bg-surface-alt);
}

/* Hardcodowane jasne tła w kalendarium (kal-print-canvas celowo zostaje jasny - druk) */
[data-theme="dark"] .kal-day-event {
    background: rgba(26, 33, 48, 0.9);
}

[data-theme="dark"] .kal-modal-close,
[data-theme="dark"] .kal-modal-btn {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
}

/* Liga Typera (strefa-kibica/liga-typera.php - zmienne --lt-* na :root) */
:root[data-theme="dark"] {
    --lt-bg: #12161f;
    --lt-surface: #1a2130;
    --lt-border: #2c3548;
    --lt-border-soft: #232c3f;
    --lt-text: #e8eaf0;
    --lt-text-muted: #9aa3b5;
    --lt-text-dim: #6b7689;
    --lt-blue: #8fb3e8;
    --lt-ok-bg: rgba(16, 185, 129, 0.12);
    --lt-err-bg: rgba(239, 68, 68, 0.12);
    --lt-warn-bg: rgba(217, 119, 6, 0.12);
}

/* --lt-blue jest też tłem przycisków i badge (biały tekst) - tam wracamy do granatu */
[data-theme="dark"] .lt-btn--primary,
[data-theme="dark"] .lt-group__count {
    background: #1a4c8b;
}

[data-theme="dark"] .lt-btn--primary:hover {
    background: #2563a8;
}

[data-theme="dark"] .lt-modal__close {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
}

/* Hero i nagłówek profilu mają gradient granat -> --lt-blue. Skoro --lt-blue jest
   w dark mode jasnym błękitem, prawa połowa paska robiła się jasna, a leżący na
   niej biały tekst i złote cyfry gasły. Wracamy do granatowo-niebieskiego, o ton
   ciemniejszego niż w trybie jasnym, żeby pasek wpisał się w ciemną stronę. */
[data-theme="dark"] .lt-hero,
[data-theme="dark"] .lt-profile__head {
    background: linear-gradient(135deg, #151b27 0%, #1d4676 100%);
}

/* Te same gradienty w kółkach zastępczych awatara (inicjał jest biały) */
[data-theme="dark"] .lt-rank-avatar--ph,
[data-theme="dark"] .lt-profile__avatar-ph {
    background: linear-gradient(135deg, #1a2332, #1a4c8b);
}

/* Karty meczów i tła grup mają w liga-typera.css zahardkodowaną biel (#fff,
   #fafbfd). Tekst w dark mode jest jasny, więc nazwy drużyn i godziny stawały
   się nieczytelne - to najbardziej rzucało się w oczy w grupie "Mecze Perły". */
[data-theme="dark"] .lt-card {
    background: var(--lt-surface);
}

[data-theme="dark"] .lt-card--locked,
[data-theme="dark"] .lt-round__body {
    background: var(--lt-bg);
}

[data-theme="dark"] .lt-card:hover {
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
}

/* Pole na wpisanie wyniku - białe tło z jasnym tekstem (--lt-text) oznaczało,
   że typujący nie widział własnej cyfry */
[data-theme="dark"] .lt-score-input {
    background: var(--lt-bg);
}

/* Hover własnego wiersza rankingu (#fdf3d6) i wyróżnienie trafionego typu
   (jasnozłoty gradient) - jasne tła pod jasnym tekstem. Zostaje złoty akcent,
   ale jako przezroczysta warstwa na ciemnym tle. */
[data-theme="dark"] .lt-ranking-table tbody tr.lt-rank-self:hover {
    background: rgba(212, 175, 55, 0.2);
}

[data-theme="dark"] .lt-profile__pred--exact {
    background: linear-gradient(90deg, rgba(212, 175, 55, 0.22) 0%, rgba(212, 175, 55, 0.06) 100%);
}

/* Statystyki (druzyna/statystyki.php - zmienne generyczne na .stats-hub) */
[data-theme="dark"] .stats-hub {
    background: #12161f;
    --bg-light: #12161f;
    --surface: #1a2130;
    --surface-muted: #212a3d;
    --border: #2c3548;
    --text: #e8eaf0;
    --text-strong: #ffffff;
    --text-muted: #9aa3b5;
    --text-faint: #6b7689;
    --blue: #8fb3e8;
    --win-bg: rgba(16, 185, 129, 0.15);
    --draw-bg: rgba(245, 158, 11, 0.15);
    --loss-bg: rgba(239, 68, 68, 0.15);
    --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.35);
    --shadow-md: 0 8px 28px rgba(0, 0, 0, 0.4);
    --shadow-lg: 0 18px 46px rgba(0, 0, 0, 0.5);
}

/* Pełnoszerokie tła paneli - w statystyki.css sa hardkodowane na jasne kolory
   (#ffffff / #f5f7fa) razem z box-shadow rozlewajacym tlo na cala szerokosc ekranu.
   Zmienne ich nie dotycza, wiec nadpisujemy tlo ORAZ kolor box-shadow, inaczej cień
   maluje biel poza .stats-wrap. Zachowujemy naprzemiennosc: nieparzyste jasniejsze. */
[data-theme="dark"] .stats-hub .stats-panel:nth-of-type(odd) {
    background: #1a2130;
    box-shadow: 0 0 0 100vmax #1a2130;
}
[data-theme="dark"] .stats-hub .stats-panel:nth-of-type(even) {
    background: #12161f;
    box-shadow: 0 0 0 100vmax #12161f;
}

/* Elementy uzywajace var(--navy) jako KOLOR TEKSTU. W dark mode --navy nie jest
   remapowany (sluzy tez jako TLO: naglowek tabeli, karta pozycji, gradienty),
   wiec navy tekst na ciemnych kartach jest niewidoczny. Nadpisujemy punktowo.
   Pomijamy przypadki na jasnym tle (zlote piguly, medalowe odznaki) - tam
   navy jest poprawny. */
[data-theme="dark"] .stats-hub .lt-perla .lt-team-name,
[data-theme="dark"] .stats-hub .lt-perla .lt-pts,
[data-theme="dark"] .stats-hub .venue-card__effectiveness-value,
[data-theme="dark"] .stats-hub .venue-goal-row__value,
[data-theme="dark"] .stats-hub .venue-card__points-row strong,
[data-theme="dark"] .stats-hub .podium-card__value,
[data-theme="dark"] .stats-hub .chart-avatar__label,
[data-theme="dark"] .stats-hub .full-ranking-trigger,
[data-theme="dark"] .stats-hub .full-ranking-trigger__label {
    color: var(--text-strong);
}

/* Podpisy na podium (miejsca 4-5) - slate za ciemny na ciemnym panelu */
[data-theme="dark"] .stats-hub .podium-card__position,
[data-theme="dark"] .stats-hub .podium-card__value-label {
    color: var(--text-muted);
}

/* Okno "Zobacz wszystkich" / "Szczegóły" (js/statystyki-modal.js).
   Stoi POZA <main class="stats-hub">, więc remap zmiennych wyżej go nie obejmuje,
   a css/statystyki.css maluje mu tło na sztywno (#ffffff i #f7f8fb). W ciemnym motywie
   świeciło białą płachtą na ciemnej stronie. Nagłówek zostaje bez zmian - jest granatowy
   ze złotem w obu motywach. */
[data-theme="dark"] .ranking-modal__dialog { background: #1a2130; }
[data-theme="dark"] .ranking-modal__body { background: #12161f; }
[data-theme="dark"] .ranking-modal__body .ranking-item {
    background: #1f2839;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
}
/* Nazwisko musi mieć prefiks aż do .ranking-modal__body: dark-theme.css ma wyżej
   [data-theme="dark"] :where(a) i bez tego nazwiska w oknie robiły się niebieskie. */
[data-theme="dark"] .ranking-modal__body .ranking-item__name { color: #ffffff; }
[data-theme="dark"] .ranking-modal__body .ranking-item__photo {
    background: #232d40;
    border-color: #2c3548;
}
[data-theme="dark"] .ranking-modal__body::-webkit-scrollbar-track { background: #1a2130; }

/* Ranking MVP (karta rozwijana w "Pozostałych rankingach").
   BEZ prefiksu .stats-hub - ta sama lista jest klonowana do okna "Zobacz wszystkich",
   które stoi poza <main class="stats-hub">. Komponent ma własne zmienne właśnie po to,
   żeby wyglądał jednakowo w obu miejscach (patrz css/statystyki.css, sekcja RANKING MVP).
   Nadpisujemy wyłącznie zmienne - żadnej reguły komponentu tu nie ma.
   Złota plakietka kolejki i pigułka z liczbą tytułów zostają jasne z ciemnym napisem:
   to ten sam wyjątek co pozostałe złote pigułki na tej podstronie. */
[data-theme="dark"] .ranking-list--mvp {
    --mvp-surface: #1f2839;
    --mvp-panel: #171d2a;
    --mvp-border: #2c3548;
    --mvp-text: #ffffff;
    --mvp-muted: #9aa3b5;
    --mvp-faint: #7f8899;
    --mvp-hover: #232d40;
    --mvp-gold: #d8ad55;
    --mvp-gold-ring: rgba(216, 173, 85, 0.4);
    --mvp-silver: #aab3c2;
    --mvp-bronze: #d9a97f;
    --mvp-goal: #6ee7b7;
    --mvp-goal-bg: rgba(16, 185, 129, 0.18);
    --mvp-assist: #93c5fd;
    --mvp-assist-bg: rgba(59, 130, 246, 0.20);
    --mvp-win: #6ee7b7;
    --mvp-win-bg: rgba(16, 185, 129, 0.18);
    --mvp-draw: #fcd34d;
    --mvp-draw-bg: rgba(245, 158, 11, 0.18);
    --mvp-loss: #fca5a5;
    --mvp-loss-bg: rgba(239, 68, 68, 0.18);
}

/* Tor paskow porownania ligowego - hardkodowane jasnoszare tlo (#eef0f3)
   w dark mode zamieniamy na ciemny, inaczej jasne paski w ciemnej sekcji. */
[data-theme="dark"] .stats-hub .league-bar__track {
    background: var(--surface-muted);
}

/* Wiersz Perly w rankingach "Na tle ligi". W jasnym motywie nazwa jest granatowa
   (#1a2332) na zlotym wypelnieniu - czytelna. W ciemnym ten sam granat czyta sie
   jak czarny na czarnym, zwlaszcza zanim pasek sie zapelni (animacja barGrow) lub
   gdy wypelnienie jest krotsze od nazwy. Dlatego w dark mode przyciemniamy samo
   wypelnienie do bursztynowej poswiaty ze zlota obwodka, a nazwe i wartosc
   podnosimy na zloto z systemowym efektem gold sweep (@keyframes goldSweep
   ze style.css). Dzieki temu napis jest czytelny i na pasku, i poza nim. */
[data-theme="dark"] .stats-hub .league-bar--perla .league-bar__fill {
    background: linear-gradient(90deg, rgba(174, 128, 47, 0.55) 0%, rgba(212, 160, 74, 0.28) 100%);
    box-shadow: inset 0 0 0 1.5px rgba(255, 239, 167, 0.45), 0 4px 14px rgba(174, 128, 47, 0.22);
}

[data-theme="dark"] .stats-hub .league-bar--perla .league-bar__name {
    background: linear-gradient(
        110deg,
        #c9a24a 0%, #FFEFA7 15%, #c9a24a 30%, #c9a24a 42%,
        #fffdf0 48%, #fff 50%, #fffdf0 52%,
        #c9a24a 58%, #c9a24a 70%, #FFEFA7 85%, #c9a24a 100%);
    background-size: 300% 100%;
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
    color: transparent;
    text-shadow: none;
    animation: goldSweep 10s ease-in-out infinite;
}

[data-theme="dark"] .stats-hub .league-bar--perla .league-bar__value {
    color: #FFEFA7;
}

@media (prefers-reduced-motion: reduce) {
    [data-theme="dark"] .stats-hub .league-bar--perla .league-bar__name {
        animation: none;
        background-position: 30% center;
    }
}

/* Hover wiersza tabeli ligowej - w statystyki.css zahardkodowany na jasny
   (#f1f5fb), przez co w dark mode jasny tekst znikal na jasnym tle. Dajemy
   subtelny niebieski overlay, ktory rozjasnia ciemny wiersz i zachowuje
   czytelnosc. Wykluczamy wiersz Perly - ma wlasny zloty hover. */
[data-theme="dark"] .stats-league-table tbody tr:not(.lt-perla):hover {
    background: rgba(143, 179, 232, 0.15);
}

/* Srodek donuta "Rozklad wynikow w sezonie" (ApexCharts) - kolory tekstu sa
   ustawiane atrybutem fill w konfiguracji JS (navy #1a2332 + szary #6a6a6a),
   niewidoczne na ciemnym srodku. CSS fill wygrywa z atrybutem prezentacji SVG. */
[data-theme="dark"] .stats-hub .apexcharts-datalabel-value {
    fill: var(--text-strong);
}
[data-theme="dark"] .stats-hub .apexcharts-datalabel-label {
    fill: var(--text-muted);
}

/* Podium TOP 5 w statystykach (półprzezroczysty biały panel na zdjęciu) */
[data-theme="dark"] .podium-card__body {
    background: rgba(12, 18, 30, 0.78);
    color: #e8eaf0;
}

/* Mapa wyjazdów (mecze/mapa-wyjazdow.php) - lista wyjazdów pod mapą */
[data-theme="dark"] .wyjazd-row {
    background: var(--bg-surface);
    border-color: var(--border-color);
}

[data-theme="dark"] .wyjazd-row__name small {
    color: var(--text-secondary);
}

[data-theme="dark"] .wyjazd-row__dist,
[data-theme="dark"] .wyjazd-row__time {
    color: var(--link-color);
}

/* Co nowego (strefa-kibica/co-nowego.php - zmienne --wn-* na :root) */
:root[data-theme="dark"] {
    --wn-bg: #12161f;
    --wn-surface: #1a2130;
    --wn-border: #2c3548;
    --wn-border-soft: #232c3f;
    --wn-text: #e8eaf0;
    --wn-text-muted: #9aa3b5;
    --wn-text-dim: #6b7689;
    --wn-blue: #8fb3e8;
    --wn-cat-new-tint: rgba(16, 185, 129, 0.12);
    --wn-cat-new-border: rgba(16, 185, 129, 0.35);
    --wn-cat-new-fg: #34d399;
    --wn-cat-up-tint: rgba(59, 130, 246, 0.12);
    --wn-cat-up-border: rgba(59, 130, 246, 0.35);
    --wn-cat-up-fg: #93bbfc;
    --wn-cat-fix-tint: rgba(217, 119, 6, 0.12);
    --wn-cat-fix-border: rgba(217, 119, 6, 0.35);
    --wn-cat-fix-fg: #fbbf24;
}

/* Hero "Co nowego" ma hardcodowany jasny gradient */
[data-theme="dark"] .wn-hero {
    background:
        radial-gradient(ellipse at 88% -10%, rgba(174, 128, 47, 0.12) 0%, transparent 55%),
        radial-gradient(ellipse at 5% 110%, rgba(26, 76, 139, 0.15) 0%, transparent 55%),
        linear-gradient(180deg, #141b2b 0%, #12161f 100%);
}

/* Ciemny tekst nieremapowany w dark mode: --wn-navy (#0F172A) sluzy tez jako tlo
   aktywnego filtra i tekst na zlotym badge, a tresc punktow ma hardkodowany
   #2a384c - wiec zamiast remapu zmiennej rozjasniamy punktowo te elementy.
   Hierarchia jak w light: tresc muted, liczby i wyroznienia mocne. */
[data-theme="dark"] .wn-stat-value {
    color: var(--wn-text);
}
[data-theme="dark"] .wn-category-list li {
    color: var(--wn-text-muted);
}
[data-theme="dark"] .wn-category-list li strong {
    color: var(--wn-text);
}

/* Do pobrania (media/do-pobrania.php - zmienne --dl-* na .downloads-hub).
   Podglądy plików (herb, zdjęcia) zostają jasne - to podkład pod grafiki. */
[data-theme="dark"] .downloads-hub {
    --dl-bg-light: #161c29;
    --dl-surface: #12161f;
    --dl-navy: #e8eaf0;         /* nazwy kart (herb, zdjecie druzyny, logotypy, dokumenty,
                                   etykieta miesiaca) - na ciemnym tle musza byc jasne */
    --dl-text: #e8eaf0;
    --dl-text-muted: #9aa3b5;
    --dl-border: #2c3548;
    --dl-blue: #8fb3e8;
    --dl-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.25);
    --dl-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4);
    --dl-shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.5);
}

[data-theme="dark"] .downloads-hub .logo-card,
[data-theme="dark"] .downloads-hub .photo-card,
[data-theme="dark"] .downloads-hub .download-card,
[data-theme="dark"] .downloads-hub .document-card,
[data-theme="dark"] .downloads-hub .dl-cal-export {
    background: var(--bg-surface);
    border-color: var(--border-color);
}

[data-theme="dark"] .downloads-hub .logo-card__preview,
[data-theme="dark"] .downloads-hub .photo-card__preview,
[data-theme="dark"] .downloads-hub .download-card__preview {
    background: #f0f1f3;
}

[data-theme="dark"] .downloads-hub .dl-cal-navbtn,
[data-theme="dark"] .downloads-hub .downloads-panel__note {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
}

/* Karta zawodnika (zawodnik.php - zmienne --pp-* na .pp + hardcodowane białe tła) */
[data-theme="dark"] .pp {
    --pp-bg-light: #161c29;
    --pp-border: #2c3548;
    --pp-text: #e8eaf0;
    --pp-text-muted: #9aa3b5;
    --pp-text-faint: #6b7689;
    --pp-blue: #8fb3e8;
}

[data-theme="dark"] .pp-hero,
[data-theme="dark"] .pp-stats,
[data-theme="dark"] .pp-chart,
[data-theme="dark"] .pp-matches,
[data-theme="dark"] .pp-switcher__select {
    background: var(--bg-surface);
    color: var(--text-primary);
}

[data-theme="dark"] .pp-hero__fact,
[data-theme="dark"] .pp-info,
[data-theme="dark"] .pp-stat-card,
[data-theme="dark"] .pp-charts,
[data-theme="dark"] .pp-venue,
[data-theme="dark"] .pp-matches__summary {
    background: var(--bg-surface-alt);
}

/* Panel zamiast statystyk (zawodnik poza kadrą). Pas statusu ma własne ciemne
   tło niezależne od motywu, więc nie wymaga tu niczego - panel bierze jasne
   tło z --pp-bg-light, ale białe tło przycisku i granat tytułu są wpisane
   wprost w player-profile.css i trzeba je nadpisać. */
[data-theme="dark"] .pp-empty-stats {
    background: var(--bg-surface-alt);
    border-color: var(--border-color);
}
[data-theme="dark"] .pp-empty-stats__title { color: var(--text-primary); }
[data-theme="dark"] .pp-empty-stats__btn {
    background: rgba(148, 163, 184, 0.1);
    border-color: var(--border-color);
    color: var(--text-primary);
}
/* Kolor napisu powtórzony jawnie: reguła wyżej rozjaśnia tekst wszystkich
   przycisków panelu, a na złotym tle jasny napis schodzi poniżej 2:1. */
[data-theme="dark"] .pp-empty-stats__btn--primary {
    background: linear-gradient(135deg, #AE802F, #FFEFA7);
    border-color: transparent;
    color: #2b2005;
    -webkit-text-fill-color: #2b2005;
}

/* Kadra: linia statusu pod nazwiskiem siedzi w szklanym panelu karty, który
   w ciemnym motywie zostaje jasny - kolory zostawiamy, poprawiamy tylko kreskę
   nad nią i sekcję "Poza kadrą" (nagłówek i lead biorą kolory strony). */
[data-theme="dark"] .players-out-lead { color: var(--text-secondary); }

[data-theme="dark"] .pp-matches__table tbody tr:nth-child(even) {
    background: var(--bg-surface-alt);
}

/* Hover wiersza - w player-profile.css zahardkodowany na jasny (#f1f5fb), przez
   co w dark mode jasny tekst znikal na jasnym tle. Subtelny niebieski overlay
   rozjasnia ciemny wiersz i zachowuje czytelnosc. */
[data-theme="dark"] .pp-matches__table tbody tr:hover {
    background: rgba(143, 179, 232, 0.15);
}

/* Mobile: przyklejona kolumna "Rywal" ma w player-profile.css (@media 768px)
   zahardkodowane biale tla (#fff / #fafbfc / #f1f5fb). Sticky komorka musi byc
   NIEprzezroczysta (zaslania kolumne Data przy scrollu), wiec dajemy pelne ciemne
   odpowiedniki. Bez tego kolumna swiecilaby na bialo na telefonie w dark mode. */
@media (max-width: 768px) {
    [data-theme="dark"] .pp-matches__table tbody td:nth-child(2) {
        background: var(--bg-surface);
    }
    [data-theme="dark"] .pp-matches__table tbody tr:nth-child(even) td:nth-child(2) {
        background: var(--bg-surface-alt);
    }
    [data-theme="dark"] .pp-matches__table tbody tr:hover td:nth-child(2) {
        background: #2b3650;
    }
}

/* Elementy z tekstem var(--pp-navy) (#1a2332) - navy nie jest remapowany, bo
   sluzy tez jako TLO (gradient switchera, CTA na dole, tooltip, sticky th), wiec
   zamiast remapu zmiennej rozjasniamy punktowo ciemny tekst na ciemnym tle.
   .pp-info__value--muted zostaje przyciemniony (puste pola "-"). */
[data-theme="dark"] .pp-hero__fact-value,
[data-theme="dark"] .pp-info__value:not(.pp-info__value--muted),
[data-theme="dark"] .pp-ovr__tier,
[data-theme="dark"] .pp-stat-card__value,
[data-theme="dark"] .pp-matches__summary {
    color: var(--pp-text);
}

/* Imie zawodnika w hero - w dark mode oba czlony na gold (jak .last "ŁUCZEK"),
   spojnie i czytelnie na ciemnym tle. W light .first zostaje granatowy (bez zmian). */
[data-theme="dark"] .pp .pp-hero__name .first {
    background: linear-gradient(
        110deg,
        #AE802F 0%, #FFEFA7 15%, #AE802F 30%, #AE802F 42%,
        #fffdf0 48%, #fff 50%, #fffdf0 52%,
        #AE802F 58%, #AE802F 70%, #FFEFA7 85%, #AE802F 100%);
    background-size: 300% 100%;
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
    color: transparent;
    animation: goldSweep 10s ease-in-out infinite;
}

/* Watermark numeru "08" (.pp-hero__jersey-bg) - w oryginale near-white #f0f2f5
   (subtelny na jasnym hero), ale jaskrawy na ciemnym. Dajemy subtelny ciemny ton. */
[data-theme="dark"] .pp-hero__jersey-bg {
    color: #262f47;
}

/* Badge wyniku (litera W/P/R) - ciemny tekst na polprzezroczystym tincie ginie
   na ciemnym tle; rozjasniamy tekst i lekko wzmacniamy tint. */
[data-theme="dark"] .pp-result--w { background: rgba(16, 185, 129, 0.20); color: #34d399; }
[data-theme="dark"] .pp-result--l { background: rgba(239, 68, 68, 0.20);  color: #f87171; }
[data-theme="dark"] .pp-result--d { background: rgba(148, 163, 184, 0.20); color: #cbd5e1; }

/* Ulepsz stronę (strefa-kibica/ulepsz-strone.php - zmienne --imp-* na .improve-hub) */
[data-theme="dark"] .improve-hub {
    --imp-bg-light: #161c29;
    --imp-surface: #12161f;
    --imp-text: #e8eaf0;
    --imp-text-muted: #9aa3b5;
    --imp-border: #2c3548;
    --imp-border-soft: #232c3f;
    --imp-blue: #8fb3e8;
    /* Granat maluje nagłówki kart, tytuł formularza i nagłówki sekcji "Co dalej".
       Bez tego zostaje #1a2332 na tle #12161f, czyli tekst praktycznie niewidoczny. */
    --imp-navy: #e8eaf0;
    /* Gwiazdka pól wymaganych - #DC2626 na ciemnym tle schodzi poniżej 4,5:1. */
    --imp-error: #f87171;
    /* Powierzchnie z białym napisem: ciemniejsze niż tekstowy --imp-blue. */
    --imp-btn-from: #2f5bbd;
    --imp-btn-to: #1b3576;
    --imp-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.25);
    --imp-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4);
    --imp-shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.5);
}

/* Komunikaty formularza. Zieleń #047857 i czerwień #B91C1C są dobrane pod jasne
   tło - na ciemnym tincie giną. Selektor musi mieć [data-theme] + .improve-hub
   + klasę + atrybut, bo arkusz strony siedzi w <style> na końcu <body>, czyli
   ładuje się PO tym pliku i przy równej specyficzności wygrywa kolejnością. */
[data-theme="dark"] .improve-hub .improve-form-status[data-state="success"] {
    background: rgba(16, 185, 129, 0.12);
    color: #34d399;
    border-color: rgba(16, 185, 129, 0.35);
}
[data-theme="dark"] .improve-hub .improve-form-status[data-state="error"] {
    background: rgba(239, 68, 68, 0.12);
    color: #f87171;
    border-color: rgba(239, 68, 68, 0.35);
}

[data-theme="dark"] .improve-card,
[data-theme="dark"] .improve-form-wrapper,
[data-theme="dark"] .improve-type__box,
[data-theme="dark"] .improve-next-card {
    background: var(--bg-surface);
    border-color: var(--border-color);
}

[data-theme="dark"] .improve-hub input,
[data-theme="dark"] .improve-hub textarea,
[data-theme="dark"] .improve-hub select {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
    border-color: var(--border-color);
}

/* Kontakt (kontakt.php - zmienne --ct-* na .contact-hub) */
[data-theme="dark"] .contact-hub {
    --ct-bg-light: #161c29;
    --ct-surface: #12161f;
    --ct-text: #e8eaf0;
    --ct-text-muted: #9aa3b5;
    --ct-border: #2c3548;
    --ct-navy: #e8eaf0;
    --ct-blue: #8fb3e8;
    --ct-blue-link: #8fb3e8;
    --ct-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.25);
    --ct-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4);
    --ct-shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.5);
}

/* Podkłady ikon: przezroczystość 0.08 z jasnego motywu na ciemnym tle znika
   zupełnie, więc kafelek ikony traci kształt. */
[data-theme="dark"] .contact-hub .contact-route__icon,
[data-theme="dark"] .contact-hub .contact-item__icon {
    background: rgba(143, 179, 232, 0.14);
}

[data-theme="dark"] .contact-hub .contact-route--gold .contact-route__icon {
    background: rgba(174, 128, 47, 0.22);
    color: #d9ab4f;
}

[data-theme="dark"] .contact-hub .contact-topic input:checked + .contact-topic__box {
    background: rgba(143, 179, 232, 0.12);
    border-color: #8fb3e8;
}

/* Przyciski zostają na pełnym granacie marki. Jasny --ct-blue-link jest dobry
   dla tekstu na ciemnym tle, ale jako tło przycisku z białym napisem dawałby
   kontrast poniżej 3:1. */
[data-theme="dark"] .contact-hub .contact-route-btn {
    background: #1a4c8b;
    color: #fff;
}

[data-theme="dark"] .contact-hub .contact-route-btn:hover {
    background: #2360aa;
}

[data-theme="dark"] .contact-hub input,
[data-theme="dark"] .contact-hub textarea {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
    border-color: var(--border-color);
}

[data-theme="dark"] .contact-hub .contact-status--ok {
    background: rgba(16, 185, 129, 0.14);
    color: #6ee7b7;
}

[data-theme="dark"] .contact-hub .contact-status--error {
    background: rgba(220, 38, 38, 0.16);
    color: #fca5a5;
}

/* Czerń marek TikToka, X i Threads na ciemnym tle znika. Te trzy dostają biel,
   pozostałe zachowują swoje kolory. */
[data-theme="dark"] .contact-hub .contact-social__item[data-social="tiktok"]:hover i,
[data-theme="dark"] .contact-hub .contact-social__item[data-social="x"]:hover i,
[data-theme="dark"] .contact-hub .contact-social__item[data-social="threads"]:hover i {
    color: #f4f6fb;
}

/* Polityka prywatności */
[data-theme="dark"] .privacy-section {
    background-color: var(--bg-page);
}

[data-theme="dark"] .privacy-content {
    background-color: var(--bg-surface);
}

/* Ustawienia (strefa-kibica/ustawienia.php - style inline) */
[data-theme="dark"] .settings-card {
    background: var(--bg-surface);
    border-color: var(--border-color);
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
}

[data-theme="dark"] .settings-card h2,
[data-theme="dark"] .setting-row__label {
    color: var(--text-primary);
}

[data-theme="dark"] .settings-card .card-desc,
[data-theme="dark"] .setting-row__hint,
[data-theme="dark"] .auth-required p {
    color: var(--text-secondary);
}

[data-theme="dark"] .setting-row {
    border-top-color: var(--border-color);
}

[data-theme="dark"] .toggle__slider {
    background: var(--border-color);
}

[data-theme="dark"] .theme-select {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
    border-color: var(--border-color);
}

/* ============================================================
   KADRA (druzyna/kadra.php)
   Ciemny wariant kart zawodnikow i sztabu. Style bazowe sa inline
   w kadra.php (jasny gradient + bialy glassmorphism) - tutaj tylko
   nadpisania. Zdjecia to wycinanki PNG, wiec dobrze wygladaja tez
   na ciemnym tle karty.
   ============================================================ */

[data-theme="dark"] .team-section,
[data-theme="dark"] .team-section:nth-child(even),
[data-theme="dark"] .team-photo-section {
    background-color: var(--bg-page);
}

/* --- Karta zawodnika (Minimal Soft Glass) --- */
[data-theme="dark"] .player-card-soft {
    background: linear-gradient(160deg, #242f47 0%, #1a2233 55%, #161c29 100%);
    box-shadow: 0 12px 28px -10px rgba(0, 0, 0, .6), 0 1px 2px rgba(0, 0, 0, .45);
}
[data-theme="dark"] .player-card-soft:hover {
    box-shadow: 0 22px 42px -10px rgba(0, 0, 0, .68);
}

/* Szklany panel - ciemna wersja */
[data-theme="dark"] .player-card-soft .glass {
    background: rgba(17, 23, 37, 0.62);
    border-color: rgba(255, 255, 255, 0.12);
    color: var(--text-primary);
    box-shadow: 0 4px 16px rgba(0, 0, 0, .38);
}
[data-theme="dark"] .player-card-soft .glass .name { color: #f1f4f9; }
[data-theme="dark"] .player-card-soft .glass .pos { color: var(--text-secondary); }
[data-theme="dark"] .player-card-soft .glass-divider {
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .18), transparent);
}
[data-theme="dark"] .player-card-soft .forma-label { color: #c2c9d6; }

/* Kolory semantyczne (trend + forma) rozjasnione dla kontrastu na ciemnym glassie */
[data-theme="dark"] .player-card-soft .trend--up   { background: rgba(52, 211, 153, .16); color: #34d399; }
[data-theme="dark"] .player-card-soft .trend--down { background: rgba(248, 113, 113, .16); color: #f87171; }
[data-theme="dark"] .player-card-soft .trend--flat { background: rgba(148, 163, 184, .18); color: #cbd5e1; }
[data-theme="dark"] .player-card-soft .forma-num--hi  { color: #34d399; }
[data-theme="dark"] .player-card-soft .forma-num--mid { color: #fbbf24; }
[data-theme="dark"] .player-card-soft .forma-num--lo  { color: #f87171; }

/* Chip numeru i przycisk zoom - ciemny glass zamiast bialego */
[data-theme="dark"] .player-card-soft .num-chip,
[data-theme="dark"] .player-card-soft .zoom-btn {
    background: rgba(17, 23, 37, 0.72);
    border-color: rgba(255, 255, 255, 0.18);
    color: #f1f4f9;
}

/* --- Karta sztabu / zarzadu (glitch glass) --- */
[data-theme="dark"] .staff-card-glitch,
[data-theme="dark"] .staff-card-glitch .staff-image {
    background: linear-gradient(160deg, #242f47 0%, #1a2233 55%, #161c29 100%);
}
[data-theme="dark"] .staff-card-glitch {
    box-shadow: 0 12px 28px -10px rgba(0, 0, 0, .6), 0 1px 2px rgba(0, 0, 0, .45);
}
[data-theme="dark"] .staff-card-glitch .staff-info {
    background: rgba(17, 23, 37, 0.55);
    border-left-color: rgba(255, 255, 255, 0.10);
    color: var(--text-primary);
}
[data-theme="dark"] .staff-card-glitch .staff-info h3 { color: #f1f4f9; }
[data-theme="dark"] .staff-card-glitch .staff-details {
    border-top-color: rgba(255, 255, 255, .12);
    border-bottom-color: rgba(255, 255, 255, .12);
}
[data-theme="dark"] .staff-card-glitch .staff-details p { color: #c2c9d6; }
[data-theme="dark"] .staff-card-glitch .staff-details i { color: var(--text-secondary); }
[data-theme="dark"] .staff-card-glitch .staff-bio { color: var(--text-secondary); }

@media (max-width: 768px) {
    [data-theme="dark"] .staff-card-glitch .staff-info {
        border-top-color: rgba(255, 255, 255, 0.10);
    }
}

/* ============================================================
   PANEL BOCZNY (sidebar-panel)
   Ściemniamy główne powierzchnie; nagłówki kart (granat/zieleń/bursztyn)
   i białe podkłady pod herbami drużyn zostają bez zmian.
   ============================================================ */

/* Przycisk wywołania panelu (szkło) i jego dymek. Podmieniamy WYŁĄCZNIE zmienne
   --sb-t-* zadeklarowane w sidebar-panel.css - układ, animacje i kształt zostają
   tam. Powierzchnia schodzi głębiej, a złoto jaśnieje: dokładnie ta sama para
   ruchów co przy kartach powiadomień (#AE802F -> #FFE79A). */
[data-theme="dark"] .sidebar-trigger-btn {
    --sb-t-surface: rgba(16, 23, 38, 0.66);
    --sb-t-surface-2: rgba(40, 54, 80, 0.36);
    --sb-t-border: rgba(255, 255, 255, 0.15);
    --sb-t-accent: #FFE79A;
    --sb-t-glow: rgba(255, 231, 154, 0.32);
    --sb-t-shadow:
        -16px 0 34px -18px rgba(0, 0, 0, 0.85),
        -3px 0 12px -8px rgba(0, 0, 0, 0.65),
        inset 1px 0 0 rgba(255, 255, 255, 0.07);
}

[data-theme="dark"] .sidebar-trigger-btn:hover,
[data-theme="dark"] .sidebar-trigger-btn:focus-visible {
    border-color: rgba(255, 255, 255, 0.30);
    box-shadow:
        -18px 0 40px -18px rgba(0, 0, 0, 0.92),
        -3px 0 14px -8px rgba(0, 0, 0, 0.72),
        inset 1px 0 0 rgba(255, 255, 255, 0.12);
}

[data-theme="dark"] .sidebar-trigger-tooltip {
    background: linear-gradient(155deg, rgba(16, 23, 38, 0.80), rgba(40, 54, 80, 0.56));
    border-color: rgba(255, 255, 255, 0.15);
}

[data-theme="dark"] .sidebar-trigger-tooltip::after {
    background: rgba(40, 54, 80, 0.57);
    border-right-color: rgba(255, 255, 255, 0.15);
    border-top-color: rgba(255, 255, 255, 0.15);
}

@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
    [data-theme="dark"] .sidebar-trigger-btn,
    [data-theme="dark"] .sidebar-trigger-tooltip {
        background: rgba(16, 23, 38, 0.97);
    }

    [data-theme="dark"] .sidebar-trigger-tooltip::after {
        background: rgba(16, 23, 38, 0.97);
    }
}

[data-theme="dark"] .sidebar-panel {
    background: var(--bg-page);
}

[data-theme="dark"] .sidebar-tabs {
    background: var(--bg-surface);
    border-bottom-color: var(--border-color);
}

/* Zakładka nieaktywna jest przygaszona (w jasnym motywie granat z alfą), więc
   w ciemnym musi zejść z --text-primary na --text-secondary. Inaczej wszystkie
   trzy zakładki miałyby ten sam kolor i stan aktywny niósłby wyłącznie
   złota kreska pod spodem. */
[data-theme="dark"] .sidebar-tab-btn {
    color: var(--text-secondary);
}

[data-theme="dark"] .sidebar-tab-btn.active {
    color: var(--text-primary);
}

[data-theme="dark"] .sidebar-tab-btn:hover {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
}

/* Ciemne złoto #AE802F gubi się na ciemnym pasku zakładek - ta sama poprawka,
   co przy rzutach karnych niżej w tym pliku. */
[data-theme="dark"] .sidebar-tab-btn.active i {
    color: #FFE79A;
}

[data-theme="dark"] .sport-card {
    background: var(--bg-surface);
    box-shadow: 0 3px 10px rgba(0, 0, 0, 0.35);
}

[data-theme="dark"] .sport-card-body {
    background: var(--bg-surface);
}

[data-theme="dark"] .info-row {
    color: var(--text-secondary);
}

/* Plakietka zmiany miejsca rozgrywania (panel boczny). Te same kolory co
   plakietka w karcie powiadomienia meczowego - to jedna informacja pokazywana
   w dwóch miejscach. Jasne warianty, bo obwódka i napis leżą na ciemnej karcie. */
[data-theme="dark"] .venue-changed-tag.is-home { color: #6ee7a0; }
[data-theme="dark"] .venue-changed-tag.is-away { color: #f0cf7d; }

/* Blok z terminem i miejscem w kartach "Następny mecz" oraz "Mecz zakończony"
   (panel boczny). Jasne tło #f5f5f5 przychodzi z globalnej reguły .next-match-info
   w style.css - w ciemnym motywie wychodził z tego biały prostokąt na ciemnej
   karcie. Tło pomocnicze zachowuje zamierzone wyróżnienie bloku, a jasna kreska
   nad nim (#eee z sidebar-panel.css) idzie w kolor obramowań motywu. */
[data-theme="dark"] .sidebar-panel .next-match-info {
    background-color: var(--bg-surface-alt);
}

[data-theme="dark"] .sidebar-panel .match-info {
    border-top-color: var(--border-color);
}

[data-theme="dark"] .mini-table {
    background: var(--bg-surface);
}

[data-theme="dark"] .table-header {
    background: var(--bg-surface-alt);
    color: var(--text-secondary);
}

[data-theme="dark"] .table-row {
    border-bottom-color: var(--border-color);
}

/* Kolumna punktów w mini-tabeli (wiersz .highlight ze złotym tłem zostaje) */
[data-theme="dark"] .table-row .pts {
    background: var(--bg-surface-alt);
    color: var(--link-color);
}

/* Teksty w kolorze granatowym (--panel-navy) nieczytelne na ciemnych kartach */
[data-theme="dark"] .team-side .team-name,
[data-theme="dark"] .table-row .team-name,
[data-theme="dark"] .table-row .pos,
[data-theme="dark"] .score-display .score,
[data-theme="dark"] .vs-display .vs {
    color: var(--text-primary);
}

/* Rzuty karne pod wynikiem: ciemne złoto (#8A6520) gubi się na ciemnej karcie */
[data-theme="dark"] .score-display .score-pens {
    color: #D4B96A;
}

[data-theme="dark"] .score-display .score-pens-label {
    color: var(--text-secondary);
}

[data-theme="dark"] .table-separator {
    background: var(--bg-surface-alt);
    color: var(--text-secondary);
}

[data-theme="dark"] .tab-loading,
[data-theme="dark"] .tab-error,
[data-theme="dark"] .tab-no-data {
    color: var(--text-secondary);
}

[data-theme="dark"] .social-icons-header,
[data-theme="dark"] .playlist-desc,
[data-theme="dark"] .radio-not-configured {
    color: var(--text-secondary);
}

[data-theme="dark"] .radio-not-configured h3,
[data-theme="dark"] .radio-playlist-section h3,
[data-theme="dark"] .episode-title,
[data-theme="dark"] .slider-title {
    color: var(--text-primary);
}

/* ------------------------------------------------------------
   Panel boczny: zakładka MEDIA
   Obie karty stały na białym tle z sidebar-panel.css, więc świeciły
   na ciemnym panelu. Niebieski nagłówek Facebooka zostaje bez zmian -
   to kolor marki, tak samo jak granatowe nagłówki kart w zakładce Sport.
   ------------------------------------------------------------ */

[data-theme="dark"] .fb-posts-section,
[data-theme="dark"] .social-icons-section {
    background: var(--bg-surface);
    box-shadow: 0 3px 10px rgba(0, 0, 0, 0.35);
}

/* Lista postów (renderujemy ją sami, patrz sidebar-media.js) */
[data-theme="dark"] .fb-posts-list {
    background: var(--bg-surface);
}

[data-theme="dark"] .fb-post-item {
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .fb-post-item:hover {
    background: var(--bg-surface-alt);
}

[data-theme="dark"] .fb-post-text {
    color: var(--text-primary);
}

[data-theme="dark"] .fb-post-text em,
[data-theme="dark"] .fb-post-meta,
[data-theme="dark"] .fb-posts-loading,
[data-theme="dark"] .fb-posts-empty {
    color: var(--text-secondary);
}

/* Czerwień komunikatu błędu (#dc3545) na ciemnym tle robi się brudna */
[data-theme="dark"] .fb-posts-error {
    color: #ff6b6b;
}

/* Stopka listy: jasnoszary pasek Facebooka (#f0f2f5). Hover zostaje bez zmian -
   biały napis na firmowym niebieskim czyta się dobrze w obu motywach. */
[data-theme="dark"] .fb-see-all-btn {
    background: var(--bg-surface-alt);
    color: var(--link-color);
}

/* ------------------------------------------------------------
   Panel boczny: zakładka RADIO
   ------------------------------------------------------------ */

/* Przełącznik playlist */
[data-theme="dark"] .radio-switch-btn {
    background: var(--bg-surface);
    border-color: var(--border-color);
    color: var(--text-primary);
}

[data-theme="dark"] .radio-switch-btn:hover {
    background: var(--bg-surface-alt);
    border-color: var(--link-color);
}

/* Aktywna playlista: granat marki (#1a2332) jest niemal tłem panelu w tym
   motywie, więc wyróżnienie przejmuje złoto - jak przy aktywnej zakładce. */
[data-theme="dark"] .radio-switch-btn.active {
    background: var(--bg-surface-alt);
    border-color: var(--panel-gold);
    color: var(--panel-gold-light);
}

/* Ikony przełącznika (Font Awesome, dawniej emoji 🎙️ / 🎵) dziedziczą kolor
   przycisku, więc wystarczy zdjąć z nich przygaszenie z sidebar-panel.css.
   Nagłówek listy ma ciemne złoto #AE802F - na ciemnym tle rozjaśniamy je
   tak samo jak resztę złota w tym motywie. */
[data-theme="dark"] .radio-switch-btn i {
    opacity: 1;
}

[data-theme="dark"] .radio-playlist-title i {
    color: #FFE79A;
}

/* Karta odtwarzacza */
[data-theme="dark"] .radio-main-player {
    background: var(--bg-surface);
    box-shadow: 0 3px 10px rgba(0, 0, 0, 0.35);
}

[data-theme="dark"] .radio-now-playing {
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .radio-now-title,
[data-theme="dark"] .radio-playlist-title {
    color: var(--text-primary);
}

[data-theme="dark"] .radio-now-meta {
    color: var(--text-secondary);
}

/* Pasek sterowania: jasnoszare tło (#fafafa) i białe gałki przycisków */
[data-theme="dark"] .radio-controls {
    background: var(--bg-surface-alt);
}

[data-theme="dark"] .radio-control-btn {
    background: var(--bg-surface);
    color: var(--text-primary);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
}

/* Czysta czerwień YouTube (#ff0000) na ciemnym tle jest za ciemna;
   hover z białym napisem na tej czerwieni zostaje bez zmian. */
[data-theme="dark"] .radio-yt-link {
    color: #ff5252 !important;
}

/* Złoty przycisk odtwarzania (--panel-gold-gradient) zostaje bez zmian -
   na ciemnym tle jest najlepiej widocznym elementem karty. */

/* Slider z pozostałymi odcinkami */
[data-theme="dark"] .radio-slider-arrow {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
    border: 1px solid var(--border-color);
}

[data-theme="dark"] .radio-slider-arrow:hover {
    background: var(--link-color);
    border-color: var(--link-color);
    color: var(--bg-page);
}

/* Pasek z tytułem pod miniaturą. Sam kolor tekstu był już przestawiony
   wyżej na jasny, ale tło zostawało białe - stąd napis znikał. */
[data-theme="dark"] .slider-title {
    background: var(--bg-surface-alt);
}

[data-theme="dark"] .radio-view-all-link {
    background: var(--bg-surface);
    color: var(--link-color);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
}

[data-theme="dark"] .radio-view-all-link:hover {
    background: var(--link-color);
    color: var(--bg-page);
}

/* Ekran zastępczy przy braku konfiguracji YouTube */
[data-theme="dark"] .radio-not-configured code {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
}

/* ============================================================
   STRONA 404 (style inline w 404.html - nadpisania tutaj)
   ============================================================ */

[data-theme="dark"] .error-section {
    background-color: var(--bg-page);
}

[data-theme="dark"] .error-content {
    background: var(--bg-surface);
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
}

[data-theme="dark"] .error-icon {
    color: var(--link-color);
}

[data-theme="dark"] .error-title {
    color: var(--text-primary);
}

[data-theme="dark"] .error-message,
[data-theme="dark"] .error-links h4 {
    color: var(--text-secondary);
}

[data-theme="dark"] .error-btn-secondary {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
}

[data-theme="dark"] .error-btn-secondary:hover {
    background: var(--border-color);
}

[data-theme="dark"] .error-links {
    border-top-color: var(--border-color);
}

[data-theme="dark"] .error-links-list a {
    color: var(--link-color);
    background: var(--bg-surface-alt);
}

[data-theme="dark"] .error-links-list a:hover {
    background: #1a4c8b;
    color: #fff;
}

/* Wykres zmiany pozycji (.race w druzyna/statystyki.php).
   Komponent jest zbudowany na zmiennych .stats-hub, które są już remapowane
   wyżej, więc dokładamy tylko to, co ma wartości zahardkodowane albo wymaga
   innego kontrastu na ciemnym tle. */

/* Aktywne pigułki i przycisk odtwarzania mają złote tło - tekst musi zostać
   granatowy, mimo że --navy w dark mode nie jest remapowany. */
[data-theme="dark"] .stats-hub .race__chip.is-active,
[data-theme="dark"] .stats-hub .race__toggle.is-active,
[data-theme="dark"] .stats-hub .race__play.is-playing {
    color: #1a2332;
}

/* Przycisk "Odtwórz" w stanie spoczynku: granatowe tło zlewa się z ciemnym
   panelem, więc dajemy mu jaśniejszą powierzchnię i obrys. */
[data-theme="dark"] .stats-hub .race__play {
    background: #2c3548;
    color: #ffffff;
}

/* Kółko pod herbem - na ciemnym tle herby (zwykle z jasnym tłem) czytają się
   lepiej na białym krążku niż na kolorze panelu. */
[data-theme="dark"] .stats-hub .race__crest-bg {
    fill: #f2f4f8;
}

/* Nagłówek wiersza w tabeli dostępnościowej jest sticky, więc potrzebuje
   nieprzezroczystego tła zgodnego z ciemnym panelem. */
[data-theme="dark"] .stats-hub .race__table th[scope="row"] {
    background: #1a2130;
}

/* Przygaszone linie muszą zejść mocniej niż w jasnym motywie - na ciemnym tle
   16 procent krycia wciąż tworzy szum wokół wyróżnionej drużyny.
   :not(.is-active) jest tu konieczne. Bez niego ta reguła (specyficzność 0,4,0)
   wygrywała z regułą podświetlenia z statystyki.css (0,3,0) i wygaszała także
   linię drużyny, na którą użytkownik najechał - w ciemnym motywie podświetlanie
   w ogóle nie działało. */
[data-theme="dark"] .stats-hub .race--focused .race__team:not(.is-active) .race__line,
[data-theme="dark"] .stats-hub .race--focused .race__team:not(.is-active) .race__markers {
    opacity: 0.12;
}

/* ============================================================
   LISTING AKTUALNOŚCI - nowy układ (css/aktualnosci.css)
   Pasek narzędzi, panel filtrów, karta wyróżniona, widgety w kolumnie bocznej.
   Zasada: żadnego ciemnego tekstu na ciemnym tle. Przygaszony (--text-secondary)
   zostaje wyłącznie tam, gdzie i w jasnym motywie jest drugorzędny: skrót karty,
   daty, liczniki.
   ============================================================ */

/* --- Pasek narzędzi --- */

[data-theme="dark"] .news-toolbar__count {
    color: var(--text-secondary);
}

[data-theme="dark"] .news-toolbar__count strong {
    color: var(--text-primary);
}

/* Przycisk filtrów: navy z jasnego motywu jest na ciemnym tle nieczytelny,
   więc dajemy powierzchnię panelu z jaśniejszym niebieskim obrysem. */
[data-theme="dark"] .news-filter-toggle {
    background-color: var(--bg-surface);
    color: var(--link-color);
    border-color: var(--link-color);
}

[data-theme="dark"] .news-filter-toggle:hover,
[data-theme="dark"] .news-filter-toggle[aria-expanded="true"] {
    background-color: var(--link-color);
    color: #12161f; /* ciemny tekst na jasnym wypełnieniu - kontrast w drugą stronę */
    box-shadow: 0 4px 12px rgba(143, 179, 232, 0.18);
}

/* Plakietka z liczbą filtrów - złoto zostaje, tekst musi być ciemny */
[data-theme="dark"] .news-filter-badge {
    background-color: var(--gold);
    color: #12161f;
}

/* --- Chipsy aktywnych filtrów --- */

[data-theme="dark"] .news-chip {
    background-color: var(--bg-surface-alt);
    border-color: var(--border-color);
    color: var(--text-primary);
}

[data-theme="dark"] .news-chip__remove {
    color: var(--text-secondary);
}

[data-theme="dark"] .news-chip__remove:hover {
    color: var(--text-primary);
}

/* --- Panel filtrów --- */

[data-theme="dark"] .news-filter-panel {
    background-color: var(--bg-surface);
    border-color: var(--border-color);
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
}

[data-theme="dark"] .news-filter-group + .news-filter-group,
[data-theme="dark"] .news-filter-panel__footer {
    border-top-color: var(--border-color);
}

[data-theme="dark"] .news-filter-group__label {
    color: var(--text-secondary);
}

[data-theme="dark"] .news-search__input,
[data-theme="dark"] .news-select {
    background-color: var(--bg-surface-alt);
    border-color: var(--border-color);
    color: var(--text-primary);
}

/* Placeholder osobno - dziedziczy kolor tekstu, więc bez tego byłby zbyt jasny */
[data-theme="dark"] .news-search__input::placeholder {
    color: var(--text-secondary);
}

[data-theme="dark"] .news-search__input:focus,
[data-theme="dark"] .news-select:focus {
    border-color: var(--link-color);
    box-shadow: 0 0 0 3px rgba(143, 179, 232, 0.18);
}

[data-theme="dark"] .news-search__icon,
[data-theme="dark"] .news-search__clear {
    color: var(--text-secondary);
}

[data-theme="dark"] .news-search__clear:hover {
    background-color: var(--bg-surface);
    color: var(--text-primary);
}

/* Lista rozwijana selecta rysuje się systemowo - color-scheme w palecie
   załatwia ciemne tło opcji, ale ustawiamy jawnie dla starszych przeglądarek. */
[data-theme="dark"] .news-select option {
    background-color: var(--bg-surface);
    color: var(--text-primary);
}

[data-theme="dark"] .news-filter-clear {
    border-color: var(--border-color);
    color: var(--text-secondary);
}

[data-theme="dark"] .news-filter-clear:hover {
    border-color: #e57373;
    color: #e57373;
}

/* --- Karta wyróżniona i plakietka przypięcia --- */

[data-theme="dark"] .news-card-pin {
    background-color: var(--gold);
    color: #12161f;
}

[data-theme="dark"] .news-card--hero {
    box-shadow: 0 6px 22px rgba(0, 0, 0, 0.5);
}

/* Meta-linia karty: data, autor, licznik komentarzy.
   W jasnym motywie #666/#555 - na ciemnym tle byłoby prawie niewidoczne. */
[data-theme="dark"] .news-card-meta,
[data-theme="dark"] .news-card-meta .news-date,
[data-theme="dark"] .news-card-author,
[data-theme="dark"] .news-card-comments-count {
    color: var(--text-secondary);
}

[data-theme="dark"] .news-card-author i,
[data-theme="dark"] .news-card-comments-count i {
    color: var(--link-color);
}

/* Nakładka hover na karcie - w jasnym motywie przyciemnia, na ciemnym musi
   rozjaśniać, inaczej karta pod kursorem znika. */
[data-theme="dark"] .news-card:hover::after {
    background-color: rgba(255, 255, 255, 0.04);
}

/* --- Pokaż więcej i stan pusty --- */

[data-theme="dark"] .news-load-more {
    background-color: var(--bg-surface);
    color: var(--link-color);
    border-color: var(--link-color);
}

[data-theme="dark"] .news-load-more:hover {
    background-color: var(--link-color);
    color: #12161f;
}

[data-theme="dark"] .news-empty-state {
    background-color: var(--bg-surface);
    border-color: var(--border-color);
}

[data-theme="dark"] .news-empty-state i {
    color: var(--border-color);
}

[data-theme="dark"] .news-empty-state h3 {
    color: var(--text-primary);
}

[data-theme="dark"] .news-empty-state p {
    color: var(--text-secondary);
}

/* --- Widgety w kolumnie bocznej --- */

[data-theme="dark"] .news-widget {
    background-color: var(--bg-surface);
    box-shadow: 0 4px 18px rgba(0, 0, 0, 0.4);
}

/* Pasek tytułu widgetu: navy (--primary-color) jest ciemniejszy niż powierzchnia
   panelu, więc zostaje jako akcent, ale tekst na nim musi być jasny. */
[data-theme="dark"] .news-widget__title {
    background-color: var(--bg-navy-dark);
    color: var(--text-primary);
    border-bottom: 1px solid var(--border-color);
}

[data-theme="dark"] .news-widget__title i {
    color: var(--gold);
}

[data-theme="dark"] .news-widget__empty {
    color: var(--text-secondary);
}

/* Ostatnie komentarze */

[data-theme="dark"] .news-comment-item {
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .news-comment-avatar {
    background-color: var(--bg-surface-alt);
    color: var(--link-color);
}

[data-theme="dark"] .news-comment-author {
    color: var(--text-primary);
}

[data-theme="dark"] .news-comment-time,
[data-theme="dark"] .news-comment-text,
[data-theme="dark"] .news-comment-source {
    color: var(--text-secondary);
}

[data-theme="dark"] .news-comment-source span {
    color: var(--link-color);
}

/* Newsletter (zapowiedź funkcji) */

[data-theme="dark"] .news-widget--soon .news-widget__title {
    background-color: #262d3d;
    color: var(--text-secondary);
}

[data-theme="dark"] .news-widget--soon .news-widget__title i {
    color: var(--text-secondary);
}

/* Formularz newslettera (partials/newsletter-form.php, css/newsletter-form.css).
   Ten sam formularz stoi w kolumnie bocznej aktualności i na stronie kontaktu,
   więc wystarczy nadpisać zmienne z .ksp-nl - oba warianty biorą je stamtąd. */
[data-theme="dark"] .ksp-nl {
    --ksp-nl-text: var(--text-primary);
    --ksp-nl-muted: var(--text-secondary);
    --ksp-nl-border: var(--border-color);
    --ksp-nl-field-bg: var(--bg-surface-alt);
    --ksp-nl-blue: var(--link-color);
    --ksp-nl-ok: #4ade80;
    --ksp-nl-error: #f87171;
}

/* Przycisk zostaje na pełnym granacie marki, nie na przygaszonym --link-color:
   to jedyna akcja w tej sekcji i ma być widać, że jest klikalna. */
[data-theme="dark"] .ksp-nl__submit {
    background-color: #1a4c8b;
    color: #fff;
}

[data-theme="dark"] .ksp-nl__submit:hover:not(:disabled) {
    background-color: #2360aa;
}

[data-theme="dark"] .ksp-nl__alt-links a:hover {
    background-color: var(--bg-surface);
    border-color: var(--link-color);
    color: var(--link-color);
}

/* Gorące dyskusje */

[data-theme="dark"] .news-hot-item {
    border-bottom-color: var(--border-color);
}

[data-theme="dark"] .news-hot-item__rank {
    background-color: var(--bg-surface-alt);
    color: var(--text-secondary);
}

[data-theme="dark"] .news-hot-item__link {
    color: var(--text-primary);
}

[data-theme="dark"] .news-hot-item__link:hover {
    color: var(--link-color);
}

[data-theme="dark"] .news-hot-item__count {
    color: var(--text-secondary);
}

/* ============================================================
   PAS WAŻNEGO KOMUNIKATU (css/announcement.css)
   Trzy warianty: informacja (niebieski), uwaga (żółty), pilne (czerwony).
   W trybie ciemnym pastelowe tła z trybu jasnego są za jasne, więc schodzimy
   do przygaszonych barw z jasnym tekstem - tekst nigdy nie zostaje ciemny.
   ============================================================ */

/* Migotanie: w trybie jasnym akcent jest ciemny i przyciemnia pas, tutaj musi
   byc jasny, zeby oddech rozjasnial tlo zamiast robic z niego plame. Same
   animacje siedza w css/announcement.css - tu zmieniamy wylacznie barwy. */
[data-theme="dark"] .ksp-announcement {
    background-color: #1b2740;
    border-top-color: #2f3f60;
    border-bottom-color: #2f3f60;

    --ksp-ann-accent: #8fb3e8;
    --ksp-ann-glow: rgba(143, 179, 232, 0.32);
    --ksp-ann-breathe: 0.07;
}

[data-theme="dark"] .ksp-announcement__icon {
    background-color: rgba(143, 179, 232, 0.16);
    color: var(--link-color);
}

[data-theme="dark"] .ksp-announcement__title {
    color: #dce7f8;
}

[data-theme="dark"] .ksp-announcement__body {
    color: #b3c0d6;
}

[data-theme="dark"] .ksp-announcement__link {
    background-color: var(--link-color);
    color: #12161f;
}

[data-theme="dark"] .ksp-announcement__link:hover {
    background-color: #a8c4ee;
}

[data-theme="dark"] .ksp-announcement__close {
    color: #9aa9c4;
}

[data-theme="dark"] .ksp-announcement__close:hover {
    background-color: rgba(143, 179, 232, 0.16);
    color: #dce7f8;
}

/* Wariant "uwaga" */

[data-theme="dark"] .ksp-announcement--uwaga {
    background-color: #2b2418;
    border-top-color: #4d4028;
    border-bottom-color: #4d4028;

    --ksp-ann-accent: #e8c765;
    --ksp-ann-glow: rgba(232, 199, 101, 0.30);
    --ksp-ann-breathe: 0.075;
}

[data-theme="dark"] .ksp-announcement--uwaga .ksp-announcement__icon {
    background-color: rgba(212, 175, 55, 0.18);
    color: #e8c765;
}

[data-theme="dark"] .ksp-announcement--uwaga .ksp-announcement__title {
    color: #f0dda2;
}

[data-theme="dark"] .ksp-announcement--uwaga .ksp-announcement__body {
    color: #cfc09b;
}

[data-theme="dark"] .ksp-announcement--uwaga .ksp-announcement__link {
    background-color: #e8c765;
    color: #2b2418;
}

[data-theme="dark"] .ksp-announcement--uwaga .ksp-announcement__link:hover {
    background-color: #f0dda2;
}

[data-theme="dark"] .ksp-announcement--uwaga .ksp-announcement__close {
    color: #cfc09b;
}

[data-theme="dark"] .ksp-announcement--uwaga .ksp-announcement__close:hover {
    background-color: rgba(212, 175, 55, 0.18);
    color: #f0dda2;
}

/* Wariant "pilne" */

[data-theme="dark"] .ksp-announcement--pilne {
    background-color: #2d1c1b;
    border-top-color: #55302e;
    border-bottom-color: #55302e;

    --ksp-ann-accent: #e5736e;
    --ksp-ann-glow: rgba(229, 115, 115, 0.34);
    --ksp-ann-breathe: 0.08;
}

[data-theme="dark"] .ksp-announcement--pilne .ksp-announcement__icon {
    background-color: rgba(229, 115, 115, 0.18);
    color: #f0918c;
}

[data-theme="dark"] .ksp-announcement--pilne .ksp-announcement__title {
    color: #f6b7b3;
}

[data-theme="dark"] .ksp-announcement--pilne .ksp-announcement__body {
    color: #d9b3b0;
}

[data-theme="dark"] .ksp-announcement--pilne .ksp-announcement__link {
    background-color: #e5736e;
    color: #2d1c1b;
}

[data-theme="dark"] .ksp-announcement--pilne .ksp-announcement__link:hover {
    background-color: #f0918c;
}

[data-theme="dark"] .ksp-announcement--pilne .ksp-announcement__close {
    color: #d9b3b0;
}

[data-theme="dark"] .ksp-announcement--pilne .ksp-announcement__close:hover {
    background-color: rgba(229, 115, 115, 0.18);
    color: #f6b7b3;
}

/* ============================================================
   GALERIA (media/galeria.php i media/album.php)

   Zmienne --gl-* siedzą w css/gallery.css na zakresach .gallery-hub,
   .album-view, .album-hero i .gl-facebook. Tutaj podmieniamy same
   wartości - dzięki temu tryb ciemny to kilkanaście linii, a nie
   kopia całego arkusza.

   Złoto zostaje klubowe (#AE802F -> #FFEFA7) w obu motywach: to kolor
   marki, a nie element palety interfejsu. Zmienia się wyłącznie to,
   na czym leży.
   ============================================================ */

[data-theme="dark"] .gallery-hub,
[data-theme="dark"] .album-view,
[data-theme="dark"] .album-hero,
[data-theme="dark"] .gl-facebook {
    --gl-navy: #e8eaf0;
    --gl-blue: #23407e;
    --gl-blue-soft: #8fb3e8;
    --gl-bg: #0f131c;
    --gl-surface: #161c29;
    --gl-surface-alt: #12161f;
    --gl-text: #e8eaf0;
    --gl-text-muted: #9aa3b5;
    --gl-border: #2c3548;
    --gl-shadow-sm: 0 1px 3px rgba(0, 0, 0, .4), 0 1px 2px rgba(0, 0, 0, .3);
    --gl-shadow-md: 0 8px 24px rgba(0, 0, 0, .45);
    --gl-shadow-lg: 0 18px 44px rgba(0, 0, 0, .55);
}

/* Plakietki kategorii mieszały kolor z bielą - na ciemnym tle dawało to
   jasny prostokąt zamiast subtelnego akcentu. Mieszamy z tłem karty. */
[data-theme="dark"] .gl-tag {
    color: color-mix(in srgb, var(--gl-chip) 70%, #ffffff);
    background: color-mix(in srgb, var(--gl-chip) 22%, #161c29);
    border-color: color-mix(in srgb, var(--gl-chip) 45%, #161c29);
}

[data-theme="dark"] .gl-tags--onDark .gl-tag {
    color: #fff;
    background: color-mix(in srgb, var(--gl-chip) 62%, transparent);
    border-color: color-mix(in srgb, var(--gl-chip) 78%, #ffffff);
}

/* Licznik na chipsie filtra: jasny numerek na ciemnym tle. */
[data-theme="dark"] .gl-chip em {
    background: #22293a;
    color: #b9c1d1;
}

[data-theme="dark"] .gl-chip.is-active em {
    background: rgba(255, 255, 255, .22);
    color: #fff;
}

/* Przycisk "Pokaż więcej" na pełnym granacie marki - jasny --gl-blue-soft
   nadaje się na tekst, ale nie na tło pod białym napisem. */
[data-theme="dark"] .gl-more {
    background: linear-gradient(135deg, #1E3A8A, #1a4c8b);
    color: #fff;
}

/* Miejsca, w których pod spodem leży zdjęcie, zostają ciemne w obu motywach -
   tam nie ma czego przełączać, zmienia się tylko kadr. */
[data-theme="dark"] .gl-card-media,
[data-theme="dark"] .gl-hero-media,
[data-theme="dark"] .album-item {
    background: #1c2231;
}

[data-theme="dark"] .gl-empty-state {
    border-color: #2c3548;
}

[data-theme="dark"] .gl-search input:focus {
    box-shadow: 0 0 0 3px rgba(143, 179, 232, .22);
}

/* Nagłówek albumu ma własne, mocniejsze przyciemnienie tła: w trybie ciemnym
   jasna okładka pod białym tytułem raziła w oczy. */
[data-theme="dark"] .album-hero-bg {
    filter: blur(18px) brightness(.3) saturate(1.05);
}

[data-theme="dark"] .album-hero::after {
    background: linear-gradient(180deg, rgba(10, 14, 22, .62) 0%, rgba(10, 14, 22, .9) 100%);
}

/* Wyjaśnienie archiwalnej jakości - tło jaśniejsze od strony, żeby ramka
   nie zlewała się z tłem sekcji. */
[data-theme="dark"] .album-archive-note {
    background: #12161f;
    border-color: #2c3548;
    border-left-color: #AE802F;
}

/* Plakietka na kafelku zostaje ciemna w obu motywach - leży na zdjęciu,
   a nie na tle strony. */
[data-theme="dark"] .gl-card-archive {
    background: rgba(10, 14, 22, .75);
    border-color: rgba(255, 255, 255, .14);
}


/* ============================================================
   KOMENTARZE BEZ KONTA, LAJKI, ODZNAKI, PROFIL KIBICA

   css/comments.css laduje sie PRZED tym plikiem, wiec wystarczy nadpisac
   to, co naprawde zalezy od motywu: tla, obrysy i kolory tekstu.
   Zloty wariant odznaki zostaje bez zmian - gradient klubowy czyta sie
   tak samo dobrze na ciemnym tle.
   ============================================================ */

[data-theme="dark"] .comments-guest__nick label { color: var(--text-primary); }
[data-theme="dark"] .comments-guest__nick input,
[data-theme="dark"] .comments-guest__known input[name="nick"] {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
    border-color: var(--border-color);
}
[data-theme="dark"] .comments-guest__hint,
[data-theme="dark"] .comments-form__note,
[data-theme="dark"] .comments-form__login,
[data-theme="dark"] .comments-guest__known { color: var(--text-secondary); }
[data-theme="dark"] .comments-guest__known strong { color: var(--text-primary); }
[data-theme="dark"] .comments-guest__change,
[data-theme="dark"] .comments-form__login a,
[data-theme="dark"] .comments-form__note i { color: var(--link-color); }

[data-theme="dark"] .comment-role-badge--guest {
    background: var(--bg-surface-alt);
    color: var(--text-secondary);
    border: 1px solid var(--border-color);
}
[data-theme="dark"] .comment-avatar--guest .comment-avatar__initials { background: #3b465e; }

/* Odznaki: brazowa i srebrna musza zejsc do ciemnych tel, inaczej swieca
   plamami na karcie komentarza. */
[data-theme="dark"] .comment-badge--braz,
[data-theme="dark"] .kibic-badge--braz {
    background: #33261a;
    color: #e0b183;
    border-color: #4b3a29;
}
[data-theme="dark"] .comment-badge--srebro,
[data-theme="dark"] .kibic-badge--srebro {
    background: #232b3b;
    color: #c3cad6;
    border-color: var(--border-color);
}

[data-theme="dark"] .comment-author--link { color: var(--text-primary); }
[data-theme="dark"] .comment-author--link:hover,
[data-theme="dark"] .comment-author--link:focus-visible { color: var(--link-color); }

[data-theme="dark"] .comment-like {
    border-color: var(--border-color);
    color: var(--text-secondary);
}
[data-theme="dark"] .comment-like:hover,
[data-theme="dark"] .comment-like.is-liked {
    background: rgba(185, 28, 28, 0.18);
    border-color: rgba(248, 113, 113, 0.5);
    color: #fca5a5;
}

[data-theme="dark"] .comment-banner--pending {
    background: rgba(2, 132, 199, 0.16);
    border-left-color: #38bdf8;
    color: #bae6fd;
}
[data-theme="dark"] .comment-action--ok {
    border-color: rgba(110, 231, 183, 0.4);
    color: #6ee7b7;
}
[data-theme="dark"] .comment-action--ok:hover {
    background: rgba(16, 185, 129, 0.18);
}

/* --- Odpowiedzi, komentarze ukryte i pole impersonacji ---

   PUŁAPKA KASKADY, przez którą odpowiedzi świeciły bielą w ciemnym motywie:
   css/comments.css jest wpinany w treści strony (partials/comments-section.php),
   czyli PO tym pliku. Nagłówek pliku mówi co innego i mówi to o samym <head> -
   przy komentarzach jest odwrotnie. Nadpisanie `[data-theme="dark"] .comment-card`
   (0,2,0) wystarcza tylko na karty bez wariantu; `.comment--reply .comment-card`
   ma dokładnie tę samą specyficzność i wygrywa kolejnością. Reguły niżej mają
   więc po trzy klasy - inaczej nie ruszą niczego.

   Odpowiedź ma być odrobinę ciemniejsza od karty komentarza, tak jak w jasnym
   motywie jest odrobinę szarsza od białej: wtapia się w tło dyskusji i wiadomo,
   że to głos drugiego planu. */
[data-theme="dark"] .comment--reply .comment-card {
    background: #171d29;
    border-color: var(--border-color);
}

/* Komentarz ukryty przez moderatora - w jasnym motywie kremowe tło z bursztynową
   obwódką. Na ciemnym ten sam sygnał daje przygaszony bursztyn na przezroczystości. */
[data-theme="dark"] .comment--hidden .comment-card {
    background: rgba(180, 83, 9, 0.14);
    border-color: rgba(217, 119, 6, 0.45);
}
[data-theme="dark"] .comment-banner--hidden {
    background: rgba(180, 83, 9, 0.18);
    border-left-color: #f59e0b;
    color: #fcd34d;
}

/* Pole "wystawiam jako" i plakietka "wystawione przez X" - widzi je wyłącznie
   moderator i admin, ale to nie powód, żeby zostawiać im dwie żółte płachty
   na ciemnej stronie. Bursztyn zostaje jako sygnał, schodzi tylko jego jasność. */
[data-theme="dark"] .comments-impersonate {
    background: rgba(212, 175, 55, 0.10);
    border-color: rgba(212, 175, 55, 0.55);
}
[data-theme="dark"] .comments-impersonate label,
[data-theme="dark"] .comments-impersonate label i {
    color: #e3c76a;
}
[data-theme="dark"] .comments-impersonate input {
    background: var(--bg-surface-alt);
    border-color: rgba(212, 175, 55, 0.5);
    color: var(--text-primary);
}
[data-theme="dark"] .comments-impersonate input:focus {
    background: var(--bg-surface);
    border-color: #d4af37;
}
[data-theme="dark"] .comment-impersonation-marker {
    background: rgba(212, 175, 55, 0.12);
    border-color: rgba(212, 175, 55, 0.4);
    color: #e3c76a;
}
[data-theme="dark"] .comment-impersonation-marker i {
    color: #d4af37;
}

/* --- Okno profilu kibica --- */
[data-theme="dark"] .kibic-modal__box {
    background: var(--bg-surface);
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
}
[data-theme="dark"] .kibic-modal__close { color: var(--text-secondary); }
[data-theme="dark"] .kibic-modal__close:hover {
    background: var(--bg-surface-alt);
    color: var(--text-primary);
}
[data-theme="dark"] .kibic-modal__nick,
[data-theme="dark"] .kibic-modal__h4,
[data-theme="dark"] .kibic-modal__stats strong,
[data-theme="dark"] .kibic-modal__cite { color: var(--text-primary); }
[data-theme="dark"] .kibic-modal__since,
[data-theme="dark"] .kibic-modal__meta,
[data-theme="dark"] .kibic-modal__loading,
[data-theme="dark"] .kibic-modal__stats span { color: var(--text-secondary); }
[data-theme="dark"] .kibic-modal__stats > div,
[data-theme="dark"] .kibic-modal__list a,
[data-theme="dark"] .kibic-modal__next {
    background: var(--bg-surface-alt);
    border-color: var(--border-color);
    color: var(--text-secondary);
}
[data-theme="dark"] .kibic-modal__list a:hover { border-color: var(--link-color); }


/* ============================================================
   RANKING KIBICOW I INTERAKCJE

   Obie strony stoja na wlasnych zmiennych (--kb-* i --in-*), wiec ciemny
   motyw podmienia SAME ZMIENNE. Komponentow nie ruszamy - wyjatki sa nazwane
   w komentarzach nizej.
   ============================================================ */

[data-theme="dark"] .kibice-hub {
    --kb-navy: #e8eaf0;
    --kb-blue: #8fb3e8;
    --kb-blue-link: #8fb3e8;
    --kb-bg-light: #12161f;
    --kb-surface: #1a2130;
    --kb-text: #e8eaf0;
    --kb-text-muted: #9aa3b5;
    --kb-border: #2c3548;
    --kb-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.4);
    --kb-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.5);
}

/* Numer miejsca na podium to jasny granat z alfą - na ciemnym tle znikał
   zupełnie, więc rozjaśniamy go osobno. */
[data-theme="dark"] .kibice-hub .kb-podium__place { color: rgba(232, 234, 240, 0.18); }

/* Nagłówek tabeli zostaje ciemny w obu motywach, ale w trybie ciemnym musi
   odciąć się od karty - stąd tło z powierzchni alternatywnej, nie z --kb-navy
   (ten jest teraz jasny, bo służy do tekstu). */
[data-theme="dark"] .kibice-hub .kb-table th {
    background: #212a3d;
    color: #e8eaf0;
}
[data-theme="dark"] .kibice-hub .kb-table tbody tr:hover { background: #212a3d; }

[data-theme="dark"] .kibice-hub .kb-badge--braz,
[data-theme="dark"] .kibice-hub .kb-badge-card--braz > i { color: #e0b183; }
[data-theme="dark"] .kibice-hub .kb-badge--braz {
    background: #33261a;
    border-color: #4b3a29;
}
[data-theme="dark"] .kibice-hub .kb-badge--srebro {
    background: #232b3b;
    color: #c3cad6;
    border-color: #2c3548;
}
[data-theme="dark"] .kibice-hub .kb-badge-card__prog,
[data-theme="dark"] .kibice-hub .kb-panel--alt .kb-badge-card__prog {
    background: #12161f;
    border-color: #2c3548;
}

[data-theme="dark"] .ints-page {
    --in-navy: #e8eaf0;
    --in-blue: #8fb3e8;
    --in-bg: #12161f;
    --in-surface: #1a2130;
    --in-text: #e8eaf0;
    --in-muted: #9aa3b5;
    --in-border: #2c3548;
}
/* Aktywna zakładka ma jasne tło z --in-navy, więc napis musi zejść na ciemny -
   inaczej biały tekst na jasnym tle daje kontrast 1,3:1. */
[data-theme="dark"] .ints-tab.is-active { color: #12161f; }
[data-theme="dark"] .ints-ikona--like  { background: rgba(185, 28, 28, 0.22); color: #fca5a5; }
[data-theme="dark"] .ints-ikona--reply { background: rgba(30, 64, 175, 0.28); color: #93c5fd; }

/* Widget "Najaktywniejsi kibice" na listingu aktualności */
[data-theme="dark"] .news-fan-item { border-bottom-color: var(--border-color); }
[data-theme="dark"] .news-fan-item__nick { color: var(--text-primary); }
[data-theme="dark"] .news-fan-item__meta { color: var(--text-secondary); }
[data-theme="dark"] .news-fan-item__rank {
    background-color: var(--bg-surface-alt);
    color: var(--text-secondary);
}
[data-theme="dark"] .news-fan-more { color: var(--link-color); }
[data-theme="dark"] .news-fan-item__badge--zloto { color: #FFEFA7; }
