/*
 * WL Kontrast
 *
 * Biały wariant jest traktowany jako domyślny wygląd strony.
 * Tryby kontrastu są dwa: żółty i pomarańczowy.
 * Klasy dodawane do <html> i <body>:
 * .wl-contrast-yellow, .wl-contrast-orange
 */

:root {
    --wl-kontrast-default-bg: #1b1b1a;
    --wl-kontrast-default-text: #ffffff;
    --wl-kontrast-yellow: #ffff00;
    --wl-kontrast-orange: #ff7a3d;
}

html.wl-contrast-yellow,
body.wl-contrast-yellow {
    --wl-contrast-bg: #1b1b1a;
    --wl-contrast-text: var(--wl-kontrast-yellow);
    --wl-contrast-accent: var(--wl-kontrast-yellow);
    --wl-contrast-muted: rgba(255, 255, 0, 0.86);
    --wl-contrast-border: rgba(255, 255, 0, 0.84);
    --wl-contrast-svg-filter: brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(7486%) hue-rotate(359deg) brightness(103%) contrast(103%);
}

html.wl-contrast-orange,
body.wl-contrast-orange {
    --wl-contrast-bg: #1b1b1a;
    --wl-contrast-text: var(--wl-kontrast-orange);
    --wl-contrast-accent: var(--wl-kontrast-orange);
    --wl-contrast-muted: rgba(255, 122, 61, 0.88);
    --wl-contrast-border: rgba(255, 122, 61, 0.86);
    --wl-contrast-svg-filter: brightness(0) saturate(100%) invert(62%) sepia(89%) saturate(2329%) hue-rotate(330deg) brightness(103%) contrast(101%);
}

html.wl-contrast-mode {
    color-scheme: dark;

    /* Blocksy i część bloków korzystają z custom properties. */
    --theme-text-color: var(--wl-contrast-text) !important;
    --theme-heading-color: var(--wl-contrast-accent) !important;
    --theme-link-initial-color: var(--wl-contrast-accent) !important;
    --theme-link-hover-color: var(--wl-contrast-accent) !important;
    --theme-border-color: var(--wl-contrast-border) !important;
    --theme-button-text-initial-color: var(--wl-contrast-bg) !important;
    --theme-button-text-hover-color: var(--wl-contrast-bg) !important;
    --theme-button-background-initial-color: var(--wl-contrast-accent) !important;
    --theme-button-background-hover-color: var(--wl-contrast-accent) !important;
    --theme-palette-color-1: var(--wl-contrast-accent) !important;
    --theme-palette-color-2: var(--wl-contrast-accent) !important;
    --theme-palette-color-3: var(--wl-contrast-accent) !important;
    --theme-palette-color-4: var(--wl-contrast-text) !important;
    --theme-palette-color-5: var(--wl-contrast-bg) !important;
    --theme-palette-color-6: var(--wl-contrast-bg) !important;
    --theme-palette-color-7: var(--wl-contrast-bg) !important;
    --theme-palette-color-8: var(--wl-contrast-bg) !important;
}

html.wl-contrast-mode body,
html.wl-contrast-mode #main,
html.wl-contrast-mode main,
html.wl-contrast-mode .site-main,
html.wl-contrast-mode .site-content,
html.wl-contrast-mode .entry-content,
html.wl-contrast-mode .ct-container,
html.wl-contrast-mode .ct-header,
html.wl-contrast-mode #header,
html.wl-contrast-mode [data-header*="type"],
html.wl-contrast-mode [data-row],
html.wl-contrast-mode .site-footer,
html.wl-contrast-mode footer,
html.wl-contrast-mode .ct-footer,
html.wl-contrast-mode #footer,
html.wl-contrast-mode .wp-block-group,
html.wl-contrast-mode .wp-block-cover,
html.wl-contrast-mode .wp-block-cover__inner-container,
html.wl-contrast-mode .wp-block-columns,
html.wl-contrast-mode .wp-block-column,
html.wl-contrast-mode .gb-container,
html.wl-contrast-mode .stk-block,
html.wl-contrast-mode .elementor-section,
html.wl-contrast-mode .elementor-container,
html.wl-contrast-mode .elementor-widget-wrap,
html.wl-contrast-mode .wlev-slot,
html.wl-contrast-mode .wlev-partners-slot,
html.wl-contrast-mode .wlev-partner-group-section {
    background-color: var(--wl-contrast-bg) !important;
    color: var(--wl-contrast-text) !important;
}

html.wl-contrast-mode :where(*, *::before, *::after) {
    text-shadow: none !important;
    box-shadow: none !important;
    border-color: var(--wl-contrast-border) !important;
}

html.wl-contrast-mode :where(h1, h2, h3, h4, h5, h6, p, li, dt, dd, figcaption, small, strong, em, label, legend, blockquote, cite, span, div),
html.wl-contrast-mode :where(.ct-menu-link, .menu-item > a, .sub-menu a, .entry-title, .page-title, .wp-block-heading),
html.wl-contrast-mode :where(
    [class^="wl-"]:not(.wl-kontrast-toggle),
    [class*=" wl-"]:not(.wl-kontrast-toggle),
    [class^="wlev-"],
    [class*=" wlev-"],
    [class^="wlz-"],
    [class*=" wlz-"]
) {
    color: var(--wl-contrast-text) !important;
}

