/*
Theme Name: Tokyo Toybox Child
Theme URI: https://tokyotoybox.pl
Description: Motyw potomny (child theme) dla Tokyo Toybox oparty na Storefront. Zastępuje sekcje zbudowane w Elementorze natywnym designem WordPress + WooCommerce. Edytuj wyłącznie warstwę wizualną w tym motywie.
Author: Tokyo Toybox
Template: storefront
Version: 3.10.0
Text Domain: tokyotoybox-child
*/

/* =========================================================
   ZMIENNE / KOLORY
   ========================================================= */
:root {
	--tt-black: #121212;
	--tt-black-soft: #17151c;
	--tt-topbar: #222222;
	--tt-accent: #ff3f3f;
	--tt-accent-2: #00e5ff;
	--tt-jp-red: #e2231a;
	--tt-white: #ffffff;
	--tt-gray-text: #cfcfcf;
	--tt-gray-light: #f5f5f5;
	/* Russo One — mocny, blokowy krój gamingowy do nagłówków, menu,
	   przycisków i UI. Zastąpił Rajdhani, który na tym motywie
	   wyglądał zbyt cienko/nijako. */
	--tt-font-heading: "Russo One", sans-serif;
	/* Titan One — jeszcze grubszy, "zabawkowy" krój zarezerwowany
	   WYŁĄCZNIE do największych napisów (tytuł hero, hasło w stopce) —
	   użyty wszędzie byłby zbyt ciężki do czytania w mniejszych rozmiarach. */
	--tt-font-display: "Titan One", "Russo One", sans-serif;
	/* Roboto zdejmujemy CAŁKOWICIE ze strony — zgłoszenie: "nie pasuje".
	   Chakra Petch to techniczny, "retro-terminalowy" krój (kwadratowe
	   litery, lekko sci-fi), który trzyma ten sam klimat co Russo
	   One/Press Start 2P, ale w normalnej grubości (400) nadaje się do
	   dłuższych akapitów — nie wygląda pogrubiony jak Russo One. */
	--tt-font-body: "Chakra Petch", sans-serif;
	--tt-font-pixel: "Press Start 2P", cursive;
}

body,
button,
input,
select,
textarea {
	font-family: var(--tt-font-body);
}

/* =========================================================
   TŁO CAŁEJ STRONY — deseń pikselartowych ikonek (serduszko, gwiazdka/
   iskierka, moneta, krzyż d-pada) w klimacie retro-arcade 8-bit, zamiast
   poprzedniego wzoru trójkąt/kółko/kwadrat/krzyżyk — ten kojarzył się
   zbyt jednoznacznie z przyciskami kontrolera PlayStation. Ikonki
   zbudowane z twardych, prostokątnych bloków (bez zaokrągleń/krzywych),
   żeby faktycznie wyglądały jak pixel art, nie jak gładkie kształty.
   Dajemy je na body jako bazę, a sekcjom z WŁASNYM jednolitym tłem
   (białym/jasnoszarym/czarnym) dokładamy ten sam deseń osobno — bo
   solidny background-color na sekcji i tak zasłoniłby wzór z body. Dwa
   warianty (jasny/ciemny) jako zmienne, żeby nie powtarzać długiego
   data-URI wszędzie. ZGŁOSZENIE "za grube/za masywne": pierwsza wersja
   miała bloki 4px na kafelku 160px — zbyt ciężkie, dominowały nad
   resztą strony zamiast być subtelną fakturą. Bloki zmniejszone do 2px
   (ikonki są teraz o połowę mniejsze), opacity też lekko ściągnięte
   (0.10/0.09 -> 0.07/0.06), kafelek powiększony do 200x200, żeby
   ikonek było mniej na ekranie i miały więcej pustej przestrzeni wokół.
   ========================================================= */
:root {
	--tt-pattern-dark: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22200%22%20height%3D%22200%22%3E%3Crect%20x%3D%2222%22%20y%3D%2216%22%20width%3D%224%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2228%22%20y%3D%2216%22%20width%3D%224%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2220%22%20y%3D%2218%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2220%22%20y%3D%2220%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2220%22%20y%3D%2222%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2222%22%20y%3D%2224%22%20width%3D%2210%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2224%22%20y%3D%2226%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2226%22%20y%3D%2228%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22154%22%20y%3D%2224%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22154%22%20y%3D%2226%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22150%22%20y%3D%2228%22%20width%3D%2210%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22154%22%20y%3D%2230%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22154%22%20y%3D%2232%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2236%22%20y%3D%22140%22%20width%3D%2210%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22142%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22144%22%20width%3D%224%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2240%22%20y%3D%22144%22%20width%3D%228%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22146%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22148%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22150%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%2236%22%20y%3D%22152%22%20width%3D%2210%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22156%22%20y%3D%22148%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22156%22%20y%3D%22150%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22152%22%20y%3D%22152%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22152%22%20y%3D%22154%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22152%22%20y%3D%22156%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22156%22%20y%3D%22158%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3Crect%20x%3D%22156%22%20y%3D%22160%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%2818%2C18%2C18%2C0.07%29%22%2F%3E%3C%2Fsvg%3E");
	--tt-pattern-light: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22200%22%20height%3D%22200%22%3E%3Crect%20x%3D%2222%22%20y%3D%2216%22%20width%3D%224%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2228%22%20y%3D%2216%22%20width%3D%224%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2220%22%20y%3D%2218%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2220%22%20y%3D%2220%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2220%22%20y%3D%2222%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2222%22%20y%3D%2224%22%20width%3D%2210%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2224%22%20y%3D%2226%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2226%22%20y%3D%2228%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22154%22%20y%3D%2224%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22154%22%20y%3D%2226%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22150%22%20y%3D%2228%22%20width%3D%2210%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22154%22%20y%3D%2230%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22154%22%20y%3D%2232%22%20width%3D%222%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2236%22%20y%3D%22140%22%20width%3D%2210%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22142%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22144%22%20width%3D%224%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2240%22%20y%3D%22144%22%20width%3D%228%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22146%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22148%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2234%22%20y%3D%22150%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%2236%22%20y%3D%22152%22%20width%3D%2210%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22156%22%20y%3D%22148%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22156%22%20y%3D%22150%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22152%22%20y%3D%22152%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22152%22%20y%3D%22154%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22152%22%20y%3D%22156%22%20width%3D%2214%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22156%22%20y%3D%22158%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3Crect%20x%3D%22156%22%20y%3D%22160%22%20width%3D%226%22%20height%3D%222%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.06%29%22%2F%3E%3C%2Fsvg%3E");
}

body {
	background-color: var(--tt-white);
	background-image: var(--tt-pattern-dark);
	background-size: 200px 200px;
}

/* UWAGA: .tt-usp / .tt-import / .tt-series / .site-footer mają WŁASNE,
   późniejsze reguły `background: <kolor>` (skrót), które zerują
   background-image. Wzór dla nich jest doklejony bezpośrednio przy
   tamtych regułach (szukaj "deseń retro" niżej w pliku), żeby uniknąć
   nadpisania przez kaskadę. */

h1, h2, h3, h4, h5, h6 {
	font-family: var(--tt-font-heading);
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.02em;
}

a {
	transition: color 0.2s ease, background-color 0.2s ease;
}

/* =========================================================
   TOPBAR (pasek "darmowa dostawa")
   ========================================================= */
/* Topbar w TYM SAMYM kolorze i z tym samym wzorem kropek co header —
   wcześniej był o jeden odcień jaśniejszy (--tt-topbar), przez co
   wyglądał jak osobny, "doklejony" pasek zamiast naturalnego
   przedłużenia headera. */
.tt-topbar {
	background-color: var(--tt-black);
	background-image: var(--tt-pattern-light);
	background-size: 200px 200px;
	color: var(--tt-white);
}

.tt-topbar .col-full {
	/* mniejszy padding = mniejszy wizualny odstęp od headera poniżej */
	padding-top: 7px;
	padding-bottom: 7px;
	text-align: center;
}

.tt-topbar p {
	margin: 0;
	font-size: 0.85rem;
	letter-spacing: 0.03em;
}

/* =========================================================
   HEADER
   ========================================================= */
.site-header {
	background-color: var(--tt-black);
	border-bottom: none;
	/* sticky zamiast relative: header ma zostawać przyklejony do góry
	   podczas scrollowania. Sticky nadal tworzy kontekst pozycjonowania
	   dla .site-header::after (neonowa kreska), więc nic więcej się nie
	   psuje. Topbar "darmowa dostawa" NIE jest sticky — celowo znika po
	   przewinięciu, żeby przyklejony pasek nie zajmował zbyt dużo miejsca. */
	position: sticky;
	top: 0;
	z-index: 999;
	background-image: var(--tt-pattern-light);
	background-size: 200px 200px;
}

/* STICKY HEADER NIE DZIAŁAŁ: Storefront ustawia `.site { overflow-x:
   hidden; }` na wrapperze #page. Sama obecność overflow-x:hidden bez
   jawnego overflow-y sprawia, że przeglądarka automatycznie liczy
   overflow-y jako "auto" (to standardowa pułapka CSS) — a jeśli
   NAJBLIŻSZY przewijalny przodek elementu ma overflow inny niż
   "visible", position:sticky przestaje działać względem okna i
   przestaje się "przyklejać". Bezpieczeństwo przed poziomym
   scrollem (potrzebne przez nasze pełnoszerokie sekcje 100vw) i tak
   już zapewnia `body { overflow-x: hidden; }`, więc na .site możemy
   bez ryzyka zresetować overflow do "visible". */
.site {
	overflow-x: visible !important;
	overflow-y: visible !important;
}

/* HEADER "PRZYKLEJONY DO DOŁU": Storefront daje .site-header
   padding-top/padding-bottom: 1.618em, ale w praktyce (przez responsywne
   reguły motywu dot. sticky/handheld nav) wychodziło z tego asymetryczne
   ~42px górą i 0 dołem — logo i menu wisiały tuż nad neonową kreską
   zamiast być wyśrodkowane. .tt-header-inner ma WŁASNY, symetryczny
   padding (14px/14px), więc zerujemy padding na samym .site-header i
   całą pionową przestrzeń oddajemy w ręce .tt-header-inner. */
.site-header {
	padding-top: 0 !important;
	padding-bottom: 0 !important;
}

/* Dwukolorowa kreska pod headerem — nawiązanie do retro/arcade krawędzi
   (neonowa ramka CRT), zamiast płaskiej, nudnej linii.
   DWIE PUŁAPKI, na które tu trafiliśmy (obie z tej samej rodziny co
   .col-full/.products — Storefront wszędzie doczepia clearfix
   ::before/::after z `display: table`):
   1) Musi siedzieć W ŚRODKU boxa headera (bottom: 0, nie -4px) — jeśli
      wystaje poza jego granicę, kolejny element strony (renderowany
      później w dokumencie) zamalowuje ją swoim tłem.
   2) Storefront ma WŁASNY clearfix `.site-header::after { display:
      table; }`. Skoro nie nadpisaliśmy jawnie `display`, ta wartość
      się odziedziczyła i element (jako tabela, nie blok) zignorował
      rozciąganie na pełną szerokość przez left/right — stąd kreska
      była niewidoczna mimo poprawnych pozostałych właściwości.
      Trzeba jawnie wymusić `display: block`. */
.site-header::after {
	content: "";
	display: block;
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 4px;
	/* "ŻYWY" LED: pasek to teraz powtarzający się gradient dwa razy
	   szerszy niż element (background-size:200%), którego pozycję
	   animujemy — efekt płynących, przesuwających się świateł (jak listwa
	   RGB w obudowie PC), plus osobna animacja pulsującego blasku
	   (box-shadow/brightness) nałożona na to samo. Dwie niezależne
	   animacje na jednym elemencie = ruch koloru + oddychające światło. */
	background: linear-gradient(
		90deg,
		var(--tt-accent) 0%, var(--tt-accent) 20%,
		var(--tt-accent-2) 30%, var(--tt-accent-2) 45%,
		var(--tt-accent) 55%, var(--tt-accent) 70%,
		var(--tt-accent-2) 80%, var(--tt-accent-2) 100%
	);
	background-size: 200% 100%;
	animation: tt-led-flow 3.2s linear infinite, tt-led-pulse 2.1s ease-in-out infinite;
}

@keyframes tt-led-flow {
	0% { background-position: 0% 0; }
	100% { background-position: -200% 0; }
}

@keyframes tt-led-pulse {
	0%, 100% {
		box-shadow: 0 0 6px 0 rgba(255, 63, 63, 0.5), 0 0 10px 0 rgba(0, 229, 255, 0.3);
		filter: brightness(1);
	}
	50% {
		box-shadow: 0 0 16px 1px rgba(255, 63, 63, 0.8), 0 0 20px 1px rgba(0, 229, 255, 0.6);
		filter: brightness(1.3);
	}
}

@media (prefers-reduced-motion: reduce) {
	.site-header::after {
		animation: none;
	}
}

/* PRZERWA MIĘDZY HEADEREM A HERO: Storefront dokleja
   `.home.page:not(.page-template-template-homepage) .site-header {
   margin-bottom: 4.2358em; }` — zakłada, że strona główna to zwykły
   blog i zostawia miejsce nad listą wpisów. Nasz front-page.php nie
   jest rozpoznawany jako "template-homepage", więc ta reguła się
   uruchamiała i wstawiała ~68px pustej, białej przerwy tuż nad hero.
   Zerujemy ją jawnie (Storefrontowy selektor ma wysoką specyficzność,
   stąd !important). */
.site-header {
	margin-bottom: 0 !important;
}

/* PRZYCIĘTE LOGO: ta reguła (z oryginalnego motywu) miała zerować
   domyślny padding Storefronta na .col-full wewnątrz headera, ale
   .tt-header-inner NOSI OBIE klasy na raz ("tt-header-inner col-full"),
   więc selektor `.site-header .col-full` (specyficzność 0,2,0) też
   trafiał w NASZ własny `.tt-header-inner { padding: 18px 0; }`
   (specyficzność 0,1,0) i wygrywał, zerując go do 0. Efekt: logo
   stykało się z górną/dolną krawędzią headera — a dolna krawędź to
   dokładnie tam, gdzie rysuje się neonowa kreska, więc wyglądało na
   "przycięte". Wykluczamy .tt-header-inner z tej reguły. */
.site-header .col-full:not(.tt-header-inner) {
	padding-top: 0;
	padding-bottom: 0;
}

.tt-header-inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 20px;
	padding: 14px 0;
}

.tt-branding {
	display: flex;
	align-items: center;
}

.tt-branding .tt-logo,
.tt-branding img,
.tt-branding .custom-logo {
	max-height: 60px !important;
	width: auto !important;
	height: auto;
	display: block;
}

.tt-primary-navigation {
	flex: 1 1 auto;
	display: flex;
	justify-content: center;
}

.tt-menu {
	display: flex;
	align-items: center;
	gap: 30px;
	list-style: none;
	margin: 0;
	padding: 0;
}

.tt-menu > li {
	position: relative;
}

/* Separator w stylu "START HERE | THE VAULT | ..." — pochylona kreska
   między pozycjami menu zamiast zwykłego znaku "|", żeby pasowała do
   dynamicznej, "rozjechanej" stylistyki retro reszty motywu. */
.tt-menu > li:not(:last-child)::after {
	content: "";
	position: absolute;
	top: 50%;
	right: -16px;
	width: 2px;
	height: 14px;
	background: var(--tt-accent-2);
	opacity: 0.55;
	transform: translateY(-50%) rotate(14deg);
}

.tt-menu li a {
	color: var(--tt-white);
	text-decoration: none;
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	font-size: 1.05rem;
	letter-spacing: 0.02em;
}

.tt-menu li a:hover {
	color: var(--tt-accent);
}

.tt-menu li.menu-item-has-children > a::after {
	content: "";
	display: inline-block;
	margin-left: 6px;
	width: 6px;
	height: 6px;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
	transform: rotate(45deg);
}

.tt-menu .sub-menu {
	list-style: none;
	margin: 0;
	padding: 10px 0;
	background: var(--tt-black);
	position: absolute;
	min-width: 200px;
	box-shadow: 0 12px 24px rgba(0, 0, 0, 0.35);
	opacity: 0;
	visibility: hidden;
	transform: translateY(6px);
	transition: all 0.15s ease;
}

.tt-menu li.menu-item-has-children:hover > .sub-menu {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
}

.tt-menu .sub-menu li a {
	display: block;
	padding: 8px 20px;
}

.tt-header-actions {
	display: flex;
	align-items: center;
	gap: 18px;
}

/* HAMBURGER — chowany na desktopie (menu mieści się w jednym rzędzie),
   pokazywany dopiero poniżej breakpointu, w którym pozycje menu
   ("SKLEP / RETRO PRODUKTY / POKEMON / O NAS / KONTAKT") przestają się
   mieścić i zaczynają się łamać na kilka linijek — patrz media query
   niżej. Trzy kreski zmieniają się w "X" przez CSS (bez dodatkowych
   ikon/SVG), sama logika otwierania/zamykania w tt-bouncer.js. */
.tt-nav-toggle {
	display: none;
	flex-direction: column;
	justify-content: center;
	align-items: center;
	gap: 5px;
	width: 38px;
	height: 38px;
	background: transparent;
	border: 2px solid var(--tt-white);
	border-radius: 2px;
	padding: 0;
	cursor: pointer;
	order: -1;
}

.tt-nav-toggle__bar {
	display: block;
	width: 16px;
	height: 2px;
	background: var(--tt-white);
	transition: transform 0.2s ease, opacity 0.2s ease;
}

.tt-nav-toggle:hover {
	border-color: var(--tt-accent-2);
}

.tt-nav-toggle:hover .tt-nav-toggle__bar {
	background: var(--tt-accent-2);
}

.tt-nav-toggle[aria-expanded="true"] .tt-nav-toggle__bar:nth-child(1) {
	transform: translateY(7px) rotate(45deg);
}

.tt-nav-toggle[aria-expanded="true"] .tt-nav-toggle__bar:nth-child(2) {
	opacity: 0;
}

.tt-nav-toggle[aria-expanded="true"] .tt-nav-toggle__bar:nth-child(3) {
	transform: translateY(-7px) rotate(-45deg);
}

.tt-account-link,
.tt-cart-link {
	color: var(--tt-white);
	display: inline-flex;
	position: relative;
}

.tt-account-link svg,
.tt-cart-link svg {
	width: 22px;
	height: 22px;
	fill: currentColor;
}

.tt-account-link:hover,
.tt-cart-link:hover {
	color: var(--tt-accent);
}

/* DYMEK Z LICZBĄ SZTUK W KOSZYKU: pusty <span> (patrz
   tokyotoybox_cart_count_badge() w functions.php) jest chowany przez
   :empty, więc gdy koszyk jest pusty, nie widać żadnego kółka — dopiero
   pierwszy dodany produkt je pokazuje. Aktualizuje się na żywo przez
   WooCommerce AJAX cart fragments, bez przeładowania strony. */
.tt-cart-count {
	position: absolute;
	top: -8px;
	right: -10px;
	min-width: 18px;
	height: 18px;
	padding: 0 4px;
	display: flex;
	align-items: center;
	justify-content: center;
	background: var(--tt-accent);
	color: var(--tt-white);
	border: 2px solid var(--tt-black);
	border-radius: 50%;
	font-family: var(--tt-font-heading);
	font-size: 0.65rem;
	line-height: 1;
	box-shadow: 0 0 8px rgba(255, 63, 63, 0.6);
	pointer-events: none;
}

.tt-cart-count:empty {
	display: none;
}

/* "Wskoczenie" produktu do koszyka: klasa .tt-cart-bump jest dopinana
   przez tt-bouncer.js na .tt-cart-link w momencie zdarzenia jQuery
   "added_to_cart" (odpala je sam WooCommerce po udanym AJAX-owym
   dodaniu) — ikonka podskakuje/kołysze się, a dymek z liczbą robi
   wyraźny "pop", żeby zmiana liczby rzuciła się w oczy zamiast cicho
   podmienić się w tle. */
.tt-cart-link.tt-cart-bump {
	animation: tt-cart-jump 0.5s ease;
}

.tt-cart-link.tt-cart-bump .tt-cart-count {
	animation: tt-cart-count-pop 0.5s ease;
}

@keyframes tt-cart-jump {
	0% {
		transform: translateY(0) rotate(0deg);
	}
	25% {
		transform: translateY(-5px) rotate(-10deg);
	}
	50% {
		transform: translateY(0) rotate(8deg);
	}
	75% {
		transform: translateY(-2px) rotate(-4deg);
	}
	100% {
		transform: translateY(0) rotate(0deg);
	}
}

@keyframes tt-cart-count-pop {
	0% {
		transform: scale(1);
		box-shadow: 0 0 8px rgba(255, 63, 63, 0.6);
	}
	40% {
		transform: scale(1.55);
		box-shadow: 0 0 18px rgba(255, 63, 63, 0.95);
	}
	70% {
		transform: scale(0.92);
	}
	100% {
		transform: scale(1);
		box-shadow: 0 0 8px rgba(255, 63, 63, 0.6);
	}
}

@media (prefers-reduced-motion: reduce) {
	.tt-cart-link.tt-cart-bump,
	.tt-cart-link.tt-cart-bump .tt-cart-count {
		animation: none;
	}
}

