/*
Theme Name: RetroTube Child
Theme URI: https://toiletpov.com
Template: retrotube
Author: TPOV Hub
Description: Child theme for RetroTube - holds every file this project has directly edited
 (content-video-player.php tracking-click fix, index.php/category.php personalized-feed
 injection, search.php "did you mean", content-video.php comment ordering + VideoObject SEO
 schema + v1.10-v1.12 video-card redesign, content-related.php shortcode rename,
 content-top-bar.php account dropdown, header.php SEO/dedup override + v1.13 speed/SEO/quality
 audit fixes across functions.php/404.php/search.php/template-actors.php/template-categories.php/
 several template-parts), so a future RetroTube update from WP-Script can never silently wipe
 these edits. WordPress resolves any template file present here INSTEAD of the parent theme's
 copy of the same path - everything not overridden here still comes straight from the parent
 theme, unchanged.
Version: 1.29
Text Domain: wpst
*/

/* ==========================================================================
   TPOV (2026-08-09) - ciemniejsza, spójniejsza paleta teł "w stylu YouTube".
   User: tło strony ma być DOKŁADNIE tym co ma YouTube (#0f0f0f, zweryfikowana
   powszechnie cytowana wartość), a reszta powierzchni (nagłówek/stopka/karty/
   pola formularzy/modal) zbudowana na tym jako CIASNA drabinka jasności -
   zamiast dotychczasowego szerokiego rozstrzału (#111->#333, odziedziczonego
   głównie z motywu-rodzica, różne odcienie dla praktycznie tej samej roli
   "powierzchnia nad tłem"). Każdy docelowy selektor znaleziony przez
   `element.matches(rule.selectorText)` na żywej stronie (nie zgadywane) -
   patrz historia sesji po pełną listę zweryfikowanych par selektor/wartość.

   .top-bar CELOWO dostaje TĘ SAMĄ wartość co strona (nie osobny, ciemniejszy
   odcień jak dotychczas) - dokładnie tak jak YouTube, którego pasek górny to
   ta sama prawie-czerń co reszta strony, oddzielona cienką linią, nie kolorem
   - stąd nowy border-bottom zamiast polegania na kontraście barw między
   nagłówkiem a treścią.

   Tekst (#ccc -> #f1f1f1) też podniesiony do wartości jakiej YouTube faktycznie
   używa - jaśniejszy niż dotychczasowy szary, ale ŚWIADOMIE nie czysta biel
   (#fff na prawie-czerni daje efekt "halo"/męczy oczy, stąd YouTube też tego
   unika).

   Wszystkie reguły z !important - te same selektory w motywie-rodzicu nie
   zawsze mają !important, więc to gwarantuje wygraną niezależnie od dokładnej
   specyficzności/kolejności ładowania, ten sam wzorzec co reszta tego pliku.
   Pasek oceny (.tpov-vote-block .rating-bar) używa rgba(255,255,255,0.12) -
   przezroczysta nakładka względem TEGO na czym akurat siedzi, nie stały hex,
   więc automatycznie dopasuje się do nowej palety bez osobnej zmiany.
   ========================================================================== */
body {
	background-color: #0f0f0f !important;
	color: #f1f1f1 !important;
}
.top-bar {
	background-color: #0f0f0f !important;
	border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.site-footer {
	background-color: #181818 !important;
}
#site-navigation,
.widget-title,
.page-title,
.page .entry-title,
.comments-title,
.comment-reply-title,
input[type="text"],
input[type="email"],
input[type="url"],
input[type="password"],
input[type="search"],
input[type="number"],
input[type="tel"],
input[type="range"],
input[type="date"],
input[type="month"],
input[type="week"],
input[type="time"],
input[type="datetime"],
input[type="datetime-local"],
input[type="color"],
select,
textarea,
.wp-editor-container {
	background-color: #1e1e1e !important;
}
.modal-content,
.rating-bar,
.categories-list .thumb-block .entry-header,
.actors-list .thumb-block .entry-header,
#filters .filters-select,
#filters .filters-options,
.breadcrumbs-area {
	background-color: #272727 !important;
}
.breadcrumbs-area {
	border-color: #272727;
}

/* ==========================================================================
   TPOV (2026-08-09) - akcent #ff3565 -> #d92d56 (jaśniejszy magenta stał się
   ciemniejszą różą), TYLKO tam gdzie kolor SIEDZI POD białym/jasnym tekstem
   lub jest wypełnieniem "przycisku" - user zgłosił, że PageSpeed flagował
   niewystarczający kontrast na 3 elementach (guzik Rejestracji, ikona
   wyszukiwania, odznaka NOWE), wszystkie trzy to biały tekst na #ff3565
   (3.53:1, poniżej wymaganych 4.5:1 dla zwykłego tekstu). #d92d56 to
   proporcjonalne przyciemnienie (każdy kanał *0.85, nie zmiana odcienia) -
   daje 4.72:1, z zapasem, i nadal wygląda jak TEN SAM róż/magenta, tylko
   odrobinę głębszy - nie przesunięcie w stronę czerwieni.

   ŚWIADOMIE NIE zmienione wszędzie - user poprosił o pełną spójność "żeby nic
   dziwnego się nie stało", więc rozdzielone dokładnie według TEGO co dana
   reguła faktycznie robi:
   - Tło pod białym/jasnym tekstem (przyciski, .label, odznaki, paginacja,
     paski postępu/oceny) -> NOWY, ciemniejszy #d92d56. To jest DOKŁADNIE ten
     sam wzorzec co 3 zgłoszone elementy, więc każde takie miejsce miało (lub
     mogło mieć) ten sam problem kontrastu, nie tylko te 3 już złapane.
   - Sam tekst/ikona koloru różowego SIEDZĄCA BEZPOŚREDNIO na ciemnym tle
     strony (linki po najechaniu, aktywne serduszko ulubionych, podkreślenie
     aktywnej zakładki) -> ŚWIADOMIE zostawione na oryginalnym #ff3565.
     Przyciemnienie TUTAJ zrobiłoby coś PRZECIWNEGO do zamierzonego efektu -
     różowy tekst na ciemnym tle potrzebuje być jaśniejszy względem tła, nie
     ciemniejszy, żeby zachować kontrast; te miejsca już zdawały (dlatego
     PageSpeed ich nie złapał) i przyciemnienie by to popsuło.

   Poniższe selektory to WIERNA kopia grup z motywu-rodzica (temp-style.php),
   gdzie 'main-color' (opcja motywu, dziś #ff3565) jest użyte jako TŁO
   (przyciski/paginacja/etykiety/paski postępu) - nie da się edytować tamtego
   pliku bezpośrednio (nadpisywany przy aktualizacji), więc nadpisanie TU,
   celując w te SAME selektory, z !important tak jak oryginał. Grupy 'main-
   color' użyte jako SAM TEKST/ikona (np. `a`, `.top-bar i:hover`) i jako SAM
   border (np. `.widget-title`, zakładki wideo) - CELOWO pominięte, z tego
   samego powodu co wyżej. */
.video-debounce-bar {
	background: #d92d56 !important;
}
button,
.button,
input[type="button"],
input[type="reset"],
input[type="submit"],
.label,
.pagination ul li a.current,
.pagination ul li a:hover,
body #filters .label.secondary.active,
.label.secondary:hover,
.main-navigation li:hover > a,
.main-navigation li.focus > a,
.main-navigation li.current_page_item > a,
.main-navigation li.current-menu-item > a,
.widget_categories ul li a:hover,
.comment-reply-link,
a.tag-cloud-link:hover,
.template-actors li a:hover {
	border-color: #d92d56 !important;
	background-color: #d92d56 !important;
}
.rating-bar-meter,
.vjs-play-progress,
#filters .filters-options span:hover,
.bx-wrapper .bx-controls-direction a,
.top-bar .social-share a:hover,
.thumb-block:hover span.hd-video,
.featured-carousel .slide a:hover span.hd-video,
.appContainer .ctaButton {
	background-color: #d92d56 !important;
}

/* TPOV (2026-08-09) - user: ścieżka breadcrumb ("Home -> Femdom -> tytuł filmu") na stronie wideo
   za jasna/za mocna, ma być ciemniejsza niż navbar. Linki #breadcrumbs (Home/kategoria) dziedziczą
   kolor z gołej reguły `a { color: main-color }` motywu-rodzica (ta sama reguła co KAŻDY zwykły link
   na stronie - świadomie NIE dotykana w poprzedniej rundzie, bo jako zwykły tekst na ciemnym tle
   generalnie działa dobrze gdzie indziej) - tutaj dodajemy WŁASNY, bardziej specyficzny selektor
   `#breadcrumbs a`, więc zmiana dotyczy TYLKO breadcrumbs, nie wszystkich linków na stronie.
   Ten sam #d92d56 co reszta przyciemnionego akcentu (nie nowy, czwarty odcień) - przy okazji
   znaleziono że .breadcrumbs-area (tło za całą ścieżką) wciąż było na starym #333 sprzed
   konsolidacji palety teł - przeniesione na #272727 wyżej, żeby nie zostawiać jednej powierzchni w
   tyle za resztą. */
#breadcrumbs a {
	color: #d92d56 !important;
}