html.wl-contrast-mode :where(a, a:hover, a:focus, a:active),
html.wl-contrast-mode :where(.current-menu-item > a, .current_page_item > a, .ct-header-text, .ct-label, .ct-button, .wp-block-button__link),
html.wl-contrast-mode :where(.wlev-tabs a, .wlev-tabs button, .wlev-months a, .wlev-months button, .wlev-month, .wlev-month-button) {
    color: var(--wl-contrast-accent) !important;
    text-decoration-color: var(--wl-contrast-accent) !important;
}

html.wl-contrast-mode :where(button, input, textarea, select, .ct-button, .wp-block-button__link),
html.wl-contrast-mode :where(.wlev-tabs a, .wlev-tabs button, .wlev-months a, .wlev-months button, .wlev-month, .wlev-month-button) {
    background-color: transparent !important;
    background-image: none !important;
    color: var(--wl-contrast-accent) !important;
    border-color: var(--wl-contrast-border) !important;
    box-shadow: none !important;
}

html.wl-contrast-mode :where(hr, table, th, td, fieldset, .ct-header, .ct-footer, .site-footer, .wp-block-separator) {
    border-color: var(--wl-contrast-border) !important;
}

html.wl-contrast-mode ::selection {
    background: var(--wl-contrast-accent) !important;
    color: var(--wl-contrast-bg) !important;
}

/* Inline SVG: logo, ikony social, ikony menu, BIP itd. */
html.wl-contrast-mode :where(svg, svg *) {
    color: var(--wl-contrast-accent) !important;
}

html.wl-contrast-mode :where(svg:not([fill="none"]), svg *:not([fill="none"])) {
    fill: currentColor !important;
}

/* Nie nadajemy stroke wszystkim elementom SVG. To powodowało czerwoną/pomarańczową
 * otoczkę na logotypach złożonych z wypełnionych ścieżek. Stroke przejmują tylko
 * elementy, które faktycznie miały stroke w SVG albo zostały oznaczone przez JS. */
html.wl-contrast-mode :where(
    svg[stroke]:not([stroke="none"]),
    svg *[stroke]:not([stroke="none"]),
    svg [data-wl-kontrast-has-stroke="1"]
) {
    stroke: currentColor !important;
}

html.wl-contrast-mode :where(svg [data-wl-kontrast-no-stroke="1"]) {
    stroke: none !important;
}

/* SVG ładowane jako <img>, np. social icon albo BIP.
 * UWAGA 1.1.13: filtr stosujemy WYŁĄCZNIE do realnych <img>. Goły selektor
 * `.custom-logo` łapał też inlinowany <svg class="custom-logo …"> (JS kopiuje
 * klasę), nakładając filtr na już-pokolorowany wektor i tworząc czerwoną obwódkę
 * na krawędziach. Inlinowane SVG kolorujemy fillem, nie filtrem — stąd jawne
 * wykluczenie `.wl-kontrast-inlined-svg` i wymóg elementu `img`. */
html.wl-contrast-mode :where(
    img[src$=".svg"]:not(.wlev-partner-logo-img):not(.wl-kontrast-inlined-svg),
    img[src*=".svg?"]:not(.wlev-partner-logo-img):not(.wl-kontrast-inlined-svg),
    img.custom-logo:not(.wl-kontrast-inlined-svg),
    .site-logo img:not(.wl-kontrast-inlined-svg),
    .ct-logo img:not(.wl-kontrast-inlined-svg),
    .ct-image-container img[src*=".svg"]:not(.wlev-partner-logo-img):not(.wl-kontrast-inlined-svg)
) {
    filter: var(--wl-contrast-svg-filter) !important;
    opacity: 1 !important;
}

/* Ikony oparte na maskach albo fontach. */
html.wl-contrast-mode :where(.ct-icon, .ct-icon-container, .wp-block-social-link, .wp-block-social-link-anchor, [class*="icon"], [class*="Icon"]) {
    color: var(--wl-contrast-accent) !important;
    fill: var(--wl-contrast-accent) !important;
    stroke: var(--wl-contrast-accent) !important;
}

/*
 * 1.1.15 — ikony SVG ze stopki (BIP / Facebook / Instagram) kolorowane MASKĄ.
 * JS zamienia <img src=".svg"> na <span class="wl-kontrast-icon"> z URL pliku w
 * zmiennej --wl-k-icon. Tryb domyślny: pokazujemy oryginał przez background-image.
 * Tryb kontrastu: malujemy płaski kolor akcentu maską (kształt = alpha pliku),
 * co jest niewrażliwe na wewnętrzne fill/stroke/<style> i nie daje czerwonej
 * obwódki (w przeciwieństwie do filtra).
 */
.wl-kontrast-icon {
    display: inline-block;
    background-image: var(--wl-k-icon);
    background-repeat: no-repeat;
    background-position: center center;
    background-size: contain;
    max-width: 100%;
    line-height: 0;
}