/* =========================================================
   MENU MOBILNE — poniżej ok. 860px pozycje menu ("SKLEP / RETRO
   PRODUKTY / POKEMON / O NAS / KONTAKT") przestają się mieścić w
   jednym rzędzie i zaczynają się łamać w środku słów (patrz zgłoszenie
   "dostosuj pod urządzenia mobilne") — chowamy poziome menu, pokazujemy
   hamburger, a po kliknięciu menu wysuwa się jako pełnoszerokościowy,
   pionowy panel pod headerem. Breakpoint 860px, nie 600px, bo to
   właśnie przy szerokościach tabletowych menu zaczynało się rwać —
   telefony są tym bardziej objęte tą samą regułą.
   ========================================================= */
@media (max-width: 860px) {
	.tt-nav-toggle {
		display: flex;
	}

	.tt-primary-navigation {
		display: none;
		flex-basis: 100%;
		order: 4;
		justify-content: flex-start;
	}

	.tt-primary-navigation.is-open {
		display: block;
	}

	.tt-menu {
		flex-direction: column;
		align-items: stretch;
		gap: 0;
		width: 100%;
		padding: 6px 0 14px;
	}

	.tt-menu > li {
		border-top: 1px solid rgba(255, 255, 255, 0.12);
	}

	.tt-menu > li:not(:last-child)::after {
		display: none;
	}

	.tt-menu li a {
		display: block;
		padding: 14px 4px;
		font-size: 1rem;
	}

	.tt-menu li.menu-item-has-children > a::after {
		float: right;
		margin-top: 6px;
		transform: rotate(45deg);
		transition: transform 0.15s ease;
	}

	.tt-menu li.menu-item-has-children.tt-submenu-open > a::after {
		transform: rotate(-135deg);
	}

	/* Na dotyku nie ma hover — podmenu chowane/pokazywane wyłącznie
	   przez klasę dopinaną w JS (pierwsze dotknięcie linku-rodzica). */
	.tt-menu .sub-menu {
		position: static;
		opacity: 1;
		visibility: visible;
		transform: none;
		box-shadow: none;
		background: rgba(255, 255, 255, 0.04);
		min-width: 0;
		padding: 0;
		display: none;
	}

	.tt-menu li.menu-item-has-children.tt-submenu-open > .sub-menu {
		display: block;
	}

	.tt-menu .sub-menu li a {
		padding: 12px 4px 12px 20px;
	}

	.tt-header-inner {
		padding: 12px 0;
	}

	.tt-branding .tt-logo,
	.tt-branding img,
	.tt-branding .custom-logo {
		max-height: 46px !important;
	}
}

/* =========================================================
   FRONT PAGE — sekcje ogólne
   ========================================================= */
.tt-front-page section {
	padding: 60px 0;
}

.tt-front-page h2 {
	text-align: center;
	font-size: 2rem;
	margin-bottom: 36px;
}

/* =========================================================
   FULL-BLEED — Storefront domyślnie wsadza treść strony w kontener
   o ograniczonej szerokości (.col-full). Sekcje z ciemnym tłem mają
   sięgać brzegów ekranu, więc "wyłamujemy" je z tego kontenera
   niezależnie od tego, jak szeroki jest rodzic.
   ========================================================= */
.tt-hero,
.tt-series,
.tt-figures,
.tt-retro,
.tt-featured-products {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
}

/* =========================================================
   BOUNCER — piksel-artowe ikonki odbijające się od krawędzi sekcji
   jak klasyczny wygaszacz DVD (patrz tt-bouncer.js). Same z siebie są
   tylko statycznie ustawionym elementem w rogu (position: 0,0) —
   cały ruch dopisuje JS przez transform:translate(), żeby CSS
   pozostawał prostym fallbackiem gdy JS/reduced-motion jest wyłączony.
   ========================================================= */
.tt-bouncer {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 1;
	pointer-events: none;
	opacity: 0.6;
	color: var(--tt-accent);
	will-change: transform;
}

.tt-bouncer svg {
	display: block;
	width: 100%;
	height: 100%;
	fill: currentColor;
	filter: drop-shadow(0 0 6px currentColor);
}

.tt-bouncer-diamond,
.tt-bouncer-heart {
	width: 30px;
	height: 30px;
}

.tt-bouncer-invader {
	width: 40px;
	height: 29px;
}

/* Druga ikonka w każdej sekcji (start z prawej) dodatkowo się kręci —
   .tt-bouncer-spinner to wewnętrzny wrapper, który dostaje WŁASNĄ,
   ciągłą animację rotacji; zewnętrzny .tt-bouncer nadal tylko
   przesuwa się (JS, translate), więc oba transformy się nie gryzą —
   obrót dzieje się "w miejscu" wewnątrz przesuwanego pudełka. */
.tt-bouncer-spinner {
	width: 100%;
	height: 100%;
}

.tt-bouncer-spin .tt-bouncer-spinner {
	animation: tt-spin 2.6s linear infinite;
}

@keyframes tt-spin {
	from { transform: rotate(0deg); }
	to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
	.tt-bouncer-spin .tt-bouncer-spinner {
		animation: none;
	}
}

/* Mały "pop" (squash/stretch) w momencie odbicia — dodaje wrażenia
   fizyki zamiast płaskiej, mechanicznej zmiany kierunku. */
@keyframes tt-bounce-pop {
	0% { transform: scale(1); }
	40% { transform: scale(1.35); }
	100% { transform: scale(1); }
}

.tt-bouncer.tt-bounce-pop svg {
	animation: tt-bounce-pop 0.18s ease;
}

/* Sekcje jasne (USP, tt-worlds) nie mają bouncerów, więc bez obaw o
   kontrast — ale gdyby ktoś kiedyś dodał go na jasnym tle, delikatnie
   przyciemniamy cień zamiast poświaty. Nieużywane teraz, zostawione
   jako haczyk na przyszłość: */
.tt-usp .tt-bouncer svg,
.tt-worlds .tt-bouncer svg {
	filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.35));
}

@media (prefers-reduced-motion: reduce) {
	.tt-bouncer {
		display: none;
	}
}

/* SEKCJE Z GRIDAMI PRODUKTÓW ZA WĄSKIE: cały motyw dzieli jeden,
   wspólny .col-full (max-width ok. 1064px) ze Storefronta — dobry dla
   tekstu (hero, USP), ale przy 5-kolumnowym gridzie kart zostawiał
   mnóstwo pustego miejsca po bokach i ściskał karty. Poszerzamy
   kontener WYŁĄCZNIE w sekcjach z gridami produktów (reszta strony —
   header, hero, USP, stopka — zostaje przy oryginalnej szerokości). */
.tt-featured-products .col-full,
.tt-retro .col-full {
	max-width: 1440px;
}

/* =========================================================
   NAGŁÓWKI SEKCJI + EFEKT "GLITCH" NA HOVER
   ========================================================= */
.tt-eyebrow {
	font-family: var(--tt-font-pixel);
	font-size: 0.6rem;
	letter-spacing: 0.1em;
	color: var(--tt-accent);
	margin: 0 0 14px;
	text-align: center;
}

.tt-eyebrow-light {
	color: var(--tt-accent-2);
}

.tt-section-title {
	position: relative;
	display: inline-block;
	width: 100%;
}

.tt-section-title-light {
	color: var(--tt-white);
}

.tt-section-subtitle {
	text-align: center;
	max-width: 620px;
	margin: -20px auto 36px;
	color: #666;
	font-family: var(--tt-font-body);
	text-transform: none;
	letter-spacing: normal;
	font-size: 0.98rem;
}

.tt-section-subtitle-light {
	color: var(--tt-gray-text);
}

/* NEON FLICKER — druga wersja. Pierwsza (na hover, cykl 2.2s ze zbyt
   gęstymi/regularnymi mrugnięciami) dalej wyglądała "falująco/epileptycznie".
   Zgłoszenie: ma migać CAŁY CZAS (nie na hover), wolno, w konkretnym,
   "zepsuty neon" rytmie: mrugnięcie → przerwa ~0.5s → podwójne mrugnięcie
   → przerwa ~1s → pojedyncze mrugnięcie → długa przerwa → od nowa.
   Zbudowane jako jeden cykl @keyframes na osi czasu 5s (żeby dało się
   dokładnie odwzorować odstępy w milisekundach), animacja działa
   NIEZALEŻNIE od hover — .tt-glitch świeci się i miga zawsze. */
.tt-glitch {
	position: relative;
	display: inline-block;
	animation: tt-neon-flicker 5s ease-in-out infinite;
	/* NAPIS ZUPEŁNIE NIECZYTELNY: blur na text-shadow (dawniej do 60-90px)
	   przy grubym, blokowym Titan One zwyczajnie zlewał sąsiednie litery
	   w jedną białą plamę bez żadnych czytelnych kształtów — nie tylko w
	   Safari (tam WebKit dodatkowo rozmywa cienie mocniej niż Chrome przy
	   tych samych wartościach, pogłębiając problem). Cienki, ciemny stroke
	   wokół liter daje twardą, zawsze widoczną krawędź NIEZALEŻNIE od
	   tego, jak mocno dana przeglądarka rozmywa poświatę wokół niej. */
	-webkit-text-stroke: 1px rgba(0, 0, 0, 0.45);
}

@keyframes tt-neon-flicker {
	/* stan "zapalony" — blur mocno zmniejszony (był 8/18/34/60px) i
	   ograniczony do 3 warstw zamiast 4, żeby poświata otaczała litery
	   zamiast je zalewać/sklejać ze sobą */
	0%, 1.5%, 3.3%, 13%, 14.7%, 16.7%, 18.3%, 38%, 39.7%, 100% {
		opacity: 1;
		text-shadow:
			0 0 3px rgba(255, 255, 255, 0.85),
			0 0 10px var(--tt-accent),
			0 0 18px var(--tt-accent-2);
	}
	/* KRÓTKI "SKOK NAPIĘCIA" tuż po powrocie z każdego mrugnięcia — zamiast
	   płynnie wracać do normalnego blasku, neon na ułamek sekundy
	   "przepala się" jaśniej (biały rozbłysk), jakby prąd wracał ze
	   skokiem, a dopiero potem się stabilizuje. To razem ze skrą (::after
	   niżej) daje wrażenie zwarcia, nie tylko zgaszenia/zapalenia. Blur
	   również mocno przycięty (był do 90px) z tego samego powodu co wyżej. */
	3.1% {
		opacity: 1;
		text-shadow:
			0 0 3px #fff,
			0 0 8px #fff,
			0 0 16px var(--tt-accent-2),
			0 0 26px var(--tt-accent-2);
	}
	14.6% {
		opacity: 1;
		text-shadow:
			0 0 3px #fff,
			0 0 8px #fff,
			0 0 16px var(--tt-accent-2),
			0 0 26px var(--tt-accent-2);
	}
	16.6% {
		opacity: 1;
		text-shadow:
			0 0 3px #fff,
			0 0 8px #fff,
			0 0 16px var(--tt-accent-2),
			0 0 26px var(--tt-accent-2);
	}
	39.6% {
		opacity: 1;
		text-shadow:
			0 0 3px #fff,
			0 0 8px #fff,
			0 0 16px var(--tt-accent-2),
			0 0 26px var(--tt-accent-2);
	}
	/* pojedyncze mrugnięcie (~0.1s) */
	2% {
		opacity: 0.25;
		text-shadow: none;
	}
	/* przerwa ~0.5s (3% -> 13% na osi 5s), potem podwójne mrugnięcie */
	13.7% {
		opacity: 0.25;
		text-shadow: none;
	}
	15.5% {
		opacity: 0.25;
		text-shadow: none;
	}
	/* przerwa ~1s (18% -> 38% na osi 5s), potem pojedyncze mrugnięcie */
	38.7% {
		opacity: 0.25;
		text-shadow: none;
	}
}

/* ISKRA / "ZWARCIE" — mały, poszarpany błysk energii (kształt pioruna)
   pojawiający się dokładnie w momentach mrugnięcia, tuż przy napisie —
   jakby w tym miejscu faktycznie przeskoczył prąd. ::after było wolne
   (stary efekt RGB-split z ::before/::after już nie istnieje), więc
   nie koliduje z niczym innym. */
.tt-glitch::after {
	content: "";
	position: absolute;
	top: -10%;
	right: -7%;
	width: 26px;
	height: 30px;
	background: radial-gradient(circle, #ffffff 0%, var(--tt-accent-2) 45%, transparent 75%);
	clip-path: polygon(45% 0%, 70% 0%, 40% 42%, 68% 42%, 25% 100%, 42% 50%, 12% 50%);
	opacity: 0;
	pointer-events: none;
	filter: drop-shadow(0 0 6px var(--tt-accent-2)) drop-shadow(0 0 16px #ffffff);
	transform: scale(0.5) rotate(-8deg);
	animation: tt-spark 5s ease-in-out infinite;
}

@keyframes tt-spark {
	0%, 1.7%, 2.3%, 13.4%, 14%, 15.2%, 15.8%, 38.4%, 39%, 100% {
		opacity: 0;
		transform: scale(0.5) rotate(-8deg);
	}
	2%, 13.7%, 15.5%, 38.7% {
		opacity: 1;
		transform: scale(1.2) rotate(6deg);
	}
}

@media (prefers-reduced-motion: reduce) {
	.tt-glitch {
		animation: none;
	}

	.tt-glitch::after {
		animation: none;
		opacity: 0;
	}
}

/* =========================================================
   BUTTONS
   ========================================================= */
.tt-btn {
	display: inline-block;
	padding: 13px 30px;
	text-decoration: none;
	font-family: var(--tt-font-heading);
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	border-radius: 2px;
	border: 2px solid transparent;
	font-size: 0.95rem;
	transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease, color 0.15s ease;
}

.tt-btn:hover {
	transform: translateY(-2px);
}

.tt-btn-solid {
	background: var(--tt-accent);
	border-color: var(--tt-accent);
	color: var(--tt-white);
}

.tt-btn-solid:hover {
	box-shadow: 0 6px 22px rgba(255, 63, 63, 0.45);
	color: var(--tt-white);
}

.tt-btn-outline {
	background: transparent;
	border-color: var(--tt-white);
	color: var(--tt-white);
}

.tt-btn-outline:hover {
	background: var(--tt-white);
	color: var(--tt-black);
}

.tt-btn-outline-light {
	background: transparent;
	border-color: var(--tt-accent-2);
	color: var(--tt-accent-2);
}

.tt-btn-outline-light:hover {
	background: var(--tt-accent-2);
	color: var(--tt-black);
}

/* =========================================================
   HERO
   ========================================================= */
.tt-hero {
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.25), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.15), transparent 40%),
		var(--tt-black);
	color: var(--tt-white);
	overflow: hidden;
	padding: 100px 0 90px;
	text-align: center;
}

.tt-hero-scanlines {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	background: repeating-linear-gradient(
		to bottom,
		rgba(255, 255, 255, 0.05) 0px,
		rgba(255, 255, 255, 0.05) 1px,
		transparent 1px,
		transparent 3px
	);
}

.tt-hero-glow {
	position: absolute;
	z-index: 0;
	top: -20%;
	left: 50%;
	transform: translateX(-50%);
	width: 60vw;
	height: 60vw;
	max-width: 700px;
	max-height: 700px;
	background: radial-gradient(circle, rgba(226, 35, 26, 0.35) 0%, transparent 70%);
	pointer-events: none;
}

.tt-hero-inner {
	position: relative;
	z-index: 1;
}

.tt-hero-title {
	/* Titan One tylko tutaj — najbardziej "krzyczący" napis na stronie
	   zasługuje na najgrubszy krój, reszta nagłówków zostaje na Russo One */
	font-family: var(--tt-font-display);
	font-size: clamp(2.6rem, 6vw, 5rem);
	margin: 0 0 20px;
	letter-spacing: 0.02em;
	color: var(--tt-white) !important;
	text-shadow: 0 0 18px rgba(226, 35, 26, 0.55), 0 0 40px rgba(0, 229, 255, 0.15);
}

.tt-glitch {
	color: var(--tt-white) !important;
}

.tt-hero-subtitle {
	max-width: 560px;
	margin: 0 auto 34px;
	color: var(--tt-gray-text);
	/* Russo One tutaj wyglądało zbyt ciężko/pogrubione jak na dłuższe
	   zdanie — --tt-font-body (Chakra Petch) ma normalną grubość i jest
	   w tym samym, techno-retro klimacie co reszta motywu, więc pasuje
	   lepiej niż zarówno Roboto (za "zwykłe"), jak i Russo One (za grube). */
	font-family: var(--tt-font-body);
	text-transform: none;
	letter-spacing: 0.01em;
	font-size: 1.1rem;
	line-height: 1.7;
}

.tt-hero-actions {
	display: flex;
	gap: 16px;
	justify-content: center;
	flex-wrap: wrap;
}

/* =========================================================
   DWA ŚWIATY — kafle Figurki / Retro
   ========================================================= */
.tt-worlds-grid {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 28px;
}

/* Ramka w stylu neubrutalizmu (ta sama rodzina co kwadraty USP): gruba
   czarna obwódka + twardy, przesunięty cień w kolorze akcentu (czerwony
   dla "Świat Anime", cyjan dla "Retro Zone") — spina te kafle wizualnie
   z resztą strony zamiast zaokrąglonych, "gołych" rogów bez charakteru. */
.tt-world-card {
	position: relative;
	display: block;
	border-radius: 2px;
	overflow: hidden;
	aspect-ratio: 16 / 10;
	text-decoration: none;
	isolation: isolate;
	border: 3px solid var(--tt-black);
	box-shadow: 8px 8px 0 var(--tt-accent);
	transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.tt-world-card:nth-child(2) {
	box-shadow: 8px 8px 0 var(--tt-accent-2);
}

.tt-world-card:hover {
	transform: translate(-4px, -4px);
	box-shadow: 12px 12px 0 var(--tt-accent);
}

.tt-world-card:nth-child(2):hover {
	box-shadow: 12px 12px 0 var(--tt-accent-2);
}

.tt-world-card img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 0.5s ease;
}

.tt-world-card:hover img {
	transform: scale(1.08);
}

/* Nakładka: treść (tag+tytuł+opis+cta) zajmuje niemal CAŁĄ wysokość
   kafla, więc gradient "ciemno na dole, jasno na górze" nie wystarczał —
   górna część tekstu (tytuł) i tak lądowała w zbyt jasnej strefie.
   Zamiast tego: wysoki, jednolity "podłoga" ciemności (62% czerni nawet
   na samej górze) + dodatkowe pogłębienie przy samym dole. Działa
   niezależnie od tego, jak jasne/ciemne i "zabałaganione" jest zdjęcie
   pod spodem (neony, jasne kartridże itp.). */
.tt-world-overlay {
	position: absolute;
	inset: 0;
	background: linear-gradient(0deg, rgba(0, 0, 0, 0.93) 0%, rgba(0, 0, 0, 0.62) 100%);
	display: flex;
	flex-direction: column;
	justify-content: flex-end;
	padding: 28px;
	color: var(--tt-white);
}

/* Tag jako wypełniona "plakietka", nie goły kolorowy tekst na zdjęciu —
   gwarantuje czytelność bez względu na to, co dzieje się w tle (nawet
   przy czerwonych/niebieskich neonach na nowych zdjęciach). */
.tt-world-tag {
	display: inline-block;
	align-self: flex-start;
	font-family: var(--tt-font-pixel);
	font-size: 0.6rem;
	background: var(--tt-accent);
	color: var(--tt-white);
	padding: 5px 10px;
	margin-bottom: 12px;
	letter-spacing: 0.05em;
	box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.6);
}

.tt-world-card:nth-child(2) .tt-world-tag {
	background: var(--tt-accent-2);
	color: var(--tt-black);
}

/* TYTUŁ WYGLĄDAŁ NA "ZLANY" Z TŁEM: to nie kwestia zbyt słabej nakładki —
   Storefront ma WŁASNĄ, globalną regułę `h1,h2,h3,h4,h5,h6 { color:#333 }`
   z Customizera. Dziedziczenie koloru z rodzica (.tt-world-overlay ma
   color:white) ZAWSZE przegrywa z jakąkolwiek regułą bezpośrednio
   celującą w sam element — nawet gołym selektorem znacznika — więc h3
   był ciemnoszary na ciemnym zdjęciu i praktycznie znikał. Trzeba
   jawnie nadpisać kolor na tym elemencie, nie polegać na dziedziczeniu. */
.tt-world-overlay h3 {
	margin: 0 0 8px;
	font-size: 1.6rem;
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.01em;
	color: var(--tt-white) !important;
	text-shadow: 0 2px 14px rgba(0, 0, 0, 0.95), 0 0 30px rgba(0, 0, 0, 0.8);
}

.tt-world-overlay p {
	margin: 0 0 14px;
	color: var(--tt-gray-text);
	font-family: var(--tt-font-body);
	text-transform: none;
	letter-spacing: normal;
	font-size: 0.9rem;
	text-shadow: 0 1px 6px rgba(0, 0, 0, 0.8);
}

.tt-world-cta {
	font-family: var(--tt-font-heading);
	font-weight: 400;
	font-size: 0.85rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	transition: transform 0.2s ease, color 0.2s ease;
	display: inline-block;
	color: var(--tt-white);
	text-shadow: 0 1px 6px rgba(0, 0, 0, 0.8);
}

.tt-world-card:hover .tt-world-cta {
	transform: translateX(6px);
	color: var(--tt-accent);
}

.tt-world-card:nth-child(2):hover .tt-world-cta {
	color: var(--tt-accent-2);
}

