/**
 * Bobrowice Core — MECHANIKA, nie wygląd.
 *
 * ── Kontrakt tego pliku (D-06) ────────────────────────────────────────────
 *
 * Ten arkusz nie deklaruje ANI JEDNEJ wartości marki: żadnego koloru, żadnego
 * odstępu ze skali, żadnego stopnia pisma. Deklaruje wyłącznie to, bez czego
 * panel off-canvas i przełączniki NIE DZIAŁAJĄ: pozycjonowanie, stan
 * otwarty/zamknięty, przejście, warstwy, blokadę tła, ukrycie dla czytnika.
 *
 * ── Skąd bierze kolory ────────────────────────────────────────────────────
 *
 * Zmierzone 2026-09-01: **Elementor emituje Variables jako właściwości CSS
 * nazwane ETYKIETĄ tokenu** — `--zielen-900`, `--biel`, `--font-tresc`.
 * Dlatego arkusz sięga po nie WPROST i nie wymaga żadnego kroku konfiguracji:
 *
 *     background: var( --b-oc-tlo, var( --zielen-900, Canvas ) );
 *                     └ opcjonalne  └ token marki      └ ratunek
 *                       przekierowanie  z panelu          systemowy
 *
 * Trzy poziomy, w tej kolejności:
 * 1. `--b-oc-tlo` — jeśli ktoś chce przepiąć slot na inny token, ustawia go
 *    w Elementor → Ustawienia witryny → Custom CSS. Opcjonalne.
 * 2. `--zielen-900` — token marki z Variables. **To jest droga domyślna**:
 *    zmiana wartości tokenu w panelu zmienia panel off-canvas, bez wydania wtyczki.
 * 3. `Canvas` — kolor systemowy, gdy nie ma ani jednego, ani drugiego.
 *
 * Wcześniejszy projekt wymagał ręcznego zmapowania wszystkich slotów po
 * instalacji. Krok, o którym trzeba pamiętać, to krok, który ktoś kiedyś
 * pominie — a wtedy panel wychodzi w kolorach systemowych i wygląda na zepsuty.
 * Ta wersja działa od razu i nadal zostawia furtkę na przepięcie.
 */

/* ── Skip-linki ─────────────────────────────────────────────────────────── */

.b-skip {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 200;
}

.b-skip__link {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	white-space: nowrap;
	/* `clip-path`, NIE `left: -9999px` — element odsunięty o 100 000 px potrafi
	   zerwać przewijanie do focusu i wchodzi w konflikt z WCAG 2.2 SC 2.4.11. */
	clip-path: inset( 50% );
}

.b-skip__link:focus,
.b-skip__link:focus-visible {
	position: static;
	width: auto;
	height: auto;
	overflow: visible;
	clip-path: none;
	display: inline-block;
	background: var( --b-skip-tlo, var( --biel, Canvas ) );
	color: var( --b-skip-tekst, var( --zielen-800, CanvasText ) );
	border: 2px solid var( --b-skip-ramka, var( --zielen-700, currentColor ) );
	padding: var( --b-skip-padding, 12px 20px );
	text-decoration: none;
}

/**
 * `.b-sr` — treść wyłącznie dla czytnika ekranu.
 *
 * Mieszka tutaj, a NIE w klasie globalnej Elementora, z dwóch powodów:
 * 1. To mechanika dostępności, nie wartość wyglądu — dokładnie ta sama
 *    technika, co `.b-skip__link` kilka reguł wyżej.
 * 2. Zmierzone 2026-09-01: `custom_css` w Global Classes odrzuca kształt
 *    `{"raw": "…"}`, który wysłałem, i wraca jako `null` — bez błędu.
 *    Klasa globalna `b-sr` wyszłaby PUSTA, wyglądając na zdefiniowaną.
 *
 * `clip-path: inset(50%)`, NIE `left: -9999px` — element odsunięty o
 * 100 000 px potrafi zerwać przewijanie do focusu i wchodzi w konflikt
 * z WCAG 2.2 SC 2.4.11.
 */
.b-sr {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	overflow: hidden;
	white-space: nowrap;
	border: 0;
	clip-path: inset( 50% );
}

/* Duplikat skip-linku z motywu Hello Elementor — pełne uzasadnienie w includes/a11y.php.
   Chowamy POWTÓRZENIE, nie funkcję: identyczny cel i etykietę niesie `.b-skip__link`
   na pierwszej pozycji. `display: none` zdejmuje duplikat także z kolejności Tab —
   o to właśnie chodzi, bo piąty skip-link powtarzający pierwszy to szum, nie pomoc. */
.skip-link.screen-reader-text {
	display: none !important;
}

/* ── Menu off-canvas ────────────────────────────────────────────────────── */

.b-oc {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	z-index: 10000;
	width: var( --b-oc-szerokosc, min( 86vw, 340px ) );
	max-width: 100%;
	padding: var( --b-oc-padding, 24px );
	background: var( --b-oc-tlo, var( --zielen-900, Canvas ) );
	color: var( --b-oc-tekst, var( --zielen-100, CanvasText ) );
	overflow-y: auto;
	overscroll-behavior: contain;
	transform: translateX( 110% );
	transition: transform .34s cubic-bezier( .4, 0, .2, 1 );
}