html.wl-contrast-mode .wl-kontrast-icon {
    background-image: none !important;
    background-color: var(--wl-contrast-accent) !important;
    -webkit-mask-image: var(--wl-k-icon) !important;
            mask-image: var(--wl-k-icon) !important;
    -webkit-mask-repeat: no-repeat !important;
            mask-repeat: no-repeat !important;
    -webkit-mask-position: center center !important;
            mask-position: center center !important;
    -webkit-mask-size: contain !important;
            mask-size: contain !important;
}

/* Shortcode: [wl_kontrast]
 * Ikona jest maską, a nie background-image. Dzięki temu kolor zmienia się
 * bez generowania osobnych SVG dla białego/żółtego/pomarańczowego wariantu.
 */
.kontrast-menu,
a.kontrast-menu,
button.kontrast-menu {
    --wl-kontrast-toggle-color: var(--wl-kontrast-default-text);
    --wl-kontrast-toggle-hover-color: var(--wl-kontrast-yellow);

    width: 15px !important;
    min-width: 15px !important;
    height: 15px !important;
    min-height: 15px !important;
    padding: 0 !important;
    margin: 0 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    font-size: 0 !important;
    line-height: 0 !important;
    text-indent: -9999px;
    overflow: hidden;
    background-color: var(--wl-kontrast-toggle-color) !important;
    background-image: none !important;
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 80 80'%3E%3Cpath fill='%23000' d='M4.67 4.67v70.66h70.66V4.67H4.67ZM69.2 69.2 10.8 10.8h58.4v58.4Z'/%3E%3C/svg%3E") !important;
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 80 80'%3E%3Cpath fill='%23000' d='M4.67 4.67v70.66h70.66V4.67H4.67ZM69.2 69.2 10.8 10.8h58.4v58.4Z'/%3E%3C/svg%3E") !important;
    -webkit-mask-repeat: no-repeat !important;
    mask-repeat: no-repeat !important;
    -webkit-mask-position: center center !important;
    mask-position: center center !important;
    -webkit-mask-size: 15px 15px !important;
    mask-size: 15px 15px !important;
    transform: none !important;
    vertical-align: middle !important;
    position: relative;
    top: 0;
    flex: 0 0 15px;
    border: 0 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    cursor: pointer;
    transition: background-color 0.2s ease, opacity 0.2s ease;
}

.kontrast-menu:hover,
.kontrast-menu:focus-visible {
    background-color: var(--wl-kontrast-toggle-hover-color) !important;
}

html.wl-contrast-yellow .kontrast-menu {
    --wl-kontrast-toggle-color: var(--wl-kontrast-yellow);
    --wl-kontrast-toggle-hover-color: var(--wl-kontrast-orange);
}

html.wl-contrast-orange .kontrast-menu {
    --wl-kontrast-toggle-color: var(--wl-kontrast-orange);
    --wl-kontrast-toggle-hover-color: var(--wl-kontrast-default-text);
}

.kontrast-menu:focus-visible {
    outline: 2px solid var(--wl-kontrast-toggle-hover-color) !important;
    outline-offset: 4px;
}


/* Header: shortcode + przełącznik języka w jednej osi. */
.ct-header-text .entry-content:has(.wl-kontrast-toggle) {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: flex-start !important;
    gap: 0.85rem !important;
    line-height: 1 !important;
}

.ct-header-text .entry-content:has(.wl-kontrast-toggle) > * {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
}

.ct-header-text .entry-content .wl-kontrast-toggle {
    margin-right: 0.85rem !important; /* fallback, gdy :has() nie zadziała */
}

.ct-header-text .entry-content:has(.wl-kontrast-toggle) .wl-kontrast-toggle {
    margin-right: 0 !important;
}

.ct-header-text .entry-content .wl-lang-switcher {
    display: inline-flex !important;
    align-items: center !important;
    line-height: 1 !important;
}

/* Twarde przypisanie kolorów ikony. Poprzednio same zmienne mogły zostać
 * przegrane przez style motywu/przycisku. Kolor maski wynika z background-color.
 */
html:not(.wl-contrast-yellow):not(.wl-contrast-orange) .kontrast-menu,
html:not(.wl-contrast-yellow):not(.wl-contrast-orange) a.kontrast-menu,
html:not(.wl-contrast-yellow):not(.wl-contrast-orange) button.kontrast-menu {
    --wl-kontrast-toggle-color: var(--wl-kontrast-default-text);
    --wl-kontrast-toggle-hover-color: var(--wl-kontrast-yellow);
    background-color: var(--wl-kontrast-default-text) !important;
}

html:not(.wl-contrast-yellow):not(.wl-contrast-orange) .kontrast-menu:hover,
html:not(.wl-contrast-yellow):not(.wl-contrast-orange) .kontrast-menu:focus-visible {
    background-color: var(--wl-kontrast-yellow) !important;
}