@media (max-width: 800px) {
	.tt-worlds-grid {
		grid-template-columns: 1fr;
	}
}

/* =========================================================
   POPULARNE SERIE — chipy
   ========================================================= */
.tt-series {
	/* deseń retro na ciemnym tle */
	background-color: var(--tt-black-soft);
	background-image: var(--tt-pattern-light);
	background-size: 200px 200px;
	padding: 46px 0 !important;
}

.tt-series-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	justify-content: center;
}

.tt-chip {
	display: inline-block;
	padding: 10px 22px;
	border: 1.5px solid rgba(255, 255, 255, 0.2);
	border-radius: 999px;
	color: var(--tt-white);
	text-decoration: none;
	font-size: 0.88rem;
	font-weight: 500;
	transition: all 0.2s ease;
}

.tt-chip:hover {
	border-color: var(--tt-accent-2);
	color: var(--tt-accent-2);
	box-shadow: 0 0 16px rgba(0, 229, 255, 0.35);
}

/* Nasz wybór — produkty WooCommerce */
.tt-featured-products ul.products {
	display: grid;
	grid-template-columns: repeat(5, 1fr);
	gap: 20px;
	list-style: none;
	margin: 0;
	padding: 0;
}

/* PRAWDZIWA PRZYCZYNA "rozjechanych" siatek produktów: WooCommerce dokleja
   do <ul class="products"> domyślny clearfix (::before/::after z
   `display: table`), potrzebny w jego natywnym układzie opartym na
   float. W CSS Grid te pseudo-elementy NIE znikają — przeglądarka
   traktuje je jak dodatkowy, niewidzialny element siatki i wstawia go
   jako pierwszą komórkę (kolumna 1, wiersz 1), przesuwając WSZYSTKIE
   prawdziwe karty produktów o jedno miejsce w prawo. Efekt: pusta
   kolumna na starcie, karty "uciekają" w kolejne wiersze, a ostatni
   produkt zostaje osamotniony z ogromną pustą przestrzenią obok.
   Wcześniejsza poprawka `display: block !important` na .product
   naprawiła inny, powiązany problem (list-item), ale nie ten — dlatego
   błąd wracał mimo kolejnych wgrań. Rozwiązanie: całkowicie wyłączamy
   te pseudo-elementy tam, gdzie używamy CSS Grid. */
.tt-featured-products ul.products::before,
.tt-featured-products ul.products::after,
.tt-retro ul.products::before,
.tt-retro ul.products::after {
	content: none !important;
	display: none !important;
}

/* Ten sam mechanizm psuje też inne siatki: wszędzie tam, gdzie klasa
   `.col-full` (mająca własny clearfix ze Storefronta: ::before/::after z
   `display: table`) jest nałożona na TEN SAM element co `display: grid`
   (a nie na element-rodzica), pseudo-element wchodzi do siatki jako
   fantomowa pierwsza komórka. Efekt: ogromne, nieproporcjonalne koło w
   sekcji "Prosto z Japonii" (bo element wizualny "uciekał" do własnego
   wiersza na pełną szerokość) oraz przesunięta siatka w stopce. */
.tt-import-grid::before,
.tt-import-grid::after,
.tt-footer-inner::before,
.tt-footer-inner::after {
	content: none !important;
	display: none !important;
}

/* Pełny wygląd kart (tło, obramowanie, zdjęcie, tytuł, cena, przycisk)
   zdefiniowany niżej w bloku "KARTY PRODUKTÓW — retro/HUD", wspólnym
   dla tej sekcji i Retro Zone. Tu tylko wymuszamy zwykły blok zamiast
   "list-item" narzucanego przez WooCommerce/Storefront, co w
   połączeniu z CSS Grid tworzyło niewidzialne "boksy znacznika listy"
   i psuło układ siatki (puste dziury, karty w dziwnych miejscach). */
.tt-featured-products ul.products li.product {
	display: block !important;
	list-style: none;
}

@media (max-width: 1200px) {
	.tt-featured-products ul.products {
		grid-template-columns: repeat(3, 1fr);
	}
}

@media (max-width: 900px) {
	.tt-featured-products ul.products {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 500px) {
	.tt-featured-products ul.products {
		grid-template-columns: 1fr;
	}
}

/* USP — 3 boxy z cechami; deseń retro na jasnym tle */
.tt-usp {
	background-color: var(--tt-gray-light);
	background-image: var(--tt-pattern-dark);
	background-size: 200px 200px;
}

.tt-usp-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 30px 24px;
	padding-top: 6px;
}

/* Neubrutalizm: gruba czarna ramka + twardy, przesunięty cień w kolorze
   akcentu (na przemian czerwony/cyjan/czerwony), karta "wciska się" po
   najechaniu — cień się kurczy i karta przesuwa się w jego stronę. */
.tt-usp-item {
	position: relative;
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	border-radius: 2px;
	padding: 38px 24px 30px;
	text-align: center;
	box-shadow: 8px 8px 0 var(--tt-accent);
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.tt-usp-item:nth-child(2) {
	box-shadow: 8px 8px 0 var(--tt-accent-2);
}

.tt-usp-item:hover {
	transform: translate(4px, 4px);
	box-shadow: 4px 4px 0 var(--tt-accent);
}

.tt-usp-item:nth-child(2):hover {
	box-shadow: 4px 4px 0 var(--tt-accent-2);
}

.tt-usp-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 64px;
	height: 64px;
	margin-bottom: 18px;
	border: 3px solid var(--tt-black);
	border-radius: 50%;
	background: var(--tt-accent);
}

.tt-usp-item:nth-child(2) .tt-usp-icon {
	background: var(--tt-accent-2);
}

.tt-usp-icon svg {
	width: 55%;
	height: 55%;
	fill: none;
	stroke: var(--tt-white);
	stroke-width: 2;
}

.tt-usp-item h3 {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.02em;
	font-size: 1.1rem;
	margin: 0 0 10px;
}

.tt-usp-item p {
	margin: 0;
	color: #555;
	font-family: var(--tt-font-body);
	font-size: 0.92rem;
}

@media (max-width: 800px) {
	.tt-usp-grid {
		grid-template-columns: 1fr;
	}
}

/* =========================================================
   RETRO ZONE
   ========================================================= */
.tt-retro {
	background: var(--tt-black);
	color: var(--tt-white);
	position: relative;
	overflow: hidden;
}

.tt-retro-grid-bg {
	position: absolute;
	inset: 0;
	pointer-events: none;
	/* Podbite z 0.05 -> 0.16/0.09 i przebarwione na cyjan (kolor akcentu
	   sekcji), żeby kratka faktycznie było widać, a nie tylko domyślać
	   się jej istnienia. Grubsze linie co 5. komórkę dla głębi. */
	background-image:
		linear-gradient(rgba(0, 229, 255, 0.16) 1px, transparent 1px),
		linear-gradient(90deg, rgba(0, 229, 255, 0.16) 1px, transparent 1px),
		linear-gradient(rgba(0, 229, 255, 0.28) 1px, transparent 1px),
		linear-gradient(90deg, rgba(0, 229, 255, 0.28) 1px, transparent 1px);
	background-size: 42px 42px, 42px 42px, 210px 210px, 210px 210px;
	mask-image: radial-gradient(ellipse at center, black 55%, transparent 92%);
}

.tt-retro .col-full {
	position: relative;
	z-index: 1;
}

.tt-retro ul.products {
	display: grid;
	grid-template-columns: repeat(5, 1fr);
	gap: 20px;
	list-style: none;
	margin: 0 0 36px;
	padding: 0;
}

.tt-retro ul.products li.product {
	display: block !important;
	list-style: none;
}

.tt-retro ul.products li.product .price,
.tt-retro ul.products li.product a {
	color: var(--tt-white);
}

.tt-retro-cta {
	text-align: center;
}

@media (max-width: 1200px) {
	.tt-retro ul.products {
		grid-template-columns: repeat(3, 1fr);
	}
}

@media (max-width: 900px) {
	.tt-retro ul.products {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 500px) {
	.tt-retro ul.products {
		grid-template-columns: 1fr;
	}
}

/* =========================================================
   KARTY PRODUKTÓW — "retro cartridge / HUD", wspólne dla "Nasz wybór"
   i "Retro Zone". Zamiast płaskich białych kafelków: ciemna karta ze
   ściętymi rogami (jak obudowa kasety/cartridge), neonowe narożniki-
   celowniki które "zapalają się" na hover, cena jako przekrzywiona
   naklejka i przycisk w stylu pixel-outline. Ciemna karta na jasnym
   tle sekcji (i jeszcze ciemniejszym w Retro Zone) daje mocny kontrast
   zamiast płaskiego, białego kafelka na białym tle.
   ========================================================= */
.tt-featured-products ul.products li.product,
.tt-retro ul.products li.product,
.tt-product-page .related.products ul.products li.product,
.tt-shop-grid ul.products li.product {
	position: relative;
	background: linear-gradient(165deg, #232228 0%, #0d0d10 100%);
	border: 1px solid rgba(255, 255, 255, 0.1);
	padding: 0 0 20px;
	text-align: left;
	overflow: hidden;
	clip-path: polygon(0 16px, 16px 0, 100% 0, 100% calc(100% - 16px), calc(100% - 16px) 100%, 0 100%);
	transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}

/* narożniki-celowniki, ukryte domyślnie */
.tt-featured-products ul.products li.product::before,
.tt-retro ul.products li.product::before,
.tt-product-page .related.products ul.products li.product::before,
.tt-shop-grid ul.products li.product::before {
	content: "";
	position: absolute;
	top: 10px;
	left: 10px;
	width: 18px;
	height: 18px;
	border-top: 2px solid var(--tt-accent-2);
	border-left: 2px solid var(--tt-accent-2);
	opacity: 0;
	transition: opacity 0.25s ease;
	pointer-events: none;
	z-index: 3;
}

.tt-featured-products ul.products li.product::after,
.tt-retro ul.products li.product::after,
.tt-product-page .related.products ul.products li.product::after,
.tt-shop-grid ul.products li.product::after {
	content: "";
	position: absolute;
	bottom: 10px;
	right: 10px;
	width: 18px;
	height: 18px;
	border-bottom: 2px solid var(--tt-accent-2);
	border-right: 2px solid var(--tt-accent-2);
	opacity: 0;
	transition: opacity 0.25s ease;
	pointer-events: none;
	z-index: 3;
}

.tt-featured-products ul.products li.product:hover,
.tt-retro ul.products li.product:hover,
.tt-product-page .related.products ul.products li.product:hover,
.tt-shop-grid ul.products li.product:hover {
	transform: translateY(-6px);
	border-color: rgba(0, 229, 255, 0.55);
	box-shadow: 0 18px 36px rgba(0, 0, 0, 0.35), 0 0 28px rgba(0, 229, 255, 0.22);
}

.tt-retro ul.products li.product {
	/* karta na czarnym tle Retro Zone potrzebuje wyraźniejszej
	   obwódki niż w "Naszym wyborze" (tam kontrastuje z jasną
	   sekcją) — inaczej ginie na tle o niemal tym samym kolorze */
	border-color: rgba(255, 255, 255, 0.18);
	box-shadow: 0 4px 18px rgba(0, 0, 0, 0.4);
}

.tt-retro ul.products li.product:hover {
	/* na czarnym tle Retro Zone cień pod kartą musi być mocniejszy,
	   żeby karta w ogóle "odkleiła się" wizualnie od tła */
	box-shadow: 0 18px 36px rgba(0, 0, 0, 0.6), 0 0 28px rgba(0, 229, 255, 0.28);
}

.tt-featured-products ul.products li.product:hover::before,
.tt-featured-products ul.products li.product:hover::after,
.tt-retro ul.products li.product:hover::before,
.tt-retro ul.products li.product:hover::after,
.tt-product-page .related.products ul.products li.product:hover::before,
.tt-shop-grid ul.products li.product:hover::before,
.tt-product-page .related.products ul.products li.product:hover::after,
.tt-shop-grid ul.products li.product:hover::after {
	opacity: 1;
}

.tt-featured-products ul.products li.product img,
.tt-retro ul.products li.product img,
.tt-product-page .related.products ul.products li.product img,
.tt-shop-grid ul.products li.product img {
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	object-fit: cover;
	border-radius: 0;
	margin: 0 0 16px;
	filter: saturate(1.08) contrast(1.04);
}

/* Tytuły produktów mają różną długość (1-3 linijki), co przy zwykłym
   bloku przesuwało cenę i przycisk "Dodaj do koszyka" o różną wysokość
   w każdej karcie — rząd wyglądał na "poszarpany". Rezerwujemy STAŁĄ
   wysokość na dokładnie 2 linijki (niezależnie od długości tekstu) i
   przycinamy dłuższe tytuły wielokropkiem — dzięki temu cena i przycisk
   zawsze siedzą w tym samym miejscu w każdej karcie danego rzędu. */
.tt-featured-products ul.products li.product .woocommerce-loop-product__title,
.tt-retro ul.products li.product .woocommerce-loop-product__title,
.tt-product-page .related.products ul.products li.product .woocommerce-loop-product__title,
.tt-shop-grid ul.products li.product .woocommerce-loop-product__title {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	text-overflow: ellipsis;
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	font-weight: 700;
	font-size: 0.98rem;
	line-height: 1.3;
	min-height: 2.6em;
	margin: 0 16px 12px;
	text-transform: uppercase;
}

/* cena jako przekrzywiona "naklejka" — mocny, gamingowy akcent */
.tt-featured-products ul.products li.product .price,
.tt-retro ul.products li.product .price,
.tt-product-page .related.products ul.products li.product .price,
.tt-shop-grid ul.products li.product .price {
	display: inline-block;
	background: var(--tt-accent);
	color: var(--tt-white) !important;
	font-family: var(--tt-font-heading);
	font-weight: 700;
	font-size: 0.95rem;
	padding: 5px 12px;
	margin: 0 16px 16px;
	transform: rotate(-2deg);
	box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.35);
}

.tt-featured-products ul.products li.product a.button,
.tt-retro ul.products li.product a.button,
.tt-product-page .related.products ul.products li.product a.button,
.tt-shop-grid ul.products li.product a.button {
	display: block;
	margin: 0 16px;
	text-align: center;
	background: transparent;
	border: 1.5px solid var(--tt-accent-2);
	color: var(--tt-accent-2) !important;
	font-family: var(--tt-font-heading);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 0.8rem;
	padding: 9px 0;
	border-radius: 2px;
	text-decoration: none;
	transition: all 0.2s ease;
}

.tt-featured-products ul.products li.product a.button:hover,
.tt-retro ul.products li.product a.button:hover,
.tt-product-page .related.products ul.products li.product a.button:hover,
.tt-shop-grid ul.products li.product a.button:hover {
	background: var(--tt-accent-2);
	color: var(--tt-black) !important;
	box-shadow: 0 0 18px rgba(0, 229, 255, 0.45);
}

/* "Zobacz koszyk" — link, który WooCommerce dokleja OBOK przycisku po
   udanym dodaniu do koszyka przez AJAX (domyślnie: goły, niebieski,
   podkreślony tekst, wpychający się w ten sam wiersz co przycisk —
   stąd brzydki "rozjazd" widoczny na karcie). Zamieniamy go w wypełnioną,
   cyjanową plakietkę z ptaszkiem, na WŁASNYM wierszu pod przyciskiem,
   która wjeżdża z małym "pop" — czytelne potwierdzenie zamiast
   przypadkowego linku. */
.tt-featured-products ul.products li.product a.added_to_cart.wc-forward,
.tt-retro ul.products li.product a.added_to_cart.wc-forward,
.tt-product-page .related.products ul.products li.product a.added_to_cart.wc-forward,
.tt-shop-grid ul.products li.product a.added_to_cart.wc-forward {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	margin: 8px 16px 0;
	padding: 8px 0;
	text-align: center;
	background: var(--tt-accent-2);
	color: var(--tt-black) !important;
	font-family: var(--tt-font-heading);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 0.72rem;
	border-radius: 2px;
	text-decoration: none;
	box-shadow: 0 0 14px rgba(0, 229, 255, 0.5);
	animation: tt-added-pop 0.3s ease;
}

.tt-featured-products ul.products li.product a.added_to_cart.wc-forward::before,
.tt-retro ul.products li.product a.added_to_cart.wc-forward::before,
.tt-product-page .related.products ul.products li.product a.added_to_cart.wc-forward::before,
.tt-shop-grid ul.products li.product a.added_to_cart.wc-forward::before {
	content: "✓";
	font-size: 0.9rem;
}

.tt-featured-products ul.products li.product a.added_to_cart.wc-forward:hover,
.tt-retro ul.products li.product a.added_to_cart.wc-forward:hover,
.tt-product-page .related.products ul.products li.product a.added_to_cart.wc-forward:hover,
.tt-shop-grid ul.products li.product a.added_to_cart.wc-forward:hover {
	background: var(--tt-white);
}

@keyframes tt-added-pop {
	0% {
		opacity: 0;
		transform: translateY(-6px) scale(0.9);
	}
	60% {
		opacity: 1;
		transform: translateY(0) scale(1.04);
	}
	100% {
		opacity: 1;
		transform: translateY(0) scale(1);
	}
}

@media (prefers-reduced-motion: reduce) {
	.tt-featured-products ul.products li.product a.added_to_cart.wc-forward,
	.tt-retro ul.products li.product a.added_to_cart.wc-forward,
	.tt-product-page .related.products ul.products li.product a.added_to_cart.wc-forward,
	.tt-shop-grid ul.products li.product a.added_to_cart.wc-forward {
		animation: none;
	}
}

/* =========================================================
   SKLEP / ARCHIWA PRODUKTÓW (kategorie, tagi) — przebudowa domyślnego,
   kompletnie niestylowanego widoku WooCommerce/Storefront (biały box,
   generyczny sidebar z bloga, gołe karty produktowe). Sidebar zostaje —
   ale to WŁASNY panel (szukajka + drzewko kategorii, patrz
   tokyotoybox_shop_sidebar() w functions.php) zamiast blogowych
   widgetów. Karty produktów dostają DOKŁADNIE ten sam "retro cartridge"
   look co sekcje na stronie głównej — patrz .tt-shop-grid dopisane do
   każdego selektora w bloku "KARTY PRODUKTÓW" wyżej, żeby nie
   duplikować całego stylu. Klasa .tt-shop-grid jest dodawana na <body>
   filtrem w functions.php na is_shop()/is_product_taxonomy().
   ========================================================= */

/* UWAGA — ZNALEZIONY BUG: `.tt-shop-grid` to klasa na <body>, więc goły
   selektor `.tt-shop-grid .col-full` łapał KAŻDY .col-full na stronie —
   łącznie z `.tt-header-inner.col-full` w nagłówku (nagłówek jest tym
   samym markupem na każdej podstronie, patrz tokyotoybox_header_branding_nav()
   w functions.php). Efekt: na stronach sklepu/kategorii nagłówek
   (logo + menu) dostawał max-width:1440px, podczas gdy na reszcie
   strony (strona główna, pojedynczy produkt) header trzyma się
   oryginalnej szerokości Storefronta (~1064px, patrz komentarz przy
   .tt-featured-products .col-full wyżej) — stąd wrażenie "innego
   układu nagłówka" między stroną główną a sklepem. Wykluczamy
   .tt-header-inner, żeby ta reguła trafiała tylko w .col-full
   należące do treści sklepu (banner, sidebar, breadcrumb, itd.). */
.tt-shop-grid .col-full:not(.tt-header-inner) {
	max-width: 1440px;
}

/* ODSTĘP OD STOPKI: `display: contents` na #primary/#main (patrz niżej)
   kasuje ich WŁASNY box — a razem z nim znika też domyślny padding-bottom
   Storefronta, który wcześniej robił odstęp między treścią a stopką.
   Bez tego ostatni wiersz grida (dolny pasek zmiany stron, z twardym
   box-shadow 6px 6px) stykał się bezpośrednio ze stopką i jego cień
   "nachodził" na ciemne tło stopki. Odstęp wracamy tutaj, na samym
   kontenerze grida. */
.tt-shop-grid #content > .col-full {
	padding-bottom: 60px;
}

/* UKŁAD: baner "SKLEP" ma być PEŁNOSZEROKOŚCIOWY (jak Hero), a DOPIERO
   pod nim ma zaczynać się układ dwukolumnowy (sidebar + treść). Problem:
   baner siedzi głęboko wewnątrz #primary (header > #main > #primary),
   a sidebar (#secondary) jest ZUPEŁNIE INNYM elementem na tym samym
   poziomie co #primary — nie da się więc po prostu "rozciągnąć" banera,
   bo strukturalnie dzieli wiersz z sidebarem.
   ROZWIĄZANIE: `display: contents` na #primary i #main sprawia, że te
   dwa opakowania znikają z layoutu (nie tworzą własnych boksów), a ICH
   DZIECI (baner, pasek sortowania, siatka produktów, paginacja) stają
   się BEZPOŚREDNIMI elementami grida na wspólnym rodzicu (.col-full) —
   dokładnie tak samo jak #secondary. Dzięki temu można każdemu z nich
   przypisać osobne miejsce w gridzie przez grid-template-areas: baner
   dostaje wiersz sam dla siebie na całą szerokość, a sidebar zajmuje
   lewą kolumnę na wysokość WSZYSTKICH pozostałych wierszy. */
