/*
Theme Name: tvsat364
Theme URI: https://tvsat364.local/
Author: tvsat364
Author URI: https://tvsat364.local/
Description: Czysty block theme dla witryny tvsat364, zbudowany w oparciu o pełną edycję witryny (Full Site Editing) i theme.json.
Version: 1.8.7
Requires at least: 6.4
Tested up to: 6.8
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: tvsat364
Tags: block-theme, full-site-editing, blog, one-column, custom-colors, custom-menu, editor-style, featured-images, threaded-comments, translation-ready
*/

:where(.wp-site-blocks) > * {
	margin-block-start: 0;
	margin-block-end: 0;
}

/* ---------------------------------------------------------------------------
 * Widoczny fokus (WCAG 2.1 — 2.4.7 Focus Visible, 1.4.11 Non-text Contrast)
 *
 * Siatka bezpieczeństwa dla wszystkich interaktywnych elementów, także tych
 * renderowanych przez bloki rdzenia, których nie kontrolujemy z theme.json.
 * `:where()` daje zerową specyficzność, więc każda dalsza reguła ją nadpisze.
 * `currentColor` w drugim, zewnętrznym obrysie zapewnia widoczność również na
 * ciemnym tle stopki i w trybie wymuszonych kolorów.
 * ------------------------------------------------------------------------- */
:where(a, button, summary, input, select, textarea, [tabindex]):focus-visible {
	outline: 3px solid var(--wp--preset--color--primary);
	outline-offset: 2px;
	border-radius: 3px;
}

/*
 * Na ciemnych tłach obrys `primary` nie osiąga progu 3:1 z 1.4.11 — na tle
 * `primary` ma wręcz 1:1, czyli znika co do piksela. Tam obrys musi być jasny:
 *
 *   tło          obrys primary   obrys base
 *   contrast          2,17:1       17,63:1
 *   primary           1,00:1        8,14:1
 *   muted             1,26:1        6,46:1
 *   black             2,58:1       21,00:1
 *
 * Kolor bierzemy z TŁA, nie z przycisku: pierścień jest rysowany poza
 * elementem, więc o jego widoczności decyduje to, co jest pod nim. Wariant
 * „obrys w kolorze przycisku” sprawdzono na 109 przyciskach witryny — daje
 * 89 niewidocznych obrysów (biały przycisk na białej karcie to 1:1, a 42
 * przyciski nie mają wypełnienia, z którego można by wziąć kolor).
 *
 * Ograniczenie: łapie wyłącznie kolory z palety. Sekcja z ciemnym tłem
 * ustawionym inline, spoza palety, dostanie obrys domyślny.
 */
:where(.has-contrast-background-color,
	.has-primary-background-color,
	.has-muted-background-color,
	.has-black-background-color) :where(a, button, summary, input, [tabindex]):focus-visible {
	outline-color: var(--wp--preset--color--base);
}

/*
 * Blok „Cover” wymaga osobnej reguły. Kolor nakładki trzyma element
 * <span class="wp-block-cover__background">, który jest RODZEŃSTWEM treści,
 * a nie jej przodkiem — selektor potomka powyżej nie ma więc jak go zobaczyć.
 * Stąd `:has()`: pytamy kontener o nakładkę stojącą obok treści.
 *
 * W hero na stronie głównej tłem jest zdjęcie z dużą ilością błękitu, przykryte
 * nakładką `contrast` o kryciu 70%. Zmierzone tło pod pierścieniem to #11256a
 * (średnia) i #1a4975 (najjaśniejszy fragment) — obrys `primary` daje tam
 * 1,72:1 i 1,15:1, czyli jest praktycznie niewidoczny. Obrys biały: 14,03:1
 * i 9,32:1.
 *
 * Warunek czytamy odwrotnie niż wyżej — „przyciemnienie nakładką w kolorze,
 * który NIE jest jasny”. Dzięki temu łapie też nakładkę bez wybranego koloru
 * (domyślnie czarną), a gdy ktoś wybierze nakładkę jasną, obrys wraca do
 * `primary`, czyli do wariantu poprawnego dla jasnego tła.
 */
.wp-block-cover:has(> .wp-block-cover__background.has-background-dim:not(
		.has-base-background-color,
		.has-white-background-color,
		.has-secondary-background-color,
		.has-tertiary-background-color,
		.has-accent-background-color))
	:where(a, button, summary, input, [tabindex]):focus-visible {
	outline-color: var(--wp--preset--color--base);
}

/*
 * Pole wyszukiwarki (blok `core/search`, wariant z przyciskiem w środku pola).
 *
 * Rdzeń wypisuje dla tego wariantu
 *   :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper)
 *     .wp-block-search__input:focus { outline: none }
 * czyli selektor (0,2,0), który wygrywa z siatką bezpieczeństwa powyżej (0,1,0).
 * Pole zostawało bez żadnego wskaźnika fokusu — widać było tylko migający kursor
 * tekstowy (2.4.7). Dotyczyło `/pomoc/`, `/aktualnosci/`, wyników wyszukiwania
 * i strony 404.
 *
 * Ramkę rysuje tu opakowanie, a nie samo pole, więc obrys też trafia na
 * opakowanie. Obrys na polu wszedłby pod przycisk lupy i przykrył ramkę od środka.
 */
.wp-block-search__inside-wrapper:has(> .wp-block-search__input:focus-visible) {
	outline: 3px solid var(--wp--preset--color--primary);
	outline-offset: 2px;
}
:where(.has-contrast-background-color,
	.has-primary-background-color,
	.has-muted-background-color,
	.has-black-background-color) .wp-block-search__inside-wrapper:has(> .wp-block-search__input:focus-visible) {
	outline-color: var(--wp--preset--color--base);
}

/* W trybie wymuszonych kolorów system nadpisuje `border-color`, więc wskaźnik
   fokusu musi opierać się na `outline`, nie na ramce pola. */
@media (forced-colors: active) {
	:where(a, button, summary, input, select, textarea, [tabindex]):focus-visible,
	.wp-block-search__inside-wrapper:has(> .wp-block-search__input:focus-visible) {
		outline: 3px solid Highlight;
	}
}