html.wl-contrast-yellow .kontrast-menu,
html.wl-contrast-yellow a.kontrast-menu,
html.wl-contrast-yellow button.kontrast-menu {
    --wl-kontrast-toggle-color: var(--wl-kontrast-yellow);
    --wl-kontrast-toggle-hover-color: var(--wl-kontrast-orange);
    background-color: var(--wl-kontrast-yellow) !important;
}

html.wl-contrast-yellow .kontrast-menu:hover,
html.wl-contrast-yellow .kontrast-menu:focus-visible {
    background-color: var(--wl-kontrast-orange) !important;
}

html.wl-contrast-orange .kontrast-menu,
html.wl-contrast-orange a.kontrast-menu,
html.wl-contrast-orange button.kontrast-menu {
    --wl-kontrast-toggle-color: var(--wl-kontrast-orange);
    --wl-kontrast-toggle-hover-color: var(--wl-kontrast-default-text);
    background-color: var(--wl-kontrast-orange) !important;
}

html.wl-contrast-orange .kontrast-menu:hover,
html.wl-contrast-orange .kontrast-menu:focus-visible {
    background-color: var(--wl-kontrast-default-text) !important;
}

html.wl-contrast-mode .kontrast-menu,
html.wl-contrast-mode a.kontrast-menu,
html.wl-contrast-mode button.kontrast-menu {
    color: transparent !important;
    border-color: transparent !important;
}

.wl-kontrast-toggle__text {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
}


/*
 * Poprawki 1.1.2
 * Greenshift / wp-element-button: tekst nie może dziedziczyć tego samego koloru,
 * który motyw lub zmienne Blocksy nadały tłu przycisku.
 */
html.wl-contrast-mode :where(
    .wp-element-button:not(.kontrast-menu),
    a.wp-element-button:not(.kontrast-menu),
    .wp-block-button__link,
    .gspb_button_wrapper .gspb-buttonbox,
    .wp-block-greenshift-blocks-buttonbox,
    .gspb-buttonbox.wp-element-button,
    .gspb-buttonbox
) {
    background-color: transparent !important;
    background-image: none !important;
    color: var(--wl-contrast-accent) !important;
    border: 1px solid var(--wl-contrast-border) !important;
    box-shadow: none !important;
    text-decoration: none !important;
}

html.wl-contrast-mode :where(
    .wp-element-button:not(.kontrast-menu),
    a.wp-element-button:not(.kontrast-menu),
    .wp-block-button__link,
    .gspb_button_wrapper .gspb-buttonbox,
    .wp-block-greenshift-blocks-buttonbox,
    .gspb-buttonbox.wp-element-button,
    .gspb-buttonbox
) :where(span, strong, em, small, .gspb-buttonbox-textwrap, .gspb-buttonbox-text, .gspb-buttonbox-title) {
    color: inherit !important;
    background: transparent !important;
}

html.wl-contrast-mode :where(
    .wp-element-button:not(.kontrast-menu),
    a.wp-element-button:not(.kontrast-menu),
    .wp-block-button__link,
    .gspb_button_wrapper .gspb-buttonbox,
    .wp-block-greenshift-blocks-buttonbox,
    .gspb-buttonbox.wp-element-button,
    .gspb-buttonbox
):where(:hover, :focus-visible) {
    background-color: var(--wl-contrast-accent) !important;
    color: var(--wl-contrast-bg) !important;
    border-color: var(--wl-contrast-accent) !important;
}

html.wl-contrast-mode :where(
    .wp-element-button:not(.kontrast-menu),
    a.wp-element-button:not(.kontrast-menu),
    .wp-block-button__link,
    .gspb_button_wrapper .gspb-buttonbox,
    .wp-block-greenshift-blocks-buttonbox,
    .gspb-buttonbox.wp-element-button,
    .gspb-buttonbox
):where(:hover, :focus-visible) :where(span, strong, em, small, .gspb-buttonbox-textwrap, .gspb-buttonbox-text, .gspb-buttonbox-title) {
    color: inherit !important;
}

/*
 * Blocksy: przycisk „back to top”. Globalne kolorowanie SVG nie może zostawiać
 * strzałki w tym samym kolorze co tło przycisku.
 */
html.wl-contrast-mode .ct-back-to-top {
    background-color: var(--wl-contrast-accent) !important;
    border-color: var(--wl-contrast-accent) !important;
    color: var(--wl-contrast-bg) !important;
    box-shadow: none !important;
}

html.wl-contrast-mode .ct-back-to-top :where(svg, svg *, path) {
    color: var(--wl-contrast-bg) !important;
    fill: var(--wl-contrast-bg) !important;
    stroke: var(--wl-contrast-bg) !important;
}

html.wl-contrast-mode .ct-back-to-top:hover,
html.wl-contrast-mode .ct-back-to-top:focus-visible {
    background-color: var(--wl-contrast-bg) !important;
    border-color: var(--wl-contrast-accent) !important;
    color: var(--wl-contrast-accent) !important;
}