.tt-shop-grid #content > .col-full {
	display: grid;
	grid-template-columns: 260px 1fr;
	grid-template-areas:
		"banner    banner"
		"sidebar   sorting-top"
		"sidebar   products"
		"sidebar   sorting-bottom";
	column-gap: 36px;
	row-gap: 26px;
	align-items: start;
}

.tt-shop-grid #primary.content-area,
.tt-shop-grid #main.site-main {
	display: contents;
}

.tt-shop-grid .woocommerce-products-header {
	grid-area: banner;
}

/* POPRAWKA WCZEŚNIEJSZEJ DIAGNOZY: Storefront NIE duplikuje paska
   sortowania jako niewidoczny podkład pod scroll — renderuje go
   NAPRAWDĘ dwa razy, celowo: raz PRZED siatką produktów, raz PO niej
   (żeby nie trzeba było wracać na górę strony, by zmienić stronę
   wyników). Oba mają IDENTYCZNE klasy (".storefront-sorting"), więc
   odróżniamy je przez kolejność w DOM-ie (:first-of-type / :last-of-type
   — jedyne elementy <div> wśród bezpośrednich dzieci #main dzięki
   display:contents wyżej) i dajemy im OSOBNE miejsca w gridzie zamiast
   ukrywać drugi jako "duplikat". */
.tt-shop-grid .storefront-sorting:first-of-type {
	grid-area: sorting-top;
}

.tt-shop-grid .storefront-sorting:last-of-type {
	grid-area: sorting-bottom;
}

/* Dolny pasek ma być "mini" — sama zmiana strony, bez powtarzania
   dropdowna sortowania (ten już wybrało się na górze). */
.tt-shop-grid .storefront-sorting:last-of-type .woocommerce-ordering {
	display: none;
}

.tt-shop-grid .storefront-sorting:last-of-type {
	justify-content: center;
	gap: 20px;
}

.tt-shop-grid ul.products {
	grid-area: products;
}

.tt-shop-grid #secondary.tt-shop-sidebar {
	grid-area: sidebar;
}

/* TRZECI, "NIEWIDZIALNY" GRID ITEM: Storefront/WooCommerce dokleja pusty
   `<div class="woocommerce"></div>` jako dziecko .col-full — w starym
   layoucie opartym na floatach był nieszkodliwy (zero wysokości/
   szerokości), ale w CSS Grid staje się pełnoprawną, niezadeklarowaną
   komórką (bez przypisanego grid-area po prostu ląduje w kolejnym
   wolnym miejscu wg auto-placement, psując cały układ). Wyjmujemy go
   całkiem z przepływu. */
.tt-shop-grid #content > .col-full > .woocommerce {
	display: none;
}

/* TA SAMA pułapka clearfixu co wszędzie indziej w tym pliku (ul.products,
   .tt-import-grid, .tt-footer-inner...): .col-full ma WŁASNY clearfix
   Storefronta (::before z display:table, ::after z display:block) —
   w gridzie te pseudo-elementy też liczą się jako dodatkowe, nieopisane
   komórki i psują układ tak samo jak powyższy pusty div. */
.tt-shop-grid #content > .col-full::before,
.tt-shop-grid #content > .col-full::after {
	content: none !important;
	display: none !important;
}

@media (max-width: 800px) {
	.tt-shop-grid #content > .col-full {
		grid-template-columns: 1fr;
		grid-template-areas:
			"banner"
			"sidebar"
			"sorting-top"
			"products"
			"sorting-bottom";
	}
}

/* LUKA POD HEADEREM: Storefront owija breadcrumb we własny wrapper
   `.storefront-breadcrumb` z odstępami myślanymi pod zwykłą, białą
   stronę (padding ~23px + margin-bottom ~59px) — na naszym motywie,
   gdzie zaraz pod nim ląduje ciemny baner "SKLEP", te odstępy
   wyglądały jak duża, pusta dziura. Zamiast tylko przycinać marginesy,
   robimy z tego paska ciemny "przedsionek" banera — pełna szerokość,
   czarne tło, zero marginesu na dole, więc styka się bezpośrednio z
   bannerem i całość wygląda jak jeden spójny, ciemny blok od razu pod
   headerem. */
.tt-shop-grid .storefront-breadcrumb,
.tt-checkout-page .storefront-breadcrumb,
.tt-cart-page .storefront-breadcrumb,
.tt-product-page .storefront-breadcrumb {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	margin-top: 0;
	margin-bottom: 0 !important;
	padding: 0 !important;
	background: var(--tt-black);
}

.tt-shop-grid .storefront-breadcrumb .col-full,
.tt-checkout-page .storefront-breadcrumb .col-full,
.tt-cart-page .storefront-breadcrumb .col-full,
.tt-product-page .storefront-breadcrumb .col-full {
	max-width: 1440px;
	padding: 12px 20px !important;
}

.tt-shop-grid .woocommerce-breadcrumb,
.tt-checkout-page .woocommerce-breadcrumb,
.tt-cart-page .woocommerce-breadcrumb,
.tt-product-page .woocommerce-breadcrumb {
	font-family: var(--tt-font-body);
	font-size: 0.8rem;
	color: var(--tt-gray-text);
}

.tt-shop-grid .woocommerce-breadcrumb a,
.tt-checkout-page .woocommerce-breadcrumb a,
.tt-cart-page .woocommerce-breadcrumb a,
.tt-product-page .woocommerce-breadcrumb a {
	color: var(--tt-gray-text);
	text-decoration: none;
}

.tt-shop-grid .woocommerce-breadcrumb a:hover,
.tt-checkout-page .woocommerce-breadcrumb a:hover,
.tt-cart-page .woocommerce-breadcrumb a:hover,
.tt-product-page .woocommerce-breadcrumb a:hover {
	color: var(--tt-accent-2);
}

/* NAGŁÓWEK ARCHIWUM — ciemny baner PEŁNOSZEROKOŚCIOWY (jak Hero), z
   pixel-artowym eyebrow doklejonym przez ::before (żeby nie ruszać PHP
   szablonu WooCommerce) i neonową kreską na dole. Sztuczka width:100vw
   jest już BEZPIECZNA — baner ma teraz WŁASNY wiersz w gridzie
   (grid-area: banner, na całą szerokość obu kolumn), sidebar zaczyna
   się dopiero w NASTĘPNYM wierszu pod nim, więc fizycznie nie ma już
   niczego, na co baner mógłby "wypłynąć". margin-bottom celowo brak —
   odstęp do kolejnego wiersza daje row-gap grida. */
.tt-shop-grid .woocommerce-products-header {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.22), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.14), transparent 40%),
		var(--tt-black);
	padding: 56px 20px 40px;
	text-align: center;
	overflow: hidden;
}

.tt-shop-grid .woocommerce-products-header::after {
	content: "";
	display: block;
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 4px;
	background: linear-gradient(
		90deg,
		var(--tt-accent) 0%, var(--tt-accent) 45%,
		var(--tt-accent-2) 55%, var(--tt-accent-2) 100%
	);
}

.tt-shop-grid .woocommerce-products-header__title {
	position: relative;
	z-index: 1;
	font-family: var(--tt-font-display);
	font-size: clamp(2rem, 5vw, 3.2rem);
	color: var(--tt-white) !important;
	text-transform: uppercase;
	letter-spacing: 0.01em;
	text-shadow: 0 0 18px rgba(226, 35, 26, 0.5), 0 0 34px rgba(0, 229, 255, 0.18);
	margin: 0;
}

.tt-shop-grid .woocommerce-products-header__title::before {
	content: "// PRZEGLĄDAJ";
	display: block;
	font-family: var(--tt-font-pixel);
	font-size: 0.6rem;
	letter-spacing: 0.1em;
	color: var(--tt-accent-2);
	margin-bottom: 16px;
}

/* opis kategorii/tagu, jeśli ustawiony w WP — wyszarzony tekst pod tytułem */
.tt-shop-grid .term-description {
	position: relative;
	z-index: 1;
	max-width: 640px;
	margin: 18px auto 0;
	padding: 0 20px;
	color: var(--tt-gray-text);
	font-family: var(--tt-font-body);
	text-align: center;
}

/* PASEK SORTOWANIA — neubrutalizm, ten sam język co USP/world-card */
.tt-shop-grid .storefront-sorting {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 14px;
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	box-shadow: 6px 6px 0 var(--tt-accent-2);
	padding: 14px 20px;
	margin: 0;
}

.tt-shop-grid .woocommerce-result-count {
	margin: 0;
	color: #555;
	font-family: var(--tt-font-body);
	font-size: 0.88rem;
}

.tt-shop-grid .woocommerce-ordering select.orderby {
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	padding: 8px 14px;
	background: var(--tt-white);
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	font-size: 0.78rem;
	letter-spacing: 0.02em;
	cursor: pointer;
}

/* SIATKA PRODUKTÓW — ten sam problem z fantomową komórką grida co przy
   .tt-featured-products (WooCommerce/Storefront doklejają do ul.products
   clearfix ::before/::after z display:table — patrz obszerny komentarz
   przy tej poprawce wyżej w pliku), więc te same dwie poprawki tutaj.
   KOLUMNY: auto-fill/minmax zamiast sztywnych "repeat(5, 1fr)" ze
   złamaniami na konkretnych szerokościach ekranu — z sidebarem po
   prawej realna szerokość siatki to ok. 65% okna, więc łamanie po
   szerokości VIEWPORTU (media query) nie odzwierciedlało faktycznej
   szerokości KONTENERA. auto-fill samo dobiera liczbę kolumn do tego,
   ile realnie mieści się obok sidebara, bez zgadywania breakpointów. */
.tt-shop-grid ul.products {
	display: grid !important;
	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
	gap: 20px;
	list-style: none;
	margin: 0;
	padding: 0;
}

.tt-shop-grid ul.products::before,
.tt-shop-grid ul.products::after {
	content: none !important;
	display: none !important;
}

/* WooCommerce/Storefront doklejają do ul.products klasę "columns-N" z
   WŁASNYMI regułami float:left + width:X% (mechanizm starego layoutu
   opartego na floatach, sprzed CSS Grid). Same z siebie nie psują grida
   (grid ignoruje float na kontenerze), ALE float na SAMYM li.product
   włącza dla niego tryb "shrink-to-fit" — element kurczy się do
   szerokości swojej zawartości (tu: małego zdjęcia, ~80px) zamiast
   rozciągnąć się na całą kolumnę grida, mimo że display jest block.
   Efekt: wąskie, wysokie "słupki" zamiast kwadratowych kart. Trzeba
   jawnie wyłączyć float i wymusić pełną szerokość kolumny. */
.tt-product-page .related.products ul.products li.product,
.tt-shop-grid ul.products li.product {
	display: block !important;
	float: none !important;
	width: 100% !important;
	margin: 0 !important;
	list-style: none;
}

/* PRODUKTY NIEDOSTĘPNE ("brak w magazynie") — WooCommerce sam dokleja
   klasę "outofstock" do li.product, zero dodatkowego PHP potrzebne do
   wykrycia. Naklejka "SPRZEDANE" celowo przejmuje ISTNIEJĄCY selektor
   ::before (używany gdzie indziej w tym pliku na narożnik-celownik
   podświetlany na hover) zamiast dokładać nowy pseudo-element — karta
   niedostępna i tak nie potrzebuje osobno tego efektu hover, więc nie
   ma tu kolizji. WAŻNE: opacity zmieniamy tylko na ZDJĘCIU/tekście, NIE
   na całej karcie — inaczej przygasłaby też sama naklejka (sprawdzone
   na żywo: przy opacity na całym li.product naklejka wychodziła wyblakła
   różowa zamiast wyrazistej czerwieni). */
.tt-product-page .related.products ul.products li.product.outofstock img,
.tt-shop-grid ul.products li.product.outofstock img {
	filter: grayscale(1) brightness(0.82) contrast(1.02);
}

.tt-product-page .related.products ul.products li.product.outofstock .woocommerce-loop-product__title,
.tt-shop-grid ul.products li.product.outofstock .woocommerce-loop-product__title,
.tt-product-page .related.products ul.products li.product.outofstock .price,
.tt-shop-grid ul.products li.product.outofstock .price {
	opacity: 0.5;
}

.tt-product-page .related.products ul.products li.product.outofstock:hover,
.tt-shop-grid ul.products li.product.outofstock:hover {
	transform: none;
	box-shadow: none;
	border-color: rgba(255, 255, 255, 0.1);
}

.tt-product-page .related.products ul.products li.product.outofstock::before,
.tt-shop-grid ul.products li.product.outofstock::before {
	content: "SPRZEDANE";
	top: 32%;
	left: -16%;
	width: 132%;
	height: auto;
	border: none;
	background: var(--tt-accent);
	color: var(--tt-white);
	text-align: center;
	padding: 6px 0;
	font-family: var(--tt-font-heading);
	font-weight: 700;
	letter-spacing: 0.1em;
	font-size: 0.82rem;
	transform: rotate(-12deg);
	box-shadow: 0 3px 10px rgba(0, 0, 0, 0.5);
	opacity: 1;
	z-index: 5;
}

.tt-product-page .related.products ul.products li.product.outofstock a.button,
.tt-shop-grid ul.products li.product.outofstock a.button {
	pointer-events: none;
	opacity: 0.35;
}

/* PAGINACJA — kwadratowe, pixel-outline przyciski zamiast gołych liczb */
.tt-shop-grid nav.woocommerce-pagination {
	margin: 0 0 20px;
}

.tt-shop-grid nav.woocommerce-pagination ul {
	display: flex;
	justify-content: center;
	flex-wrap: wrap;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
	border: none !important;
	background: none !important;
}

.tt-shop-grid nav.woocommerce-pagination ul li {
	border: none !important;
}

.tt-shop-grid nav.woocommerce-pagination .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 40px;
	height: 40px;
	padding: 0 10px;
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	background: var(--tt-white);
	color: var(--tt-black);
	font-family: var(--tt-font-heading);
	font-size: 0.85rem;
	text-decoration: none;
	transition: all 0.15s ease;
}

.tt-shop-grid nav.woocommerce-pagination .page-numbers.current {
	background: var(--tt-black);
	border-color: var(--tt-black);
	color: var(--tt-white);
}

.tt-shop-grid nav.woocommerce-pagination a.page-numbers:hover {
	background: var(--tt-accent);
	border-color: var(--tt-accent);
	color: var(--tt-white);
}

/* SIDEBAR SKLEPU — szukajka + drzewko kategorii (patrz
   tokyotoybox_shop_sidebar() w functions.php), w tym samym języku
   neubrutalizmu co USP/world-card: białe boksy, gruba czarna ramka,
   twardy przesunięty cień w kolorze akcentu. */
.tt-shop-grid #secondary.tt-shop-sidebar {
	display: flex;
	flex-direction: column;
	gap: 24px;
	padding-top: 4px;
}

.tt-shop-widget {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	box-shadow: 6px 6px 0 var(--tt-accent);
	padding: 20px;
}

.tt-shop-cats-widget {
	box-shadow: 6px 6px 0 var(--tt-accent-2);
}

.tt-shop-widget-title {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	font-size: 1rem;
	letter-spacing: 0.02em;
	margin: 0 0 16px;
	padding-bottom: 10px;
	border-bottom: 2px solid var(--tt-black);
}

.tt-shop-search {
	display: flex;
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	overflow: hidden;
}

.tt-shop-search-input {
	flex: 1 1 auto;
	min-width: 0;
	border: none;
	padding: 10px 12px;
	font-family: var(--tt-font-body);
	font-size: 0.85rem;
	outline: none;
}

.tt-shop-search-btn {
	flex: 0 0 auto;
	border: none;
	border-left: 2px solid var(--tt-black);
	background: var(--tt-accent);
	color: var(--tt-white);
	width: 42px;
	cursor: pointer;
	display: flex;
	align-items: center;
	justify-content: center;
	transition: background 0.15s ease;
}

.tt-shop-search-btn svg {
	width: 18px;
	height: 18px;
	fill: currentColor;
}

.tt-shop-search-btn:hover {
	background: var(--tt-black);
}

.tt-cat-tree,
.tt-cat-tree ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

.tt-cat-tree ul {
	margin: 6px 0 6px 14px;
	padding-left: 10px;
	border-left: 2px dashed rgba(18, 18, 18, 0.15);
}

.tt-cat-tree li {
	position: relative;
	margin: 0 0 6px;
}

.tt-cat-tree a {
	display: block;
	color: var(--tt-black);
	text-decoration: none;
	font-family: var(--tt-font-body);
	font-size: 0.9rem;
	padding: 4px 0;
	border-bottom: 1px dashed transparent;
	transition: color 0.15s ease, border-color 0.15s ease;
}

/* Strzałka do rozwijania/zwijania podkategorii — dokładana przez JS
   (patrz <script> w tokyotoybox_shop_sidebar()) TYLKO dla <li>, które
   faktycznie mają zagnieżdżone <ul> z podkategoriami. Podkategorie są
   domyślnie ukryte (zgłoszenie: widoczne mają być tylko kategorie
   główne). */
.tt-has-children > a {
	padding-right: 26px;
}

.tt-cat-toggle {
	position: absolute;
	top: 2px;
	right: 0;
	width: 22px;
	height: 22px;
	padding: 0;
	border: none;
	background: transparent;
	color: var(--tt-black);
	cursor: pointer;
	display: flex;
	align-items: center;
	justify-content: center;
	transition: transform 0.15s ease, color 0.15s ease;
}

.tt-cat-toggle svg {
	width: 12px;
	height: 12px;
	fill: currentColor;
}

.tt-cat-toggle:hover {
	color: var(--tt-accent);
}

.tt-cat-open > .tt-cat-toggle {
	transform: rotate(90deg);
}

.tt-cat-tree a:hover {
	color: var(--tt-accent);
	border-color: var(--tt-accent);
}

/* podświetlenie aktualnie przeglądanej kategorii — WordPress dokleja
   klasę "current-cat" do <li> automatycznie na stronie archiwum tej
   kategorii, zero dodatkowego kodu PHP potrzebne */
.tt-cat-tree .current-cat > a {
	color: var(--tt-accent-2);
	font-weight: 700;
}

@media (max-width: 768px) {
	.tt-shop-grid #secondary.tt-shop-sidebar {
		margin-top: 30px;
	}
}

/* =========================================================
   KASA / CHECKOUT — klasa .tt-checkout-page dodawana na <body> filtrem
   w functions.php na is_checkout(). WAŻNE: checkout na tym sklepie
   korzysta z bloków Gutenberga WooCommerce (React), NIE klasycznego
   szortkoda [woocommerce_checkout] — stąd zupełnie inne klasy niż
   reszta motywu (prefiks "wc-block-*"), sprawdzone bezpośrednio na
   żywej stronie /kasa/ przez devtools, żeby nie zgadywać na ślepo.
   Sidebar bloga (Storefront) jest tu bez sensu (Szukaj/Recent Posts
   w trakcie płacenia), więc PHP go całkiem usuwa, a checkout dostaje
   pełną szerokość — swój WŁASNY, wbudowany w blok, dwukolumnowy układ
   (formularz + podsumowanie zamówienia) robi się sam, bez naszego
   CSS grida. */

.tt-checkout-page #primary.content-area {
	width: 100%;
	float: none;
}

.tt-checkout-page #content > .col-full {
	max-width: 1440px;
}

/* Baner "KASA" — ten sam język co baner "SKLEP" (pełna szerokość,
   ciemne tło, neonowy tytuł, pixel-artowy eyebrow), ale doczepiony
   do zwykłego h1.entry-title Storefronta (checkout to zwykła strona
   WP, nie archiwum WooCommerce, więc nie ma tu woocommerce-products-header). */
.tt-checkout-page .entry-header {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.22), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.14), transparent 40%),
		var(--tt-black);
	padding: 48px 20px 38px;
	text-align: center;
	margin-bottom: 40px;
	overflow: hidden;
}

.tt-checkout-page .entry-title {
	font-family: var(--tt-font-display);
	color: var(--tt-white);
	font-size: 2.2rem;
	letter-spacing: 0.02em;
	text-shadow: 0 0 18px rgba(226, 35, 26, 0.5), 0 0 34px rgba(0, 229, 255, 0.18);
	margin: 0;
}

.tt-checkout-page .entry-title::before {
	content: "// FINALIZUJ ZAMÓWIENIE";
	display: block;
	font-family: var(--tt-font-body);
	font-size: 0.7rem;
	letter-spacing: 0.25em;
	color: var(--tt-accent-2);
	margin-bottom: 14px;
}

@media (max-width: 600px) {
	.tt-checkout-page .entry-title {
		font-size: 1.6rem;
	}
}

/* KROKI CHECKOUTU (dane kontaktowe / adres / płatność / notatka) —
   ".wc-block-components-checkout-step" to WSPÓLNY wrapper WooCommerce
   Blocks dla każdego z tych kroków, więc jedna reguła stylizuje je
   wszystkie naraz. Neubrutalizm w tym samym języku co .tt-shop-widget
   w sidebarze sklepu: biały box, czarna ramka, twardy cień. */
.tt-checkout-page .wc-block-components-checkout-step {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	box-shadow: 6px 6px 0 var(--tt-accent-2);
	padding: 26px 28px;
	margin-bottom: 28px;
}

.tt-checkout-page .wc-block-components-checkout-step__title {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 1.15rem;
	color: var(--tt-black);
	margin: 0 0 18px;
	padding-bottom: 12px;
	border-bottom: 2px solid var(--tt-black);
}

.tt-checkout-page .wc-block-components-checkout-step__description {
	font-family: var(--tt-font-body);
	color: #555;
	font-size: 0.85rem;
}