/* ---------------------------------------------------------------------------
 * Linki otwierające nowe okno (WCAG 3.2.5 / technika G201)
 *
 * Tekst jest dostępny dla czytników ekranu, a użytkownik widzący dostaje
 * strzałkę doklejoną jako tło pseudoelementu — `background-image` nie trafia
 * do drzewa dostępności, więc informacja nie jest podawana dwa razy.
 * ------------------------------------------------------------------------- */
.tvsat-external-hint {
	border: 0;
	clip-path: inset(50%);
	height: 1px;
	overflow: hidden;
	position: absolute;
	white-space: nowrap;
	width: 1px;
}
a:has(> .tvsat-external-hint)::after,
.wp-block-navigation-item__label:has(> .tvsat-external-hint)::after {
	content: "";
	display: inline-block;
	width: 0.7em;
	height: 0.7em;
	margin-left: 0.3em;
	background-color: currentColor;
	-webkit-mask: var(--tvsat-external-icon) no-repeat center / contain;
	mask: var(--tvsat-external-icon) no-repeat center / contain;
}
:root {
	--tvsat-external-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5'/%3E%3Cpath d='M20 4h-6m6 0v6m0-6L10 14'/%3E%3C/svg%3E");
}

/* ---------------------------------------------------------------------------
 * Linki zajmujące cały wiersz (WCAG 2.2 — 2.5.8 Target Size, poziom AA)
 *
 * Dotyczy linków, które są JEDYNĄ treścią swojego akapitu lub pozycji listy —
 * np. nazwy plików na `/pliki-do-pobrania/`, telefon i e-mail na `/kontakt/`,
 * odsyłacze „Wszystkie artykuły” w kartach kategorii pomocy. Linków wewnątrz
 * zdania reguła NIE obejmuje i obejmować nie powinna: tam działa wyjątek
 * „Inline” z 2.5.8, a `inline-block` rozjechałby interlinię akapitu.
 *
 * Klikalny obszar linku liniowego to obszar treści, nie cały wiersz: zmierzone
 * 20 px przy interlinii 25,6 px. Wyjątek „Inline" nie ma tu zastosowania,
 * bo akapit zawiera sam link — nie ma otaczającego tekstu, którego interlinia
 * ograniczałaby cel.
 *
 * Próg przekracza samo `inline-block` — obszar klikalny rośnie wtedy do
 * wysokości wiersza (25,6 px). Dopełnienie daje zapas do 29,6 px, żeby wynik
 * nie zależał od zaokrągleń i od kroju pisma. Zmierzone po zmianie:
 * od 29,6 px (jeden wiersz) do 55,2 px (nazwa łamana na dwa) — 0 z 39 poniżej progu.
 *
 * 2.5.8 wchodzi dopiero z EN 301 549 v4.1.1 (WCAG 2.2); reguła jest tu
 * z wyprzedzeniem. Klasa `tvsat-link-blok` siedzi w atrybucie `className` bloku
 * akapitu, więc treść pozostaje w pełni edytowalna w edytorze bloków.
 * ------------------------------------------------------------------------- */
.tvsat-link-blok a {
	display: inline-block;
	padding-block: 2px;
}

/*
 * Numery stron w stronicowaniu (2.5.8 Target Size).
 *
 * Rdzeń renderuje je jako gołe linki w linii — zmierzone 8,7–15,3 × 19 px przy
 * odstępie 4 px między numerami. Za mały jest więc sam cel, a wyjątek „Spacing”
 * też nie ratuje: okręgi 24 px wokół sąsiednich numerów „2” i „3” na siebie
 * nachodzą. Wyjątek „Inline” nie wchodzi w grę, bo numery nie stoją w zdaniu.
 * Dotyczyło `/aktualnosci/`, archiwów kategorii i wyników wyszukiwania.
 *
 * `inline-block` podnosi wysokość do wysokości wiersza, dopełnienie daje zapas
 * jak w `.tvsat-link-blok`. Szerokość minimalna w `rem`, żeby rosła razem
 * z powiększeniem samego tekstu. Reguła obejmuje też bieżącą stronę i wielokropek
 * — to nie są cele, ale bez tego odstępy między numerami byłyby nierówne.
 */
.wp-block-query-pagination-numbers .page-numbers {
	display: inline-block;
	min-width: 1.75rem;
	padding-block: 2px;
	text-align: center;
}

/* ---------------------------------------------------------------------------
 * Podpis tabeli
 *
 * Podpis trafia do <caption> filtrem `render_block_core/table` w `functions.php` —
 * tylko tam czytnik ekranu ogłasza go przy wejściu w tabelę. Domyślnie <caption>
 * renderuje się nad tabelą; sprowadzamy go pod nią, żeby czytało się to jak podpis
 * obrazka i zgadzało z podglądem w edytorze bloków.
 *
 * Rozmiar i kolor podpisu ustawia `styles.elements.caption` w `theme.json` —
 * rdzeń generuje z tego regułę obejmującą `.wp-element-caption` i podpisy
 * wszystkich bloków multimedialnych. Filtr kopiuje atrybuty `<figcaption>`,
 * więc `<caption>` dziedziczy klasę `wp-element-caption` i wpada pod tę samą
 * regułę co podpis obrazka. Tutaj zostaje wyłącznie to, czego `theme.json`
 * wyrazić nie potrafi: położenie podpisu, wyrównanie i marginesy, których
 * rdzeń dla `<caption>` nie ustawia (ma je tylko `.wp-block-image figcaption`).
 * ------------------------------------------------------------------------- */
.wp-block-table caption {
	caption-side: bottom;
	text-align: center;
	margin-top: 0.5em;
	margin-bottom: 1em;
}