.b-oc__overlay {
	position: fixed;
	inset: 0;
	z-index: 9999;
	background: var( --b-oc-overlay, rgba( 13, 32, 24, .55 ) );
	opacity: 0;
	transition: opacity .3s ease;
}

[data-b-oc="otwarte"] .b-oc {
	transform: translateX( 0 );
}

[data-b-oc="otwarte"] .b-oc__overlay {
	opacity: 1;
}

.b-oc__lista {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Cel dotykowy — to wymóg WCAG, nie decyzja estetyczna, więc zostaje tutaj. */
.b-oc__lista a,
.b-oc__zamknij,
.b-burger {
	min-height: 44px;
	min-width: 44px;
	display: inline-flex;
	align-items: center;
}

/* Reguły kitów na gołym selektorze `button` biją własne klasy — burger i ✕
   muszą się z tego wypiąć, inaczej dostają tło i ramkę szablonu.

   D-66b: cztery deklaracje `!important` (tło, ramka, promień, cień) ZDJĘTE.
   Dla burgera i tak były przykryte przez `!important` arkusza zestawu, ale dla ✕
   działały — i to one kasowały wygląd z referencji: ramkę 2 px `--linia-kontrolki`,
   tło `--biel` i promień 4 px, które arkusz zestawu deklaruje bez `!important`
   (`kit-css-wsad-f.css` L1623–1626). Po zdjęciu wygląd obu przycisków ma jedno
   źródło — arkusz zestawu. Kryterium: B246 R5. */
.b-burger,
.b-oc__zamknij {
	color: inherit;
	cursor: pointer;
	justify-content: center;
}

/* ── Rozmiar tekstu ─────────────────────────────────────────────────────── */

/**
 * 🔴 WARUNEK DZIAŁANIA: typografia w klasach globalnych MUSI być w `rem`.
 *
 * Skalowanie działa przez `font-size` na <html>. Rozmiary podane w `px`
 * — a Elementor domyślnie emituje `px` — NIE zareagują na ten przełącznik.
 * To jest jedyne miejsce, w którym warstwa panelu i warstwa wtyczki muszą
 * się umówić; umowa jest opisana w README §3.
 */
html[data-b-tekst="s"] { font-size: 87.5%; }
html[data-b-tekst="m"] { font-size: 100%; }
html[data-b-tekst="l"] { font-size: 125%; }

/* ── Zatrzymanie ruchu ──────────────────────────────────────────────────── */

/* D-61 61c pkt 3 — reguły `html[data-b-ruch]` zdjęte razem z przyciskiem
   „Zatrzymaj animacje”. Preferencja systemowa poniżej ZOSTAJE (D-61b,
   kanon §9 reguła 23). Kryterium: B251 (c), (e). */

@media ( prefers-reduced-motion: reduce ) {
	*,
	*::before,
	*::after {
		animation-duration: .001ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: .001ms !important;
		scroll-behavior: auto !important;
	}
}

/* --------------------------------------------------------------------------
 * Pierścień fokusu — WYPROWADZONY Z TEJ WTYCZKI 2026-09-01 (wydanie 1.3.1)
 *
 * 🔴 Reguła stąd NIGDY NIE DZIAŁAŁA i trzeba to zapisać, żeby nikt jej tu nie
 * wrócił. Wersja 1.2.1 deklarowała:
 *
 *     :where( a, button, input, select, textarea, summary, [tabindex] ):focus-visible
 *
 * `:where()` ma z definicji ZEROWĄ specyficzność, więc cały selektor ważył
 * (0,1,0). Elementor w `assets/css/conditionals/reset.css` wysyła własną regułę:
 *
 *     a:focus-visible, button:focus-visible, input:focus-visible, …
 *     { box-shadow: 0 0 0 4px #fff; outline: 2px solid #000; outline-offset: 2px }
 *
 * czyli (0,1,1) — wyższą o jeden selektor elementu. Zmierzone na renderze
 * 2026-09-01 Tabem (NIE programowym `.focus()`, bo ten nie wywołuje
 * `:focus-visible` — pseudo-klasa idzie za modalnością interakcji):
 * `outlineColor` = #000000, `outlineWidth` = 2px, `outlineOffset` = 2px.
 * Pierścień marki nie pojawiał się na ŻADNYM odnośniku, przycisku ani polu.
 *
 * Reguła mieszka teraz w Custom CSS zestawu (Ustawienia witryny → Custom CSS),
 * bo tamten arkusz jest emitowany PO frameworku Elementora i wygrywa kolejnością
 * przy równej specyficzności. Przy okazji znika powód, dla którego siedziała
 * w kodzie: komentarz z 1.2.1 mówił, że „selektora ogólnego nie da się wyrazić
 * w panelu", powołując się na odrzucanie `custom_css` NA KLASIE GLOBALNEJ (O-6).
 * To prawda o klasie globalnej, ale NIE o zestawie — zmierzone 2026-09-01:
 * `custom_css` na kicie przyjmuje dowolny selektor i ląduje w `post-6.css`.
 *
 * Wniosek ogólny, wart zapamiętania: `:where()` jest wygodne do pisania
 * „miękkich" wartości domyślnych, ale do NADPISANIA cudzej reguły nadaje się
 * najgorzej ze wszystkich zapisów — zeruje własną siłę przetargową.
 * -------------------------------------------------------------------------- */