/* POLA TEKSTOWE / SELECT — ".wc-block-components-text-input" to
   floating-label wrapper (label "wjeżdża" nad input, gdy jest
   aktywny/wypełniony); stylujemy tylko obramowanie i typografię, nie
   ruszamy layoutu, bo animacja etykiety jest wliczona w JS komponentu. */
.tt-checkout-page .wc-block-components-text-input input,
.tt-checkout-page .wc-blocks-components-select__select {
	border: 2px solid var(--tt-black) !important;
	border-radius: 2px !important;
	font-family: var(--tt-font-body) !important;
	background: var(--tt-white) !important;
}

.tt-checkout-page .wc-block-components-text-input input:focus,
.tt-checkout-page .wc-blocks-components-select__select:focus {
	outline: none !important;
	border-color: var(--tt-accent-2) !important;
	box-shadow: 0 0 0 3px rgba(0, 229, 255, 0.2) !important;
}

.tt-checkout-page .wc-block-components-text-input label,
.tt-checkout-page .wc-blocks-components-select__label {
	font-family: var(--tt-font-body) !important;
}

/* PRZYCISKI — te same proporcje/krój co .tt-btn na reszcie strony.
   Przycisk "Kupuję i płacę" dostaje pełną szerokość i akcentowy
   czerwony, żeby był jednoznacznym, dużym CTA na końcu formularza. */
.tt-checkout-page .wc-block-components-button.wp-element-button {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	border-radius: 2px;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.tt-checkout-page .wc-block-components-checkout-place-order-button {
	background: var(--tt-accent) !important;
	border-color: var(--tt-accent) !important;
	color: var(--tt-white) !important;
	font-size: 1.05rem !important;
	padding: 16px !important;
	width: 100%;
}

.tt-checkout-page .wc-block-components-checkout-place-order-button:hover {
	transform: translateY(-2px);
	box-shadow: 0 6px 22px rgba(255, 63, 63, 0.45);
}

/* OPCJE PŁATNOŚCI/WYSYŁKI (radio) — UWAGA: ".wc-block-components-radio-control__option"
   ma domyślnie padding-left: 48px, bo w tym miejscu absolutnie
   pozycjonowany jest natywny <input type="radio"> (left: 16px). Nadpisanie
   samego "padding" bez zachowania tej rezerwy z lewej nakłada tekst
   etykiety NA kropkę radio (sprawdzone na żywo — dokładnie to się
   stało przy pierwszej próbie). Dlatego padding niżej odtwarza
   dokładnie ich własne wartości, dokładając tylko ramkę/cień. */
.tt-checkout-page .wc-block-components-radio-control__option {
	border: 2px solid var(--tt-black) !important;
	border-radius: 2px !important;
	margin-bottom: 10px !important;
	padding: 16px 16px 16px 48px !important;
}

.tt-checkout-page .wc-block-components-radio-control__option-checked {
	border-color: var(--tt-accent-2) !important;
	box-shadow: 3px 3px 0 var(--tt-accent-2);
}

.tt-checkout-page .wc-block-components-payment-method-label {
	font-family: var(--tt-font-body);
	font-weight: 600;
}

/* CHECKBOXY (notatka do zamówienia, regulamin) */
.tt-checkout-page .wc-block-components-checkbox label {
	font-family: var(--tt-font-body);
}

/* WIDOK ZAPISANEGO ADRESU — karta z danymi + link "Edytuj" w rogu,
   pokazywana zamiast formularza, gdy adres jest już uzupełniony. */
.tt-checkout-page .wc-block-components-address-card {
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	padding: 14px 16px;
	font-family: var(--tt-font-body);
}

.tt-checkout-page .wc-block-components-address-card__edit {
	color: var(--tt-accent) !important;
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	font-size: 0.75rem;
}

/* PODSUMOWANIE ZAMÓWIENIA — prawa kolumna (własny grid komponentu WC
   Blocks, nie nasz), sticky. Ten sam neubrutalizm co karty formularza,
   ale z czerwonym cieniem zamiast cyjanowego — wizualnie odróżnia
   "co płacę" od "co wpisuję".
   NAPRAWKA "PRZYKLEJENIA": WC Blocks samo ustawia na tym elemencie
   `position: sticky; top: 24px`, myśląc, że jest tuż pod górną
   krawędzią okna. U nas nad nim jest WŁASNY sticky header (position:
   sticky, top:0, z-index:999, wysokość 88px) — przy scrollu header
   zakrywał górę podsumowania, bo 24px to mniej niż jego wysokość.
   Podnosimy "top" powyżej wysokości headera, żeby podsumowanie
   zatrzymywało się PONIŻEJ niego, a nie pod nim. */
.tt-checkout-page .wc-block-components-sidebar {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	box-shadow: 6px 6px 0 var(--tt-accent);
	padding: 26px 28px;
	top: 108px !important;
}

.tt-checkout-page .wc-block-components-order-summary .wc-block-components-panel__button {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 1.1rem;
}

.tt-checkout-page .wc-block-components-order-summary-item {
	border-bottom: 1px dashed #ccc;
	padding: 12px 0;
}

/* NAPRAWKA OBRAMOWANIA ZDJĘĆ: ".wc-block-components-order-summary-item__image"
   to element FLEX w wierszu produktu, więc domyślnie rozciąga się na
   całą wysokość wiersza (align-items: stretch) — wyższą niż samo
   zdjęcie (48x48px). Efekt: czarna ramka robiła duży, w większości
   pusty prostokąt zamiast ciasno otaczać miniaturkę. Przenosimy ramkę
   na sam <img> i wyłączamy rozciąganie kontenera (align-self). */
.tt-checkout-page .wc-block-components-order-summary-item__image {
	border: none;
	align-self: flex-start;
}

.tt-checkout-page .wc-block-components-order-summary-item__image img {
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	display: block;
}

.tt-checkout-page .wc-block-components-product-name {
	font-family: var(--tt-font-body);
	font-weight: 600;
	color: var(--tt-black);
}

/* Krótki opis produktu (np. "Drogi Graczu!") w podsumowaniu zamówienia
   jest zbędny — samo miejsce na listę pozycji ma być zwięzłe: nazwa +
   ilość + cena, bez dodatkowego tekstu. */
.tt-checkout-page .wc-block-components-product-metadata {
	display: none;
}

.tt-checkout-page .wc-block-components-totals-footer-item .wc-block-components-totals-item__label,
.tt-checkout-page .wc-block-components-totals-footer-item .wc-block-components-totals-item__value {
	font-family: var(--tt-font-heading);
	font-size: 1.2rem;
	color: var(--tt-black);
}

/* Panel kuponu — spójny z resztą interaktywnych elementów (link w kolorze akcentu) */
.tt-checkout-page .wc-block-components-totals-coupon .wc-block-components-panel__button {
	font-family: var(--tt-font-body);
	font-weight: 600;
	color: var(--tt-accent);
}

/* =========================================================
   KOSZYK — klasa .tt-cart-page dodawana na <body> filtrem w
   functions.php na is_cart(). Ta sama historia co w Kasie: strona
   korzysta z bloku Gutenberga WooCommerce (.wp-block-woocommerce-cart,
   klasy "wc-block-cart-*"/"wc-block-components-*"), sprawdzone na
   żywo na /koszyk/ przez devtools. Sidebar bloga usuwa PHP, banner
   "KOSZYK" i karty w tym samym neubrutalistycznym języku co reszta
   sklepu — część klas (".wc-block-components-sidebar",
   ".wc-block-components-totals-footer-item", panel kuponu) jest
   WSPÓLNA z Kasą (WC Blocks reużywa te same komponenty), więc te
   reguły są właściwie duplikatem tamtych z myślą o samodzielności tej
   sekcji, gdyby ktoś kiedyś skasował blok "KASA / CHECKOUT". */

.tt-cart-page #primary.content-area {
	width: 100%;
	float: none;
}

.tt-cart-page #content > .col-full {
	max-width: 1440px;
}

.tt-cart-page .entry-header {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.22), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.14), transparent 40%),
		var(--tt-black);
	padding: 48px 20px 38px;
	text-align: center;
	margin-bottom: 40px;
	overflow: hidden;
}

.tt-cart-page .entry-title {
	font-family: var(--tt-font-display);
	color: var(--tt-white);
	font-size: 2.2rem;
	letter-spacing: 0.02em;
	text-shadow: 0 0 18px rgba(226, 35, 26, 0.5), 0 0 34px rgba(0, 229, 255, 0.18);
	margin: 0;
}

.tt-cart-page .entry-title::before {
	content: "// TWOJE PRZEDMIOTY";
	display: block;
	font-family: var(--tt-font-body);
	font-size: 0.7rem;
	letter-spacing: 0.25em;
	color: var(--tt-accent-2);
	margin-bottom: 14px;
}

@media (max-width: 600px) {
	.tt-cart-page .entry-title {
		font-size: 1.6rem;
	}
}

/* Lista produktów — jedna neubrutalistyczna karta obejmująca cały
   "tabelaryczny" układ bloku (nagłówek kolumn + wiersze), rozdzielona
   przerywanymi liniami zamiast osobnych kart na wiersz, żeby nie
   wyglądało na przegęszczone przy kilku pozycjach. */
.tt-cart-page .wc-block-cart-items {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	box-shadow: 6px 6px 0 var(--tt-accent-2);
	padding: 8px 28px;
	margin-bottom: 28px;
}

.tt-cart-page .wc-block-cart-items__header {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	font-size: 0.75rem;
	color: var(--tt-black);
	border-bottom: 2px solid var(--tt-black);
}

.tt-cart-page .wc-block-cart-items__row {
	border-bottom: 1px dashed #ccc;
}

.tt-cart-page .wc-block-components-product-name {
	font-family: var(--tt-font-body);
	font-weight: 600;
	color: var(--tt-black);
}

.tt-cart-page .wc-block-cart-item__image img {
	border: 2px solid var(--tt-black);
	border-radius: 2px;
}

.tt-cart-page .wc-block-components-quantity-selector {
	border: 2px solid var(--tt-black) !important;
	border-radius: 2px !important;
}

.tt-cart-page .wc-block-components-quantity-selector__button {
	font-family: var(--tt-font-heading);
}

.tt-cart-page .wc-block-cart-item__remove-link {
	color: var(--tt-accent) !important;
}

.tt-cart-page .wc-block-cart-item__remove-link svg {
	fill: currentColor;
}

/* Krótki opis produktu (np. "Drogi Graczu!") pod nazwą jest zbędny —
   lista ma zostać zwięzła: nazwa, ilość, cena. */
.tt-cart-page .wc-block-components-product-metadata {
	display: none;
}

/* Podsumowanie koszyka — karta z czerwonym cieniem (ten sam kontrast
   biało/czerwono/cyjanowy co w Kasie: lista produktów = cyjan, "co
   płacę" = czerwień).
   NAPRAWKA "PRZYKLEJENIA": ten sam komponent WC Blocks co w Kasie, ta
   sama poprawka top — inaczej sticky header (88px wysokości) zakrywał
   górę podsumowania przy scrollu, bo WC Blocks samo ustawia top:24px. */
.tt-cart-page .wc-block-components-sidebar {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	box-shadow: 6px 6px 0 var(--tt-accent);
	padding: 26px 28px;
	top: 108px !important;
}

.tt-cart-page .wc-block-cart__totals-title {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 1.1rem;
	color: var(--tt-black);
}

.tt-cart-page .wc-block-components-totals-footer-item .wc-block-components-totals-item__label,
.tt-cart-page .wc-block-components-totals-footer-item .wc-block-components-totals-item__value {
	font-family: var(--tt-font-heading);
	font-size: 1.2rem;
	color: var(--tt-black);
}

.tt-cart-page .wc-block-components-button.wp-element-button {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	border-radius: 2px;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.tt-cart-page .wc-block-cart__submit-button {
	background: var(--tt-accent) !important;
	border-color: var(--tt-accent) !important;
	color: var(--tt-white) !important;
	text-decoration: none !important;
	font-size: 1.05rem !important;
	padding: 16px !important;
	width: 100%;
	text-align: center;
}

.tt-cart-page .wc-block-cart__submit-button:hover {
	transform: translateY(-2px);
	box-shadow: 0 6px 22px rgba(255, 63, 63, 0.45);
}

.tt-cart-page .wc-block-components-totals-coupon .wc-block-components-panel__button {
	font-family: var(--tt-font-body);
	font-weight: 600;
	color: var(--tt-accent);
}

/* =========================================================
   POJEDYNCZY PRODUKT — inspiracja: karta produktu na limitedrungames.com
   (duża galeria w ramce z twardym cieniem, cena jako mocny akcent,
   przekrzywiony/ścięty przycisk CTA, sekcje szczegółów jako "biletowe"
   zakładki z jednostronnie ściętą krawędzią — nawiązanie do tej samej
   ząbkowanej stylistyki, którą motyw ma już w stopce). To klasyczny
   szablon WooCommerce (nie blok Gutenberga), więc reużywamy standardowe
   klasy WooCommerce/Storefront. Klasa .tt-product-page (is_product())
   usuwa sidebar bloga i oddaje całą szerokość produktowi — dokładnie
   ten sam zabieg co w sklepie/koszyku/kasie. */

.tt-product-page #primary.content-area {
	width: 100%;
	float: none;
}

.tt-product-page #content > .col-full {
	max-width: 1440px;
}

/* UKŁAD: div.product ma jako bezpośrednie dzieci galerię, podsumowanie,
   zakładki, "podobne produkty" i nawigację prev/next — dokładnie te
   same 5 elementów co w domyślnym szablonie WooCommerce (sprawdzone na
   żywo). Galeria i podsumowanie stają obok siebie w dwóch kolumnach,
   reszta dostaje pełną szerokość w kolejnych wierszach. */
.tt-product-page div.product {
	display: grid;
	grid-template-columns: 1.05fr 1fr;
	column-gap: 48px;
	align-items: start;
	margin: 40px 0 20px;
}

/* BUG ZNALEZIONY NA ŻYWO (produkt "Shanks"): kolumny grida potrafiły
   rozjechać się DALEKO poza kontener (np. 2354px + 267px zamiast
   1440px), przez co cała prawa kolumna (tytuł/cena/CTA) wylatywała
   poza widoczny ekran. Przyczyna: domyślnie grid item ma
   min-width:auto, czyli NIE MOŻE skurczyć się poniżej min-content
   swojej zawartości. ".woocommerce-tabs" i ".related.products"
   rozpinają OBIE kolumny (grid-column: 1 / -1) — gdy produkt ma dużo
   podobnych produktów, ich zagnieżdżony grid (auto-fill,
   minmax(200px,1fr)) ma spory min-content, który "wciska się" do
   algorytmu liczenia szerokości kolumn 1.05fr/1fr i je rozdyma.
   min-width: 0 to standardowa poprawka - pozwala fr faktycznie
   kontrolować szerokość zamiast być nadpisanym przez min-content. */
.tt-product-page .woocommerce-product-gallery,
.tt-product-page .summary.entry-summary,
.tt-product-page .woocommerce-tabs,
.tt-product-page .related.products,
.tt-product-page .storefront-product-pagination {
	min-width: 0;
}

/* DRUGI BUG ZNALEZIONY NA ŻYWO (produkt "Game Boy Classic"): mimo
   poprawki wyżej, kolumny i tak nie wypełniały siatki — galeria i
   podsumowanie kurczyły się do szerokości swojej zawartości (~293px i
   ~359px), a zakładki (OPIS/INFORMACJE/OPINIE) renderowały się jako
   wąska kolumna po lewej z opisem WEDŁUG obok, a nie pod spodem.
   Przyczyna: to stary, "klasyczny" (nie blokowy) szablon WooCommerce —
   jego DOMYŚLNE style Storefronta wciąż ustawiają float:left/right na
   ".images"/".summary" (dwukolumnowy layout sprzed CSS Grid) oraz na
   "ul.tabs"/".panel" (boczny układ zakładek). Ustawienie display:grid
   na rodzicu NIE kasuje floata na dzieciach — dziecko z floatem nadal
   dostaje tryb "shrink-to-fit" zamiast rozciągnąć się na kolumnę/wiersz
   grida (dokładnie ten sam mechanizm co bug z li.product w archiwum
   sklepu, patrz sekcja SKLEP wyżej). Trzeba jawnie zgasić float. */
.tt-product-page .woocommerce-product-gallery,
.tt-product-page .summary.entry-summary {
	float: none;
	width: auto;
}

.tt-product-page .woocommerce-tabs ul.tabs,
.tt-product-page .woocommerce-tabs .panel {
	float: none;
	width: auto;
}

.tt-product-page .woocommerce-product-gallery {
	grid-column: 1;
	grid-row: 1;
}

.tt-product-page .summary.entry-summary {
	grid-column: 2;
	grid-row: 1;
}

.tt-product-page .woocommerce-tabs {
	grid-column: 1 / -1;
	margin-top: 50px;
}

.tt-product-page .related.products {
	grid-column: 1 / -1;
	margin-top: 60px;
}

.tt-product-page .storefront-product-pagination {
	grid-column: 1 / -1;
	margin-top: 24px;
}

@media (max-width: 860px) {
	.tt-product-page div.product {
		grid-template-columns: 1fr;
	}

	.tt-product-page .summary.entry-summary {
		grid-column: 1;
		grid-row: 2;
		margin-top: 30px;
	}
}

/* GALERIA — gruba ramka + twardy cień (cyjan), ten sam neubrutalizm co
   karty w sidebarze sklepu. Miniaturki FlexSlidera dostają obwódkę,
   aktywna podświetla się na cyjan. Domyślną lupkę WC (ikona zoomu w
   rogu) chowamy — stylistycznie nie pasuje i dubluje kliknięcie w
   zdjęcie, które i tak otwiera podgląd przez FlexSlider/PhotoSwipe. */
.tt-product-page .woocommerce-product-gallery {
	position: relative;
	max-width: 560px;
}

/* BUG ZNALEZIONY NA ŻYWO (produkt "Luffy" — obwódka wyglądała jak
   niedomknięta litera "L", widoczna tylko od góry i z lewej): ramka +
   cień siedziały na ".woocommerce-product-gallery__wrapper", ale TO
   NIE JEST pojedyncze zdjęcie — to wewnętrzny, przesuwany PASEK
   FlexSlidera ze WSZYSTKIMI slajdami obok siebie (potrafi mieć nawet
   kilka tysięcy px szerokości przy kilku zdjęciach produktu). Widać
   było tylko lewy-górny róg tej ogromnej ramki, bo resztę przycinał
   dopiero RODZIC (".flex-viewport", overflow:hidden). Poprawka:
   ramkę/cień przenosimy na ".flex-viewport" — to jedyny element w tej
   strukturze, który ZAWSZE ma poprawny, przycięty do jednego zdjęcia
   rozmiar. Wrapper zostaje bez obwódki (i tak jest przycięty przez
   rodzica, więc wizualnie nie ma znaczenia). Przy okazji: max-width
   560px na całej galerii, żeby zdjęcie nie dominowało układu obok
   podsumowania (zgłoszone jako "trochę za duże"). */
.tt-product-page .flex-viewport {
	/* height:auto nadpisuje inline wysokość, którą FlexSlider liczy raz
	   przy starcie (może "zamrozić" złą wartość, jeśli zdjęcie nie jest
	   idealnym kwadratem) — overflow:hidden nadal przycina poziomo do
	   jednego slajdu, więc przełączanie miniaturek dalej działa. */
	height: auto !important;
	border: 3px solid var(--tt-black);
	border-radius: 4px;
	overflow: hidden;
	box-shadow: 8px 8px 0 var(--tt-accent-2);
	background: var(--tt-white);
}

.tt-product-page .woocommerce-product-gallery__wrapper {
	border: none;
	box-shadow: none;
}

/* BUG ZNALEZIONY NA ŻYWO (produkty "Wii Famicom Controller" i "Game Boy
   Classic"): z aspect-ratio:1/1 na tym img, Chrome potrafił w ogóle NIE
   wyrenderować pikseli zdjęcia — pusty, szary kwadrat mimo że obrazek
   był poprawnie załadowany (complete:true, poprawny naturalWidth).
   Powtarzalne na zdjęciach o proporcjach mocno innych niż kwadrat
   (np. pionowe pudełko 416×555), w połączeniu z tym, że FlexSlider
   dokłada do slajdu własne inline-style (width/float) już PO tym jak
   przeglądarka zdążyła policzyć layout — to kolizja, przez którą
   przeglądarka nie unieważnia malowania obrazka wewnątrz wymuszonego
   aspect-ratio. Usunięcie aspect-ratio i oparcie się na naturalnych
   proporcjach (height:auto + max-height) naprawia to w 100% przypadków
   sprawdzonych na żywo — kosztem tego, że rama nie jest już idealnym
   kwadratem dla każdego zdjęcia, ale to dużo mniejsze zło niż puste
   zdjęcie na stronie produktu. */
.tt-product-page .woocommerce-product-gallery__image img {
	display: block;
	width: 100%;
	height: auto;
	max-height: 720px;
	object-fit: contain;
	background: #f4f4f4;
}

.tt-product-page .woocommerce-product-gallery__trigger {
	display: none;
}