/* ---------------------------------------------------------------------------
 * Menu — hamburger poniżej 768 px
 *
 * Nagłówek ma dwa menu: „Menu pomocnicze” w górnym pasku i „Menu główne” obok
 * logo. Poniżej 768 px górny pasek znika, a przycisk menu głównego otwiera
 * nakładkę z części szablonu `parts/menu-mobilne.html` — są w niej oba menu.
 *
 * Blok Nawigacji chowa menu pod przyciskiem dopiero poniżej 600 px, więc
 * odwracamy tu dwie reguły rdzenia z `@media (min-width: 600px)`: ukrywamy
 * menu w wierszu i pokazujemy przycisk. Próg musi być wspólny z ukryciem
 * górnego paska, inaczej jego linki zniknęłyby, zanim pojawi się przycisk.
 *
 * W jednym wierszu (z bocznymi odstępami nagłówka) górny pasek potrzebuje
 * ok. 674 px, a logo z menu głównym ok. 608 px — przy 768 px zostaje zapas
 * na jedną, dwie nowe pozycje w każdym menu.
 * ------------------------------------------------------------------------- */
@media (max-width: 767.98px) {
	header.wp-block-template-part .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) {
		display: none;
	}
	header.wp-block-template-part .wp-block-navigation__responsive-container-open:not(.always-shown) {
		display: flex;
	}
	.tvsat-topbar {
		display: none;
	}
}

/* ---------------------------------------------------------------------------
 * Stopka
 * ------------------------------------------------------------------------- */
.tvsat-footer__list {
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 5px;
}
.tvsat-footer__list a {
	color: inherit;
	text-decoration: none;
}
/* Linki w listach nawigacyjnych nie są „linkami w bloku tekstu”, więc samo
   położenie je wyróżnia; podkreślenie pojawia się w interakcji. */
.tvsat-footer__list a:hover,
.tvsat-footer__list a:focus-visible {
	text-decoration: underline;
	text-underline-offset: 3px;
}
/* Telefon i e-mail sąsiadują ze zwykłym tekstem adresu — tu podkreślenie musi
   być stałe, inaczej jedynym wyróżnikiem byłby kolor (1.4.1). */
.tvsat-footer__contact-link {
	color: inherit;
	text-decoration: underline;
	text-underline-offset: 3px;
	white-space: nowrap;
}

/* Contact form (TV-SAT 364 contact form plugin) */
.tvsat-contact-form {
	display: flex;
	flex-direction: column;
	gap: 14px;
	margin: 0;
}
/* A class selector outranks the UA `[hidden] { display: none }` rule. */
.tvsat-contact-form[hidden] {
	display: none;
}
.tvsat-contact-form__honeypot {
	position: absolute;
	left: -9999px;
	width: 1px;
	height: 1px;
	opacity: 0;
}
.tvsat-contact-form__message:empty {
	display: none;
}
.tvsat-contact-form__required-note {
	margin: 0;
	font-size: 0.8125rem; /* 13px */
	color: var(--wp--preset--color--muted);
}
.tvsat-contact-form__field {
	display: block;
	margin: 0;
}
/* Widoczna, trwała etykieta. Sam placeholder jej nie zastąpi — znika po
   wpisaniu treści i nie spełnia 3.3.2. */
.tvsat-contact-form__label {
	display: block;
	margin-bottom: 6px;
	font-size: 0.875rem; /* 14px */
	font-weight: 600;
	line-height: 1.3;
	color: var(--wp--preset--color--contrast);
}
.tvsat-contact-form__required {
	margin-left: 2px;
	color: #b62020;
}
.tvsat-contact-form[aria-busy="true"] .tvsat-contact-form__submit,
.tvsat-contact-form__submit[aria-disabled="true"] {
	opacity: 0.75;
	cursor: default;
}
.tvsat-contact-form input[type="text"],
.tvsat-contact-form input[type="email"],
.tvsat-contact-form input[type="tel"],
.tvsat-contact-form textarea {
	width: 100%;
	box-sizing: border-box;
	background: var(--wp--preset--color--base);
	/* 3,36:1 na bieli — granica kontrolki musi spełniać 1.4.11 (min. 3:1). */
	border: 1.5px solid #8a8aa4;
	border-radius: 12px;
	padding: 14px 16px;
	font-family: inherit;
	font-size: 1rem; /* 16px */
	color: var(--wp--preset--color--contrast);
	line-height: 1.4;
	transition: border-color 0.15s ease;
}
/* Placeholder podpowiada format, ale etykieta jest widoczna osobno (patrz
   `.tvsat-contact-form__label`) — mimo to musi spełniać 1.4.3 (6,46:1). */
.tvsat-contact-form input::placeholder,
.tvsat-contact-form textarea::placeholder {
	color: var(--wp--preset--color--muted);
	opacity: 1;
}
.tvsat-contact-form input:focus-visible,
.tvsat-contact-form textarea:focus-visible {
	border-color: var(--wp--preset--color--primary);
}
/*
 * Błąd sygnalizowany nie tylko kolorem, ale i grubszą ramką (1.4.1).
 *
 * Kolejność i selektor mają znaczenie. Reguła pól wyżej ma specyficzność
 * (0,2,1), więc wcześniejsze `.tvsat-contact-form [aria-invalid="true"]` (0,2,0)
 * przegrywało i czerwona ramka nigdy się nie pokazywała — w żadnym z dwóch
 * formularzy. `:is(input, textarea)` wyrównuje specyficzność do (0,2,1),
 * a miejsce za regułą fokusu sprawia, że pole z błędem zostaje czerwone także
 * wtedy, gdy skrypt przeniesie na nie fokus (obrys fokusu i tak jest osobno).
 */
.tvsat-contact-form :is(input, textarea)[aria-invalid="true"] {
	border-color: #b62020;
	border-width: 2px;
}
.tvsat-contact-form textarea {
	min-height: 84px;
	resize: vertical;
}
.tvsat-contact-form__method {
	border: 0;
	padding: 0;
	margin: 0;
}
.tvsat-contact-form__method legend {
	font-size: 0.875rem; /* 14px */
	color: var(--wp--preset--color--muted);
	margin: 2px 0 8px;
	padding: 0;
}
.tvsat-contact-form__toggle {
	display: inline-flex;
	border: 1px solid #8a8aa4;
	border-radius: 999px;
	/* `overflow: hidden` obcinałby obrys fokusu wybranej etykiety. */
	overflow: visible;
	background: var(--wp--preset--color--base);
}
.tvsat-contact-form__toggle label {
	position: relative;
	padding: 9px 22px;
	font-size: 0.9375rem; /* 15px */
	font-weight: 600;
	cursor: pointer;
	border-right: 1px solid #8a8aa4;
	border-radius: 999px;
	color: var(--wp--preset--color--contrast);
	background: transparent;
	transition: background-color 0.15s ease, color 0.15s ease;
	white-space: nowrap;
}
.tvsat-contact-form__toggle label:last-child {
	border-right: 0;
}
.tvsat-contact-form__toggle input[type="radio"] {
	position: absolute;
	opacity: 0;
	pointer-events: none;
}
.tvsat-contact-form__toggle label:has(input[type="radio"]:checked) {
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
}
/* Radio jest `opacity: 0`, więc jego własny obrys fokusu byłby niewidoczny —
   przenosimy wskaźnik na widoczną etykietę (2.4.7). */