/* ==========================================================================
   TPOV (2026-08-09, PageSpeed audyt) - font-display:swap dla FontAwesome. Motyw-rodzic (font-
   awesome.css) rejestruje @font-face bez font-display w ogóle - domyślne zachowanie przeglądarki to
   krótki okres niewidocznego tekstu (FOIT) zanim font się wczyta, zamiast pokazać tekst od razu
   systemowym fontem i podmienić. Nie można edytować pliku motywu-rodzica bezpośrednio (nadpisywany
   przy aktualizacji) - zamiast tego DRUGA deklaracja @font-face dla TEJ SAMEJ font-family/src,
   wczytywana PO oryginalnej (kolejność w kaskadzie), z jedyną różnicą - dodanym font-display: swap.
   Przeglądarki traktują późniejszą pasującą deklarację jako właściwą dla tego font-face - czysto
   addytywne, nie zmienia wyglądu fontu, tylko moment w którym tekst staje się widoczny. Zweryfikowane
   na PageSpeed: ~230ms oszczędności na FCP.
   ========================================================================== */
@font-face {
	font-family: 'FontAwesome';
	src: url('../retrotube/assets/stylesheets/font-awesome/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),
		url('../retrotube/assets/stylesheets/font-awesome/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),
		url('../retrotube/assets/stylesheets/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype');
	font-weight: normal;
	font-style: normal;
	font-display: swap;
}

/* ==========================================================================
   ODŚWIEŻENIE WIZUALNE (2026-08-06) - świadomie NIE przeprojektowanie na
   generyczny "YouTube/Netflix" wygląd - ta witryna ma swój własny, niszowy
   charakter (ciemny motyw, róż/magenta jako akcent - patrz istniejący kolor
   przycisków) i to zostaje. Poprawiamy tylko rzemiosło (typografia,
   zaokrąglenia, głębia/cień, waga przycisku CTA), nie ton/branding.

   ŚWIADOMIE DOBRANE POD KĄTEM SZYBKOŚCI (użytkownik: "bardzo mała utrata
   szybkości jest ok, ale nie chcemy zwolnić strony"):
   - Zero nowych requestów sieciowych. Typografia to STOS FONTÓW SYSTEMOWYCH
     (już zainstalowane na urządzeniu odwiedzającego), NIE webfont z Google
     Fonts/self-hosted - to samo praktyczne polepszenie względem gołego
     "sans-serif" (który dotychczas był tu dosłownie używany), zero dodatkowych
     bajtów/połączeń.
   - Wszystkie reguły dotykają WYŁĄCZNIE border-radius/box-shadow/transform/
     transition/color/background - właściwości malowane przez przeglądarkę
     (paint) albo kompozytowane (transform), NIE wyzwalające ponownego
     layoutu/reflow całej strony. Zero nowych obrazków/ikon/JS.
   - Ten plik i tak już jest wczytywany na każdej stronie (patrz functions.php) -
     to więcej reguł w JUŻ wymaganym pliku, nie nowy request.
   ========================================================================== */

/* Typografia - stos fontów systemowych zamiast gołego "sans-serif" (co
   renderowało się jako domyślny, generyczny font przeglądarki). Każdy system
   dostaje swój najlepszy, natywny, już wgrany font - bez pobierania niczego. */
body,
button,
input,
select,
textarea,
.button {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, sans-serif;
}

/* Przyciski/CTA - lekkie zaokrąglenie + delikatne uniesienie na hover
   (transform, nie zmiana marginesu/rozmiaru - nie wywołuje reflow). */
button,
.button,
input[type="button"],
input[type="reset"],
input[type="submit"] {
	border-radius: 6px;
	transition: transform 150ms ease, box-shadow 150ms ease, background-color 150ms ease;
}
button:hover,
.button:hover,
input[type="button"]:hover,
input[type="reset"]:hover,
input[type="submit"]:hover {
	transform: translateY(-1px);
	box-shadow: 0 4px 10px rgba(0, 0, 0, 0.35);
}

/* "Register" jako prawdziwe CTA zamiast zwykłego, niewyróżniającego się linku
   (Login i Register dzielą tę samą klasę .login na <span> w motywie, więc
   celujemy w konkretny href zamiast dodawać nową klasę do szablonu - zero
   zmian w PHP). Ten sam róż/magenta co reszta przycisków witryny (marka
   zostaje spójna), Login świadomie zostaje zwykłym, cichszym linkiem - to
   drugorzędna akcja względem założenia konta. */
.top-bar .membership a[href="#wpst-register"] {
	background-color: #d92d56;
	color: #fff;
	padding: 0.35em 0.9em;
	border-radius: 6px;
	font-weight: 600;
	margin: 0;
	transition: transform 150ms ease, box-shadow 150ms ease, background-color 150ms ease;
}
.top-bar .membership a[href="#wpst-register"]:hover {
	background-color: #b82649;
	color: #fff;
	transform: translateY(-1px);
	box-shadow: 0 4px 10px rgba(217, 45, 86, 0.4);
}

/* Miniaturki - lekkie zaokrąglenie (.post-thumbnail ma już overflow:hidden w
   motywie-rodzicu, więc obraz w środku ładnie się przycina, nic dodatkowo nie
   trzeba maskować) + delikatny cień + subtelne powiększenie obrazka na hover
   (transform:scale na samym <img>, NIE na kontenerze - kontener zachowuje swój
   rozmiar/pozycję, więc sąsiednie karty w siatce się nie przesuwają). */
.thumb-block .post-thumbnail {
	border-radius: 8px;
	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
.thumb-block .post-thumbnail img {
	transition: transform 300ms ease;
}
.thumb-block:hover .post-thumbnail img {
	transform: scale(1.04);
}

/* Plakietki na miniaturce (HD/czas trwania/wyświetlenia) - ujednolicone
   zaokrąglenie (dotąd tylko HD miało 3px, duration/views miały 0). */
span.views,
span.duration,
span.hd-video {
	border-radius: 4px;
}

/* Okno logowania/rejestracji (Bootstrap-style modal) - zaokrąglenie zamiast
   ostrych rogów, spójne z resztą odświeżenia. */
.modal-content {
	border-radius: 10px;
}

/* ==========================================================================
   POPRAWKI ZGŁOSZONE PO WDROŻENIU v1.1 (2026-08-06) - zweryfikowane NA ŻYWO
   (wstrzyknięcie reguły + pomiar przez JS na produkcyjnej stronie), nie na
   podstawie samego czytania kodu.
   ========================================================================== */

/* 1. "Zniknęła ikonka lupy" - guzik wyszukiwania to <input type="submit"
   class="button fa-input" value="&#xf002;">, czyli glif Font Awesome
   zapisany jako SUROWY znak unicode w atrybucie value, renderowany jako
   ikona TYLKO gdy font-family tego inputu to fontAwesome. Mój gołowy
   selektor `input` w bloku typografii wyżej (celowo bez podania typu, żeby
   objąć zwykłe pola tekstowe) przypadkiem złapał też TEN input i nadpisał
   mu font na systemowy - stąd glif renderował się jako pusty/niewidoczny
   znak zamiast ikony. Wyjątek dla `.fa-input`/#searchsubmit przywraca
   właściwy font (klasa ma wyższą specyficzność niż goły `input`, więc
   wygrywa bez potrzeby !important).
   2 i 3 poniżej mają WSPÓLNY korzeń: */
.fa-input,
#searchsubmit {
	font-family: fontAwesome;
}

/* 2 i 3. "Podpowiedzi renderują się NA polu wyszukiwania" / "scrollowanie
   podpowiedzi przesuwa cały header" - #searchform ma dzieci float:left
   (input#s, input#searchsubmit - tak zbudował to motyw-rodzic) BEZ
   clearfixa, więc sam formularz miał WYSOKOŚĆ 0 (potwierdzone pomiarem na
   żywo). Skrypt podpowiedzi pozycjonuje dropdown przez `top:100%` względem
   TEGO formularza - przy wysokości 0 to matematycznie `top:0`, czyli
   dropdown lądował DOKŁADNIE na polu wyszukiwania zamiast pod nim (bug #3).
   To z kolei tłumaczy bug #2: odwiedzający próbujący przewinąć listę
   podpowiedzi w rzeczywistości najeżdża na obszar nakładający się z samym
   polem, a po dojechaniu do końca wewnętrznego przewijania dropdownu brak
   `overscroll-behavior` pozwalał przewijaniu "przelać się" na całą stronę -
   stąd wrażenie że header ucieka w górę. `display:flow-root` to nowoczesny
   clearfix - w przeciwieństwie do starszego triku `overflow:hidden` NIE
   przycina dropdownu (który musi wystawać POZA formularz, żeby być
   widoczny) - kontener po prostu poprawnie liczy swoją wysokość.
   `overscroll-behavior:contain` na samym dropdownie to dodatkowe,
   niezależne zabezpieczenie na wypadek gdyby przewijanie mimo poprawki #1
   nadal sięgało jego granic. */
#searchform {
	display: flow-root;
}
.tpov-search-suggest {
	overscroll-behavior: contain;
}

/* Menu główne - motyw-rodzic ma gotowy zestaw ikon per klasa CSS pozycji menu
   (.home-icon/.cat-icon/.tag-icon/.blog-icon/... - patrz style.css rodzica),
   ale nie ma nic dla "czatu"/AI. Dokładka w tym samym duchu - żeby dało się
   przypisać ikonę w Appearance -> Menus -> CSS Classes: "chat-icon", bez
   dodatkowego kodu. Reszta niespójności w menu (brakujące/błędne klasy typu
   "book-icon" zamiast "blog-icon", zbłąkany "?" w etykiecie) to kwestia
   ustawień samego menu w wp-adminie, nie CSS. */
.chat-icon a:before {
	font-family: fontAwesome;
	margin-right: 0.4em;
	content: "\f075";
}

/* "Femdom AI Chat" w menu głównym - to reklama/link afiliacyjny, ma WYRÓŻNIAĆ się z rzędu zwykłych
   pozycji menu jako plakietka/pill, nie tylko inny kolor tekstu. Przypisz w Appearance -> Menus ->
   [pozycja menu] -> CSS Classes: "ad-highlight" (zastępuje "chat-icon" jeśli był wcześniej przypisany
   - ta jedna klasa daje TĘ SAMĄ ikonkę czatu + wyróżnienie razem, żeby nie trzeba było przypisywać
   dwóch osobnych klas). Kolor CELOWO INNY niż różowy akcent reszty witryny (Register, ikonki ⋮,
   akcenty playlist) - różowy już oznacza "podstawowa akcja serwisu"; identyczny kolor sprawiłby że to
   wygląda jak kolejna funkcja serwisu, nie promowany/sponsorowany link. Złoto/bursztyn czyta się jako
   "wyróżnione/promowane" bez kłócenia się z ciemnym motywem + różowym akcentem. Świadomie BEZ
   animacji/pulsowania - to czytałoby się jako spam, wprost sprzeczne z resztą pracy nad
   unowocześnieniem wyglądu w tej sesji.
   #site-navigation z przodu selektora - baza motywu ustawia kolor tekstu linków menu przez
   `#site-navigation>ul>li>a { color:#fff }` (selektor z ID, wysoka specyficzność), więc goła klasa
   `.ad-highlight a` przegrałaby o kolor tekstu bez tego dopisku z przodu.

   POPRAWKI po zgłoszeniu z produkcji (zweryfikowane na żywo - wstrzyknięcie reguły + realne
   najechanie myszą, nie tylko czytanie kodu):
   1. Tekst nie był wyśrodkowany w pionie - `<a>` dziedziczył z motywu `height:50px; line-height:50px`
      (baza `#site-navigation>ul>li>a`), a mój padding tylko DOKŁADAŁ się do tego, nie zastępował -
      stąd rozjazd. Jawny reset height/line-height + display:inline-flex/align-items:center daje pełną,
      niezależną kontrolę zamiast walczyć z odziedziczonymi wartościami.
   2. Tło na hover było RÓŻOWE, nie złote - w customizerze motywu jest WYGENEROWANY (nie w tym repo,
      dynamiczny inline <style> z ustawień "kolor akcentu") globalny hover-akcent z !important:
      `.main-navigation li:hover > a { background-color: #ff3565 !important; }` - !important zawsze
      wygrywa z regułą bez !important niezależnie od specyficzności, stąd moja wcześniejsza reguła
      (bez !important) przegrywała w 100% przypadków. Naprawione przez dodanie !important do MOJEJ
      reguły też (specyficzność + !important przeciw !important, moja wygrywa dzięki #site-navigation
      z przodu).
   3. "Tekst robi się biały gdy mysz jest blisko" - `margin: 0 0.3em` na <a> zostawiał mały pasek W
      OBRĘBIE <li> ale POZA samym <a> - najechanie na ten pasek uruchamiało hover CAŁEGO <li>
      (`#site-navigation>ul>li:hover>a { color:#fff }` I ten sam różowy !important akcent, bo oba
      selektory to `li:hover > a`, dziedziczą na dziecko niezależnie od tego czy MYSZ dosłownie jest
      nad samym <a>) - stąd migotanie: różowe tło zanim mysz naprawdę dotarła do pigułki. Naprawione
      przez pokrycie OBU ścieżek najechania (hover <li> ORAZ hover <a> wprost) tymi samymi regułami.
   4. Skutek uboczny poprawki #1: <li> w tym motywie nie ma WŁASNEJ wysokości - dotąd po prostu
      dopasowywał się do wysokości swojego dziecka <a> (stąd odziedziczone 50px). Skoro zresetowałem
      wysokość <a> do naturalnej (~29px), samo <li> też się skurczyło do 29px, podczas gdy sąsiednie
      pozycje menu (Home, Categories...) wciąż mają 50px - pigułka zaczęła się przy tym samym górnym Y
      co sąsiedzi, ale była NIŻSZA, czyli wizualnie "przyklejona do góry" rzędu zamiast wyśrodkowana W
      NIM. Jawne display:flex + align-items:center + height:50px na SAMYM <li> (nie na <a>) naprawia
      to - <li> ma teraz tę samą wysokość co sąsiedzi, a krótsza pigułka <a> jest w niej wyśrodkowana. */
#site-navigation .ad-highlight {
	display: flex;
	align-items: center;
	height: 50px;
}
#site-navigation .ad-highlight a {
	background: #f5a623;
	color: #1a1a1a;
	font-weight: 700;
	padding: 0.35em 0.9em;
	margin: 0 0.3em;
	border-radius: 20px;
	height: auto;
	line-height: normal;
	display: inline-flex;
	align-items: center;
	transition: transform 150ms ease, box-shadow 150ms ease, background-color 150ms ease;
}
#site-navigation .ad-highlight a:before {
	font-family: fontAwesome;
	content: "\f075";
	margin-right: 0.4em;
	color: #1a1a1a;
}
#site-navigation .ad-highlight:hover a,
#site-navigation .ad-highlight a:hover {
	background: #ffb84d !important;
	border-color: transparent !important;
	color: #1a1a1a !important;
	transform: translateY(-1px);
	box-shadow: 0 4px 10px rgba(245, 166, 35, 0.4);
}