/* Miniaturki na siatce (auto-fill kolumn 72px) zamiast flex-wrap —
   gwarantuje równe rzędy niezależnie od tego, ile zdjęć ma produkt
   (przy flex-wrap ostatni, niepełny rząd "rozjeżdżał" się wizualnie).
   Ramka + twardy przesunięty cień to ten sam "neubrutalistyczny" motyw
   co karty produktów/checkout/koszyk w reszcie motywu, żeby miniaturki
   nie wyglądały jak gołe, cienkie obwódki oderwane od stylu strony. */
.tt-product-page .flex-control-thumbs {
	display: grid;
	grid-template-columns: repeat(auto-fill, 72px);
	gap: 12px;
	margin: 16px 0 0;
	padding: 0;
	list-style: none;
}

.tt-product-page .flex-control-thumbs li {
	width: 72px;
	height: 72px;
}

.tt-product-page .flex-control-thumbs img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	border: 3px solid var(--tt-black);
	border-radius: 3px;
	cursor: pointer;
	opacity: 0.55;
	box-shadow: 3px 3px 0 rgba(18, 18, 18, 0.15);
	transition: opacity 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;
}

.tt-product-page .flex-control-thumbs img.flex-active,
.tt-product-page .flex-control-thumbs img:hover {
	opacity: 1;
	border-color: var(--tt-accent-2);
	box-shadow: 3px 3px 0 var(--tt-accent-2);
	transform: translateY(-2px);
}

/* PODSUMOWANIE — tytuł, cena jako przekrzywiona "naklejka" (ten sam
   motyw co na kartach produktów), status magazynowy jako plakietka,
   formularz koszyka z krojonym, "biletowym" przyciskiem CTA. */
.tt-product-page .product_title.entry-title {
	font-family: var(--tt-font-display);
	font-size: 2rem;
	line-height: 1.15;
	text-transform: uppercase;
	color: var(--tt-black);
	margin: 0 0 18px;
}

.tt-product-page .summary .price {
	display: inline-block;
	background: var(--tt-accent);
	color: var(--tt-white) !important;
	font-family: var(--tt-font-heading);
	font-weight: 700;
	font-size: 1.5rem;
	padding: 8px 22px;
	margin: 0 0 22px;
	transform: rotate(-2deg);
	box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.25);
}

.tt-product-page .summary .price ins {
	text-decoration: none;
}

.tt-product-page .summary .price del {
	opacity: 0.65;
	font-size: 0.65em;
	margin-right: 10px;
}

.tt-product-page .woocommerce-product-details__short-description {
	font-family: var(--tt-font-body);
	color: #333;
	line-height: 1.65;
	margin-bottom: 20px;
}

.tt-product-page .woocommerce-product-details__short-description ul {
	padding-left: 20px;
}

.tt-product-page p.stock {
	display: inline-block;
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	font-size: 0.78rem;
	letter-spacing: 0.05em;
	padding: 7px 16px;
	border-radius: 2px;
	margin: 0 0 22px;
}

.tt-product-page p.stock.in-stock {
	background: rgba(0, 229, 255, 0.12);
	color: #067a86;
	border: 2px solid var(--tt-accent-2);
}

.tt-product-page p.stock.out-of-stock {
	background: rgba(255, 63, 63, 0.1);
	color: var(--tt-accent);
	border: 2px solid var(--tt-accent);
}

.tt-product-page form.cart {
	display: flex;
	flex-wrap: wrap;
	align-items: stretch;
	gap: 14px;
	margin: 0 0 26px;
}

/* Komunikat wtyczki "Points and Rewards" (np. "Kupując ten produkt
   zyskasz X ¥eny!") jest renderowany przez wtyczkę jako pierwsze
   dziecko form.cart, tuż obok ilości i przycisku — bez tej reguły
   wpychał się w ten sam rząd flex co przycisk "Dodaj do koszyka" i
   nachodził na niego na węższych ekranach. Wymuszamy własny, pełnej
   szerokości wiersz nad resztą formularza. */
.tt-product-page form.cart .wc-points-rewards-product-message {
	order: -1;
	flex: 0 0 100%;
	width: 100%;
	margin: 0 0 4px;
	font-family: var(--tt-font-body);
	font-size: 0.88rem;
	color: #666;
}

.tt-product-page form.cart > br {
	display: none;
}

.tt-product-page .quantity .qty {
	width: 70px;
	height: 100%;
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	font-family: var(--tt-font-heading);
	font-size: 1rem;
	text-align: center;
}

/* Przycisk "Dodaj do koszyka" ścięty po skosie z obu boków — nawiązanie
   do "biletowego"/skośnego CTA z LRG, ale w naszych barwach i kroju. */
.tt-product-page .single_add_to_cart_button {
	flex: 1;
	background: var(--tt-accent) !important;
	color: var(--tt-white) !important;
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	font-size: 1rem;
	border: none;
	padding: 14px 30px;
	clip-path: polygon(12px 0, 100% 0, calc(100% - 12px) 100%, 0 100%);
	cursor: pointer;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.tt-product-page .single_add_to_cart_button:hover {
	transform: translateY(-2px);
	box-shadow: 0 8px 22px rgba(255, 63, 63, 0.4);
}

.tt-product-page .single_add_to_cart_button.disabled {
	background: #999 !important;
	cursor: not-allowed;
	box-shadow: none;
}

.tt-product-page .product_meta {
	font-family: var(--tt-font-body);
	font-size: 0.82rem;
	color: #666;
	border-top: 1px dashed #ccc;
	padding-top: 16px;
}

.tt-product-page .product_meta a {
	color: var(--tt-accent);
	text-decoration: none;
}

.tt-product-page .product_meta a:hover {
	color: var(--tt-accent-2);
}

/* ZAKŁADKI (Opis / Informacje dodatkowe / Opinie) — nawigacja jako
   "biletowe" przyciski ze ściętym prawym rogiem, aktywna zakładka na
   czerwono. Panel pod spodem to neubrutalistyczna karta jak reszta
   sklepu. WooCommerce dokleja do każdego panelu WŁASNY <h2> z tą samą
   nazwą co zakładka (np. drugie "Opis" w środku) — chowamy, żeby się
   nie dublowało z przyciskiem nawigacji nad nim. */
.tt-product-page .woocommerce-tabs ul.tabs {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	list-style: none;
	margin: 0 0 -3px;
	padding: 0;
}

.tt-product-page .woocommerce-tabs ul.tabs li {
	margin: 0;
}

.tt-product-page .woocommerce-tabs ul.tabs li a {
	display: block;
	background: var(--tt-black);
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 0.85rem;
	padding: 13px 26px 13px 20px;
	text-decoration: none;
	clip-path: polygon(0 0, calc(100% - 14px) 0, 100% 100%, 0 100%);
	transition: background 0.2s ease;
}

.tt-product-page .woocommerce-tabs ul.tabs li.active a,
.tt-product-page .woocommerce-tabs ul.tabs li a:hover {
	background: var(--tt-accent);
}

.tt-product-page .woocommerce-tabs .panel {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	box-shadow: 6px 6px 0 var(--tt-accent-2);
	padding: 30px;
	font-family: var(--tt-font-body);
	color: #333;
	line-height: 1.7;
}

.tt-product-page .woocommerce-Tabs-panel > h2 {
	display: none;
}

.tt-product-page .woocommerce-Tabs-panel table.shop_attributes {
	width: 100%;
	border-collapse: collapse;
}

.tt-product-page .woocommerce-Tabs-panel table.shop_attributes th,
.tt-product-page .woocommerce-Tabs-panel table.shop_attributes td {
	padding: 10px 14px;
	border: 1px solid #e2e2e2;
	font-family: var(--tt-font-body);
	font-size: 0.88rem;
}

.tt-product-page .woocommerce-Tabs-panel table.shop_attributes th {
	background: #f7f7f7;
	font-weight: 700;
	text-align: left;
}

/* "PODOBNE PRODUKTY" — nagłówek sekcji w tym samym stylu co reszta
   .tt-eyebrow/nagłówków sekcji na stronie głównej. Same karty dostają
   DOKŁADNIE ten sam retro-cartridge wygląd co reszta sklepu — patrz
   dopisane wyżej selektory ".tt-product-page .related.products
   ul.products li.product" w bloku "KARTY PRODUKTÓW", żeby nie
   duplikować całego stylu. */
.tt-product-page .related.products > h2 {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 1.4rem;
	color: var(--tt-black);
	margin: 0 0 24px;
	padding-bottom: 14px;
	border-bottom: 3px solid var(--tt-black);
}

.tt-product-page .related.products ul.products {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
	gap: 20px;
	list-style: none;
	padding: 0;
}

.tt-product-page .related.products ul.products::before,
.tt-product-page .related.products ul.products::after {
	content: none !important;
	display: none !important;
}

.tt-product-page .storefront-product-pagination {
	font-family: var(--tt-font-body);
	font-size: 0.85rem;
}

.tt-product-page .storefront-product-pagination a {
	color: var(--tt-accent);
	text-decoration: none;
}

/* =========================================================
   RETRO PRODUKTY — strona-hub z kartami konsol (page-retro-hub.php).
   Zwykła strona WP (nie WooCommerce), więc usuwamy standardowy
   Storefrontowy nagłówek strony i budujemy własny, pełnoszerokościowy
   baner — ten sam język co SKLEP/KASA/KOSZYK/PRODUKT (radial-gradient
   na czerni, pixel-artowy eyebrow, neonowy tytuł). Karty konsol
   reużywają neubrutalistyczny motyw kart (ścięte rogi, twardy cień),
   ale w JASNEJ odmianie (białe tło), bo stoją na jasnym tle strony —
   ciemna wersja (jak karty produktów) zlewałaby się z ciemnym
   banerem powyżej i wyglądała nieczytelnie na białym tle sekcji. */
.tt-retro-hub .storefront-breadcrumb {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	margin-top: 0;
	margin-bottom: 0;
	padding: 0;
	background: var(--tt-black);
}

.tt-retro-hub #primary.content-area {
	width: 100%;
	float: none;
}

.tt-retro-hub #content > .col-full {
	max-width: 1440px;
}

.tt-retro-hero {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.22), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.14), transparent 40%),
		var(--tt-black);
	padding: 40px 20px 34px;
	text-align: center;
	overflow: hidden;
}

.tt-retro-hero__inner {
	max-width: 720px;
}

.tt-retro-hero__title {
	font-family: var(--tt-font-display);
	color: var(--tt-white);
	font-size: 2.4rem;
	letter-spacing: 0.02em;
	text-shadow: 0 0 18px rgba(226, 35, 26, 0.5), 0 0 34px rgba(0, 229, 255, 0.18);
	margin: 0;
}

@media (max-width: 600px) {
	.tt-retro-hero__title {
		font-size: 1.8rem;
	}
}

/* Sekcja wprowadzenia pod Hero: tekst po lewej, zdjęcie po prawej —
   ta sama neubrutalistyczna rama (czarna ramka + twardy cień), co
   karty produktów, ale w wersji "obrazkowej", żeby dwa duże bloki
   (tekst / zdjęcie) czuły się jak część tego samego systemu wizualnego. */
.tt-retro-intro {
	position: relative;
	display: flex;
	align-items: center;
	gap: 56px;
	padding: 56px 20px 64px;
}

/* Bouncery (patrz tt-bouncer.js) na jasnym tle tej sekcji — cieńszy,
   ciemny cień zamiast neonowej poświaty, bo ta ostatnia gubi się na
   białym tle (ten sam patent co .tt-usp/.tt-worlds niżej w pliku). */
.tt-retro-intro .tt-bouncer svg {
	filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.3));
}

.tt-retro-intro__text {
	flex: 1 1 0;
	min-width: 0;
}

.tt-retro-intro__eyebrow {
	text-align: left;
	margin: 0 0 10px;
}

.tt-retro-intro__title {
	position: relative;
	display: inline-block;
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 1.6rem;
	color: var(--tt-black);
	margin: 0 0 24px;
	padding-bottom: 14px;
}

.tt-retro-intro__title::after {
	content: "";
	position: absolute;
	left: 0;
	bottom: 0;
	width: 48px;
	height: 4px;
	background: var(--tt-accent-2);
	box-shadow: 6px 0 0 var(--tt-accent);
}

.tt-retro-intro__text p {
	font-family: var(--tt-font-body);
	color: #333;
	line-height: 1.75;
	font-size: 0.98rem;
	margin: 0 0 14px;
}

.tt-retro-intro__text strong {
	color: var(--tt-black);
}

.tt-retro-intro__callout {
	margin-top: 20px;
	padding: 16px 20px;
	background: rgba(226, 35, 26, 0.06);
	border-left: 4px solid var(--tt-accent);
	text-align: left;
}

.tt-retro-intro__callout p {
	margin: 0;
	font-size: 0.92rem;
	line-height: 1.65;
}

.tt-retro-intro__callout strong {
	color: var(--tt-accent);
}

/* Zdjęcie jako "naklejka" zamiast zwykłej ramki: lekki obrót, ścięte
   przeciwległe rogi (ten sam clip-path co karty produktowe), i druga,
   przesunięta kopia tła w cyjanie widoczna spod spodu jako twardy
   cień z kolorem zamiast płaskiego box-shadow. Plakietka "EXCLUSIVE"
   dopina temat "unikatowe produkty" z tekstu obok. */
.tt-retro-intro__media {
	position: relative;
	flex: 0 0 auto;
	width: 38%;
	max-width: 420px;
}

.tt-retro-intro__media-frame {
	position: relative;
	transform: rotate(-3deg);
	transition: transform 0.25s ease;
}

.tt-retro-intro__media:hover .tt-retro-intro__media-frame {
	transform: rotate(-1deg);
}

.tt-retro-intro__media-frame::before {
	content: "";
	position: absolute;
	inset: 0;
	background: var(--tt-accent-2);
	clip-path: polygon(24px 0, 100% 0, 100% calc(100% - 24px), calc(100% - 24px) 100%, 0 100%, 0 24px);
	transform: rotate(6deg) translate(16px, 16px);
	z-index: 0;
}

.tt-retro-intro__media-frame img {
	position: relative;
	z-index: 1;
	display: block;
	width: 100%;
	height: auto;
	border: 4px solid var(--tt-black);
	clip-path: polygon(24px 0, 100% 0, 100% calc(100% - 24px), calc(100% - 24px) 100%, 0 100%, 0 24px);
	background: #fff;
}

.tt-retro-intro__media-tag {
	position: absolute;
	top: -14px;
	right: 6px;
	z-index: 2;
	background: var(--tt-black);
	color: var(--tt-white);
	font-family: var(--tt-font-pixel);
	font-size: 0.55rem;
	letter-spacing: 0.08em;
	padding: 6px 10px;
	transform: rotate(4deg);
	box-shadow: 4px 4px 0 var(--tt-accent);
}

@media (max-width: 860px) {
	.tt-retro-intro {
		flex-direction: column;
		gap: 36px;
		padding: 44px 20px 48px;
		text-align: center;
	}
	/* Po złożeniu sekcji w kolumnę robi się za niska/wąska, żeby
	   odbijający się bouncer nie nachodził prędzej czy później na
	   nagłówek "Znajdź swoją perełkę" — na wąskich ekranach lepiej go
	   po prostu schować (czysto dekoracyjny, aria-hidden). */
	.tt-retro-intro .tt-bouncer {
		display: none;
	}
	.tt-retro-intro__eyebrow {
		text-align: center;
	}
	.tt-retro-intro__title::after {
		left: 50%;
		transform: translateX(-50%);
	}
	.tt-retro-intro__media {
		width: 70%;
		max-width: 320px;
	}
	.tt-retro-intro__media-tag {
		right: 50%;
		transform: translateX(50%);
	}
}

@media (max-width: 480px) {
	.tt-retro-intro__media {
		width: 88%;
	}
}

/* Przełamanie między sekcją wprowadzenia a siatką konsol — rząd
   pikselowych rombów w kolorach marki, ten sam "kartridżowy" język,
   co zygzak w stopce, tylko subtelniejszy (to wnętrze strony, nie
   krawędź). */
.tt-retro-divider {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 22px;
	padding: 0 20px 46px;
}

.tt-retro-divider span {
	width: 12px;
	height: 12px;
	background: var(--tt-accent);
	transform: rotate(45deg);
	box-shadow: 0 0 10px rgba(226, 35, 26, 0.45);
}

.tt-retro-divider span:nth-child(2n) {
	background: var(--tt-accent-2);
	box-shadow: 0 0 10px rgba(0, 229, 255, 0.4);
}

.tt-retro-divider span:nth-child(3) {
	width: 16px;
	height: 16px;
}

.tt-retro-consoles {
	padding-bottom: 70px;
}

.tt-retro-consoles__title {
	text-align: center;
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.06em;
	font-size: 1.3rem;
	color: var(--tt-black);
	margin: 0 0 32px;
}

.tt-retro-consoles__empty {
	text-align: center;
	font-family: var(--tt-font-body);
	color: #666;
}

.tt-console-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: 26px;
}

/* BUG ZNALEZIONY NA ŻYWO: samo "text-decoration: none" na karcie
   (<a>) nie wystarczyło — WooCommerce/Storefront mają gdzieś globalne
   "a { text-decoration: underline }" o wystarczającej sile, że
   podkreślenie i tak przebijało na zagnieżdżonym h3/span. Gasimy je
   jawnie na każdym potomku karty, nie tylko na samej karcie. */
.tt-console-card,
.tt-console-card * {
	text-decoration: none;
}

.tt-console-card {
	display: block;
	position: relative;
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	border-radius: 4px;
	overflow: hidden;
	box-shadow: 6px 6px 0 var(--tt-accent-2);
	transition: transform 0.2s ease, box-shadow 0.2s ease;
}

a.tt-console-card:hover {
	transform: translateY(-4px);
	box-shadow: 10px 10px 0 var(--tt-accent-2);
}

.tt-console-card__media {
	position: relative;
	aspect-ratio: 4 / 3;
	background: #f4f4f4;
	border-bottom: 3px solid var(--tt-black);
}

.tt-console-card__media img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.tt-console-card__body {
	padding: 18px 20px 22px;
}

.tt-console-card__body h3 {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 1.05rem;
	color: var(--tt-black);
	margin: 0 0 8px;
}

.tt-console-card__count {
	display: block;
	font-family: var(--tt-font-body);
	font-size: 0.82rem;
	color: #666;
	margin-bottom: 10px;
}

.tt-console-card__cta {
	display: inline-block;
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 0.8rem;
	color: var(--tt-accent);
}

/* Konsole bez produktów (jeszcze): karta jako <div>, nieklikalna,
   wyszarzone zdjęcie i naklejka WKRÓTCE — ten sam pomysł co naklejka
   SPRZEDANE na kartach produktów w archiwum sklepu. */
.tt-console-card--soon {
	cursor: default;
	box-shadow: 6px 6px 0 rgba(18, 18, 18, 0.12);
}

.tt-console-card--soon .tt-console-card__media img {
	filter: grayscale(1) brightness(0.9);
	opacity: 0.6;
}

.tt-console-card--soon .tt-console-card__body h3 {
	color: #888;
}

.tt-console-card--soon .tt-console-card__ribbon {
	position: absolute;
	top: 22%;
	left: -16%;
	width: 132%;
	text-align: center;
	padding: 6px 0;
	background: var(--tt-black);
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	font-weight: 700;
	letter-spacing: 0.1em;
	font-size: 0.78rem;
	transform: rotate(-12deg);
	box-shadow: 0 3px 10px rgba(0, 0, 0, 0.35);
}

/* =========================================================
   FIGURKI ZONE — czerwony "bliźniak" Retro Zone. Sekcja w markupie
   nosi OBIE klasy naraz (class="tt-retro tt-figures"), więc dziedziczy
   całą mechanikę siatki/kart po .tt-retro (kolumny, ścięte rogi,
   hover, cena-naklejka, przycisk) bez powtarzania kodu. Tutaj
   nadpisujemy WYŁĄCZNIE to, co ma być inne: czerwoną poświatę w tle
   zamiast siatki linii (eyebrow jest czerwony "za darmo", bo to
   domyślny kolor .tt-eyebrow bez modyfikatora -light). */
.tt-figures {
	background: radial-gradient(circle at 20% 25%, rgba(255, 63, 63, 0.22), transparent 45%),
		radial-gradient(circle at 85% 75%, rgba(226, 35, 26, 0.16), transparent 40%),
		var(--tt-black);
}

.tt-figures ul.products li.product::before {
	border-top-color: var(--tt-accent);
	border-left-color: var(--tt-accent);
}

.tt-figures ul.products li.product::after {
	border-bottom-color: var(--tt-accent);
	border-right-color: var(--tt-accent);
}

.tt-figures ul.products li.product:hover {
	border-color: rgba(255, 63, 63, 0.55);
	box-shadow: 0 18px 36px rgba(0, 0, 0, 0.6), 0 0 28px rgba(255, 63, 63, 0.28);
}

.tt-figures ul.products li.product a.button {
	border-color: var(--tt-accent);
	color: var(--tt-accent) !important;
}

.tt-figures ul.products li.product a.button:hover {
	background: var(--tt-accent);
	color: var(--tt-white) !important;
	box-shadow: 0 0 18px rgba(255, 63, 63, 0.45);
}

/* =========================================================
   PROSTO Z JAPONII — sekcja importowa
   ========================================================= */
.tt-import {
	/* deseń retro na białym tle */
	background-color: var(--tt-white);
	background-image: var(--tt-pattern-dark);
	background-size: 200px 200px;
}

.tt-import-grid {
	display: grid;
	grid-template-columns: 1.2fr 0.8fr;
	gap: 50px;
	align-items: center;
}