.tvsat-contact-form__toggle label:has(input[type="radio"]:focus-visible) {
	outline: 3px solid var(--wp--preset--color--primary);
	outline-offset: 2px;
}
.tvsat-contact-form__consent {
	display: flex;
	align-items: flex-start;
	gap: 9px;
	font-size: 0.875rem; /* 14px */
	/* Zgoda RODO to treść wiążąca prawnie — musi spełniać 1.4.3 (6,46:1). */
	color: var(--wp--preset--color--muted);
	line-height: 1.5;
	margin: 0;
	cursor: pointer;
}
.tvsat-contact-form__consent input[type="checkbox"] {
	width: 18px;
	height: 18px;
	margin: 1px 0 0;
	flex: 0 0 auto;
	border: 1.5px solid #8a8aa4;
	border-radius: 5px;
	accent-color: var(--wp--preset--color--primary);
	cursor: pointer;
}
.tvsat-contact-form__submit {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	padding: 14px;
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
	border: 0;
	border-radius: 12px;
	font-family: inherit;
	font-weight: 600;
	font-size: 1.125rem; /* 18px */
	box-shadow: 0 8px 18px rgba(55, 55, 204, 0.22);
	cursor: pointer;
	transition: background-color 0.15s ease;
}
.tvsat-contact-form__submit:hover {
	background: var(--wp--preset--color--contrast);
}
.tvsat-contact-form__submit svg {
	display: block;
	flex: 0 0 auto;
}
.tvsat-contact-message {
	padding: 12px 16px;
	border-radius: 10px;
	font-size: 0.9375rem; /* 15px */
	line-height: 1.5;
}
.tvsat-contact-message--success {
	background: rgba(75, 220, 255, 0.18);
	color: var(--wp--preset--color--contrast);
	border: 1px solid rgba(75, 220, 255, 0.5);
}
.tvsat-contact-message--error {
	background: rgba(207, 46, 46, 0.08);
	color: #b62020;
	border: 1px solid rgba(207, 46, 46, 0.3);
}
/* Komunikat neutralny — np. „nie ma w zasięgu”: to nie błąd użytkownika. */
.tvsat-contact-message--info {
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--contrast);
	border: 1px solid rgba(55, 55, 204, 0.25);
}

/* Coverage check (TV-SAT 364 coverage plugin) */
.tvsat-coverage-form {
	margin: 0;
	margin-top: var(--wp--preset--spacing--40);
}
.tvsat-coverage-form__fields {
	display: grid;
	grid-template-columns: 3fr 1fr 1fr;
	gap: 1rem;
	align-items: end;
}
.tvsat-coverage-form__field {
	display: block;
	margin: 0;
}
.tvsat-coverage-form input[type="text"] {
	width: 100%;
	box-sizing: border-box;
	background: var(--wp--preset--color--base);
	/* 3,36:1 na bieli — granica kontrolki musi spełniać 1.4.11 (min. 3:1). */
	border: 1.5px solid #8a8aa4;
	border-radius: 12px;
	padding: 14px 16px;
	font-family: inherit;
	font-size: 1rem; /* 16px */
	color: var(--wp--preset--color--contrast);
	line-height: 1.4;
	transition: border-color 0.15s ease;
}
.tvsat-coverage-form input::placeholder {
	color: var(--wp--preset--color--muted);
	opacity: 1;
}
/* Obrys fokusu daje reguła globalna — ramka jest dodatkiem, nie jedynym wskaźnikiem (2.4.7). */
.tvsat-coverage-form input:focus-visible {
	border-color: var(--wp--preset--color--primary);
}
/* Błąd sygnalizowany nie tylko kolorem, ale i grubszą ramką (1.4.1).
   `input` w selektorze jest konieczne: bez niego (0,2,0) przegrywa z regułą
   pola `input[type="text"]` (0,2,1), choć stoi niżej — patrz formularz kontaktowy. */
.tvsat-coverage-form input[aria-invalid="true"] {
	border-color: #b62020;
	border-width: 2px;
}
.tvsat-coverage-form__submit {
	padding: 14px 16px;
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
	border: 1.5px solid var(--wp--preset--color--primary);
	border-radius: 12px;
	font-family: inherit;
	font-weight: 500;
	font-size: 1rem;
	line-height: 1.4;
	box-shadow: 0 8px 18px rgba(55, 55, 204, 0.22);
	cursor: pointer;
	transition: background-color 0.15s ease;
}
.tvsat-coverage-form__submit:hover {
	background: var(--wp--preset--color--contrast);
}
.tvsat-coverage-form__submit[aria-disabled="true"] {
	opacity: 0.75;
	cursor: default;
}
/* Region `aria-live` zostaje w drzewie dostępności także pusty — ukrywamy tylko odstęp. */
.tvsat-coverage-form__result:not(:empty) {
	margin-top: 1rem;
}
.tvsat-coverage-result p {
	margin: 0;
}
.tvsat-coverage-result p + p {
	margin-top: 0.5em;
}
@media (max-width: 780px) {
	.tvsat-coverage-form__fields {
		grid-template-columns: 1fr;
	}
}

/* Lista osiedli z ulicami — celowo bez numerów budynków. Karty jedna pod drugą:
   osiedla mają od 3 do 11 ulic, więc w rzędzie obok siebie nierówno by się rozciągały. */