/* ==========================================================================
   "FAN FAVORITES" (2026-08-07) - kuratorska (Engagement Score) półka na
   stronie głównej, [tpov_fan_favorites] w tpov-recommendations.php. Flexbox
   zamiast walki z istniejącym systemem szerokości .thumb-block (float-based,
   procentowe, różne na różnych breakpointach) - flex-basis nadpisuje zwykłe
   width niezależnie od tego które dokładnie reguła motywu akurat obowiązuje,
   więc "5 w rzędzie" trzyma się na każdej szerokości ekranu bez !important.
   ========================================================================== */
.tpov-fan-favorites {
	margin: 1.5em 0;
}
.tpov-fan-favorites-grid {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	font-size: 0.88em; /* "trochę mniejsze" - dziedziczone przez tytuły/metadane karty poniżej */
}
.tpov-fan-favorites-grid .thumb-block {
	float: none;
	flex: 0 0 calc(20% - 8px);
	max-width: calc(20% - 8px);
	margin-bottom: 0;
}
@media (max-width: 767.98px) {
	.tpov-fan-favorites-grid .thumb-block {
		flex: 0 0 calc(50% - 5px);
		max-width: calc(50% - 5px);
	}
}
@media (min-width: 768px) and (max-width: 991.98px) {
	.tpov-fan-favorites-grid .thumb-block {
		flex: 0 0 calc(33.333% - 7px);
		max-width: calc(33.333% - 7px);
	}
}

/* ==========================================================================
   Odznaka "NOWE" (2026-08-07) - tpov_reco_default_card_html() w
   tpov-recommendations.php wstrzykuje <span class="tpov-new-badge"> jako
   pierwsze dziecko każdej pasującej karty (.thumb-block). position:relative
   na .thumb-block ustawia kontekst pozycjonowania - karta i tak jest
   float:left, position:relative nie wpływa na to w żaden sposób, bezpieczny
   dodatek. Mały odstęp od rogu (top/left, nie 0/0) - user wyraźnie prosił
   "not exactly touching the corner".
   ========================================================================== */
.thumb-block {
	position: relative;
}
.tpov-new-badge {
	position: absolute;
	top: 8px;
	left: 8px;
	z-index: 20;
	background: #d92d56;
	color: #fff;
	font-size: 0.7em;
	font-weight: 700;
	letter-spacing: 0.03em;
	padding: 0.25em 0.6em;
	border-radius: 4px;
	line-height: 1.4;
	pointer-events: none;
	text-transform: uppercase;
}

/* ==========================================================================
   "Wróć do oglądania" - karuzela (2026-08-07). Ta sama pomniejszona stylistyka
   kart co Fan Favorites (mniejsza czcionka/karty), ale UKŁAD inny - track ma
   flex-wrap:nowrap (nie wrap jak Fan Favorites), bo widoczność 3 kart naraz
   sterowana jest przez JS (display:none na kartach poza oknem), nie przez
   naturalne zawijanie flexboxa. Karty poza oknem TAK CZY INACZEJ nie
   zajmują miejsca (display:none), więc szerokość liczona tylko względem
   TPOV_RECO_CONTINUE_WATCHING_VISIBLE (3), nie całej załadowanej puli (do 10).
   ========================================================================== */
/* NAPRAWIONE (2026-08-07, feedback usera - "continue watching is broken"):
   po repozycjonowaniu (patrz __closure_continue_watching_reposition_1/2 w
   rendering.php - insertAdjacentElement('afterend', ...) wstawia ten kontener
   jako RODZEŃSTWO konkretnej karty feedu) ląduje między kartami .thumb-block,
   które w motywie-rodzicu mają float:left (style.css:1924) - bez własnego
   clear:both zwykły <div> wstawiony W ŚRODEK strumienia floatów nie zajmuje
   pełnej szerokości wiersza, tylko cokolwiek zostało z miejsca w bieżącej
   "linii" floatów, stąd cała karuzela renderowała się ściśnięta/mała zamiast
   na pełną szerokość feedu. .tpov-continue-repositioned dodawane przez JS
   WYŁĄCZNIE po faktycznym przeniesieniu (przed tym elementem siedzi zwykle
   w <footer>/gdzie indziej, gdzie ten problem nie występuje) - stąd reguła
   scopowana do tego stanu, nie do .tpov-continue-watching w ogóle. Ta sama
   poprawka od razu dla Fan Favorites (identyczny mechanizm przenoszenia,
   identyczne ryzyko, user jeszcze tego nie zgłosił ale przyczyna jest ta sama). */