html.wl-contrast-mode .ct-back-to-top:hover :where(svg, svg *, path),
html.wl-contrast-mode .ct-back-to-top:focus-visible :where(svg, svg *, path) {
    color: var(--wl-contrast-accent) !important;
    fill: var(--wl-contrast-accent) !important;
    stroke: var(--wl-contrast-accent) !important;
}

/*
 * Poprawki 1.1.3
 * Blocksy header: wyrównanie ikony kontrastu do tej samej osi co ikona wyszukiwania.
 * W praktyce problem wynikał z tego, że element tekstowy nagłówka i shortcode
 * tworzyły własny line-box niezależny od sąsiedniego elementu z lupą.
 */
.ct-header-text:has(.wl-kontrast-toggle),
.ct-header-text:has(.wl-kontrast-toggle) .entry-content {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: flex-start !important;
    line-height: 1 !important;
}

.ct-header-text:has(.wl-kontrast-toggle) {
    min-height: 15px !important;
}

.ct-header-text:has(.wl-kontrast-toggle) .entry-content {
    gap: 0.7rem !important;
}

.ct-header-text:has(.wl-kontrast-toggle) .wl-kontrast-toggle,
.ct-header-text .entry-content .wl-kontrast-toggle {
    align-self: center !important;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    position: relative !important;
    top: 0px !important;
}

.ct-header-text:has(.wl-kontrast-toggle) .wl-lang-switcher,
.ct-header-text:has(.wl-kontrast-toggle) .wl-lang,
.ct-header-text:has(.wl-kontrast-toggle) .wl-lang-sep {
    display: inline-flex !important;
    align-items: center !important;
    line-height: 1 !important;
}

/* Gdy przeglądarka nie wspiera :has(), fallback obejmuje typowy układ z shortcode. */
.ct-header-text .entry-content .wl-kontrast-toggle + .wl-lang-switcher {
    display: inline-flex !important;
    align-items: center !important;
    line-height: 1 !important;
    vertical-align: middle !important;
}

/*
 * Zdjęcia w trybach kontrastu: czarno-białe.
 * Wykluczamy SVG/logotypy, bo ich kolor obsługują osobne reguły przez fill/stroke albo maskę.
 */
html.wl-contrast-mode :where(
    img:not([src$='.svg']):not([src*='.svg?']):not(.custom-logo),
    picture img,
    .wp-post-image,
    .attachment-post-thumbnail,
    .ct-media-container img:not([src$='.svg']):not([src*='.svg?']),
    .wp-block-image img:not([src$='.svg']):not([src*='.svg?']),
    .wp-block-gallery img:not([src$='.svg']):not([src*='.svg?']),
    .blocks-gallery-item img:not([src$='.svg']):not([src*='.svg?']),
    .gspb_image img:not([src$='.svg']):not([src*='.svg?']),
    .wlev-event-image img:not([src$='.svg']):not([src*='.svg?']),
    .wl-event-image img:not([src$='.svg']):not([src*='.svg?']),
    .wlz-member-photo img:not([src$='.svg']):not([src*='.svg?']),
    .wl-wspomnienia-card img:not([src$='.svg']):not([src*='.svg?'])
) {
    -webkit-filter: grayscale(100%) !important;
    filter: grayscale(100%) !important;
}

/*
 * Poprawki 1.1.5
 * Nie nakładamy grayscale na całe kontenery hero/card, bo wtedy filtr obejmuje
 * również napisy i przyciski. Filtr zostaje tylko na prawdziwych obrazach oraz
 * na elementach będących wyłącznie warstwą obrazu.
 */
html.wl-contrast-mode :where(
    .wp-block-cover__image-background,
    .wlev-slide-img,
    .wlev-hero-img,
    .wl-hero__image img,
    .wl-cover__image img,
    .wl-wspomnienia-card__image img
) {
    -webkit-filter: grayscale(100%) !important;
    filter: grayscale(100%) !important;
}

/* Hero / slider Wydarzeń: zachowujemy obraz jako obraz, a nie czyścimy go
 * regułami kontrastu przeznaczonymi dla kontenerów tekstowych.
 */
html.wl-contrast-mode :where(
    .wlev-slide,
    .wlev-hero-slide,
    .wlev-hero-media,
    .wlev-hero-image,
    .wl-hero__media,
    .wl-hero__background,
    .wl-cover__media,
    .wl-cover__background
) {
    background-color: transparent !important;
    color: var(--wl-contrast-accent) !important;
}

html.wl-contrast-mode :where(.wlev-slide-img, .wlev-hero-img) {
    display: block !important;
    opacity: 1 !important;
    visibility: visible !important;
    mix-blend-mode: normal !important;
}

/* Napisy na hero/cover powinny przyjmować aktywny kolor kontrastu. */
html.wl-contrast-mode :where(
    .wl-hero,
    .wl-hero *,
    .wl-cover,
    .wl-cover *,
    .wlev-event-hero,
    .wlev-event-hero *,
    .wlev-hero,
    .wlev-hero *,
    .wlev-slide-content,
    .wlev-slide-content *,
    .wlev-hero-content,
    .wlev-hero-content *,
    .wp-block-cover__inner-container,
    .wp-block-cover__inner-container *
) {
    color: var(--wl-contrast-accent) !important;
    text-shadow: none !important;
}