.tt-import-text .tt-eyebrow,
.tt-import-text .tt-section-title {
	text-align: left;
}

.tt-import-text p {
	color: #555;
	line-height: 1.7;
	font-family: var(--tt-font-body);
	margin: 0 0 30px;
}

.tt-import-stats {
	display: flex;
	gap: 34px;
	flex-wrap: wrap;
}

.tt-import-stat {
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.tt-import-number {
	font-family: var(--tt-font-heading);
	font-weight: 700;
	font-size: 1.8rem;
	color: var(--tt-accent);
}

.tt-import-stat span:last-child {
	font-size: 0.82rem;
	color: #666;
}

.tt-import-visual {
	position: relative;
	aspect-ratio: 1 / 1;
	display: flex;
	align-items: center;
	justify-content: center;
}

.tt-import-circle {
	width: 78%;
	height: 78%;
	border-radius: 50%;
	background: radial-gradient(circle at 35% 30%, var(--tt-jp-red), #7a0f0a 75%);
	position: relative;
	box-shadow: 0 20px 60px rgba(226, 35, 26, 0.35);
}

.tt-import-circle::before {
	content: "";
	position: absolute;
	inset: -16px;
	border-radius: 50%;
	border: 1.5px dashed rgba(226, 35, 26, 0.35);
	animation: tt-spin 30s linear infinite;
}

@keyframes tt-spin {
	from { transform: rotate(0deg); }
	to { transform: rotate(360deg); }
}

@media (max-width: 800px) {
	.tt-import-grid {
		grid-template-columns: 1fr;
	}
	.tt-import-text .tt-eyebrow,
	.tt-import-text .tt-section-title,
	.tt-import-text p {
		text-align: center;
	}
	.tt-import-stats {
		justify-content: center;
	}
	.tt-import-visual {
		max-width: 260px;
		margin: 0 auto;
	}
}

/* Social */
.tt-social-grid {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: 24px;
	max-width: 700px;
	margin: 0 auto;
}

.tt-social-card {
	background: var(--tt-white);
	border-radius: 6px;
	box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 44px 0;
}

.tt-social-card svg {
	width: 64px;
	height: 64px;
	border-radius: 14px;
}

@media (max-width: 600px) {
	.tt-social-grid {
		grid-template-columns: 1fr;
	}
}

/* =========================================================
   FOOTER
   ========================================================= */
.site-footer {
	/* deseń retro na czarnym tle, ten sam co w headerze/topbarze —
	   spina całą stronę w jedną spójną kompozycję. */
	background-color: var(--tt-black);
	background-image: var(--tt-pattern-light);
	background-size: 200px 200px;
	color: var(--tt-gray-text);
}

/* -----------------------------------------------------------
   NEONOWY BANNER Z HASŁEM (nad kolumnami stopki)
   --------------------------------------------------------- */
.tt-footer-tagline {
	text-align: center;
	padding: 54px 20px 6px;
}

.tt-footer-tagline p {
	margin: 0;
	font-family: var(--tt-font-display);
	text-transform: uppercase;
	font-size: clamp(1.9rem, 5.5vw, 3.8rem);
	letter-spacing: 0.01em;
	color: var(--tt-white);
	text-shadow: 0 0 18px rgba(255, 63, 63, 0.55), 0 0 42px rgba(0, 229, 255, 0.25);
}

.tt-footer-tagline p span {
	color: var(--tt-accent-2);
}

/* Rząd okrągłych ikon social w stopce */
.tt-footer-social {
	display: flex;
	justify-content: center;
	gap: 16px;
	padding: 22px 0 6px;
}

.tt-footer-social-icon {
	width: 42px;
	height: 42px;
	border-radius: 50%;
	border: 1.5px solid rgba(255, 255, 255, 0.2);
	display: flex;
	align-items: center;
	justify-content: center;
	transition: all 0.2s ease;
}

.tt-footer-social-icon svg {
	width: 18px;
	height: 18px;
	fill: var(--tt-white);
}

.tt-footer-social-icon:hover {
	border-color: var(--tt-accent-2);
	box-shadow: 0 0 16px rgba(0, 229, 255, 0.35);
}

/* -----------------------------------------------------------
   KOLUMNY STOPKI — flex (celowo NIE grid, patrz komentarz przy
   .tt-import-grid::before wyżej: łączenie .col-full z display:grid
   uruchamia domyślny clearfix Storefronta jako fantomową komórkę
   siatki i rozjeżdża layout).
   --------------------------------------------------------- */
.tt-footer-inner {
	display: flex;
	flex-wrap: wrap;
	gap: 30px;
	padding: 40px 0 30px;
}

.tt-footer-col {
	flex: 1 1 200px;
	position: relative;
	padding-left: 30px;
}

.tt-footer-col:first-child {
	padding-left: 0;
	flex-basis: 240px;
}

.tt-footer-col:not(:first-child)::before {
	content: "";
	position: absolute;
	left: 0;
	top: 4px;
	bottom: 4px;
	width: 1px;
	background: rgba(255, 255, 255, 0.12);
}

.tt-footer-brand img {
	max-height: 70px;
	width: auto;
}

.tt-footer-tag {
	margin: 14px 0 0;
	font-size: 0.85rem;
	color: var(--tt-gray-text);
	line-height: 1.6;
	max-width: 220px;
}

.tt-footer-col h3 {
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.02em;
	font-size: 0.95rem;
	margin: 0 0 16px;
}

.tt-footer-col ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

.tt-footer-col ul li {
	margin-bottom: 10px;
}

/* STOPKA NIECZYTELNA: Storefrontowy Customizer generuje własną regułę
   `.site-footer a:not(.button):not(.components-button) { color:#333; }`
   — dwa :not() ze swoimi klasami windują jej specyficzność znacznie
   wyżej niż nasze proste `.tt-footer-col a`, więc mimo jasnego koloru w
   zmiennej --tt-gray-text linki i tak wychodziły ciemnoszare (#333) na
   czarnym tle = praktycznie niewidoczne. Wymuszamy jasny kolor
   !important, żeby wygrać niezależnie od tej specyficzności. */
.tt-footer-col a {
	color: #e5e5e5 !important;
	text-decoration: none;
}

.tt-footer-col a:hover {
	color: var(--tt-accent) !important;
}

.tt-footer-col p {
	margin: 0 0 10px;
}

.tt-footer-bottom {
	border-top: 1px solid rgba(255, 255, 255, 0.1);
	padding: 18px 0;
	display: flex;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 10px;
	font-size: 0.8rem;
	font-family: var(--tt-font-body);
}

.tt-footer-bottom a {
	color: var(--tt-accent-2) !important;
	text-decoration: none;
}

.tt-footer-bottom p {
	margin: 0;
	color: var(--tt-gray-text) !important;
}

/* Ząbkowany, "biletowy" pasek zamykający stopkę — retro akcent, ten sam
   pomysł co różowy zygzak w Limited Run Games, w naszych barwach.
   DWIE POPRAWKI względem starej wersji (zgłoszenie: "wygląda słabo i
   nie jest na całą szerokość"):
   1) Storefront owija CAŁY `do_action('storefront_footer')` w jeden,
      wspólny `<div class="col-full">` (dokładnie ten sam mechanizm co
      przy innych sekcjach) — nasz pasek, w przeciwieństwie do
      .tt-footer-inner/.tt-footer-bottom, nie miał WŁASNEJ klasy
      col-full do przełamania tego ograniczenia, więc był ucięty do
      ok. 1064px zamiast całej szerokości ekranu. Wyłamujemy go tym
      samym patentem 100vw/-50vw co Hero/Retro Zone.
   2) Zamiast jednego, płaskiego rzędu małych czerwonych trójkącików —
      dwa przeplatające się rzędy (czerwony/cyjan, ząbki w przeciwną
      stronę) w grubszym pasie + neonowy blask pod spodem, żeby
      wyglądało jak podświetlana krawędź kartridża, a nie cienka kreska. */
.tt-footer-zigzag {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	height: 26px;
	background-image:
		linear-gradient(135deg, var(--tt-accent) 25%, transparent 25.5%),
		linear-gradient(225deg, var(--tt-accent) 25%, transparent 25.5%),
		linear-gradient(315deg, var(--tt-accent-2) 25%, transparent 25.5%),
		linear-gradient(45deg, var(--tt-accent-2) 25%, transparent 25.5%);
	background-size: 26px 26px;
	background-position: 0 -6px, 0 -6px, 0 6px, 0 6px;
	background-repeat: repeat-x;
	box-shadow: 0 0 18px rgba(255, 63, 63, 0.4), 0 0 22px rgba(0, 229, 255, 0.3);
}

@media (max-width: 800px) {
	.tt-footer-inner {
		text-align: center;
	}
	.tt-footer-col {
		flex: 1 1 100%;
		padding-left: 0;
	}
	.tt-footer-col:not(:first-child)::before {
		display: none;
	}
	.tt-footer-tag {
		margin-left: auto;
		margin-right: auto;
	}
	.tt-footer-bottom {
		justify-content: center;
		text-align: center;
	}
}

/* =========================================================
   MOJE KONTO — zamiana domyślnego bocznego panelu WooCommerce
   (<ul><li> linków) na siatkę klikalnych kafelków wyśrodkowaną na
   stronie. Sama siatka jest renderowana przez nadpisany szablon
   woocommerce/myaccount/navigation.php (patrz ten plik + functions.php
   sekcja "11. MOJE KONTO") — tutaj tylko warstwa wizualna. Ten sam
   język co RETRO PRODUKTY: pełnoszerokościowy ciemny baner + jasne
   neubrutalistyczne karty poniżej. */
.tt-my-account .storefront-breadcrumb {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	margin-top: 0;
	margin-bottom: 0;
	padding: 0;
	background: var(--tt-black);
}

.tt-my-account #primary.content-area {
	width: 100%;
	float: none;
}

.tt-my-account #content > .col-full {
	max-width: 1100px;
	padding-bottom: 60px;
}

/* BUG ZNALEZIONY NA ŻYWO: Moje Konto to zwykła strona WP z shortcode'em
   WooCommerce (nie custom szablon jak RETRO PRODUKTY), więc Storefront
   i tak renderuje swój domyślny .entry-header/.entry-title NAD treścią.
   Doklejenie OSOBNEGO banera (jak najpierw zrobiliśmy) dawało dwa razy
   napis "MOJE KONTO" jeden pod drugim. Naprawka: nie dodajemy nowego
   elementu, tylko PRZESTYLOWUJEMY już istniejący entry-header/entry-title
   w baner — dokładnie ta sama, sprawdzona metoda co na KASA/KOSZYK
   (entry-title::before jako eyebrow "// ..."). Tytuł jest tu dodatkowo
   DYNAMICZNY z natywnego WooCommerce — na Kokpicie pokazuje "Moje konto",
   ale na zakładce Zamówienia/Adresy/itd. sam zmienia się na nazwę
   zakładki, więc nie trzeba tego ręcznie obsługiwać. */
.tt-my-account .entry-header {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.22), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.14), transparent 40%),
		var(--tt-black);
	padding: 54px 20px 44px;
	text-align: center;
	margin-bottom: 44px;
	overflow: hidden;
}

.tt-my-account .entry-title {
	font-family: var(--tt-font-display);
	color: var(--tt-white);
	font-size: 2.4rem;
	letter-spacing: 0.02em;
	text-shadow: 0 0 18px rgba(226, 35, 26, 0.5), 0 0 34px rgba(0, 229, 255, 0.18);
	margin: 0;
}

.tt-my-account .entry-title::before {
	content: "// TWOJA STREFA";
	display: block;
	font-family: var(--tt-font-body);
	font-size: 0.7rem;
	letter-spacing: 0.25em;
	color: var(--tt-accent-2);
	margin-bottom: 14px;
}

@media (max-width: 600px) {
	.tt-my-account .entry-title {
		font-size: 1.8rem;
	}
}

/* Storefront domyślnie renderuje nawigację i treść konta jako DWIE
   kolumny obok siebie (float: left, po ok. 30%/68% szerokości) — stąd
   w teście na żywo kafelki najpierw wyrenderowały się jako wąska,
   ściśnięta kolumna po lewej zamiast siatki na środku ekranu.
   Rozbijamy ten float, żeby nawigacja (kafelki) i treść stanęły jedna
   pod drugą na pełnej szerokości — dokładnie ta sama logika co
   float-leak naprawiony wcześniej na stronie produktu. */
.tt-my-account .woocommerce-MyAccount-navigation {
	float: none;
	width: 100%;
}

.tt-my-account .woocommerce-MyAccount-content {
	float: none;
	width: 100%;
	margin-left: 0;
}

/* Siatka kafelków nawigacji — wyśrodkowana, karty jak w RETRO
   PRODUKTY (białe tło, czarna 3px ramka, twardy cień), ale mniejsze
   i z ikoną + etykietą na środku zamiast zdjęcia produktu. */
/* Stałe 4 kolumny (przy 8 pozycjach nawigacji wychodzą równe 2 rzędy
   po 4 kafelki) zamiast auto-fill, które przy tej szerokości strony
   upychało aż 6 w pierwszym rzędzie i tylko 2 w drugim. */
.tt-account-tiles {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 20px;
	margin: 0 0 48px;
}

@media (max-width: 860px) {
	.tt-account-tiles {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 420px) {
	.tt-account-tiles {
		grid-template-columns: 1fr;
	}
}

.tt-account-tile,
.tt-account-tile * {
	text-decoration: none;
}

.tt-account-tile {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 12px;
	text-align: center;
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	border-radius: 4px;
	padding: 26px 14px;
	box-shadow: 6px 6px 0 var(--tt-accent-2);
	transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
}

.tt-account-tile:hover {
	transform: translateY(-4px);
	box-shadow: 10px 10px 0 var(--tt-accent-2);
}

.tt-account-tile__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 52px;
	height: 52px;
	border: 2px solid var(--tt-black);
	border-radius: 50%;
	background: var(--tt-gray-light);
	color: var(--tt-black);
}

.tt-account-tile__icon svg {
	width: 26px;
	height: 26px;
}

.tt-account-tile__label {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 0.82rem;
	color: var(--tt-black);
	line-height: 1.3;
}

/* Aktywna (bieżąca) zakładka — podświetlenie cyjanem, ta sama
   konwencja co aktywna zakładka opisu produktu (ul.tabs li.active). */
.tt-account-tile.is-active {
	background: var(--tt-black);
	box-shadow: 6px 6px 0 var(--tt-accent-2);
}

.tt-account-tile.is-active .tt-account-tile__icon {
	background: var(--tt-accent-2);
	border-color: var(--tt-black);
}

.tt-account-tile.is-active .tt-account-tile__label {
	color: var(--tt-white);
}

/* "Wyloguj się" — wizualnie oddzielone jako akcja wyjścia, czerwony
   akcent zamiast cyjanu (ta sama logika co przycisk "Dodaj do koszyka"
   na stronie produktu — czerwony = akcja "twarda"/kończąca). */
.tt-account-tile--logout {
	box-shadow: 6px 6px 0 var(--tt-accent);
}

.tt-account-tile--logout:hover {
	box-shadow: 10px 10px 0 var(--tt-accent);
}

.tt-account-tile--logout .tt-account-tile__icon {
	color: var(--tt-accent);
}

/* Treść zakładki (zamówienia/adresy/dane/pobrania) — karta w tym
   samym stylu co panel zakładek na stronie produktu, żeby domyślne,
   nieostylowane tabele/formularze WooCommerce nie wyglądały jak obcy
   element wśród nowego wyglądu. */
.tt-my-account .woocommerce-MyAccount-content {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	border-radius: 4px;
	box-shadow: 6px 6px 0 var(--tt-accent-2);
	padding: 30px;
	margin-bottom: 60px;
	font-family: var(--tt-font-body);
	color: #333;
	line-height: 1.7;
}

/* BUG ZNALEZIONY NA ŻYWO: strona Adresy renderuje wewnątrz tej karty
   .woocommerce-Addresses (klasa "u-columns" z WooCommerce/Storefronta),
   która ma float: left na obu kolumnach adresu. Rodzic bez clearfixa
   "nie widzi" wysokości floatowanych dzieci i zwija się do zera — stąd
   ramka karty kończyła się zaraz po tytułach "ADRES ROZLICZENIOWY/DO
   WYSYŁKI", a sama treść adresu (imię, ulica, miasto) wystawała POD
   ramką, na gołym tle. Standardowy clearfix na kontenerze karty. */
.tt-my-account .woocommerce-MyAccount-content::after {
	content: "";
	display: table;
	clear: both;
}

.tt-my-account .woocommerce-MyAccount-content h2,
.tt-my-account .woocommerce-MyAccount-content h3 {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--tt-black);
}

.tt-my-account .woocommerce-MyAccount-content mark {
	background: none;
	color: var(--tt-accent);
	font-weight: 700;
}

.tt-my-account .woocommerce-MyAccount-content table.shop_table {
	border-collapse: collapse;
	width: 100%;
}

.tt-my-account .woocommerce-MyAccount-content table.shop_table th,
.tt-my-account .woocommerce-MyAccount-content table.shop_table td {
	padding: 12px 14px;
	border: 1px solid #e2e2e2;
	font-family: var(--tt-font-body);
	font-size: 0.9rem;
}

.tt-my-account .woocommerce-MyAccount-content table.shop_table th {
	background: #f7f7f7;
	font-weight: 700;
	text-align: left;
}

.tt-my-account .woocommerce-MyAccount-content .woocommerce-Button,
.tt-my-account .woocommerce-MyAccount-content button.button,
.tt-my-account .woocommerce-MyAccount-content input.button,
.tt-my-account .woocommerce-MyAccount-content a.button {
	display: inline-block;
	background: var(--tt-accent);
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	font-size: 0.9rem;
	border: none;
	padding: 12px 26px;
	border-radius: 2px;
	cursor: pointer;
	text-decoration: none;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.tt-my-account .woocommerce-MyAccount-content .woocommerce-Button:hover,
.tt-my-account .woocommerce-MyAccount-content button.button:hover,
.tt-my-account .woocommerce-MyAccount-content input.button:hover,
.tt-my-account .woocommerce-MyAccount-content a.button:hover {
	transform: translateY(-2px);
	box-shadow: 0 8px 22px rgba(255, 63, 63, 0.4);
}

.tt-my-account .woocommerce-MyAccount-content form .form-row label {
	font-family: var(--tt-font-body);
	font-size: 0.9rem;
	color: #333;
}

.tt-my-account .woocommerce-MyAccount-content form .form-row input.input-text,
.tt-my-account .woocommerce-MyAccount-content form .form-row select {
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	font-family: var(--tt-font-body);
}

.tt-my-account .woocommerce-MyAccount-content form .form-row input.input-text:focus,
.tt-my-account .woocommerce-MyAccount-content form .form-row select:focus {
	outline: none;
	border-color: var(--tt-accent-2);
	box-shadow: 0 0 0 3px rgba(0, 229, 255, 0.2);
}

/* BUG ZNALEZIONY NA ŻYWO: nagłówek adresu (h2) dziedziczył domyślny
   rozmiar Storefronta — 32px. Przy "align-items: center" (środek w
   pionie względem CAŁEJ wysokości nagłówka) taki duży tekst zawijał
   się na 2 linie, a ikonka Edytuj lądowała dokładnie na środku,
   nachodząc na drugą linię napisu. Naprawka: mniejszy, jednoliniowy
   rozmiar czcionki na h2 + wyrównanie do góry (flex-start) zamiast
   do środka, więc nawet gdyby tekst się zawinął, ikonka i tak zostanie
   przy górnej krawędzi, a nie w środku napisu. */
.tt-my-account .woocommerce-MyAccount-content .woocommerce-Address-title {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 10px;
	flex-wrap: wrap;
}

.tt-my-account .woocommerce-MyAccount-content .woocommerce-Address-title h2,
.tt-my-account .woocommerce-MyAccount-content .woocommerce-Address-title h3 {
	font-size: 1.05rem;
	margin: 0;
}

.tt-my-account .woocommerce-MyAccount-content .woocommerce-Address-title a.edit {
	color: var(--tt-accent);
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	font-size: 0.8rem;
	text-decoration: none;
}

/* WIDOK WYLOGOWANEGO — logowanie/rejestracja. Ważne: to jest OSOBNA
   ścieżka renderowania w WooCommerce (kiedy nikt nie jest zalogowany,
   [woocommerce_my_account] wypisuje myaccount/form-login.php od razu,
   z pominięciem całego my-account.php — czyli bez nawigacji, bez
   .woocommerce-MyAccount-content). Dlatego cała ta sekcja dotychczas
   była zupełnie nieostylowana (gołe formularze Storefronta), mimo że
   reszta strony Moje Konto już wygląda "po naszemu". Kontener #customer_login
   to znów .u-columns z float: left na kolumnach (ten sam wzorzec co
   .woocommerce-Addresses wcześniej) — od razu resetujemy na flex,
   żeby nie powtarzać tego samego buga trzeci raz. */
.tt-my-account #customer_login {
	display: flex;
	align-items: flex-start;
	gap: 32px;
	margin: 0 0 60px;
}

.tt-my-account #customer_login .u-column1,
.tt-my-account #customer_login .u-column2 {
	float: none;
	width: auto;
	flex: 1 1 0;
	min-width: 0;
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	border-radius: 4px;
	padding: 32px;
}

.tt-my-account #customer_login .u-column1 {
	box-shadow: 6px 6px 0 var(--tt-accent-2);
}