.tvsat-coverage-list {
	display: grid;
	gap: 1rem;
	margin: 0;
	margin-top: var(--wp--preset--spacing--60);
	padding: 0;
	list-style: none;
}
.tvsat-coverage-list__area {
	padding: 18px 22px;
	border: 1px solid var(--wp--preset--color--tertiary);
	border-radius: 14px;
	background: var(--wp--preset--color--secondary);
	scroll-margin-top: 1rem; /* po skoku do kotwicy (#os-chrobrego) ramka karty nie przylega do krawędzi okna */
}
.tvsat-coverage-list__name {
	display: flex;
	align-items: center;
	gap: 12px;
	margin: 0;
	font-size: 1.125rem; /* 18px */
	font-weight: 600;
	line-height: 1.3;
}
.tvsat-coverage-list__name svg {
	flex: 0 0 auto;
	color: var(--wp--preset--color--primary);
}
/* Kolumny zamiast siatki: alfabet biegnie w dół kolumny, jak w spisie.
   Wcięcie 34px = ikona (22px) + odstęp (12px) — ulice zaczynają się pod nazwą osiedla. */
.tvsat-coverage-list__streets {
	columns: 16rem;
	column-gap: 1.5rem;
	margin: 0.75rem 0 0;
	padding: 0 0 0 34px;
	list-style: none;
	line-height: 1.4;
}
.tvsat-coverage-list__streets li {
	break-inside: avoid;
	padding: 0.2rem 0;
}
/* Na telefonie wcięcie łamałoby najdłuższe nazwy („ul. Stanisława Przybyszewskiego”). */
@media (max-width: 780px) {
	.tvsat-coverage-list__streets {
		padding-left: 0;
	}
}

/* Osiedla na stronie głównej — odsyłacze do list ulic na /sprawdz-dostepnosc/.
   Progi zamiast `auto-fit`: przy czterech osiedlach dałby układ 3 + 1, a karta
   węższa niż ~240px łamie „os. Chrobrego” na dwie linie. */
.tvsat-coverage-areas {
	display: grid;
	grid-template-columns: 1fr;
	gap: 1rem;
	margin: 0;
	margin-top: var(--wp--preset--spacing--60);
	padding: 0;
	list-style: none;
}
@media (min-width: 600px) {
	.tvsat-coverage-areas {
		grid-template-columns: repeat(2, 1fr);
	}
}
@media (min-width: 1120px) {
	.tvsat-coverage-areas {
		grid-template-columns: repeat(4, 1fr);
	}
}
.tvsat-coverage-areas__link {
	display: flex;
	align-items: center;
	gap: 12px;
	height: 100%;
	box-sizing: border-box;
	padding: 18px 22px;
	border: 1px solid var(--wp--preset--color--tertiary);
	border-radius: 14px;
	background: var(--wp--preset--color--secondary);
	color: var(--wp--preset--color--contrast);
	text-decoration: none;
	transition: border-color 0.15s ease;
}
/* Ramka zmienia tylko kolor — wskaźnikiem fokusu jest obrys z reguły globalnej (2.4.7). */
.tvsat-coverage-areas__link:hover {
	border-color: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--contrast);
}
.tvsat-coverage-areas__link svg {
	flex: 0 0 auto;
	color: var(--wp--preset--color--primary);
}
.tvsat-coverage-areas__text {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.tvsat-coverage-areas__name {
	font-size: 1.125rem; /* 18px */
	font-weight: 600;
	line-height: 1.3;
}
.tvsat-coverage-areas__count {
	color: var(--wp--preset--color--muted);
	font-size: 0.9375rem; /* 15px */
	line-height: 1.4;
}
.tvsat-coverage-areas__arrow {
	margin-left: auto;
	transition: transform 0.15s ease;
}
.tvsat-coverage-areas__link:hover .tvsat-coverage-areas__arrow {
	transform: translateX(3px);
}
@media (prefers-reduced-motion: reduce) {
	.tvsat-coverage-areas__link,
	.tvsat-coverage-areas__arrow {
		transition: none;
	}
}

/* ---------------------------------------------------------------------------
 * Mapa dojazdu na /kontakt/ — fasada
 *
 * Mapa Google ładuje się dopiero po kliknięciu „Pokaż mapę”. Przy wejściu na
 * stronę nie ma więc ani kilkudziesięciu żądań do Google (ok. 480 KB, TBT do
 * 690 ms na telefonie), ani przekazania danych odwiedzającego, zanim sam o tym
 * zdecyduje (druga analiza SEO, pkt 6). Kratka w tle tylko sugeruje mapę — to
 * nie jest jej zrzut (regulamin Google zabrania zapisywania obrazów map).
 * ------------------------------------------------------------------------- */
.tvsat-mapa,
.tvsat-mapa gmp-map {
	display: block;
	width: 100%;
	min-height: 400px;
}
.tvsat-mapa gmp-map {
	height: 400px;
}
/* Ramka sekcji ma zaokrąglone rogi, ale nie przycina zawartości — bez tego
   tło fasady i sama mapa wystawałyby kwadratowymi rogami poza obrys. */
.tvsat-mapa {
	border-radius: inherit;
	overflow: hidden;
}
.tvsat-mapa__fasada {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 0.875rem;
	box-sizing: border-box;
	min-height: 400px;
	padding: 2rem 1.5rem;
	text-align: center;
	background-color: var(--wp--preset--color--secondary);
	background-image:
		linear-gradient(var(--wp--preset--color--tertiary) 1px, transparent 1px),
		linear-gradient(90deg, var(--wp--preset--color--tertiary) 1px, transparent 1px);
	background-size: 48px 48px;
}
.tvsat-mapa__pinezka {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	border-radius: 50%;
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
	box-shadow: 0 8px 18px rgba(55, 55, 204, 0.22);
}
.tvsat-mapa__adres {
	margin: 0;
	line-height: 1.5;
}
.tvsat-mapa__przycisk {
	padding: 14px 24px;
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
	border: 1.5px solid var(--wp--preset--color--primary);
	border-radius: 12px;
	font-family: inherit;
	font-weight: 500;
	font-size: 1rem;
	line-height: 1.4;
	box-shadow: 0 8px 18px rgba(55, 55, 204, 0.22);
	cursor: pointer;
	transition: background-color 0.15s ease;
}
.tvsat-mapa__przycisk:hover {
	background: var(--wp--preset--color--contrast);
}
.tvsat-mapa__przycisk[aria-disabled="true"] {
	opacity: 0.75;
	cursor: default;
}
.tvsat-mapa__uwaga {
	max-width: 34rem;
	margin: 0;
	color: var(--wp--preset--color--muted);
	font-size: 0.875rem;
	line-height: 1.5;
}
/* Bez skryptu przycisk nic by nie zrobił — zostaje adres, a nad mapą odsyłacz
   „Wyznacz trasę w Mapach Google”. Uwaga o Google też traci wtedy sens. */
html:not(.tvsat-js) .tvsat-mapa__przycisk,
html:not(.tvsat-js) .tvsat-mapa__uwaga {
	display: none;
}

/* FAQ accordion (core/details inside the contact section) */
.tvsat-faq .wp-block-details {
	padding: 0;
}
/* `display: flex` na <summary> usuwa w WebKicie natywną rolę disclosure —
   VoiceOver przestaje wtedy ogłaszać stan zwinięty/rozwinięty. Zostawiamy
   `display: block` i pozycjonujemy znacznik +/− bezwzględnie (4.1.2). */
.tvsat-faq .wp-block-details summary {
	position: relative;
	display: block;
	padding: 17px 44px 17px 20px;
	cursor: pointer;
	list-style: none;
	font-size: 1.0625rem; /* 17px */
	font-weight: 500;
	line-height: 1.35;
}
.tvsat-faq .wp-block-details summary::-webkit-details-marker {
	display: none;
}
.tvsat-faq .wp-block-details summary::after {
	content: "+";
	position: absolute;
	top: 50%;
	right: 20px;
	transform: translateY(-50%);
	color: var(--wp--preset--color--primary);
	font-size: 1.375rem; /* 22px */
	font-weight: 600;
	line-height: 1;
}
.tvsat-faq .wp-block-details[open] summary::after {
	content: "−";
}

/*
 * Treść z `content` trafia do nazwy dostępnej pseudoelementu, więc czytnik
 * doczytywałby „plus” / „minus” po tekście pytania. Stan zwinięty/rozwinięty
 * komunikuje już natywnie `<details>`, więc znacznik jest czysto wizualny —
 * składnia `content: "+" / ""` nadaje mu pusty tekst alternatywny.
 *
 * Reguła siedzi w `@supports`, bo w przeglądarce bez obsługi tej składni cała
 * deklaracja `content` byłaby nieprawidłowa i znacznik zniknąłby z ekranu.
 */
@supports (content: "x" / "") {
	.tvsat-faq .wp-block-details summary::after {
		content: "+" / "";
	}
	.tvsat-faq .wp-block-details[open] summary::after {
		content: "−" / "";
	}
}
.tvsat-faq .wp-block-details > *:not(summary) {
	padding: 0 20px 18px;
	margin: 0;
	color: var(--wp--preset--color--muted);
	font-size: 1rem; /* 16px */
	line-height: 1.55;
}

/* Callback dialog (TV-SAT 364 callback dialog plugin) */
.tvsat-dialog {
	box-sizing: border-box;
	width: calc(100% - 32px);
	max-width: 480px;
	padding: 32px;
	border: 0;
	border-radius: 20px;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--contrast);
	box-shadow: 0 24px 60px rgba(20, 20, 58, 0.28);
}
.tvsat-dialog::backdrop {
	background: rgba(20, 20, 58, 0.55);
}
/*
 * Powrót po wysyłce bez JavaScriptu. Okna modalnego nie da się otworzyć samym
 * HTML-em, więc wtyczka renderuje je z atrybutem `open` — jako niemodalne.
 * Przeglądarka pozycjonuje takie okno absolutnie, przez co nachodziłoby na
 * stopkę; tutaj staje w zwykłym układzie, na końcu treści strony.
 * `relative`, a nie `static`: przycisk zamknięcia jest pozycjonowany
 * bezwzględnie i potrzebuje okna jako punktu odniesienia.
 */