html.wl-contrast-mode :where(
    .wl-hero .wp-element-button,
    .wl-cover .wp-element-button,
    .wlev-event-hero .wp-element-button,
    .wlev-hero .wp-element-button,
    .wlev-slide-content .wp-element-button,
    .wp-block-cover__inner-container .wp-element-button
) {
    background-color: transparent !important;
    color: var(--wl-contrast-accent) !important;
    border-color: var(--wl-contrast-border) !important;
}

html.wl-contrast-mode :where(
    .wl-hero .wp-element-button:hover,
    .wl-cover .wp-element-button:hover,
    .wlev-event-hero .wp-element-button:hover,
    .wlev-hero .wp-element-button:hover,
    .wlev-slide-content .wp-element-button:hover,
    .wp-block-cover__inner-container .wp-element-button:hover
) {
    background-color: var(--wl-contrast-accent) !important;
    color: var(--wl-contrast-bg) !important;
}

/* Logotypy partnerów: nie używamy globalnego filtra do koloru akcentu,
 * bo przy SVG z wewnętrznym białym polem robi się żółty/pomarańczowy kwadrat.
 * Ten wariant zamienia białe tło pliku na ciemne, a sam znak pozostawia jasny.
 */
html.wl-contrast-mode :where(
    .wlev-partner-item,
    .wlev-partner-link,
    .wlev-partner-logo
) {
    background-color: transparent !important;
    background-image: none !important;
}

html.wl-contrast-mode :where(
    .wlev-partner-logo-img[src$=".svg"],
    .wlev-partner-logo-img[src*=".svg?"]
) {
    /* Nie filtrujemy logotypów partnerów na kolor akcentu, bo część SVG zawiera
     * wewnętrzne tło i cały obraz zamieniał się w żółty/pomarańczowy kwadrat.
     * Jeśli logo ma zostać całkowicie kontrolowane kolorem kontrastu, trzeba je
     * przygotować jako inline SVG albo SVG bez własnego tła.
     */
    -webkit-filter: none !important;
    filter: none !important;
    mix-blend-mode: normal !important;
    background: transparent !important;
    opacity: 1 !important;
}

html.wl-contrast-yellow :where(.wlev-partner-group-title),
html.wl-contrast-orange :where(.wlev-partner-group-title) {
    color: var(--wl-contrast-accent) !important;
    border-color: var(--wl-contrast-border) !important;
}


/*
 * Poprawki 1.1.7
 * 1) Zachowujemy tła graficzne hero/cover i warstw obrazów. Kontrast nie może
 *    zdejmować właściwego zdjęcia z wydarzenia; czarno-biały efekt nakładamy na
 *    obraz, a nie na kontener z tekstem.
 * 2) Wyrównujemy kolor tekstów w hero do aktywnego wariantu kontrastu.
 * 3) Przycisk smooth scroll „Więcej o koncercie” ma być tekstowy: bez ramki,
 *    bez tła i bez podświetlenia na hover.
 */
html.wl-contrast-mode :where(
    .wp-block-cover,
    .wp-block-cover__inner-container,
    .wlev-slide,
    .wlev-hero-slide,
    .wlev-hero-media,
    .wlev-hero-image,
    .wlev-slide-content,
    .wlev-hero-content,
    .wl-hero,
    .wl-hero__media,
    .wl-hero__background,
    .wl-cover,
    .wl-cover__media,
    .wl-cover__background,
    .gspb_container,
    .gspb_container-gsbp,
    .gspb_row,
    .gspb_column
) {
    background-color: transparent !important;
}

html.wl-contrast-mode :where(
    .wlev-slide,
    .wlev-hero-slide,
    .wlev-hero-media,
    .wlev-hero-image,
    .wl-hero__media,
    .wl-hero__background,
    .wl-cover__media,
    .wl-cover__background
) {
    background-image: revert-layer;
}

html.wl-contrast-mode :where(
    .wlev-slide-img,
    .wlev-hero-img,
    .wp-block-cover img,
    .wp-block-cover__image-background,
    .wp-block-cover__video-background
) {
    -webkit-filter: grayscale(100%) !important;
    filter: grayscale(100%) !important;
    opacity: 1 !important;
    visibility: visible !important;
}

html.wl-contrast-mode :where(
    .wlev-slide-content,
    .wlev-slide-content *,
    .wlev-hero-content,
    .wlev-hero-content *,
    .wl-hero,
    .wl-hero *,
    .wl-cover,
    .wl-cover *,
    .wp-block-cover__inner-container,
    .wp-block-cover__inner-container *,
    .gspb_heading,
    .gspb_heading *,
    .gspb_text,
    .gspb_text *
):not(img):not(svg):not(path) {
    color: var(--wl-contrast-accent) !important;
    text-shadow: none !important;
}

html.wl-contrast-mode :where(
    .gspb-buttonbox.gs-smoothscrollto,
    .wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto,
    a.gspb-buttonbox.gs-smoothscrollto,
    a.wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto
) {
    background: transparent !important;
    background-color: transparent !important;
    background-image: none !important;
    border: 0 !important;
    box-shadow: none !important;
    color: var(--wl-contrast-accent) !important;
    text-decoration: none !important;
}