.tt-my-account #customer_login .u-column2 {
	box-shadow: 6px 6px 0 var(--tt-accent);
}

.tt-my-account #customer_login h2 {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 1.4rem;
	color: var(--tt-black);
	margin: 0 0 24px;
}

.tt-my-account #customer_login .form-row {
	margin: 0 0 18px;
}

.tt-my-account #customer_login label {
	display: block;
	font-family: var(--tt-font-body);
	font-size: 0.88rem;
	color: #333;
	margin-bottom: 6px;
}

.tt-my-account #customer_login label .required {
	color: var(--tt-accent);
	text-decoration: none;
}

.tt-my-account #customer_login .woocommerce-Input,
.tt-my-account #customer_login input.input-text {
	width: 100%;
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	padding: 11px 14px;
	font-family: var(--tt-font-body);
	font-size: 0.95rem;
	background: var(--tt-white);
}

.tt-my-account #customer_login .woocommerce-Input:focus,
.tt-my-account #customer_login input.input-text:focus {
	outline: none;
	border-color: var(--tt-accent-2);
	box-shadow: 0 0 0 3px rgba(0, 229, 255, 0.2);
}

.tt-my-account #customer_login .woocommerce-form-login__rememberme {
	display: flex;
	align-items: center;
	gap: 8px;
	font-family: var(--tt-font-body);
	font-size: 0.88rem;
	color: #333;
	margin-bottom: 18px;
	cursor: pointer;
}

.tt-my-account #customer_login .woocommerce-form-login__rememberme input {
	width: auto;
	margin: 0;
}

.tt-my-account #customer_login button.button {
	display: inline-block;
	width: 100%;
	background: var(--tt-accent);
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	font-size: 0.95rem;
	border: none;
	padding: 13px 26px;
	border-radius: 2px;
	cursor: pointer;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.tt-my-account #customer_login button.button:hover {
	transform: translateY(-2px);
	box-shadow: 0 8px 22px rgba(255, 63, 63, 0.4);
}

.tt-my-account #customer_login .woocommerce-LostPassword {
	margin: 16px 0 0;
	text-align: center;
}

.tt-my-account #customer_login .woocommerce-LostPassword a {
	color: var(--tt-accent-2);
	font-family: var(--tt-font-body);
	font-size: 0.88rem;
	text-decoration: none;
}

.tt-my-account #customer_login .woocommerce-LostPassword a:hover {
	text-decoration: underline;
}

.tt-my-account #customer_login .u-column2 > p {
	font-family: var(--tt-font-body);
	font-size: 0.88rem;
	color: #555;
	line-height: 1.6;
}

.tt-my-account #customer_login .u-column2 a {
	color: var(--tt-accent-2);
	text-decoration: none;
}

.tt-my-account #customer_login .u-column2 a:hover {
	text-decoration: underline;
}

@media (max-width: 800px) {
	.tt-my-account #customer_login {
		flex-direction: column;
	}
}

@media (max-width: 600px) {
	.tt-my-account .woocommerce-MyAccount-content {
		padding: 20px;
	}
}

/* =========================================================
   PUSTY KOSZYK — sekcja "Nowe w sklepie" pod komunikatem o pustym
   koszyku. To NIE jest klasyczna siatka ul.products (którą już
   ostylowaliśmy w kilku miejscach), tylko blok Gutenberga WooCommerce
   ("Nowe produkty" / wc-block-grid) — inny, nowszy silnik renderowania
   z zupełnie innymi klasami (wc-block-grid__product...), więc dotąd
   wyświetlał się z gołymi, fioletowymi linkami przeglądarki. Wygląd
   kart przenosimy jeden do jednego z już sprawdzonej stylistyki kart
   produktowych używanej w SKLEPIE i "Podobnych produktach" (ciemny
   gradient, ścięte rogi, czerwona plakietka z ceną, obrysowany
   cyjanowy przycisk). */
.tt-cart-page .wc-block-cart__empty-cart__title {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 1.3rem;
	color: var(--tt-black);
}

.tt-cart-page .wp-block-woocommerce-empty-cart-block > h2.wp-block-heading {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 1.3rem;
	color: var(--tt-black);
	margin: 0 0 28px;
}

.tt-cart-page .wp-block-separator.is-style-dots {
	color: var(--tt-accent-2);
}

.tt-cart-page .wc-block-grid__products {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
	gap: 20px;
	list-style: none;
	padding: 0;
	margin: 0 0 40px;
}

/* BUG ZNALEZIONY NA ŻYWO: WooCommerce Blocks ma na .wc-block-grid__product
   (dokładnie ".wc-block-grid.has-4-columns .wc-block-grid__product")
   własną regułę "flex: 1 0 25%; max-width: 25%" (myślaną pod jego
   domyślny layout flex na 4 kolumny). Samo ustawienie "width: 100%"
   NIE wystarczyło — to max-width: 25% z core'a przycinał kartę, licząc
   się jako 25% WĄSKIEJ komórki siatki (~223px), więc karta kurczyła
   się do ok. 56px i tytuł zawijał się litera pod literą. Trzeba nadpisać
   max-width, nie tylko width. */
.tt-cart-page .wc-block-grid__product {
	position: relative;
	width: 100%;
	max-width: 100%;
	background: linear-gradient(165deg, #232228 0%, #0d0d10 100%);
	border: 1px solid rgba(255, 255, 255, 0.1);
	border-radius: 0;
	padding: 0 0 20px;
	text-align: left;
	overflow: hidden;
	clip-path: polygon(0 16px, 16px 0, 100% 0, 100% calc(100% - 16px), calc(100% - 16px) 100%, 0 100%);
	transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}

.tt-cart-page .wc-block-grid__product:hover {
	transform: translateY(-6px);
	border-color: rgba(0, 229, 255, 0.55);
	box-shadow: 0 18px 36px rgba(0, 0, 0, 0.35), 0 0 28px rgba(0, 229, 255, 0.22);
}

.tt-cart-page .wc-block-grid__product-link {
	display: block;
	text-decoration: none;
}

.tt-cart-page .wc-block-grid__product-image {
	margin: 0;
}

.tt-cart-page .wc-block-grid__product-image img {
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	object-fit: cover;
	margin: 0 0 16px;
	filter: saturate(1.08) contrast(1.04);
}

.tt-cart-page .wc-block-grid__product-title {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	text-overflow: ellipsis;
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	font-weight: 700;
	font-size: 0.98rem;
	line-height: 1.3;
	min-height: 2.6em;
	margin: 0 16px 12px;
	text-transform: uppercase;
}

.tt-cart-page .wc-block-grid__product-price {
	display: inline-block;
	background: var(--tt-accent);
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	font-weight: 700;
	font-size: 0.95rem;
	padding: 5px 12px;
	margin: 0 16px 16px;
	transform: rotate(-2deg);
	box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.35);
}

.tt-cart-page .wc-block-grid__product-add-to-cart {
	margin: 0 16px;
}

.tt-cart-page .wc-block-grid__product-add-to-cart .wp-block-button__link {
	display: block;
	text-align: center;
	background: transparent;
	border: 1.5px solid var(--tt-accent-2);
	color: var(--tt-accent-2);
	font-family: var(--tt-font-heading);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 0.8rem;
	padding: 9px 0;
	border-radius: 2px;
	text-decoration: none;
	transition: all 0.2s ease;
}

.tt-cart-page .wc-block-grid__product-add-to-cart .wp-block-button__link:hover {
	background: var(--tt-accent-2);
	color: var(--tt-black);
	box-shadow: 0 0 18px rgba(0, 229, 255, 0.45);
}

/* =========================================================
   O NAS — była to zupełnie goła strona WP: czarny domyślny tytuł,
   blogowy sidebar (Szukaj/RECENT POSTS/RECENT COMMENTS) i wpisana w
   edytorze treść (opis sklepu) bez żadnego stylu. Ten sam, lekki
   przepis co MOJE KONTO/KASA/KOSZYK: przestylowany entry-header w
   pełnoszerokościowy baner + entry-content zamknięty w jasną kartę
   neubrutalistyczną, węższą niż inne strony (720px), bo to długi
   tekst do czytania, a nie siatka kart. */
.tt-about-page .storefront-breadcrumb {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	margin-top: 0;
	margin-bottom: 0;
	padding: 0;
	background: var(--tt-black);
}

.tt-about-page #primary.content-area {
	width: 100%;
	float: none;
}

.tt-about-page #content > .col-full {
	max-width: 780px;
	padding-bottom: 70px;
}

.tt-about-page .entry-header {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.22), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.14), transparent 40%),
		var(--tt-black);
	padding: 54px 20px 44px;
	text-align: center;
	margin-bottom: 44px;
	overflow: hidden;
}

.tt-about-page .entry-title {
	font-family: var(--tt-font-display);
	color: var(--tt-white);
	font-size: 2.4rem;
	letter-spacing: 0.02em;
	text-shadow: 0 0 18px rgba(226, 35, 26, 0.5), 0 0 34px rgba(0, 229, 255, 0.18);
	margin: 0;
}

.tt-about-page .entry-title::before {
	content: "// POZNAJ NAS";
	display: block;
	font-family: var(--tt-font-body);
	font-size: 0.7rem;
	letter-spacing: 0.25em;
	color: var(--tt-accent-2);
	margin-bottom: 14px;
}

@media (max-width: 600px) {
	.tt-about-page .entry-title {
		font-size: 1.8rem;
	}
}

.tt-about-page .entry-content {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	border-radius: 4px;
	box-shadow: 8px 8px 0 var(--tt-accent-2);
	padding: 40px 44px;
}

.tt-about-page .entry-content h2 {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 1.5rem;
	color: var(--tt-black);
	margin: 0 0 22px;
	padding-bottom: 16px;
	border-bottom: 3px solid var(--tt-black);
}

.tt-about-page .entry-content p {
	font-family: var(--tt-font-body);
	color: #333;
	font-size: 1rem;
	line-height: 1.85;
	margin: 0 0 20px;
}

/* BUG ZNALEZIONY NA ŻYWO: pierwszy akapit w treści strony nie jest
   wcale tekstem — to duże zdjęcie logo (978×1024px) wklejone w
   edytorze. Reguła "p:first-of-type" (myślana jako pogrubiony
   "lead" akapit) trafiała więc w akapit ze zdjęciem, które renderowało
   się w pełnej, ogromnej szerokości i rozciągało kartę o ~720px pustej
   przestrzeni. Zamiast pogrubiać ten akapit, wyśrodkowujemy i
   pomniejszamy w nim logo, a pogrubiony "lead" styl przenosimy na
   NASTĘPNY akapit (pierwszy, który faktycznie jest tekstem). */
.tt-about-page .entry-content p:first-child {
	text-align: center;
	margin-bottom: 30px;
}

.tt-about-page .entry-content img {
	max-width: 180px;
	height: auto;
}

.tt-about-page .entry-content p:first-child + p {
	font-size: 1.1rem;
	color: var(--tt-black);
	font-weight: 600;
}

.tt-about-page .entry-content p:last-child {
	margin-bottom: 0;
}

@media (max-width: 600px) {
	.tt-about-page .entry-content {
		padding: 28px 24px;
	}
}

/* =========================================================
   KONTAKT — ten sam przepis co O NAS (baner z przestylowanego
   entry-header/entry-title + karta na entry-content). Formularz
   MetForm na dole strony renderuje się jako goły tekst "[metform
   form_id="238"]", bo wymaga Elementora, którego nie ma na stronie —
   to nie da się naprawić stylami, wymaga decyzji (patrz komentarz w
   functions.php sekcja "13. KONTAKT"). Do czasu decyzji tekst ten
   dziedziczy zwykły styl akapitu, żeby nie rzucał się rażąco w oczy.
   Dodatkowo stylujemy listę (telefon/e-mail) i pogrubione dane firmy. */
.tt-contact-page .storefront-breadcrumb {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	margin-top: 0;
	margin-bottom: 0;
	padding: 0;
	background: var(--tt-black);
}

.tt-contact-page #primary.content-area {
	width: 100%;
	float: none;
}

.tt-contact-page #content > .col-full {
	max-width: 780px;
	padding-bottom: 70px;
}

.tt-contact-page .entry-header {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.22), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.14), transparent 40%),
		var(--tt-black);
	padding: 54px 20px 44px;
	text-align: center;
	margin-bottom: 44px;
	overflow: hidden;
}

.tt-contact-page .entry-title {
	font-family: var(--tt-font-display);
	color: var(--tt-white);
	font-size: 2.4rem;
	letter-spacing: 0.02em;
	text-shadow: 0 0 18px rgba(226, 35, 26, 0.5), 0 0 34px rgba(0, 229, 255, 0.18);
	margin: 0;
}

.tt-contact-page .entry-title::before {
	content: "// NAPISZ DO NAS";
	display: block;
	font-family: var(--tt-font-body);
	font-size: 0.7rem;
	letter-spacing: 0.25em;
	color: var(--tt-accent-2);
	margin-bottom: 14px;
}

@media (max-width: 600px) {
	.tt-contact-page .entry-title {
		font-size: 1.8rem;
	}
}

.tt-contact-page .entry-content {
	background: var(--tt-white);
	border: 3px solid var(--tt-black);
	border-radius: 4px;
	box-shadow: 8px 8px 0 var(--tt-accent-2);
	padding: 40px 44px;
}

.tt-contact-page .entry-content h2 {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 1.4rem;
	color: var(--tt-black);
	margin: 0 0 20px;
	padding-bottom: 14px;
	border-bottom: 3px solid var(--tt-black);
}

.tt-contact-page .entry-content h2:not(:first-child) {
	margin-top: 36px;
}

.tt-contact-page .entry-content p {
	font-family: var(--tt-font-body);
	color: #333;
	font-size: 1rem;
	line-height: 1.8;
	margin: 0 0 16px;
}

.tt-contact-page .entry-content ul {
	list-style: none;
	padding: 0;
	margin: 0 0 24px;
}

.tt-contact-page .entry-content ul li {
	font-family: var(--tt-font-heading);
	font-size: 1rem;
	color: var(--tt-black);
	padding: 10px 0 10px 30px;
	border-bottom: 1px dashed #ddd;
	position: relative;
}

.tt-contact-page .entry-content ul li::before {
	content: "→";
	position: absolute;
	left: 0;
	color: var(--tt-accent);
	font-weight: 700;
}

.tt-contact-page .entry-content ul li:last-child {
	border-bottom: none;
}

.tt-contact-page .entry-content b {
	color: var(--tt-black);
	font-family: var(--tt-font-heading);
	letter-spacing: 0.02em;
}

@media (max-width: 600px) {
	.tt-contact-page .entry-content {
		padding: 28px 24px;
	}
}

/* Własny formularz kontaktowy (shortcode [tt_contact_form],
   functions.php sekcja "14. FORMULARZ KONTAKTOWY") — zastępuje
   zepsuty shortcode MetForm. Ten sam przepis pól/przycisku co
   logowanie/rejestracja na Moje Konto. */
.tt-contact-form {
	margin-top: 20px;
}

.tt-contact-form__hp {
	position: absolute;
	left: -9999px;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.tt-contact-form .form-row {
	margin: 0 0 18px;
}

.tt-contact-form label {
	display: block;
	font-family: var(--tt-font-body);
	font-size: 0.88rem;
	color: #333;
	margin-bottom: 6px;
}

.tt-contact-form label .required {
	color: var(--tt-accent);
	text-decoration: none;
}

.tt-contact-form input[type="text"],
.tt-contact-form input[type="email"],
.tt-contact-form textarea {
	width: 100%;
	border: 2px solid var(--tt-black);
	border-radius: 2px;
	padding: 11px 14px;
	font-family: var(--tt-font-body);
	font-size: 0.95rem;
	background: var(--tt-white);
}

.tt-contact-form textarea {
	resize: vertical;
	min-height: 140px;
}

.tt-contact-form input[type="text"]:focus,
.tt-contact-form input[type="email"]:focus,
.tt-contact-form textarea:focus {
	outline: none;
	border-color: var(--tt-accent-2);
	box-shadow: 0 0 0 3px rgba(0, 229, 255, 0.2);
}

.tt-contact-form button[type="submit"] {
	display: inline-block;
	background: var(--tt-accent);
	color: var(--tt-white);
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	font-size: 0.95rem;
	border: none;
	padding: 13px 30px;
	border-radius: 2px;
	cursor: pointer;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.tt-contact-form button[type="submit"]:hover {
	transform: translateY(-2px);
	box-shadow: 0 8px 22px rgba(255, 63, 63, 0.4);
}

.tt-contact-form__notice {
	padding: 14px 18px;
	border-radius: 2px;
	margin-bottom: 24px;
	font-family: var(--tt-font-body);
	font-size: 0.92rem;
}

.tt-contact-form__notice--success {
	background: rgba(0, 229, 255, 0.12);
	border: 2px solid var(--tt-accent-2);
	color: #067a86;
}

.tt-contact-form__notice--error {
	background: rgba(255, 63, 63, 0.1);
	border: 2px solid var(--tt-accent);
	color: var(--tt-accent);
}

/* =========================================================
   404 — STRONA NIE ZNALEZIONA
   Ten sam "retro arcade" hero co strona główna (scanlines +
   poświata + neonowy .tt-glitch), tylko samodzielny, na całą
   wysokość ekranu — żeby błąd 404 wyglądał jak część tej samej
   gry, a nie goły, domyślny ekran Storefronta.

   PEŁNA SZEROKOŚĆ, DOCIĄGNIĘTE DO HEADERA/FOOTERA: WordPress
   wrapuje 404.php w domyślny Storefrontowy #content > .col-full
   (max-width ok. 1064px + padding) — bez zdjęcia tego ograniczenia
   baner wyglądał jak wyśrodkowany prostokąt z tłem strony widocznym
   po bokach (dokładnie zgłoszony problem). Zdejmujemy max-width/
   padding z .col-full NA STRONIE 404 (Storefront sam dodaje klasę
   "error404" na <body>, więc nie trzeba własnego filtra) i dodatkowo
   wyłamujemy sam baner na 100vw tym samym patentem co Hero/KASA/
   MOJE KONTO — więc dotyka lewej i prawej krawędzi ekranu nawet
   gdyby coś innego jeszcze ograniczało rodzica. */
.error404 #content > .col-full {
	max-width: none;
	padding: 0;
	margin: 0;
}

/* Storefrontowa okruszynowa nawigacja ("Strona główna / Błąd 404")
   renderuje się PRZED naszym bannerem i to ona była tą białą luką
   między headerem a czarną sekcją 404 — ten sam patent co na innych
   pełnoszerokościowych stronach (RETRO PRODUKTY/MOJE KONTO): wtapiamy
   ją w czerń zamiast usuwać, żeby nie tracić linku powrotnego. */
.error404 .storefront-breadcrumb {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	margin-top: 0;
	margin-bottom: 0;
	padding: 10px 20px;
	background: var(--tt-black);
}

.error404 .storefront-breadcrumb,
.error404 .storefront-breadcrumb a {
	color: rgba(255, 255, 255, 0.55);
	font-family: var(--tt-font-body);
	font-size: 0.8rem;
}

.error404 .storefront-breadcrumb a:hover {
	color: var(--tt-accent-2);
}

.tt-404-hero {
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
	min-height: calc(100vh - 340px);
	display: flex;
	align-items: center;
	justify-content: center;
	background: radial-gradient(circle at 15% 20%, rgba(226, 35, 26, 0.25), transparent 45%),
		radial-gradient(circle at 85% 80%, rgba(0, 229, 255, 0.15), transparent 40%),
		var(--tt-black);
	color: var(--tt-white);
	overflow: hidden;
	padding: 90px 20px;
	text-align: center;
}

.tt-404-inner {
	position: relative;
	z-index: 1;
	max-width: 640px;
}

.tt-404-code {
	margin: 0 0 6px;
	line-height: 1;
}

.tt-404-code .tt-glitch {
	font-family: var(--tt-font-display);
	font-size: clamp(5rem, 18vw, 10rem);
	letter-spacing: 0.02em;
}

.tt-404-subtitle {
	font-family: var(--tt-font-heading);
	text-transform: uppercase;
	letter-spacing: 0.06em;
	font-size: clamp(1.1rem, 2.4vw, 1.5rem);
	color: var(--tt-accent-2);
	margin: 0 0 22px;
	text-shadow: 0 0 14px rgba(0, 229, 255, 0.35);
}

.tt-404-desc {
	font-family: var(--tt-font-body);
	color: var(--tt-gray-text);
	line-height: 1.75;
	font-size: 1rem;
	max-width: 520px;
	margin: 0 auto 34px;
}

.tt-404-actions {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-wrap: wrap;
	gap: 16px;
	margin-bottom: 38px;
}

.tt-404-insert-coin {
	font-family: var(--tt-font-pixel);
	font-size: 0.65rem;
	letter-spacing: 0.12em;
	color: var(--tt-accent);
	animation: tt-404-blink 1.1s step-start infinite;
}

@keyframes tt-404-blink {
	0%, 49% {
		opacity: 1;
	}
	50%, 100% {
		opacity: 0;
	}
}

@media (max-width: 600px) {
	.tt-404-hero {
		min-height: calc(100vh - 260px);
		padding: 70px 20px;
	}
	.tt-404-actions {
		flex-direction: column;
	}
	.tt-404-actions .tt-btn {
		width: 100%;
	}
}

@media (prefers-reduced-motion: reduce) {
	.tt-404-insert-coin {
		animation: none;
	}
}