.tvsat-dialog:not(:modal) {
	position: relative;
	margin-block: 3rem;
}
.tvsat-dialog__close {
	position: absolute;
	top: 14px;
	right: 14px;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 6px;
	border: 0;
	border-radius: 8px;
	background: transparent;
	color: var(--wp--preset--color--muted);
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease;
}
.tvsat-dialog__close:hover {
	background: var(--wp--preset--color--secondary);
	color: var(--wp--preset--color--contrast);
}
.tvsat-dialog__close svg {
	display: block;
}
/* Nagłówek stoi w DOM przed przyciskiem zamknięcia (żeby czytnik ogłosił
   najpierw tytuł okna), ale wizualnie przycisk ma zostać w prawym górnym rogu —
   stąd `position: absolute` powyżej i zapas marginesu tutaj. */
.tvsat-dialog__title {
	margin: 0 32px 8px 0;
	font-size: 1.625rem; /* 26px */
	line-height: 1.25;
}
.tvsat-dialog__subtitle {
	margin: 0 0 20px;
	color: var(--wp--preset--color--muted);
	font-size: 0.9375rem; /* 15px */
	line-height: 1.55;
}
/* „Dotyczy: MEGAnet 600” — bez `display`, żeby nie przykryć atrybutu `hidden`. */
.tvsat-dialog__offer {
	margin: -8px 0 20px;
	padding: 10px 14px;
	border-radius: 12px;
	background: var(--wp--preset--color--secondary);
	font-size: 0.9375rem; /* 15px */
	line-height: 1.45;
}
.tvsat-callback-form__message {
	margin-bottom: 4px;
}
.tvsat-callback-form__message:empty {
	display: none;
}
.tvsat-contact-form__submit[disabled] {
	opacity: 0.6;
	cursor: default;
}
@media (max-width: 480px) {
	.tvsat-dialog {
		padding: 26px 20px;
	}
	.tvsat-dialog__title {
		font-size: 1.4375rem; /* 23px */
	}
}