html.wl-contrast-mode :where(
    .gspb-buttonbox.gs-smoothscrollto,
    .wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto,
    a.gspb-buttonbox.gs-smoothscrollto,
    a.wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto
):where(:hover, :focus, :focus-visible, :active) {
    background: transparent !important;
    background-color: transparent !important;
    background-image: none !important;
    border-color: transparent !important;
    box-shadow: none !important;
    color: var(--wl-contrast-accent) !important;
}


html.wl-contrast-mode :where(
    .gspb-buttonbox.gs-smoothscrollto,
    .wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto,
    a.gspb-buttonbox.gs-smoothscrollto,
    a.wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto
):focus-visible {
    outline: 2px solid var(--wl-contrast-accent) !important;
    outline-offset: 4px !important;
}

html.wl-contrast-mode :where(
    .gspb-buttonbox.gs-smoothscrollto,
    .wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto,
    a.gspb-buttonbox.gs-smoothscrollto,
    a.wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto
) :where(.gspb-buttonbox-title, .gspb-buttonbox-textwrap, .gspb-buttonbox-text, .gspb-buttonbox-icon, span) {
    color: var(--wl-contrast-accent) !important;
    background: transparent !important;
}

html.wl-contrast-mode :where(
    .gspb-buttonbox.gs-smoothscrollto,
    .wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto,
    a.gspb-buttonbox.gs-smoothscrollto,
    a.wp-block-greenshift-blocks-buttonbox.gs-smoothscrollto
) :where(svg, svg *, path) {
    color: var(--wl-contrast-accent) !important;
    fill: var(--wl-contrast-accent) !important;
    stroke: var(--wl-contrast-accent) !important;
}

html.wl-contrast-mode :where(
    .wlev-partner-logo,
    .wlev-partner-logo-img
) {
    background-color: transparent !important;
    background-image: none !important;
    box-shadow: none !important;
}


/*
 * Poprawki 1.1.8
 * Partnerzy: SVG ładowane jako <img> są zamieniane przez JS na inline SVG
 * z klasą .wl-kontrast-partner-svg. Dopiero wtedy fill/stroke można realnie
 * podporządkować aktualnemu kolorowi kontrastu.
 */
html.wl-contrast-mode :where(.wlev-partner-logo .wl-kontrast-partner-svg) {
    display: block !important;
    width: auto;
    max-width: 100% !important;
    height: auto;
    color: var(--wl-contrast-accent) !important;
    fill: currentColor !important;
    background: transparent !important;
    filter: none !important;
    opacity: 1 !important;
}

html.wl-contrast-mode :where(
    .wlev-partner-logo .wl-kontrast-partner-svg path,
    .wlev-partner-logo .wl-kontrast-partner-svg rect,
    .wlev-partner-logo .wl-kontrast-partner-svg circle,
    .wlev-partner-logo .wl-kontrast-partner-svg ellipse,
    .wlev-partner-logo .wl-kontrast-partner-svg polygon,
    .wlev-partner-logo .wl-kontrast-partner-svg polyline,
    .wlev-partner-logo .wl-kontrast-partner-svg line,
    .wlev-partner-logo .wl-kontrast-partner-svg text,
    .wlev-partner-logo .wl-kontrast-partner-svg tspan
):not([fill="none"]) {
    fill: currentColor !important;
}

html.wl-contrast-mode :where(.wlev-partner-logo .wl-kontrast-partner-svg [data-wl-kontrast-has-stroke="1"]) {
    stroke: currentColor !important;
}

html.wl-contrast-mode :where(.wlev-partner-logo .wl-kontrast-partner-svg [data-wl-kontrast-no-stroke="1"]) {
    stroke: none !important;
}

html.wl-contrast-mode :where(.wlev-partner-logo .wl-kontrast-partner-svg [fill="none"]) {
    fill: none !important;
}

html.wl-contrast-mode :where(.wlev-partner-logo .wl-kontrast-partner-svg [stroke="none"]) {
    stroke: none !important;
}


/*
 * Poprawki 1.1.9
 * Szerszy cel dla logotypów partnerów po zamianie na inline SVG.
 * Część plików SVG ma własne style albo atrybuty fill/stroke; używamy koloru
 * aktualnego trybu kontrastu jako currentColor i celujemy także w przypadek,
 * gdy SVG zostało już wstawione inline przez inny mechanizm.
 */
html.wl-contrast-mode :where(
    .wlev-partner-logo svg,
    .wlev-partner-logo svg *,
    .wlev-partner-logo .wl-kontrast-partner-svg,
    .wlev-partner-logo .wl-kontrast-partner-svg *
) {
    color: var(--wl-contrast-accent) !important;
}