.tpov-continue-watching.tpov-continue-repositioned,
.tpov-fan-favorites.tpov-fan-favorites-repositioned {
	clear: both;
	display: block;
	width: 100%;
}

.tpov-continue-watching {
	margin: 1.5em 0;
}
.tpov-continue-carousel {
	display: flex;
	align-items: center;
	gap: 8px;
}
.tpov-continue-track {
	display: flex;
	flex-wrap: nowrap;
	overflow: hidden;
	gap: 10px;
	flex: 1;
	font-size: 0.88em;
}
.tpov-continue-track .thumb-block {
	float: none;
	flex: 0 0 calc(33.333% - 7px);
	max-width: min(calc(33.333% - 7px), 200px);
	margin-bottom: 0;
}
.tpov-continue-arrow {
	flex: 0 0 auto;
	width: 36px;
	height: 36px;
	border-radius: 50%;
	border: none;
	background: #d92d56;
	color: #fff;
	font-size: 1em;
	line-height: 1;
	cursor: pointer;
	display: flex;
	align-items: center;
	justify-content: center;
	transition: transform 150ms ease, opacity 150ms ease;
}
.tpov-continue-arrow:hover:not(:disabled) {
	transform: scale(1.08);
}
.tpov-continue-arrow:disabled {
	opacity: 0.3;
	cursor: default;
}

/* Ikony dla pozycji menu kontowych (Historia oglądania/Playlisty), doklejanych programowo do
   głównego menu TYLKO dla zalogowanych - patrz add_filter('wp_nav_menu_items', ...) w
   tpov-recommendations.php. "Ulubione" reużywa gotowe .star-icon z motywu-rodzica (pasuje
   znaczeniowo - star = favorite), te dwie nie mają odpowiednika w gotowym zestawie motywu. */
.history-icon a:before {
	font-family: fontAwesome;
	margin-right: 0.4em;
	content: "\f1da";
}
.playlist-icon a:before {
	font-family: fontAwesome;
	margin-right: 0.4em;
	content: "\f03a";
}

/* ==========================================================================
   KARTA FILMU - DRUGA PRZEBUDOWA (2026-08-09), w stylu YouTube

   User: sekcja między "Download this video" a komentarzami nadal "nie
   satysfakcjonuje" mimo pierwszej przebudowy z 2026-08-07 (patrz git log dla
   pełnej historii tamtej wersji - część reguł niżej to bezpośrednia kontynuacja
   tamtej pracy, nie start od zera). Trzy konkretne problemy, które user sam
   zdiagnozował i które potwierdziłem na żywym markupie przed zmianą czegokolwiek:
   1. Te same dane głosowania pokazane DWA razy - raz jako klikalne Like/Dislike,
      raz jako osobny pasek+procent+liczniki zaraz obok.
   2. "Dodaj do playlisty" renderowało się jako pełny, wypełniony różowy .button
      (ta sama klasa co Download/Register), podczas gdy serce ulubionych obok
      niej to tylko ikona - dwie akcje o tym samym znaczeniu (drugorzędne,
      zależne od konta), skrajnie różna waga wizualna.
   3. Za dużo informacji zawsze widocznej na raz (opis + autor/data + aktorzy +
      tagi + szczegóły oceny) - user: "95% ludzi tego nie potrzebuje, ale 5%
      może być zainteresowanych, plus dobre pod SEO".

   Poszedłem zobaczyć jak radzi sobie z tym YouTube (prawdziwa strona wideo,
   nie zgadywanie) - rozwiązuje wszystkie trzy TYM SAMYM mechanizmem: jedna
   reprezentacja głosów, WSZYSTKIE drugorzędne akcje jako te same, stonowane,
   szare "pigułki" (żadna nie jest głośniejsza od innej), i opis+meta+tagi
   domyślnie zwinięte w jeden blok z "Pokaż więcej" (pełna treść zostaje w
   HTML - SEO - tylko wizualnie ukryta). Poniższe reguły budują dokładnie to.

   Tytuł wraca do siedzenia LUZEM na tle strony (jak na YouTube) zamiast
   własnej karty z obramowaniem - tylko .tpov-info-block (zwijany blok) dostaje
   panel, więc to WŁAŚNIE ta powierzchnia niesie teraz wizualną tożsamość
   "karty", nie cała sekcja. Motyw-rodzic stawia !important na kilku regułach
   #video-tabs/.rating-bar (sprawdzone w jego style.css) - tam gdzie tak jest,
   też używamy !important.
   ========================================================================== */

.tpov-video-card h1.entry-title {
	margin: 0 0 0.6em;
	font-size: 1.5em;
	font-weight: 600;
	color: #fff;
}

.tpov-meta-row {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 0.6em;
	margin-bottom: 1em;
}

/* Blok głosowania - tylko klikalne Like/Dislike, BEZ osobnego paska/procentu/
   liczników obok (patrz problem 1 wyżej) - ta sama liczbowa treść żyje teraz
   WYŁĄCZNIE w .tpov-rating-summary wewnątrz .tpov-info-block niżej, jedna
   reprezentacja zamiast dwóch. */
.tpov-vote-block {
	display: flex;
	align-items: center;
	height: 2.6em;
}

/* Przyciski Like/Dislike (tpov_reco_render_post_like_link()) - NAPRAWDĘ jedna
   spójna pigułka (dawniej dwie połówki z 1px odstępem) - cienki, wewnętrzny
   separator zamiast przerwy, dokładnie jak Like/Dislike na YouTube. */
/* TPOV (2026-08-09) - normalizacja wysokości: zagnieżdżone spany wtyczki (.like/#more,
   .dislike/#less) dziedziczyły domyślny line-height motywu-rodzica na KAŻDYM poziomie
   zagnieżdżenia, więc realna wysokość rosła do ~62px zamiast deklarowanych 2.6em (~42px) -
   widoczna niespójność wysokości względem sąsiednich pigułek (Dodaj do playlisty/Share) w tym
   samym rzędzie. line-height:1 na każdym poziomie usuwa to sumowanie się u źródła. */
/* TPOV (2026-08-09) - realna przyczyna niespójnej wysokości znaleziona: motyw-rodzic ma
   `span.post-like { font-size: 1.3em; }` (style.css:2312) - nasze `height: 2.6em` liczy się WZGLĘDEM
   TEGO powiększonego kontekstu (2.6 * 1.3 * 16px = 54px), nie względem zwykłych 16px jak reszta
   pigułek w tym samym rzędzie (stąd zmierzona różnica 54px vs ~42px). font-size:1em tutaj neutralizuje
   narzucone przez motyw powiększenie u źródła, zamiast przeliczać 2.6em na sztywne piksele wszędzie. */
#video-rate .post-like {
	display: inline-flex;
	align-items: stretch;
	height: 2.6em;
	font-size: 1em;
	border-radius: 999px;
	overflow: hidden;
	background: rgba(255, 255, 255, 0.07);
	line-height: 1;
}
#video-rate .post-like a {
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	background: transparent !important;
	color: #ccc !important;
	padding: 0 1em !important;
	font-size: 0.95em;
	line-height: 1;
	transition: background-color 150ms ease, color 150ms ease;
}
#video-rate .post-like .like,
#video-rate .post-like .dislike,
#video-rate .post-like #more,
#video-rate .post-like #less {
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	line-height: 1;
}
#video-rate .post-like a:first-child {
	border-right: 1px solid rgba(255, 255, 255, 0.12);
}
#video-rate .post-like a:hover {
	background: rgba(255, 255, 255, 0.1) !important;
	color: #fff !important;
}
#video-rate .post-like .grey-link {
	color: inherit;
}
/* Span "niezalogowany/już zagłosował" (bez <a>, patrz tpov_reco_render_post_like_link()) - te same
   wymiary/wygląd co klikalna wersja, żeby przełączenie stanu nie zmieniało rozmiaru rzędu. */
#video-rate .post-like > span.like,
#video-rate .post-like > span.dislike {
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	color: #ccc;
	padding: 0 1em;
	font-size: 0.95em;
	line-height: 1;
}
#video-rate .post-like > span.like {
	border-right: 1px solid rgba(255, 255, 255, 0.12);
}
/* Liczba PRZY Like/Dislike (nie osobny pasek gdzie indziej - user: "we don't need to show this two
   times"). Reużywa klasy .likes/.likes_count/.dislikes_count których main.js (motyw-rodzic)
   aktualizuje po AJAX-owym głosowaniu ($('.likes .likes_count')/$('.likes .dislikes_count')) - jQuery
   dopasowuje WSZYSTKIE pasujące elementy, więc dwa osobne .likes-owe kontenery (jeden tu, jeden przy
   dislike) aktualizują się tak samo jak jeden wspólny, zero zmian w main.js potrzebne. */
#video-rate .likes {
	font-size: 1.25em;
	color: #999;
	font-weight: 600;
}
.tpov-voted {
	color: #d92d56 !important;
}

.tpov-video-views {
	font-size: 1em !important;
	color: #999 !important;
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	padding: 0 !important;
}
.tpov-video-views span {
	font-weight: 600;
	color: #eee !important;
	font-size: 1.25em !important;
}

.tpov-video-actions {
	display: flex;
	align-items: center;
	gap: 0.5em;
	margin-left: auto;
}