/* ---------------------------------------------------------------------------
 * Wykaz kanałów
 *
 * Numer i nazwa kanału stoją w jednej pozycji listy („101 TVP 1 HD”), więc lista
 * edytuje się w edytorze jak każda inna — Enter dodaje kanał. Tabela dawałaby
 * mocniejszą semantykę, ale jej nie da się rozłożyć na kolumny CSS, a 63 wiersze
 * jedno pod drugim to 2769 px na ekranie. W kolumnach: 537 px.
 *
 * `column-width` zamiast samego `column-count` — liczba kolumn wynika wtedy
 * z dostępnej szerokości, więc telefon dostaje jedną kolumnę bez zapytania
 * medialnego. `column-count` dokłada do tego górny limit: przy 1200 px treści
 * pięć kolumn robi się tak wąskich, że najdłuższe nazwy się łamią.
 *
 * Szerokość kolumny wynika z pomiaru, nie z oka. Najdłuższe pozycje w wykazach:
 *
 *   65 Investigation Discovery HD   217 px + 18 px wcięcia podlisty = 235 px
 *   202 Investigation Discovery HD  227 px
 *   139 Comedy Central Polska HD    222 px
 *
 * 15rem to 240 px, czyli zapas nad najszerszą pozycją. Przy 13rem łamały się
 * trzy nazwy w wykazie naziemnym i jedna w wykazach satelitarnych.
 *
 * Numery kanałów mają cyfry o stałej szerokości, więc ustawiają się w równą
 * kolumnę bez dodatkowego znacznika wokół liczby.
 * ------------------------------------------------------------------------- */
.tvsat-wykaz-kanalow {
	column-width: 15rem;
	column-count: 4;
	column-gap: 2rem;
	padding-left: 0;
	list-style: none;
	font-variant-numeric: tabular-nums;
}
.tvsat-wykaz-kanalow li {
	break-inside: avoid;
	margin-block: 0;
}

/*
 * Kolumny mają sens dopiero przy dłuższej liście. Wykaz pakietu dodatkowego
 * potrafi mieć dwie pozycje — rozrzucone po dwóch kolumnach stoją wtedy na
 * przeciwnych końcach wiersza i trudno je odczytać jako jedną całość.
 *
 * Próg czytamy z samej listy: `li:nth-child(8)` istnieje tylko wtedy, gdy pozycji
 * jest co najmniej osiem. Dzięki temu nie trzeba nadawać niczego w edytorze —
 * krótki wykaz sam zostaje w jednej kolumnie, a średni dostaje dwie.
 */
.tvsat-wykaz-kanalow:not(:has(> li:nth-child(8))) {
	column-width: auto;
	column-count: 1;
}
.tvsat-wykaz-kanalow:has(> li:nth-child(8)):not(:has(> li:nth-child(16))) {
	column-width: auto;
	column-count: 2;
}

/*
 * Wykazy telewizji naziemnej dzielą kanały na multipleksy. Częstotliwość jest
 * pozycją nadrzędną, kanały jej podlistą — dzięki temu czytnik ekranu ogłasza
 * „K-22 482 MHz, lista, 8 elementów”, a nie ciąg nazw bez przynależności.
 *
 * `break-inside: avoid` z reguły wyżej obejmuje także pozycję nadrzędną, więc
 * multipleks nie pęka między kolumnami — tak samo jak w wersji PDF.
 */
.tvsat-wykaz-kanalow:has(> li > ul) > li {
	margin-bottom: 0.5rem;
	font-weight: 600;
}
.tvsat-wykaz-kanalow ul {
	margin: 0;
	padding-left: 1.1rem;
	list-style: none;
	font-weight: 400;
}

/* ---------------------------------------------------------------------------
 * Przycisk drukowania
 *
 * Znacznik podmienia na <button> filtr `render_block_core/button`
 * w `functions.php`; tutaj zostaje tylko to, czego przeglądarka nie dziedziczy
 * sama w elemencie formularza, oraz ukrycie przycisku, gdy skrypt nie działa —
 * przycisk bez obsługi kliknięcia byłby kontrolką, która nic nie robi.
 * ------------------------------------------------------------------------- */
.tvsat-drukuj .wp-block-button__link {
	font-family: inherit;
	cursor: pointer;
}
html:not(.tvsat-js) .tvsat-drukuj {
	display: none;
}

/* ---------------------------------------------------------------------------
 * Wydruk
 *
 * Reguły dotyczą całej witryny, nie tylko wykazów kanałów — do tej pory wydruk
 * dowolnej strony wlókł za sobą nagłówek, nawigację, stopkę i kolorowe tła.
 *
 * Pomocnicze klasy do wyklikania w edytorze (panel bloku → Zaawansowane):
 *   `tvsat-tylko-ekran` — blok nie trafia na papier,
 *   `tvsat-tylko-druk`  — blok widoczny wyłącznie na wydruku.
 * ------------------------------------------------------------------------- */
.tvsat-tylko-druk {
	display: none;
}