html.wl-contrast-mode :where(
    .wlev-partner-logo svg path,
    .wlev-partner-logo svg rect,
    .wlev-partner-logo svg circle,
    .wlev-partner-logo svg ellipse,
    .wlev-partner-logo svg polygon,
    .wlev-partner-logo svg polyline,
    .wlev-partner-logo svg line,
    .wlev-partner-logo svg text,
    .wlev-partner-logo svg tspan,
    .wlev-partner-logo svg use
):not([fill="none"]):not([data-wl-kontrast-bg]) {
    fill: currentColor !important;
}

html.wl-contrast-mode :where(.wlev-partner-logo svg [data-wl-kontrast-has-stroke="1"]):not([data-wl-kontrast-bg]) {
    stroke: currentColor !important;
}

html.wl-contrast-mode :where(.wlev-partner-logo svg [data-wl-kontrast-no-stroke="1"]):not([data-wl-kontrast-bg]) {
    stroke: none !important;
}


/*
 * 1.1.12/1.1.13 — BEZPIECZNIK UKŁADU (działa też w trybie domyślnym).
 *
 * Każdy SVG wstawiany inline przez wtyczkę traci reguły motywu celujące w `img`
 * oraz domyślne `img { max-width: 100% }`. Bez tego duże atrybuty/rozmiary SVG
 * rozpychają stronę w poziomie na wąskim ekranie. Reguła jest celowo POZA
 * `html.wl-contrast-mode`, by chronić układ także bez aktywnego kontrastu.
 * Ustawiamy tylko `max-width` — wysokość zostaje taka, jaką JS skopiował z
 * wyrenderowanego <img>, więc proporcje logo są zachowane.
 */
.wl-kontrast-inlined-svg,
.wl-kontrast-partner-svg {
    max-width: 100% !important;
}

/*
 * 1.1.11 — ochrona przed obwódką na logotypach SVG.
 * Wypełnione ścieżki logo nie powinny dostawać sztucznego stroke. Dla SVG
 * zamienionych na inline przez JS elementy bez rzeczywistego obrysu mają
 * data-wl-kontrast-no-stroke="1".
 */
html.wl-contrast-mode :where(
    .wl-kontrast-inlined-svg,
    .wl-kontrast-inlined-svg *,
    .custom-logo.wl-kontrast-inlined-svg,
    .ct-logo svg,
    .site-logo svg,
    .site-branding svg
) {
    color: var(--wl-contrast-accent) !important;
}

html.wl-contrast-mode :where(
    .wl-kontrast-inlined-svg path,
    .wl-kontrast-inlined-svg rect,
    .wl-kontrast-inlined-svg circle,
    .wl-kontrast-inlined-svg ellipse,
    .wl-kontrast-inlined-svg polygon,
    .wl-kontrast-inlined-svg polyline,
    .wl-kontrast-inlined-svg line,
    .wl-kontrast-inlined-svg text,
    .wl-kontrast-inlined-svg tspan,
    .wl-kontrast-inlined-svg use
):not([fill="none"]):not([data-wl-kontrast-bg]) {
    fill: currentColor !important;
}

html.wl-contrast-mode :where(.wl-kontrast-inlined-svg [data-wl-kontrast-has-stroke="1"]):not([data-wl-kontrast-bg]) {
    stroke: currentColor !important;
}

html.wl-contrast-mode :where(.wl-kontrast-inlined-svg [data-wl-kontrast-no-stroke="1"]):not([data-wl-kontrast-bg]) {
    stroke: none !important;
}

/*
 * 1.1.10 — wl-cover-rotator / Greenshift hero z tłem w CSS variable.
 * Ten fragment używa inline style z background-image: var(--wl-cr-bg) !important,
 * więc nie filtrujemy całego kontenera. Zamiast tego nakładamy szarą kopię tła
 * na pseudo-element, a treść zostaje nad nią w kolorze kontrastu.
 */
html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"] {
    position: relative !important;
    isolation: isolate !important;
    overflow: hidden !important;
}

html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"]::before {
    content: "" !important;
    position: absolute !important;
    inset: 0 !important;
    z-index: 0 !important;
    pointer-events: none !important;
    background-image: var(--wl-cr-bg) !important;
    background-position: var(--wl-cr-pos, center center) !important;
    background-size: cover !important;
    background-repeat: no-repeat !important;
    -webkit-filter: grayscale(100%) !important;
    filter: grayscale(100%) !important;
}

html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"] > .gspb_row__content,
html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"] > .wp-block-cover__inner-container,
html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"] > *:not(.wp-block-cover__image-background):not(.wp-block-cover__video-background) {
    position: relative !important;
    z-index: 1 !important;
}

html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"] .wl-hero__title,
html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"] .wl-hero__title *,
html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"] .gspb_heading,
html.wl-contrast-mode .wl-rotator-hero[data-wl-cover-rotator="1"] .gspb_heading * {
    color: var(--wl-contrast-accent) !important;
    text-shadow: none !important;
}

/* Promo slider z przesłanego fragmentu: jawne objęcie obrazków kart zapowiedzi. */
html.wl-contrast-mode .wlev-promo-slider .wlev-promo-card-img {
    -webkit-filter: grayscale(100%) !important;
    filter: grayscale(100%) !important;
}