/* TPOV (2026-08-09) - rodzina "neutralnych pigułek": Dodaj do playlisty +
   Share dostają TERAZ dokładnie ten sam, stonowany, szary styl co Like/Dislike
   wyżej - zamiast wypełnionego różowego .button (motyw-rodzic/globalna klasa
   .button, patrz akcent #d92d56 gdzie indziej w tym pliku), żeby żadna
   drugorzędna akcja nie krzyczała głośniej niż reszta (problem 2 wyżej).
   Serce ulubionych CELOWO zostaje bez własnego tła (patrz komentarz przy
   .tpov-fav-btn-standalone niżej - to świadoma, wcześniejsza decyzja usera
   "bez kółka", nie coś do cofnięcia) - to ta subtelniejsza, ikonowa strona
   tej samej rodziny "coś drugorzędnego", nie osobna, sprzeczna konwencja. */
.tpov-video-actions .tpov-atp-toggle-btn,
.tpov-video-actions > a.button,
.tpov-share-toggle {
	height: 2.6em;
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	padding: 0 1.1em !important;
	box-sizing: border-box;
	background: rgba(255, 255, 255, 0.07) !important;
	color: #ccc !important;
	border: none;
	border-radius: 999px;
	font-weight: 400;
	font-size: 0.95em;
	cursor: pointer;
	transition: background-color 150ms ease, color 150ms ease;
}
.tpov-video-actions .tpov-atp-toggle-btn:hover,
.tpov-video-actions > a.button:hover,
.tpov-share-toggle:hover {
	background: rgba(255, 255, 255, 0.14) !important;
	color: #fff !important;
}
.tpov-share-toggle.active {
	background: rgba(217, 45, 86, 0.18) !important;
	color: #fff !important;
}


/* Guzik ulubionych (serce) - TPOV (2026-08-09, user feedback po v1.25): "should be way bigger, to
   match the size of buttons, not the size of texts" - wcześniejsza wersja (bez tła, sam ikonowy
   znak) była świadomą decyzją z jeszcze wcześniejszej rundy ("bez kółka"), ale user teraz WPROST
   prosi o coś przeciwnego - PEŁNA pigułka, ta sama rodzina wizualna co Dodaj do playlisty/Share
   BEZ tła/pigułki - user: "it shouldn't have the background button, the heart itself should just be
   bigger (and I now think it should also be bold)". Sam FontAwesome-4 glifik (statyczny, nie ma
   wariantów wagi) - "pogrubienie" symulowane przez text-shadow (dokłada grubość konturu) zamiast
   font-weight (bez efektu na ikony-jako-font). .tpov-fav-btn (klasa bazowa dzielona z plakietką na
   miniaturkach kart w feedzie, patrz includes/rendering.php) narzuca własne wymiary/tło i ładuje się
   PÓŹNIEJ w dokumencie (inline <style> w wp_head) - stąd !important na każdej właściwości którą baza
   narzuca. */
.tpov-fav-btn-standalone {
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	width: auto !important;
	height: 2.6em !important;
	line-height: 1 !important;
	padding: 0 0.3em !important;
	background: none !important;
	color: #ccc !important;
	font-size: 1.7em !important;
	text-shadow: 0 0 1px currentColor;
	transition: color 150ms ease, transform 150ms ease;
}
.tpov-fav-btn-standalone:hover {
	color: #ff5c82 !important;
	transform: scale(1.08);
}
/* Stan AKTYWNY (dodane do ulubionych) - ikona sama w sobie już się zmienia
   (fa-heart-o -> fa-heart, kontur -> wypełnienie), kolor dokłada dodatkowy,
   wyraźny sygnał różowy. Krótka "pop" animacja przy kliknięciu zamiast
   statycznej zmiany - wyraźnie widoczny moment przełączenia. */
.tpov-fav-btn-standalone.tpov-fav-active {
	color: #ff3565 !important;
	animation: tpov-fav-pop 300ms ease;
}
.tpov-fav-btn-standalone.tpov-fav-active:hover {
	color: #ff1a52 !important;
	transform: scale(1.08);
}
@keyframes tpov-fav-pop {
	0% { transform: scale(1); }
	40% { transform: scale(1.35); }
	100% { transform: scale(1); }
}

.tpov-add-to-playlist {
	position: relative;
	display: inline-flex;
}
.tpov-atp-panel {
	position: absolute;
	right: 0;
	top: calc(100% + 8px);
	z-index: 20;
	background: #272727;
	border: 1px solid rgba(255, 255, 255, 0.1);
	border-radius: 8px;
	box-shadow: 0 8px 20px rgba(0, 0, 0, 0.45);
	padding: 0.8em;
	min-width: 220px;
}
.tpov-atp-list {
	list-style: none;
	margin: 0 0 0.6em;
	padding: 0;
	max-height: 200px;
	overflow-y: auto;
}
.tpov-atp-list li {
	padding: 0.3em 0;
	color: #ccc;
}
.tpov-atp-create-form {
	display: flex;
	gap: 0.5em;
}
.tpov-atp-create-form input {
	flex: 1;
	min-width: 0;
}

/* Panel Share (#video-share, motyw-rodzic) - chowany domyślnie przez
   `.tab-content>div{display:none}` motywu, pokazywany/chowany teraz przez
   .tpov-share-toggle (tpov-theme-fixes.js) zamiast systemu zakładek - patrz
   komentarz w content-video.php. Zawartość to tylko rząd ikon social - lekki
   dopasowujący padding, żeby nie wyglądał jak przypadkowo zostawiony wolny
   pasek pod rzędem akcji. */
/* TPOV (2026-08-09, audyt) - realny bug znaleziony live na 375px: motyw-rodzic ma WŁASNĄ regułę
   `@media(max-width:767.98px) #video-share{display:block}` (selektor ID, tak samo specyficzny jak
   `.tab-content>div{display:none}` jest MNIEJ specyficzny - ID zawsze wygrywa z klasą, niezależnie od
   media query) - na mobile panel Share renderował się już rozwinięty przy pierwszym wejściu na stronę.
   `#video-share{display:none}` tutaj ma TĘ SAMĄ specyficzność (ID) i ładuje się PO arkuszu motywu-
   -rodzica (patrz kolejność enqueue w functions.php) - wygrywa przez kolejność w kaskadzie, bez
   potrzeby !important (który zablokowałby też inline style="display:block" ustawiany przez
   .slideToggle() po kliknięciu "Share" - !important w arkuszu bije nie-!important inline style). */
.tab-content {
	margin-bottom: 0.5em;
}
#video-share {
	display: none;
	padding: 0.6em 0;
}

/* ==========================================================================
   .tpov-info-block - JEDEN zwijany panel (opis + autor/data + aktorzy + tagi +
   szczegóły oceny), domyślnie pokazujący tylko skrót, z "Pokaż więcej" (patrz
   problem 3 wyżej). To TERAZ jedyne miejsce w tej sekcji z widocznym tłem/
   panelem - reszta (tytuł, rząd akcji) siedzi luzem na tle strony jak na
   YouTube.

   Mechanizm zwijania: motyw-rodzic ładuje BIBLIOTEKĘ readmore.js (main.js,
   rejestruje globalny plugin jQuery $.fn.readmore) i sam już woła ją na
   `.video-description .more` - zamiast duplikować tę logikę, WOŁAMY TĘ SAMĄ,
   już załadowaną bibliotekę na .tpov-info-block z osobnej, małej inicjalizacji
   w tpov-theme-fixes.js (własny collapsedHeight/moreLink/lessLink). `.desc`
   NIE dostaje już klasy "more" w PHP (content-video.php) - zapobiega
   PODWÓJNEMU zwijaniu (raz przez motyw na samym opisie, raz przez nas na
   całym bloku).
   ========================================================================== */
.tpov-info-block {
	background: #1e1e1e;
	border-radius: 8px;
	padding: 0.9em 1.1em;
}

.tpov-info-block .video-description .desc {
	color: #ccc !important;
	line-height: 1.6;
	font-size: 1em;
	margin-bottom: 0.4em;
}

/* TPOV (2026-08-09, redesign v3) - "Show more" (nie readmore.js jak w v1.25 - to była wysokość-w-px,
   obcinała tagi w połowie wiersza gdy zastosowana na całym bloku). CSS line-clamp tnie WYŁĄCZNIE
   tekst opisu, czysto po liniach, niezależnie od zawartości HTML - żadnego mierzenia wysokości w JS.
   .tpov-collapsible-extra (autor/data + aktorzy + tagi) to zwykłe display:none/block, przełączane
   RAZEM z rozwinięciem opisu jednym kliknięciem (tpov-theme-fixes.js) - user: kliknięcie ma pokazać
   pełny opis AND wiersz autor/data AND wiersz tagów, nie tylko sam tekst. Pełna treść zawsze w DOM
   (SEO) niezależnie od stanu zwinięcia. */