@media print {
	@page {
		margin: 15mm;
	}

	/* Nawigacja na papierze jest bezużyteczna, a zjada pierwszą jedną trzecią
	   kartki. Skip-link i tak jest widoczny dopiero po otrzymaniu fokusu.
	   `!important` jest konieczne przy klasach pomocniczych: rdzeń wypisuje
	   `body .is-layout-flex { display: flex }`, czyli selektor o specyficzności
	   (0,1,1), który wygrywa z każdą pojedynczą klasą. Bez tego `tvsat-tylko-ekran`
	   nałożona na grupę albo na przyciski nie ukryje ich na wydruku. */
	header.wp-block-template-part,
	footer.wp-block-template-part,
	.skip-link,
	.tvsat-tylko-ekran {
		display: none !important;
	}

	.tvsat-tylko-druk {
		display: block !important;
	}

	/* Sekcje pełnej szerokości mają na ekranie oddychać, ale na kartce ten oddech
	   to kilkanaście straconych wierszy — w wykazie Mini różnica między 0,94
	   a 0,63 strony, czyli między ryzykiem drugiej kartki a spokojnym zapasem.
	   Bez tła sekcje przestają być rozróżnialne, więc granicę między nimi musi
	   wyznaczyć odstęp; pierwsza go nie dostaje, bo tam pracuje margines `@page`. */
	.wp-site-blocks :is(.alignfull, .alignwide) {
		padding: 0 !important;
		margin-block: 0 !important;
	}
	.wp-site-blocks :is(.alignfull, .alignwide):not(:first-child) {
		margin-block-start: 8mm !important;
	}

	/* Skale typograficzne są dobrane do czytania z odległości ramienia. Na papierze
	   litera jest bliżej oka i nie musi być tak duża. Rdzeń wypisuje klasy rozmiaru
	   z `!important`, więc bez tego akapit prowadzący zostałby przy 24 px. */
	h1 {
		font-size: 17pt !important;
	}
	h2 {
		font-size: 13pt !important;
	}
	.wp-site-blocks :is(.has-x-large-font-size, .has-xx-large-font-size, .has-huge-font-size) {
		font-size: 11pt !important;
	}

	body {
		background: #fff;
		color: #000;
		font-size: 10pt;
		line-height: 1.35;
	}

	/* Ograniczenie szerokości treści porządkuje czytanie na ekranie, ale na
	   papierze zostawiłoby szeroki margines po prawej obok marginesu `@page`. */
	main {
		margin: 0;
		padding: 0;
	}
	.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)) {
		max-width: none;
	}

	/* Tła i cienie zjadają toner, a w druku czarno-białym potrafią zamienić się
	   w szarą plamę pod tekstem. Ramki zostają — bez nich wykaz się zlewa.
	   Samo `!important` nie wystarcza: rdzeń generuje `.has-*-background-color`
	   również z `!important`, więc o wyniku decyduje specyficzność. Stąd dwa
	   człony zamiast `:where(…) *` — `[class]` i `[style]` łapią dokładnie te
	   elementy, które w ogóle mogą mieć ustawione tło. */
	.wp-site-blocks [class],
	.wp-site-blocks [style] {
		background: none !important;
		box-shadow: none !important;
		text-shadow: none !important;
	}

	/* Bez tego nagłówek tabeli pojawi się tylko na pierwszej kartce, a dalsze
	   strony wyjdą jako bezimienne kolumny. */
	thead {
		display: table-header-group;
	}
	tr,
	li {
		break-inside: avoid;
	}
	h1,
	h2,
	h3,
	caption {
		break-after: avoid;
	}

	/* Podział na kolumny jest urządzeniem ekranowym — pasek boczny ze spisem
	   treści i tak nie trafia na papier, a bez tej reguły kolumna z treścią
	   trzyma swoje `flex-basis` i zostawia po sobie kilka centymetrów pustki.
	   Zmierzone na wykazie pakietów dodatkowych: 107 mm zamiast 180 mm
	   szerokości.

	   Znów potrzebne `!important`: układ kolumnowy rdzeń wypisuje jako
	   `body .is-layout-flex { display: flex }`, czyli selektor (0,1,1). */
	.wp-block-columns {
		display: block !important;
	}
	.wp-block-column {
		width: auto !important;
		flex-basis: auto !important;
	}

	a {
		color: #000;
		text-decoration: underline;
	}

	/* Wyszarzenia (`muted`, #5c5c77) porządkują hierarchię na ekranie, ale na
	   papierze zostaje z nich tylko jaśniejszy druk — przy słabym tonerze
	   pierwszy blednie akapit prowadzący. Selektory muszą przebić reguły
	   generowane z theme.json i klasę `has-muted-color` z `!important`. */
	.wp-site-blocks :is(caption, .wp-element-caption),
	.wp-site-blocks .has-muted-color {
		color: #000 !important;
	}

	/* Na papierze wykaz ścieśnia się bardziej niż na ekranie — węższe kolumny
	   mieszczą się, bo kartka nie musi być czytana z odległości. Interlinia też
	   schodzi: 1,35 jest dobrane do akapitów, a lista krótkich pozycji czyta się
	   dobrze przy ciaśniejszym świetle i oszczędza tu około 9% wysokości. */
	.tvsat-wykaz-kanalow {
		column-width: 46mm;
		column-count: auto;
		column-gap: 8mm;
		font-size: 8.5pt;
		line-height: 1.2;
	}

	/* Na ekranie kolumny włączają się dopiero od ósmej pozycji, bo są szerokie.
	   Na papierze kolumna ma 46 mm, więc opłaca się już przy pięciu — na stronie
	   z czterema pakietami krótkie wykazy stały jeden pod drugim i zabierały
	   ćwierć kartki. Dwie pozycje nadal zostają w jednej kolumnie. */
	.tvsat-wykaz-kanalow:has(> li:nth-child(5)) {
		column-width: 46mm;
		column-count: auto;
	}
	.tvsat-wykaz-kanalow ul {
		padding-left: 3mm;
	}
}

/* Ikony Tablera w bloku „Ikona” — obrys, którego WordPress nie przepuszcza w SVG
   (patrz tvsat364_register_icons() w functions.php). Selektor z .wp-block-icon
   przebija `fill: currentColor` z CSS bloku. */
svg.tvsat-ikona-kontur,
.wp-block-icon svg.tvsat-ikona-kontur {
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}

/* ---------------------------------------------------------------------------
 * Długie słowa w tytułach wpisów
 *
 * Tytuł karty na liście (kategorie pomocy, aktualności, wyniki wyszukiwania)
 * ma rozmiar H2 — na telefonie 390 px ok. 29 px, a na tekst karty zostaje
 * 268 px. „niepełnosprawnych” zajmowało 274 px i `word-break: break-word`
 * ucinało je w dowolnym miejscu („niepełnosprawnyc / h”). Przy 24 px to słowo
 * mieści się w karcie na telefonach od 360 px.
 *
 * Dzielenie wyrazów to zabezpieczenie na dłuższe słowa i węższe ekrany:
 * tylko słowa od 12 znaków, co najmniej 5 liter po każdej stronie dywizu.
 * Słownik dobiera przeglądarka po `lang="pl-PL"`; mają go telefony (Chrome
 * na Androidzie, Safari) i Firefox — gdzie go nie ma, zostaje stare łamanie.
 * ------------------------------------------------------------------------- */
@media (max-width: 600px) {
	.wp-block-post-template h2.wp-block-post-title {
		font-size: 1.5rem;
	}
}
.wp-block-post-title {
	hyphens: auto;
	hyphenate-limit-chars: 12 5 5;
}