.tpov-desc-clamp {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
.tpov-desc-clamp.tpov-expanded {
	display: block;
	-webkit-line-clamp: unset;
	overflow: visible;
}
.tpov-showmore-toggle {
	display: block;
	width: 100%;
	text-align: center;
	background: none !important;
	border: none;
	border-top: 1px solid rgba(255, 255, 255, 0.08);
	padding: 0.5em 0 0;
	margin-top: 0.2em;
	color: #999 !important;
	font-size: 0.85em;
	font-weight: 600;
	cursor: pointer;
}
.tpov-showmore-toggle:hover {
	color: #fff !important;
}
.tpov-collapsible-extra {
	display: none;
	padding-top: 0.8em;
}

.tpov-video-submeta {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4em 1.2em;
	font-size: 0.85em;
	color: #999;
	margin-bottom: 1em;
	padding-bottom: 1em;
	border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.tpov-video-submeta i {
	margin-right: 0.35em;
	opacity: 0.7;
}
.tpov-video-submeta a {
	color: #ccc;
}
.tpov-video-submeta a:hover {
	color: #ff3565;
}

/* Tagi - obrys zamiast wypełnienia, mniejszy font niż opis, nadal wszystkie
   widoczne w DOM (SEO) niezależnie od stanu zwinięcia .tpov-info-block. */
.tpov-info-block .tags .tags-list .label {
	display: inline-flex !important;
	align-items: center;
	gap: 0.3em;
	background: transparent !important;
	border: 1px solid rgba(255, 255, 255, 0.14);
	color: #999 !important;
	font-size: 0.78em !important;
	padding: 0.3em 0.7em !important;
	margin: 0 0.5em 0.5em 0 !important;
	border-radius: 20px;
	transition: border-color 150ms ease, color 150ms ease;
}
.tpov-info-block .tags .tags-list .label:hover {
	border-color: #ff3565;
	color: #fff !important;
}
.tpov-info-block .tags .tags-list .label i {
	font-size: 0.85em;
	opacity: 0.7;
}

@media only screen and (max-width: 767.98px) {
	.tpov-video-card h1.entry-title {
		font-size: 1.2em;
		text-align: left;
	}
	.tpov-video-actions {
		margin-left: 0;
		width: 100%;
		justify-content: flex-start;
		flex-wrap: wrap;
	}
	.tpov-atp-panel {
		right: auto;
		left: 0;
	}
}

/* ==========================================================================
   v1.13 (2026-08-08) - AUDYT MOTYWU: SZYBKOŚĆ / OPTYMALIZACJA / SEO / JAKOŚĆ
   Brak zmian CSS w tej wersji - cała robota jest w PHP/JS. Wpis tutaj tylko
   po to, żeby wersja i changelog tego pliku (jedyne miejsce w child themie z
   nagłówkiem Version:) zostały spójne z resztą zmian tej rundy:

   Grupa A (bezpieczne, izolowane):
   - functions.php: zdjęcie martwych/niepotrzebnych enqueue (touchSwipe zawsze,
     bxSlider poza karuzelą, video.js na is_single()), async na reCAPTCHA,
     konsolidacja register_post_meta('duration'/'embed'/'tracking_url') z JEDNYM
     spójnym auth_callback.
   - header.php (nowy override, patrz niżej) + temp-style.php buffer-strip:
     usunięcie @import Google Fonts gdy niepotrzebny.
   - loop-video-carousel.php, content-featured-carousel.php (nowe override'y):
     loading="lazy", no_found_rows.
   - loop-video.php: wpst_get_multithumbs() tylko gdy faktycznie używane
     (enable-thumbnails-rotation), nie zawsze.
   - 404.php (nowy override), content-related.php, search.php: ORDER BY RAND()
     zamienione na pulę kandydatów + shuffle() w PHP.
   - loop-video-carousel.php, template-actors.php, template-categories.php,
     loop-blog.php (nowe override'y): esc_attr()/esc_url() na title/alt/href.

   Grupa B (średnia złożoność):
   - template-actors.php, template-categories.php (nowe override'y) +
     tpov_theme_get_one_post_per_term() (functions.php): jedno zbiorcze
     zapytanie SQL zamiast N zapytań RAND() per termin.
   - functions.php: lekki rate-limit per IP na ?filter=random + usunięcie
     no-op meta_query dla ?filter=popular.
   - assets/js/tpov-theme-fixes.js (nowy plik): siatka ratunkowa na zablokowane
     przyciski "Loading..." po nieudanym AJAX-ie + delegowany hover-preview
     miniatur dla kart doklejonych przez nieskończone przewijanie.

   Grupa C (header.php, pełny override motywu-rodzica - jedyny sposób na
   przechwycenie inc/meta-social.php i temp-style.php, dołączanych przez stałą
   ścieżkę do motywu-rodzica):
   - Deduplikacja schemy VideoObject w wp_head() (motyw-rodzic drukował drugą,
     zbędną kopię obok własnej, pełniejszej schemy dziecka w treści strony).
   - tpov_theme_render_meta_social(): og:type="video.other" zamiast zawsze
     "article", realne wymiary og:image zamiast zahardkodowanych 200x200.
   - Utwardzenie <h1> na stronie głównej (dawniej mogło być 0 albo 2, zależnie
     od kombinacji opcji use-logo-image/homepage-title) - teraz zawsze
     dokładnie jedno.
   - noindex,follow na stronach danych konta (Historia oglądania/
     Ulubione/Playlisty), wykrywanych po shortcodzie w treści strony.

   Znalezione, ale ŚWIADOMIE NIE naprawione w tej rundzie (patrz raport dla
   usera): błąd komunikatu rejestracji w inc/ajax-login-register.php (martwy
   kod - przejęty i w pełni zastąpiony przez tpov_reco_takeover_registration_ajax()
   wcześniej w tym projekcie), krucha weryfikacja reCAPTCHA w
   class-video-submitter.php (realny, ale niedostępny do podczepienia bez
   edycji motywu-rodzica - degradacja przy błędzie sieci, nie luka
   bezpieczeństwa). Świadomie ODŁOŻONE jako osobna praca funkcjonalna: OG/
   Twitter tagi na stronach kategorii/aktorów/głównej/wyszukiwania (dziś tylko
   na is_single()).
   ========================================================================== */

/* ==========================================================================
   v1.14 (2026-08-08) - AIOSEO KONFLIKT + WERYFIKACJA NA REALNYCH DANYCH
   Brak zmian CSS. v1.13 zweryfikowane po raz pierwszy na PRAWDZIWYCH danych
   produkcyjnych (local-dev/, docker + import bazy) zamiast tylko czytania
   kodu - znaleziono i naprawiono dwa realne problemy niewidoczne wcześniej:

   1. Luka w tpov_theme_is_account_data_page() (functions.php) - sprawdzała
      tylko 3 z 4 shortcode'ów stron kont, brakowało 'tpov_playlist_view'
      (pojedynczy widok playlisty, /playlist/, osobny shortcode od listy
      playlist /playlists/) - ta strona nie dostawała noindex. Naprawione.

   2. Odkryto że All in One SEO (AIOSEO) Pro jest aktywne na produkcji -
      wtyczka trzecia, niewidoczna dla wcześniejszego audytu kodu, ujawniona
      dopiero przy realnych danych. AIOSEO samodzielnie generuje własne OG/
      Twitter/schema.org na wp_head - kolidowało z v1.13: dwa og:type (nasze
      "video.other" vs ich "article"), a w JSON-LD AIOSEO klasyfikowało KAŻDY
      wpis-film jako "BlogPosting" (błędne dla wideo, zero szans na video
      rich-results w Google). Sitemap AIOSEO (/sitemap.xml) faktycznie działa
      i jest używany - NIE wyłączono całej wtyczki. Zamiast tego (functions.php):
      - tpov_theme_render_meta_social() teraz stoi z boku gdy AIOSEO aktywne
        (function_exists('aioseo') w header.php) - AIOSEO staje się jedynym
        źródłem OG/Twitter, zero duplikatów.
      - Filtr aioseo_facebook_tags koryguje og:type na "video.other" dla
        wpisów-filmów + usuwa nieadekwatne article:* tagi.
      - Filtr aioseo_schema_output usuwa węzeł BlogPosting z grafu AIOSEO dla
        pojedynczych wpisów-filmów (własna, poprawna schema VideoObject w
        content-video.php zostaje jedyną) - BreadcrumbList/WebPage/Organization
        itd. z grafu AIOSEO zostają nietknięte, to wciąż realna wartość.
      - Filtr aioseo_opengraph_default_image: przy weryfikacji na żywo
        wyszło że TYLKO 83 z 664 opublikowanych wpisów-filmów mają
        prawdziwy featured image WP - reszta (87%) polega WYŁĄCZNIE na
        niestandardowym polu meta 'thumb' tego motywu, o którym AIOSEO nie
        wie. Bez tego filtra przełączenie na "AIOSEO jako jedyne źródło"
        zostawiłoby 87% filmów bez og:image w ogóle. Fallback: prawdziwy
        featured image (z realnymi wymiarami) w pierwszej kolejności,
        inaczej surowy URL z 'thumb' (bez zgadywania wymiarów) - identyczny
        łańcuch co miał własny kod motywu, tylko teraz wpięty w AIOSEO.
      Zweryfikowane na 8 losowych + 2 celowo dobranych (z/bez featured image)
      prawdziwych wpisach-filmach: dokładnie jeden og:type, jeden VideoObject,
      zero BlogPosting, og:image poprawny w obu ścieżkach fallbacku.

   Przy okazji odinstalowane/dezaktywowane (patrz project_local_dev_environment
   i project_pending_deployment w pamięci, nie część tego repo):
   jwt-authentication-for-wp-rest-api (potwierdzone nieużywane - Hub loguje
   się przez natywne WP Application Passwords, nie JWT; brak nawet
   zdefiniowanego JWT_AUTH_SECRET_KEY) i query-monitor (narzędzie
   deweloperskie, zero wartości dla odwiedzających, zbędny narzut na każde
   żądanie) - oba do dezaktywacji też na produkcji.
   ========================================================================== */

/* ==========================================================================
   v1.15 (2026-08-08) - N+1 w content-related.php, ta sama naprawa co
   tpov-recommendations v1.56 (patrz jego changelog dla pełnej diagnozy -
   profilowanie na realnych danych, slow query log). array_map('get_post',
   $related_ids) hydratyzował "Related videos" (fallback bez personalizacji)
   pojedynczo, po jednym zapytaniu na film - dodano _prime_post_caches()
   przed hydratacją. Mały wpływ (max 8 filmów w tej gałęzi), naprawione przy
   okazji dla spójności ze wzorcem już użytym gdzie indziej w tym projekcie.
   Brak zmian CSS.
   ========================================================================== */

/* ==========================================================================
   v1.16 (2026-08-08, nocny audyt bezpieczeństwa) - produkcja nie wysyłała ŻADNYCH
   nagłówków bezpieczeństwa (sprawdzone: curl -I https://toiletpov.com/ - brak
   X-Frame-Options/X-Content-Type-Options/Referrer-Policy/HSTS). Dodane w functions.php
   (hak send_headers): X-Content-Type-Options: nosniff, X-Frame-Options: SAMEORIGIN,
   Referrer-Policy: strict-origin-when-cross-origin, i Strict-Transport-Security
   (tylko gdy is_ssl(), max-age=31536000, świadomie bez includeSubDomains/preload -
   łatwiejsze do cofnięcia). Świadomie BEZ Content-Security-Policy - strona ma sporo
   zewnętrznych zasobów (odtwarzacze hostów w iframe, reklamy, GA4, AIOSEO) które
   wymagałyby starannego, osobnego audytu domen przed dodaniem CSP bez ryzyka
   zablokowania czegoś legalnego. Reszta nocnego audytu (CSRF/rate-limit/IDOR na REST
   API wtyczki, znane CVE zainstalowanych wtyczek, eksponowane pliki, N+1 na innych
   typach stron) - wszystko potwierdzone czyste, żadnych innych zmian kodu potrzebnych.
   Brak zmian CSS.
   ========================================================================== */

/* ==========================================================================
   v1.17 (2026-08-08, drugi nocny audyt - "keep going" po pierwszym raporcie) - dwie realne
   naprawy w tej rundzie, reszta obszernego audytu (dead code, indeksy DB, N+1 na dodatkowych
   punktach REST, głębszy przegląd bezpieczeństwa poza REST) wyszła czysto, bez potrzeby zmian.
   1. functions.php: fancybox+waterfall.js (biblioteki lightbox/masonry motywu-rodzica) zdejmowane
      teraz na 4 stronach kont (Historia oglądania/Ulubione/Playlisty/Playlist) - motyw-rodzic
      kolejkuje je na KAŻDEJ stronie pasującej do is_page(), a te 4 strony renderują wyłącznie
      siatki kart z shortcode'ów, zero galerii/lightboxów. Inne, prawdziwe Strony WP nietknięte
      (mogą legalnie potrzebować fancybox dla własnej galerii w treści).
   2. template-parts/content-video.php, loop-video-carousel.php, loop-video.php: title="<?php
      the_title(); ?>" (bez esc_attr) w atrybucie HTML - tytuły filmów pochodzą z formularza
      zgłaszania po stronie klienta (user-controlled), więc cudzysłów w tytule mógłby wyłamać się
      z atrybutu. Naprawione (+ esc_url() na $tracking_url/get_the_permalink() przy okazji).
   Brak zmian CSS.
   ========================================================================== */

/* ==========================================================================
   v1.18 (2026-08-08) - pierwszy z odłożonych punktów audytu: OG/Twitter na stronach kategorii/
   aktorów/tagów/wyszukiwania. Zweryfikowane na żywo najpierw (curl na produkcję) - strona główna i
   pojedyncze wpisy JUŻ miały pełne tagi OG przez AIOSEO (jego Output::isAllowed() obejmuje
   is_front_page/is_home/is_singular/is_post_type_archive) - prawdziwa luka to WYŁĄCZNIE archiwa
   taksonomii i wyszukiwanie, żadne z nich nie pasowały do warunków AIOSEO. Nowa funkcja
   tpov_theme_render_archive_meta_social() (functions.php) odtwarza TE SAME warunki jako negatywny
   check (nie hakuje wewnętrznej metody AIOSEO - isAllowed() nie ma apply_filters() wokół siebie,
   więc nie da się jej bezpiecznie podczepić) - renderuje własne, lekkie tagi TYLKO gdy żaden z
   warunków AIOSEO nie zachodzi, więc automatycznie nie dubluje niczego i automatycznie przestanie
   działać na starych stronach jeśli AIOSEO kiedyś zacznie je obsługiwać samo. Obrazek: prawdziwy
   obrazek kategorii/aktora jeśli ustawiony (te same pola meta co template-categories.php/
   template-actors.php), inaczej ikona strony (get_site_icon_url()) jako fallback zamiast pustego
   podglądu przy udostępnianiu. Zweryfikowane lokalnie na wszystkich 4 typach stron + upewnione że
   strona główna/wpisy/Strony (AIOSEO) nie dostały duplikatu.
   Brak zmian CSS.
   ========================================================================== */

/* ==========================================================================
   v1.19 (2026-08-08) - drugi z odłożonych punktów: Content-Security-Policy. Celowo jako
   Content-Security-Policy-**Report-Only** (nagłówek raportujący, NIE egzekwujący) - patrz pełne
   uzasadnienie w functions.php przy tym nagłówku (rotujące domeny hostów wideo + intensywne użycie
   inline <script> bez nonce'ów, także w motywie-rodzicu którego nie można edytować). frame-src
   dla hostów wideo DYNAMICZNE - współdzieli helper tpov_theme_get_current_video_hosts() z już
   istniejącymi preconnect/dns-prefetch (zrefaktoryzowane z jednego miejsca na dwa, jedno źródło
   prawdy). Zweryfikowane w PRAWDZIWEJ przeglądarce (nie tylko curl - CSP wymaga realnej ewaluacji
   JS/zasobów) na stronie głównej, filmie, wynikach wyszukiwania i modalu logowania - znalezione i
   naprawione DWIE realne luki które sama lektura kodu/dokumentacji by przeoczyła: skrypt reCAPTCHA
   faktycznie ładuje się z www.gstatic.com (nie z www.google.com jak sugerowałby sam enqueue), a
   GA4 wysyła zdarzenia na REGIONALNĄ subdomenę (region1.google-analytics.com, nie samo
   www.google-analytics.com) - connect-src rozszerzone na *.google-analytics.com. Po tych dwóch
   poprawkach: zero pozostałych luk na żadnym z przetestowanych typów stron/interakcji.
   **Następny krok (świadomie NIE zrobiony automatycznie)**: obserwować konsolę przeglądarki (F12)
   na żywej produkcji przez jakiś czas - jeśli nie pojawią się ostrzeżenia CSP dla legalnych
   zasobów, gotowe do przełączenia na faktycznie egzekwującą politykę (zmiana nazwy nagłówka).
   Brak zmian CSS.
   ========================================================================== */

/* ==========================================================================
   v1.20 (2026-08-08) - fix: "NEW" odznaka niewidoczna, przykryta przez własną miniaturkę karty.
   User zgłosił na żywo: świeżo opublikowany film nie pokazywał odznaki mimo że powinien. Sprawdzone
   bezpośrednio w DOM produkcji (nie z kodu) - span.tpov-new-badge FAKTYCZNIE był w HTML, poprawnie
   pozycjonowany (position:absolute, top/left 8px, kolory OK) - to nie był bug logiki/cache'a
   (tpov_reco_get_new_badge_post_ids()/wstrzyknięcie w rendering.php działały poprawnie). Realna
   przyczyna: document.elementsFromPoint() na współrzędnych odznaki pokazał img.video-main-thumb
   JAKO WARSTWĘ WYŻEJ niż odznakę - motyw-rodzic ma regułę ".thumb-block .post-thumbnail img
   { z-index: 10; }" (prawdopodobnie pod rotację miniaturek na hover), a odznaka miała z-index:5 -
   niższy, więc przegrywała mimo pointer-events:none (który tylko wyłącza hit-testing myszy, nie
   wpływa na malowanie/z-order - zweryfikowane osobno, żeby nie pomylić objawu z przyczyną).
   Naprawione podniesieniem z-index odznaki do 20 (z zapasem ponad znane 10 rodzica) - zweryfikowane
   na żywo na produkcji (tymczasowa nadpisanie z-index w DevTools/JS przed zmianą kodu) że to
   faktycznie odwraca kolejność malowania.
   ========================================================================== */

/* ==========================================================================
   v1.22-v1.23 (2026-08-09) - dyskusja o teorii koloru z userem, dwie rundy:
   (1) v1.22 - ciemniejsza, spójna paleta teł "w stylu YouTube" (tło strony
   dokładnie #0f0f0f jak YouTube, .top-bar ta sama wartość zamiast osobnego
   odcienia + nowy border-bottom, reszta powierzchni skonsolidowana na ciasnej
   drabince #181818/#1e1e1e/#272727 zamiast rozrzuconych #222/#282828/#333).
   (2) v1.23 - akcent #ff3565 -> #d92d56 (proporcjonalne przyciemnienie,
   *0.85 na każdy kanał, nie zmiana odcienia), ale TYLKO tam gdzie kolor
   siedzi POD białym tekstem (przyciski/odznaki/paski postępu) - to naprawia
   realny kontrast (3.53:1 -> 4.72:1, białe na kolorze, dokładnie problem
   który złapał PageSpeed na 3 elementach: guzik Rejestracji, ikona
   wyszukiwania, odznaka NOWE). Świadomie NIE zmienione tam gdzie różowy jest
   samym tekstem/ikoną/cienkim borderem na ciemnym tle strony (aktywne serce
   ulubionych, podkreślenie aktywnej zakładki, linki po najechaniu) - te już
   miały dobry kontrast i przyciemnienie by go POGORSZYŁO, nie poprawiło.
   Pełna lista zweryfikowana selektor-po-selektorze (włącznie z ~15 regułami
   motywu-rodzica opartymi o opcję 'main-color' w temp-style.php) - patrz
   komentarze przy każdej sekcji wyżej w tym pliku po pełne uzasadnienie.
   Zweryfikowane na żywo na local-dev: wszystkie 3 zgłoszone elementy teraz
   4.71:1 (zmierzone, nie tylko wyliczone), pozostawione elementy potwierdzone
   że NADAL używają oryginalnego #ff3565 (nic przypadkiem nie nadpisane).
   ========================================================================== */

/* ==========================================================================
   v1.24 (2026-08-09) - user: ścieżka breadcrumb na stronie wideo ("Home ->
   Femdom -> tytuł") za jasna, ma być ciemniejsza niż navbar. Linki tam
   dziedziczyły z gołej reguły `a { color: main-color }` motywu-rodzica (ta
   sama reguła co każdy zwykły link na stronie) - nowy, bardziej specyficzny
   `#breadcrumbs a { color: #d92d56 }` dotyka WYŁĄCZNIE breadcrumbs, reużywa
   już ustalony przyciemniony odcień zamiast wymyślać kolejny. Przy okazji
   znalezione i naprawione: .breadcrumbs-area (tło za całą ścieżką) wciąż
   było na starym #333 sprzed konsolidacji palety teł w v1.22 - przeniesione
   na #272727, żeby ta powierzchnia nie zostawała w tyle za resztą.
   Zweryfikowane na żywo na local-dev.
   ========================================================================== */

/* ==========================================================================
   v1.25 (2026-08-09) - DRUGA przebudowa "sekcji między Download a komentarzami"
   (patrz duży komentarz przy .tpov-video-card wyżej dla pełnego uzasadnienia).
   User: pierwsza wersja z 2026-08-07 nadal "nie satysfakcjonuje" - poprosił
   żebym poszedł zobaczyć jak radzi sobie z tym YouTube i zbudował na tym wzorcu.
   Zmiany zweryfikowane na żywo na local-dev (nie tylko wyliczone): tytuł luzem
   na tle strony, Like/Dislike jako jedna pigułka, Dodaj-do-playlisty/Share
   przestylowane z pełnego różowego .button na te same, stonowane, szare
   pigułki co reszta akcji drugorzędnych, panel Share z własnym JS-toggle
   (zamiast systemu zakładek zaprojektowanego dla dwóch zakładek), .tpov-info-
   -block jako jeden zwijany panel (opis+meta+tagi+szczegóły oceny) z "Read
   more" - reużywa już załadowaną bibliotekę readmore.js motywu-rodzica (ta
   sama co wcześniej, tylko teraz zawsze aktywna, nie warunkowana opcją
   'truncate-description' sprawdzoną jako 'off' na produkcyjnych danych).
   Jedna realna usterka znaleziona i naprawiona PRZED wdrożeniem: pierwsza
   próba zwijania całego .tpov-info-block (nie tylko tekstu opisu) obcinała
   listę tagów w połowie wiersza przy stałej wysokości px - naprawione przez
   zwijanie WYŁĄCZNIE samego opisu (dokładnie tak jak robi to YouTube -
   hashtagi/meta zawsze widoczne, tylko akapit tekstu się skraca).
   ========================================================================== */

/* ==========================================================================
   v1.26 (2026-08-09) - redesign v3, bezpośredni feedback po v1.25:
   1. "Show more" (nie "Read more") teraz odsłania PEŁNY opis ORAZ autor/data
      ORAZ tagi RAZEM, jednym kliknięciem - CSS line-clamp na samym tekście
      (nie biblioteka readmore.js jak w v1.25, która mierzyła wysokość w px i
      dlatego przy zastosowaniu na całym bloku ucinała tagi w połowie wiersza).
   2. Osobny pasek oceny (.tpov-rating-summary) USUNIĘTY całkowicie - user:
      "we don't need to show this two times". Liczba polubień/niepolubień
      teraz PRZY samych przyciskach Like/Dislike (tpov_reco_render_post_like_
      link() w account-data.php, wtyczka).
   3. Znaleziona i naprawiona realna przyczyna niespójnej wysokości pigułek w
      rzędzie akcji: motyw-rodzic ma `span.post-like { font-size: 1.3em }`,
      przez co nasze `height: 2.6em` liczyło się względem powiększonego
      kontekstu (54px) zamiast zwykłych ~42px jak reszta pigułek - naprawione
      przez font-size:1em na .post-like, nie przez zgadywanie sztywnych pikseli.
   4. "Liczby nie działają" - realny bug w tpov_reco_render_post_like_link():
      gałąź "już zagłosował" zwracała PUSTY <span></span> (zero widocznych
      liczb, nie tylko brak aktualizacji) - teraz renderuje te same ikony+
      liczby jako zwykłe (nieklikalne) <span>, z podświetleniem tego na co
      faktycznie zagłosowano.
   5. Serce ulubionych - user: "should be way bigger, to match the size of
      buttons, not the size of texts" - dostało teraz TĘ SAMĄ pigułkową
      stylistykę (tło, padding, wysokość) co Dodaj do playlisty/Share, zamiast
      bycia samą ikoną bez tła (wcześniejsza, jeszcze wcześniejsza decyzja
      usera "bez kółka" - świadomie nadpisana tym nowym, wprost feedbackiem).
   Wszystko zweryfikowane na żywo na local-dev (nie tylko wyliczone) - patrz
   historia sesji po dokładne zmierzone wartości przed/po.
   ========================================================================== */

/* ==========================================================================
   v1.27 (2026-08-09) - redesign v4, bezpośredni feedback po v1.26:
   1. Napis "Like" usunięty z przycisku Like - sama ikona + liczba zostaje
      (title="" nadal niesie znaczenie dla czytników ekranu).
   2. Serce ulubionych - user COFNĄŁ v1.26's decyzję ("shouldn't have the
      background button, the heart itself should just be bigger, and now I
      think it should also be bold") - .tpov-fav-btn-standalone wraca do
      SAMEJ ikony bez tła/pigułki (background:none), font-size 1.1em -> 1.7em,
      "pogrubienie" symulowane przez text-shadow (FontAwesome 4 to statyczne
      glify, font-weight nie ma na nie wpływu).
   3. Like/Dislike teraz wspierają zmianę/cofnięcie głosu (kliknięcie tego
      samego usuwa głos, kliknięcie drugiego przełącza) - zero nowego CSS
      potrzebne tutaj, .tpov-voted (już istniejąca klasa) po prostu przełącza
      się między przyciskami zamiast być trwałym stanem "już zagłosował".
   Backend (wtyczka, includes/account-data.php) + JS (assets/js/tpov-theme-
   -fixes.js) - patrz zmiany w tpov-recommendations.php dla pełnego opisu,
   w tym realnego buga znalezionego i naprawionego PRZED wdrożeniem: COUNT(*)
   na wp_tpov_video_reactions jako "przeliczenie liczników" (wprowadzone
   2026-08-07, nigdy nie wdrożone na produkcję) zerowało historyczne liczby
   polubień przy pierwszym głosie oddanym przez ten system - zastąpione
   atomowym SQL-owym +/-1 na już istniejącym liczniku postmeta.
   ========================================================================== */

/* ==========================================================================
   v1.28 (2026-08-09) - dwie poprawki z audytu (Fable 5, AUDIT.md, mobile/UX +
   performance) - fixed, nie tylko przeanalizowane:
   1. Panel Share renderował się już ROZWINIĘTY na mobile (≤767px) - motyw-
      rodzic ma WŁASNĄ regułę `@media(max-width:767.98px) #video-share
      {display:block}` (selektor ID) która wygrywała z naszym
      `.tab-content>div{display:none}` (klasa - ID zawsze bije klasę,
      niezależnie od media query). `#video-share{display:none}` tutaj ma TĘ
      SAMĄ specyficzność i ładuje się PO arkuszu motywu-rodzica (kolejność
      enqueue w functions.php) - wygrywa przez kolejność w kaskadzie, bez
      !important (który zablokowałby też inline display ustawiany przez JS
      .slideToggle() po kliknięciu). Dotyczy ~50% ruchu (mobile).
   2. Backend fix (plugin, patrz tpov-recommendations.php v1.64) - nie
      dotyczy tego pliku bezpośrednio, ale wymieniony tutaj bo to ten sam
      audytowy przebieg: race warunkowy przy równoległych głosach Like/
      Dislike mógł podwójnie/wielokrotnie zmieniać licznik mimo że tabela
      reakcji (prawdziwe źródło prawdy) miała tylko jeden wiersz.
   ========================================================================== */

/* ==========================================================================
   v1.29 (2026-08-11) - jedna zmiana, w JS (assets/js/tpov-theme-fixes.js
   sekcja 7), nie w CSS: checkbox opt-in maili przywracających wstrzykiwany do
   modala rejestracji (#wpst_registration_form zyje w require'owanym pliku
   motywu-rodzica, poza zasiegiem nadpisan child theme'u). Domyslnie
   ODZNACZONY - dyskrecja > zasieg listy (wczesniejsza decyzja wlascicielki)
   i wymog prawny (pre-zaznaczone zgody niewazne). Zapis po stronie wtyczki:
   tpov_reco_handle_registration_ajax() (accounts.php, plugin v1.67 - patrz
   pelny changelog rundy audytu feedu tam).
   ========================================================================== */
