/* ==========================================================================
   Ostoja Borucza — arkusz główny.
   Odwzorowanie 1:1 zaakceptowanego wyglądu. Kroje Plus Jakarta Sans.
   ========================================================================== */

:root {

	/* ---------- CIENIE: jedna skala, światło z góry (14.08) ----------
	   Było dziewięć różnych cieni pisanych wprost w regułach. Każdy z innym
	   rozmyciem i innym kierunkiem, więc kafle sąsiadujące ze sobą wyglądały,
	   jakby leżały w dwóch różnych scenach. */
	--cien-sm: 0 1px 3px rgba(20, 34, 0, .07);
	--cien-md: 0 6px 20px rgba(20, 34, 0, .10);
	--cien-lg: 0 14px 34px rgba(20, 34, 0, .14);
	--cien-xl: 0 24px 60px rgba(20, 34, 0, .22);

	/* ---------- CZASY PRZEJŚĆ: cztery, każdy z zadaniem ----------
	   Było sześć. Różnica między 400 a 500 ms nie niesie żadnej informacji,
	   a sprawia, że dwie sąsiednie animacje nie trzymają rytmu. */
	--t-szybko: 150ms;   /* podświetlenie, obramowanie pola */
	--t-zwykle: 200ms;   /* najechanie, zmiana barwy */
	--t-panel:  320ms;   /* wjazd menu, pasek ciasteczek */
	--t-obraz:  600ms;   /* powolny ruch zdjęcia w kadrze */


	/* ---------- SKALA PISMA (dodana 14.08, patrz migracja_tokenow.py) ----------
	   Sześć rozmiarów akapitu w jednym motywie to nie skala, tylko zbiór
	   przypadków. Poniżej pięć stopni i jedna zasada: akapit nie schodzi
	   poniżej 16 px, bo tam zaczyna się nieczytelność na telefonie. */
	--fs-xs:   0.8125rem;   /* 13 px — plakietki, wersaliki, podpisy */
	--fs-sm:   0.9375rem;   /* 15 px — tekst drugorzędny */
	--fs-base: 1rem;        /* 16 px — akapit */
	--fs-md:   1.125rem;    /* 18 px — lead */
	--fs-lg:   1.375rem;    /* 22 px — H3 */

	/* ---------- KOLORY (tokeny, zero surowych hexów w kodzie niżej) ---------- */
	--c-brand:        #67971b;   /* marka: wypełnienia, obwódki, ikony, duże nagłówki */
	/* Zieleń marki na białym daje 3.49:1. To wystarcza dla dużego tekstu
	   (próg 3:1), ale NIE dla menu, telefonu czy stawek, gdzie obowiązuje
	   4.5:1. Osobny, głębszy odcień tej samej barwy: 5.07:1 na białym
	   i 4.63:1 na jasnym tle sekcji. Marka zostaje, tekst staje się czytelny. */
	--c-brand-ink:    #517a0c;
	--c-brand-dark:   #2e4c00;   /* zieleń ciemna: przyciski, stopka */
	--c-brand-darker: #1f3a00;   /* hover przycisku (ciemniejszy wariant) */
	--c-text:         #101010;   /* tekst główny */
	--c-muted:        #444;      /* tekst drugorzędny (kontrast 9.7:1 na białym) */
	--c-bg:           #fff;
	--c-surface:      #f4f5f0;   /* tło sekcji jasnych (cennik, FAQ) */
	--c-surface-alt:  #eef2e4;   /* tło stopki */
	--c-border:       rgba(0,0,0,.12);
	--c-border-light: rgba(0,0,0,.08);
	--c-overlay:      rgba(2,80,172,.07);   /* overlay na zdjęciach (z pomiaru wzorca) */
	--c-kolo:         rgba(46,76,0,.78);    /* koło na zdjęciu budynku */
	--c-on-brand:     #fff;      /* tekst na tle marki */

	/* ---------- ODSTĘPY: skala 4px, bez wartości spoza niej ---------- */
	--space-1: .25rem;   /*  4px */
	--space-2: .5rem;    /*  8px */
	--space-3: .75rem;   /* 12px */
	--space-4: 1rem;     /* 16px */
	--space-5: 1.25rem;  /* 20px */
	--space-6: 1.5rem;   /* 24px */
	--space-8: 2rem;     /* 32px */
	--space-10: 2.5rem;  /* 40px */
	--space-12: 3rem;    /* 48px */
	--space-16: 4rem;    /* 64px */

	/* rytm pionowy sekcji — jeden token, spójne odstępy między sekcjami */
	--sekcja-y: clamp(3rem, 7vw, 5.5rem);
	/* margines boczny — treść nigdy nie dotyka krawędzi na telefonie */
	--gutter: clamp(1rem, 5vw, 3rem);

	/* ---------- TYPOGRAFIA: skala modularna 1.25 ---------- */
	--font: "Plus Jakarta Sans", Helvetica, Arial, sans-serif;
	--fs-h1:    clamp(1.9rem, 1.4rem + 2vw, 2.56rem);
	--fs-h2:    clamp(1.7rem, 1.3rem + 1.4vw, 2.125rem);
	--fs-h3:    clamp(1.05rem, .98rem + .3vw, 1.15rem);
	--fs-body:  1rem;
	--fs-small: .9375rem;   /* 15px — próg czytelności na telefonie */
	--fs-label: .8125rem;
	--lh-tight: 1.25;
	--lh-head:  1.32;
	--lh-body:  1.65;

	/* ---------- PROMIENIE: jeden system ---------- */
	--radius:    8px;
	--radius-sm: var(--radius);   /* było 3 px obok 4 px: różnica niewidoczna, wartość zbędna */
	--radius-md: var(--radius);   /* 10 px i 6 px obok siebie czytały się jak pomyłka */
	--radius-lg: 16px;
	--radius-full: 50%;
	--radius-full-pill: 999px;

	/* ---------- CIENIE: skala, jeden kierunek światła ---------- */
	--shadow-sm: 0 1px 3px rgba(0,0,0,.06);
	--shadow-md: 0 4px 14px rgba(0,0,0,.08);
	--shadow-lg: var(--cien-lg);

	/* ---------- RUCH: jeden czas i easing ---------- */
	--ease: cubic-bezier(.25,1,.5,1);
	--t-fast: 150ms;
	--t-base: 200ms;

	--kontener: 1180px;

	/* zgodność wstecz ze starymi nazwami użytymi niżej */
	--ziel: var(--c-brand);
	--ziel-tekst: var(--c-brand-ink);
	--ziel-ciemna: var(--c-brand-dark);
	--ziel-hero: var(--c-brand);
	--ziel-bud: var(--c-brand);
	--tekst: var(--c-text);
	--tekst-mig: var(--c-muted);
	--jasny: var(--c-surface);
	--biel: var(--c-bg);
	--r: var(--radius);
}

* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
	margin:0;
	font-family: var(--font);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	color: var(--tekst);
	background: var(--biel);
}
img { max-width: 100%; height: auto; display: block; }
a { color: inherit; text-decoration: none; }
p { margin:0 0 1rem; }

.ob-container { width: 100%; max-width: var(--kontener); margin:0 auto; padding-inline:var(--gutter); }

.ob-h2 {
	font-size: var(--fs-h2);
	font-weight: 700;
	color: var(--ziel);
	line-height: var(--lh-head);
	margin:0 0 1.25rem;
	text-wrap: balance;
}
.ob-h2--jasny { color: var(--biel); }

.ob-icon { display: inline-block; vertical-align: middle; }

/* ---------- przyciski ---------- */
.ob-btn {
	display: inline-flex;
	align-items: center;
	gap:.5rem;
	padding:0.75rem 1.5rem;
	border-radius: var(--r);
	font-weight: 700;
	font-size: var(--fs-sm);
	line-height: 1;
	cursor: pointer;
	transition: background var(--t-base) var(--ease), color var(--t-base) var(--ease), transform var(--t-base) var(--ease);
	min-height: 44px;
}
.ob-btn--rez { background: var(--ziel-ciemna); color: var(--biel); }
.ob-btn--jasny { background: var(--biel); color: var(--ziel-ciemna); }
.ob-btn--kontur { background: transparent; color: var(--ziel-ciemna); border: 2px solid var(--ziel-ciemna); }
@media (hover: hover) {
	.ob-btn--rez:hover { background: var(--c-brand-darker); }
	.ob-btn--jasny:hover { background: var(--c-surface-alt); }
	.ob-btn--kontur:hover { background: var(--ziel-ciemna); color: var(--biel); }
}

/* ==========================================================================
   NAGŁÓWEK
   ========================================================================== */
.ob-header { position: sticky; top: 0; z-index: 100; background: var(--biel); box-shadow: var(--shadow-sm); }
.ob-header__top-in { display: flex; align-items: center; gap:1.5rem; min-height: 120px; }
.ob-logo img { width: 170px; height: auto; }
.ob-header__kontakt { margin-left:auto; display: flex; align-items: center; gap:1.5rem; }
.ob-header__tel { color: var(--ziel-tekst); font-weight: 600; font-size: var(--fs-base); }
.ob-header__nav-wrap { border-top: 1px solid var(--c-border-light); }
.ob-header__nav-in { display: flex; align-items: center; min-height: 56px; }
.ob-nav ul { display: flex; gap:2rem; list-style: none; margin:0; padding:0; }
.ob-nav a { color: var(--ziel-tekst); font-weight: 700; font-size: var(--fs-xs); letter-spacing: .04em; }
.ob-nav a { position: relative; padding-block:0.25rem; }
.ob-nav a::after { content: ""; position: absolute; left: 0; right: 100%; bottom: 0; height: 2px; background: var(--ziel); transition: right var(--t-base) var(--ease); }
@media (hover: hover) {
	.ob-nav a:hover { color: var(--ziel-ciemna); }
	.ob-nav a:hover::after { right: 0; }
	.ob-btn:hover { transform: translateY(-1px); box-shadow: var(--shadow-md); }
}
.ob-social { margin-left:auto; display: flex; align-items: center; gap:.75rem; color: var(--tekst); font-size: var(--fs-sm); }
.ob-social__fb { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 50%; background: var(--ziel-ciemna); color: var(--biel); }
.ob-burger { display: none; }

/* ==========================================================================
   HERO
   ========================================================================== */
/* Hero jak we wzorcu: ZIELEŃ dominuje, zdjęcie 31.jpg ledwie prześwituje
   przy dolnej krawędzi (pozycja center bottom jak w Divi). */
/* Hero jak w Divi: zdjęcie mglistego lasu WIDOCZNE, przykryte zieloną
   mgłą (blend `multiply` + delikatne rozjaśnienie u dołu). Wcześniej
   zieleń kryła 93% i zdjęcia praktycznie nie było widać. */
.ob-hero {
	position: relative;
	background: var(--ziel-hero) url("../img/31.jpg") center center / cover no-repeat;
	color: var(--biel);
	isolation: isolate;
}
.ob-hero::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background:
		linear-gradient(180deg, rgba(46, 76, 0, .78) 0%, rgba(103, 151, 27, .62) 55%, rgba(46, 76, 0, .80) 100%);
	mix-blend-mode: multiply;
}
.ob-hero::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background: radial-gradient(120% 80% at 30% 40%, rgba(255, 255, 255, .10) 0%, rgba(255, 255, 255, 0) 60%);
	pointer-events: none;
}
.ob-hero__in { display: grid; grid-template-columns: 1.25fr 1fr; gap:2.5rem; align-items: center; padding-block:clamp(2rem, 4vw, 3rem); }
.ob-hero__nad { display: inline-flex; align-items: center; gap:.5rem; font-size: var(--fs-sm); font-weight: 600; margin:0 0 1rem; }
.ob-hero__tytul { font-size: var(--fs-h1); font-weight: 700; line-height: 1.4; letter-spacing: -.01em; margin:0 0 1.25rem; }
/* ⚠️ Bez `opacity`. Biel przygaszona do 95 % to 242 zamiast 255, czyli
   oddany kontrast tam, gdzie tłem jest zdjęcie i brakowało go najbardziej.
   Zmierzone z pikseli zrzutu: 1,79 : 1 przy progu 4,50. */
.ob-hero__tekst { font-size: var(--fs-sm); line-height: 1.7; margin:0 0 1.5rem; }
/* Telefon jak we wzorcu: podkreślony biały odnośnik z ikoną, nie wypełniony przycisk */
.ob-hero__tel { display: inline-flex; align-items: center; gap:.5rem; color: var(--biel); font-weight: 700; text-decoration: underline; text-underline-offset: .25em; min-height: 44px; }
@media (hover: hover) { .ob-hero__tel:hover { opacity: .85; } }
/* Kolaż jak we wzorcu: [kafel + rowerzystka] [dęby + kafel] */
.ob-hero__right { display: grid; grid-template-columns: 1fr 1fr; gap:1rem; align-items: stretch; }
.ob-hero__kolA, .ob-hero__kolB { display: flex; flex-direction: column; gap:1rem; }
.ob-hero__kafel { background: var(--biel); color: var(--tekst); border-radius: var(--r); padding:1rem; text-align: center; display: flex; flex-direction: column; align-items: center; justify-content: center; gap:.25rem; }
.ob-hero__kafel-ikona { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: var(--radius); background: var(--ziel); color: var(--biel); }
.ob-hero__kafel strong { font-size: var(--fs-sm); }
/* ⚠️ `:not()` NIE JEST OZDOBĄ.
   Ikona w kaflu też jest elementem `span`, więc łapała się na tę regułę.
   Swoistość `.ob-hero__kafel span` to (0,1,1), a `.ob-hero__kafel-ikona`
   tylko (0,1,0), więc podpis wygrywał i narzucał ikonie SWÓJ kolor:
   listek wychodził ciemnoszary (#444) na zielonym kwadracie zamiast białego.
   Reguła celuje teraz wyłącznie w podpisy. */
.ob-hero__kafel span:not(.ob-hero__kafel-ikona) { font-size: var(--fs-xs); color: var(--tekst-mig); }
/* zdjęcia kolażu w białych ramkach jak w Divi */
.ob-hero__foto { border: 6px solid var(--biel); border-radius: var(--r); overflow: hidden; flex: 1 1 auto; min-height: 0; box-shadow: var(--shadow-md); }
.ob-hero__foto img { width: 100%; height: 100%; object-fit: cover; }

/* ==========================================================================
   WPROWADZENIE
   ========================================================================== */
.ob-intro { background: var(--biel); }
/* Ilustracja wyspy duża jak we wzorcu (~45% szerokości) */
.ob-intro__in { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr); gap:2.5rem; align-items: center; padding-block:var(--sekcja-y); }
.ob-intro__foto {
	position: relative;
	aspect-ratio: 692 / 797;
	background: url("../img/intro-las.jpg") center / cover no-repeat;
	-webkit-mask-image: var(--maska-akwarela);
	mask-image: var(--maska-akwarela);
	-webkit-mask-size: 100% 100%;
	mask-size: 100% 100%;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
}
/* MGŁA jak na starej stronie: biel rozmywa krawędzie kadru do środka,
   od dołu wchodzi delikatna poświata. Zdjęcie nie ma twardej ramy,
   tylko rozpływa się w tle sekcji. */
.ob-intro__foto::after {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	background:
		radial-gradient(120% 95% at 50% 45%, rgba(255, 255, 255, 0) 42%, rgba(255, 255, 255, .55) 74%, rgba(255, 255, 255, .92) 100%),
		linear-gradient(180deg, rgba(255, 255, 255, .45) 0%, rgba(255, 255, 255, 0) 26%, rgba(255, 255, 255, 0) 68%, rgba(255, 255, 255, .70) 100%);
}
/* Nagłówek z pionową zieloną kreską jak w Divi */
.ob-intro__tresc .ob-h2 { font-size: var(--fs-lg);   /* nagłówek, nie lead: stopień wyżej niż tekst obok */ line-height: 1.4; border-left: 4px solid var(--ziel); padding-left:0.75rem; }
.ob-intro__tresc p { font-size: var(--fs-sm); color: var(--tekst-mig); }
/* Pierwszy akapit (pytanie) pogrubiony jak we wzorcu */
.ob-intro__tresc .ob-h2 + p { font-weight: 700; color: var(--tekst); }
.ob-intro__ikony { display: grid; grid-template-columns: 1fr 1fr; gap:1.5rem; margin-block:1.25rem; }
.ob-intro__ikona { display: flex; gap:.75rem; align-items: flex-start; font-size: var(--fs-xs); color: var(--tekst-mig); }
.ob-intro__ikona .ob-icon { flex-shrink: 0; box-sizing: content-box; padding:8px; border-radius: var(--radius); background: var(--ziel); color: var(--biel); }

/* ==========================================================================
   TRZY BUDYNKI
   ========================================================================== */
.ob-budynki {
	background-color: rgba(2, 80, 172, .07);
	background-image: url("../img/background-3-2.png");
	background-size: auto;
	background-repeat: repeat-x;
	background-position: left bottom;
	background-blend-mode: overlay;
	color: var(--tekst);
	padding-block:var(--sekcja-y);
}
/* Nagłówek pasa budynków */
.ob-budynki__tytul { text-align: left; max-width: none; margin:0 0 2rem; font-size: var(--fs-md); font-weight: 700; color: var(--ziel); border-left: 4px solid var(--ziel); padding-left:0.75rem; }
.ob-budynki__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap:1.5rem; }

/* KARTA BUDYNKU — jasna, nowoczesna:
   zdjęcie zostaje w pełni widoczne (żadnej zielonej płachty na starcie),
   etykieta powierzchni to biała pigułka w rogu, a opis leży pod zdjęciem
   na białej karcie. Po najechaniu zdjęcie delikatnie się przybliża
   i podnosi cień — bez zasłaniania fotografii. */
.ob-budynek {
	position: relative;
	background: var(--biel);
	border-radius: var(--radius-lg);
	overflow: hidden;
	box-shadow: var(--cien-sm);
	display: flex;
	flex-direction: column;
	transition: box-shadow var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.ob-budynek__kadr {
	position: relative;
	aspect-ratio: 4/3;
	background-size: cover;
	background-position: center;
	overflow: hidden;
}
.ob-budynek__kadr::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(0, 0, 0, 0) 55%, rgba(20, 34, 0, .35) 100%);
	transition: opacity var(--t-base) var(--ease);
}
.ob-budynek__kolo {
	position: absolute;
	left: 1rem;
	bottom: 1rem;
	z-index: 2;
	width: auto;
	height: auto;
	border-radius: var(--radius-full-pill);
	background: rgba(255, 255, 255, 1);
	color: var(--ziel-ciemna);
	box-shadow: var(--cien-md);
	display: inline-flex;
	align-items: center;
	padding:.5rem 1rem;
	font-weight: 800;
	font-size: var(--fs-sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	transition: background var(--t-base) var(--ease), color var(--t-base) var(--ease);
}
.ob-budynek__najechanie {
	padding:1.25rem 1.25rem 1.5rem;
	display: flex;
	flex-direction: column;
	gap:.5rem;
	color: var(--tekst);
	flex: 1 1 auto;
}
.ob-budynek__tytul { font-size: var(--fs-base); font-weight: 700; color: var(--ziel-ciemna); margin:0; }
.ob-budynek__opis { font-size: var(--fs-sm); color: var(--tekst-mig); margin:0; }
@media (hover: hover) {
	.ob-budynek:hover { box-shadow: var(--cien-lg); transform: translateY(-4px); }
	.ob-budynek:hover .ob-budynek__kadr { background-size: 108%; }
	.ob-budynek:hover .ob-budynek__kolo { background: var(--ziel); color: var(--biel); }
}
.ob-budynek__kadr { transition: background-size var(--t-obraz) var(--ease); }
.ob-budynki__stopka { text-align: center; text-wrap: balance; margin:2.5rem 0 0; color: var(--tekst); font-weight: 600; }

/* Cennik jak we wzorcu: prosta lista bez kart, wąska kolumna, ceny na
   zielono, cienkie linie oddzielające. */
.ob-cennik__pod { color: var(--tekst-mig); margin-bottom:1.5rem; }

.ob-cennik__poz { position: relative; padding-block:1rem; border-top: 1px solid var(--c-border-light); }
.ob-cennik__poz:last-child { border-bottom: 1px solid var(--c-border-light); }
.ob-cennik__polecamy { display: inline-block; background: var(--ziel-tekst); color: var(--biel); font-size: var(--fs-xs); font-weight: 700; letter-spacing: .06em; text-transform: uppercase; padding:0.25rem 0.5rem; border-radius: var(--radius-full-pill); margin-bottom:0.5rem; }
.ob-cennik__nazwa { font-size: var(--fs-base); font-weight: 700; margin:0; }
.ob-cennik__opis { display: block; font-size: var(--fs-xs); color: var(--tekst-mig); margin-bottom:.5rem; }
.ob-cennik__stawka { display: flex; justify-content: space-between; gap:1rem; font-size: var(--fs-sm); color: var(--tekst-mig); margin:0 0 .25rem; font-variant-numeric: tabular-nums; }
.ob-cennik__stawka strong { color: var(--ziel-tekst); font-weight: 800; }
.ob-cennik__nota { font-size: var(--fs-xs); color: var(--tekst-mig); margin-top:1rem; }



/* ==========================================================================
   REZERWACJA
   ========================================================================== */
/* Rezerwacja: las KLIENTA (`rez-las.jpg`, kadr z DSCF4224: sosny i staw).
   Stało tu zdjęcie ze starej strony ważące 4394 KB, przy budżecie 800 KB na
   całą stronę. Nowy kadr to 278 KB, a w WebP 199 KB.
   Wybór po pomiarze jasności: na tym tle leży BIAŁY tekst, a przesłona
   u góry sekcji ma tylko 30 %. Kandydat najciemniejszy, 62/255. */
.ob-rezerwacja { background-size: cover; background-position: center; padding-block:var(--sekcja-y); }
.ob-rezerwacja__box { background: var(--biel); border-radius: var(--r); padding:2rem; max-width: 42rem; box-shadow: var(--shadow-md); }
.ob-rezerwacja__widget { min-height: 100px; }

/* ==========================================================================
   ORGANIZACJA WYDARZEŃ
   ========================================================================== */
/* Organizacja: jasna sekcja bez tła zdjęciowego (jak wzorzec) — zdjęcie
   z lotu ptaka w białej ramce, tekst w białym boxie z cieniem. */
.ob-org { background: var(--biel); padding-block:var(--sekcja-y); }
.ob-org__in { display: grid; grid-template-columns: 1fr 1.2fr; gap:2rem; align-items: center; }
.ob-org__foto img { border: 8px solid var(--biel); border-radius: var(--r); box-shadow: var(--shadow-lg); }
.ob-org__box { background: var(--biel); border-radius: var(--r); padding:2rem; box-shadow: var(--shadow-md); }
/* ⚠️ `flex-start` plus wyliczone przesunięcie, nie `center`.
   Nagłówek „Wesela, przyjęcia i spotkania firmowe" łamie się na dwa
   wiersze, a `center` stawiał listek DOKŁADNIE MIĘDZY NIMI, przez co
   wyglądał na zabłąkany znak. Ikona ma 22 px, interlinia 1,32em, więc
   żeby usiąść na środku pierwszego wiersza, potrzebuje połowy różnicy.
   Zapis w `em` skaluje się razem z nagłówkiem, więc działa na telefonie
   (odstęp 7 px) i na biurku (11 px) bez osobnych reguł. */
.ob-org__tytul { display: flex; align-items: flex-start; gap:.5rem; }
.ob-org__tytul > svg { flex-shrink: 0; margin-top: calc((1.32em - 22px) / 2); }
.ob-org__box p { color: var(--tekst-mig); font-size: var(--fs-sm); }

/* ==========================================================================
   RELAKS CTA
   ========================================================================== */
.ob-relaks { background: var(--ziel-tekst); color: var(--biel); padding-block:var(--sekcja-y); }
.ob-relaks__tytul { text-align: left; }
.ob-relaks__tekst p { opacity: .92; font-size: var(--fs-sm); }

/* ==========================================================================
   KONTAKT
   ========================================================================== */
.ob-kontakt { background: var(--biel); padding-block:var(--sekcja-y); }
.ob-kontakt__in { display: grid; grid-template-columns: 1fr 1fr; gap:2.5rem; align-items: start; }
.ob-kontakt__lead { font-weight: 600; }
.ob-kontakt__tresc p { color: var(--tekst-mig); font-size: var(--fs-sm); }
.ob-kontakt__chipy { display: flex; flex-wrap: wrap; gap:0.5rem; margin-top:1.25rem; }
.ob-chip { display: inline-flex; align-items: center; gap:0.5rem; background: var(--jasny); color: var(--ziel-ciemna); font-size: var(--fs-xs); font-weight: 600; padding:.5rem 1rem; border-radius: var(--radius-full-pill); }
.ob-chip .ob-icon { color: var(--ziel); }
.ob-kontakt__dane { display: flex; flex-direction: column; gap:.75rem; margin-top:1.5rem; }
.ob-kontakt__dane a { display: inline-flex; align-items: center; gap:.5rem; color: var(--ziel-tekst); font-weight: 600; }
.ob-kontakt__mapa-etyk { display: block; margin-bottom:.75rem; font-weight: 600; color: var(--tekst-mig); }
.ob-kontakt__mapa iframe { border-radius: var(--r); }

/* ==========================================================================
   PYTANIA
   ========================================================================== */
.ob-faq { background: var(--jasny); padding-block:var(--sekcja-y); }
.ob-faq__tytul { color: var(--tekst); }
.ob-faq__poz { border-bottom: 1px solid var(--c-border); }
.ob-faq__q { cursor: pointer; list-style: none; padding:1rem 2.5rem 1rem 0; position: relative; font-weight: 600; min-height: 44px; display: flex; align-items: center; }
.ob-faq__q::-webkit-details-marker { display: none; }
.ob-faq__q::after { content: ""; position: absolute; right: .75rem; top: 50%; width: .55rem; height: .55rem; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; transform: translateY(-70%) rotate(45deg); transition: transform var(--t-fast) var(--ease); opacity: .55; }
.ob-faq__poz[open] .ob-faq__q::after { transform: translateY(-20%) rotate(-135deg); }
.ob-faq__a { padding:0 2.5rem 1rem 0; color: var(--tekst-mig); }
.ob-faq__a p { margin:0; }

/* ==========================================================================
   CTA TERMINY
   ========================================================================== */
/* Wąski pasek: świadomie połowa rytmu sekcji, wyliczona z tokena,
   nie osobna wartość. */
.ob-terminy { background: var(--biel); padding-block: calc(var(--sekcja-y) / 2); text-align: center; }

/* ==========================================================================
   PODSTRONA OGÓLNA
   ========================================================================== */
.ob-strona { padding-block:var(--sekcja-y); }
.ob-strona__tytul { color: var(--tekst); }
.ob-strona__tresc { line-height: 1.8; }
.ob-strona__tresc h2 { color: var(--ziel); font-size: var(--fs-lg); margin-top:2rem; }

/* ==========================================================================
   STOPKA
   ========================================================================== */
/* Stopka jak we wzorcu: ZIELONA, z białą falą SVG u góry (dokładnie ta sama
   fala co w Divi — zdekodowana z base64) i białą kartą „Dane kontaktowe"
   nachodzącą do góry. */
.ob-footer { position: relative; background: var(--ziel); color: var(--biel); padding-top:120px; }
.ob-footer__fala {
	position: absolute; top: 0; left: 0; right: 0; height: 100px; pointer-events: none;
	background-image: url("data:image/svg+xml;utf8,<svg width='100%25' height='100px' viewBox='0 0 1280 140' preserveAspectRatio='none' xmlns='http://www.w3.org/2000/svg'><g fill='%23ffffff'><path d='M0 51.76c36.21-2.25 77.57-3.58 126.42-3.58 320 0 320 57 640 57 271.15 0 312.58-40.91 513.58-53.4V0H0z' fill-opacity='.3'/><path d='M0 24.31c43.46-5.69 94.56-9.25 158.42-9.25 320 0 320 89.24 640 89.24 256.13 0 307.28-57.16 481.58-80V0H0z' fill-opacity='.5'/><path d='M0 0v3.4C28.2 1.6 59.4.59 94.42.59c320 0 320 84.3 640 84.3 285 0 316.17-66.85 545.58-81.49V0z'/></g></svg>");
	background-size: 100% 100px; background-repeat: no-repeat;
}
.ob-footer__in { display: grid; grid-template-columns: 1.2fr 1fr 1fr 1.4fr; gap:2rem; padding-bottom:2.5rem; }
/* Tytuły kolumn stopki to <p>, nie nagłówki — stopkowe „Menu/Dodatkowe"
   po H2 sekcji robiło przeskok H2→H4 w hierarchii dokumentu. */
.ob-footer__tytul { color: var(--biel); font-size: var(--fs-base); font-weight: 700; margin:0 0 1rem; }
.ob-footer__kol ul { list-style: disc; margin:0; padding-left:1rem; display: flex; flex-direction: column; gap:.5rem; }
.ob-footer__kol a { color: rgba(255,255,255,.88); font-size: var(--fs-sm); }
@media (hover: hover) { .ob-footer__kol a:hover { color: var(--biel); } }
/* logo w stopce jak we wzorcu: napis w wersji białej (filtr, ten sam plik) */
.ob-footer__logo { width: 285px; height: auto; margin-bottom:1rem; filter: brightness(0) invert(1); }
/* przycisk „Wyznacz trasę": kolor tekstu przegrywał z regułą linków stopki */
.ob-footer__kol--logo a.ob-btn--jasny { color: var(--ziel-ciemna); }
/* karta danych kontaktowych: biała, zaokrąglona, nachodzi na falę */
.ob-footer__kol--dane { background: var(--biel); color: var(--tekst); border-radius: var(--radius-lg); padding:1.5rem 1.5rem; margin-top:-9.5rem; box-shadow: var(--shadow-lg); position: relative; z-index: 2; }
.ob-footer__kol--dane .ob-footer__tytul { color: var(--ziel-ciemna); }
.ob-footer__kol--dane p { display: flex; gap:0.5rem; align-items: flex-start; font-size: var(--fs-sm); color: var(--tekst-mig); }
.ob-footer__kol--dane a { color: var(--ziel-ciemna); font-weight: 600; }
.ob-footer__kol--dane .ob-icon { color: var(--ziel); flex-shrink: 0; margin-top:0.25rem; }
.ob-footer__dol { background: var(--ziel-ciemna); color: rgba(255,255,255,.85); }
.ob-footer__dol-in { display: flex; justify-content: space-between; padding-block:1rem; font-size: var(--fs-xs); flex-wrap: wrap; gap:.5rem; }
.ob-footer__dol a { color: var(--biel); font-weight: 600; }

/* ==========================================================================
   RESPONSYWNOŚĆ
   ========================================================================== */
@media (max-width: 980px) {
	.ob-hero__in, .ob-intro__in, .ob-org__in, .ob-kontakt__in { grid-template-columns: 1fr; }
	.ob-budynki__grid { grid-template-columns: 1fr; }
	.ob-footer__in { grid-template-columns: 1fr 1fr; }

	.ob-header__nav-wrap { position: fixed; inset: 0 0 0 auto; width: min(80vw, 320px); background: var(--biel); transform: translateX(100%); visibility: hidden; transition: transform var(--t-base) var(--ease), visibility 0s var(--t-base); z-index: 200; border-left: 1px solid var(--c-border-light); overflow-y: auto; padding-top:4rem; }
	body.ob-menu-open .ob-header__nav-wrap { transform: translateX(0); visibility: visible; transition-delay: 0s; box-shadow: var(--shadow-lg); }
	.ob-header__nav-in { flex-direction: column; align-items: flex-start; gap:1.5rem; padding:1.5rem; }
	.ob-nav ul { flex-direction: column; gap:1rem; }
	.ob-social { margin-left:0; }
	.ob-burger { display: inline-flex; flex-direction: column; justify-content: center; gap:0.25rem; width: 44px; height: 44px; margin-left:auto; background: none; border: none; cursor: pointer; z-index: 210; position: relative; }
	.ob-burger span { display: block; width: 26px; height: 2px; background: var(--ziel-ciemna); transition: .3s; }
	body.ob-menu-open .ob-burger span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
	body.ob-menu-open .ob-burger span:nth-child(2) { opacity: 0; }
	body.ob-menu-open .ob-burger span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
	.ob-header__kontakt .ob-header__tel { display: none; }
}
@media (max-width: 600px) {
	.ob-hero__right { grid-template-columns: 1fr 1fr; }
	.ob-hero__foto img { aspect-ratio: 5/6; }
	.ob-footer__in { grid-template-columns: 1fr; }
	.ob-header__top-in { min-height: 64px; }
	.ob-logo img { width: 100px; }
}
/* karta danych nie nachodzi na falę, gdy stopka jest jednokolumnowa */
@media (max-width: 980px) {
	.ob-footer__kol--dane { margin-top:0; }
}

/* kalendarz podstrona */
.ob-kalendarz { padding-block:3rem; text-align: center; }
.ob-kalendarz__tytul { text-align: center; color: var(--tekst); }
.ob-kalendarz__widget { max-width: 62rem; margin:0 auto; min-height: 480px; }
.ob-strona { padding-block:3rem; }
.ob-strona__tytul { color: var(--tekst); }
.ob-strona__tresc { line-height: 1.8; }
.ob-strona__tresc h2 { color: var(--ziel); font-size: var(--fs-lg); margin-top:2rem; }

/* ==========================================================================
   STANY KOMPONENTÓW — brief pkt 5
   Każdy klikalny element ma reakcję hover, widoczny focus dla klawiatury,
   docisk przy active. Stany są tokenowe, nie punktowe.
   ========================================================================== */

/* --- focus-visible: widoczny pierścień, ale tylko przy nawigacji klawiaturą.
       `:focus` bez `-visible` zostawiamy w spokoju — obrys po kliknięciu myszą
       irytuje, a nikomu nie pomaga. --- */
a:focus-visible,
button:focus-visible,
summary:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible {
	outline: 3px solid currentColor;
	outline-offset: 3px;
	border-radius: var(--radius-sm);
}

/* --- active: lekki docisk, ten sam na wszystkich przyciskach --- */
.ob-btn:active { transform: translateY(1px); }

/* --- disabled --- */
.ob-btn[disabled],
.ob-btn[aria-disabled="true"] {
	opacity: .5;
	cursor: not-allowed;
	pointer-events: none;
}

/* --- linki w treści odróżnialne od tekstu --- */
.ob-strona__tresc a,
.ob-faq__a a {
	color: var(--c-brand-dark);
	text-decoration: underline;
	text-underline-offset: .18em;
	transition: color var(--t-fast) var(--ease);
}
@media (hover: hover) {
	.ob-strona__tresc a:hover,
	.ob-faq__a a:hover { color: var(--c-brand); }
}

/* --- karty: hover tylko tam, gdzie jest czym najechać --- */
@media (hover: hover) {
	/* Audyt: logo, telefon w nagłówku, ikona FB i odnośniki bez reakcji
	   na najechanie. Delikatne przygaszenie — spójne, bez fajerwerków. */
	.ob-logo:hover, .ob-logo:hover img { opacity: .8; }
	.ob-header__tel:hover { color: var(--ziel-ciemna); }
	.ob-social__fb:hover { background: var(--ziel); }
	.ob-footer__social a:hover { opacity: .8; }
	.ob-hero__kafel:hover { box-shadow: var(--shadow-md); }
}
.ob-logo img, .ob-header__tel, .ob-social__fb, .ob-hero__kafel { transition: opacity var(--t-base) var(--ease), background var(--t-base) var(--ease), color var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease); }
/* pole dotyku przycisku menu — zmierzone 38 px szerokości */
.ob-burger { min-width: 44px; min-height: 44px; }

/* ==========================================================================
   RUCH — brief pkt 8. Szanujemy preferencję ograniczenia animacji.
   ========================================================================== */
@media (prefers-reduced-motion: reduce) {
	*,
	*::before,
	*::after {
		animation-duration: .01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: .01ms !important;
		scroll-behavior: auto !important;
	}
}

/* ==========================================================================
   DETALE (polish) — brief pkt 9
   ========================================================================== */
::selection { background: var(--c-brand); color: var(--c-on-brand); }

/* Nagłówki: balans łamania (bez sierotki w ostatniej linii), proza: pretty */
h1, h2, h3, .ob-h2, .ob-hero__tytul { text-wrap: balance; }
p, li { text-wrap: pretty; }

/* Długi adres e-mail nie rozpycha układu */
.ob-kontakt__dane a, .ob-footer__kol--dane a { overflow-wrap: anywhere; }


/* Ramki bez podanej wysokości mają zarezerwowane miejsce (zero CLS) */
iframe:not([height]):not([style*="height"]) { width: 100%; aspect-ratio: 16/10; min-height: 16rem; border: 0; }

/* ==========================================================================
   TELEFON — brief pkt 7. Próg czytelności i cele dotykowe.
   ========================================================================== */
@media (max-width: 767px) {
	/* body min 16px, treść drugorzędna min 15px */
	.ob-hero__tekst, .ob-intro__tresc p, .ob-budynek__opis,
	.ob-relaks__tekst p, .ob-kontakt__tresc p,
	.ob-hero__kafel span, .ob-intro__ikona, .ob-cennik__stawka,
	.ob-cennik__opis, .ob-cennik__nota, .ob-faq__a, .ob-footer__kol a,
	.ob-footer__dol-in, .ob-footer__kol--dane p { font-size: max(0.9375rem, var(--fs-small)); }
	/* cele dotykowe: odnośniki w stopce i menu */
	.ob-footer__kol a, .ob-nav a { min-height: 44px; display: inline-flex; align-items: center; }
	/* pola formularza ≥16px — inaczej iOS przybliża stronę przy dotknięciu */
	input, textarea, select { font-size: var(--fs-base); }
}

/* ==========================================================================
   NAPRAWY Z AUDYTU POMIAROWEGO (320–1440 px)
   Każda pozycja ma pod sobą zmierzoną przyczynę, nie domysł.
   ========================================================================== */

/* 1) H-SCROLL 10 px przy 320 px — PRZYCZYNA: panel menu ma stałą szerokość
      `min(80vw, 320px)`, a przy `transform: translateX(100%)` jego prawa
      krawędź wychodzi poza dokument. Zamykamy go w `overflow-x: clip` na
      body i ograniczamy szerokość panelu — bez zaklejania całego układu. */
body { overflow-x: clip; }
@media (max-width: 980px) {
	.ob-header__nav-wrap { width: min(80vw, 300px); max-width: calc(100vw - 2.5rem); }
}

/* 2) CELE DOTYKOWE < 44 px — ikona Facebooka miała 30×30, logo 50×39.
      Pole dotyku powiększamy bez zmiany wyglądu ikony. */
.ob-social__fb { width: 44px; height: 44px; }
.ob-social__fb svg { width: 16px; height: 16px; }
.ob-logo { display: inline-flex; align-items: center; min-height: 44px; }
.ob-header__tel { min-height: 44px; display: inline-flex; align-items: center; }
.ob-footer__kol a, .ob-nav a, .ob-kontakt__dane a { min-height: 44px; display: inline-flex; align-items: center; }

/* 3) KARTY BUDYNKÓW NIERÓWNEJ WYSOKOŚCI (446/417/472 px) — PRZYCZYNA: opisy
      mają różną długość, a karta rosła do treści. Zdjęcie stałej proporcji
      + opis rozpychający się do pełnej wysokości wyrównuje rząd. */

/* 4) KONTENERY NIEZGODNE (lewa krawędź 0 vs 321) — PRZYCZYNA: kontener
      wewnątrz panelu menu (poza ekranem) był liczony razem z resztą.
      Panel dostaje własny, węższy gutter i nie udaje kontenera treści. */
.ob-header__nav-in { padding-inline:var(--space-6); }

/* ==========================================================================
   NAPRAWY — DRUGA TURA, po diagnozie przyczyn (nie objawów)
   ========================================================================== */

/* H-SCROLL 10 px przy 320 px — PRAWDZIWA PRZYCZYNA (zmierzona):
   panel menu jest `position: fixed` i odsunięty `translateX(256px)`.
   Element przesunięty transformem NADAL powiększa obszar przewijania
   dokumentu. `overflow-x: clip` na `body` tego nie łapie, bo panel jest
   `fixed` — zaczepia się o viewport, nie o body.
   Rozwiązanie: chowamy panel `visibility: hidden` gdy jest zamknięty
   (element ukryty nie tworzy obszaru przewijania), przywracamy przy
   otwarciu. Animacja zostaje płynna, bo `visibility` też jest w przejściu. */
@media (max-width: 980px) {
	.ob-header__nav-wrap {
		visibility: hidden;
		transition: transform var(--t-base) var(--ease), visibility 0s linear var(--t-base);
	}
	body.ob-menu-open .ob-header__nav-wrap {
		visibility: visible;
		transition: transform var(--t-base) var(--ease), visibility 0s;
	}
}

/* KARTY BUDYNKÓW 446/417/472 — PRAWDZIWA PRZYCZYNA: `align-items: stretch`
   działa na KARTĘ, ale wysokość rzędu w gridzie wyznacza najwyższa karta,
   a wewnątrz karty zdjęcie ma `aspect-ratio`, więc rośnie tylko opis.
   Karty były już `flex`, brakowało rozciągnięcia opisu do pełnej wysokości
   ORAZ ujednolicenia tytułów (2 wiersze vs 1). */

/* Podpis „Wykonanie: Arlek.pl" w stopce — odnośnik miał 48×16 px.
   To odnośnik w zdaniu, więc nie powiększamy pola do 44 px (zepsułoby
   wiersz), tylko dokładamy odstęp klikalny w pionie. */
.ob-footer__dol a { padding-block:var(--space-3); display: inline-block; }

/* ==========================================================================
   NAPRAWY — TRZECIA TURA. Zmierzone, nie zgadnięte.
   ========================================================================== */

/* H-SCROLL — `visibility: hidden` NIE WYSTARCZYŁO: element ukryty tą
   własnością nadal zajmuje miejsce w układzie i nadal powiększa obszar
   przewijania. Zmierzone: panel `fixed`, prawa krawędź 576 px przy ekranie
   320 px.
   Właściwe rozwiązanie: panel zamknięty ma `display: none`. Wtedy znika
   z układu całkowicie. Płynność otwierania zachowana, bo przy otwarciu
   wracamy do `display: block` i animujemy `transform` w następnej klatce
   (`@starting-style` obsługiwane, a bez niego menu po prostu wjeżdża). */
@media (max-width: 980px) {
	.ob-header__nav-wrap { display: none; }
	body.ob-menu-open .ob-header__nav-wrap { display: block; visibility: visible; }
}

/* KARTY 446/446/472 — zmierzone: zdjęcia równe (216 px), tytuły równe
   (58 px), różnią się WYŁĄCZNIE opisy (132 vs 158 px). Grid miał
   `grid-auto-rows: auto`, więc rząd nie wyrównywał wysokości.
   `1fr` na rzędach wyrównuje karty do najwyższej w rzędzie. */

/* H-SCROLL przy 320 px — PRZYCZYNA (zmierzona): kolumna zdjęcia w sekcji
   wprowadzenia ma sztywne `300px`, a przy ekranie 320 px i marginesach
   bocznych nie mieści się w kontenerze (prawa krawędź 330 px).
   Brief pkt 1: „brak sztywnych szerokości w px na elementach, które mają
   być elastyczne". Zamieniamy na `minmax()` — kolumna kurczy się razem
   z ekranem zamiast wypychać układ. */
/* Reguła minmax(0,300px) usunięta — była później w kaskadzie i po cichu
   zwężała ilustrację do 300 px. Siatkę ustawia definicja przy WPROWADZENIU. */
@media (max-width: 980px) { .ob-intro__in { grid-template-columns: minmax(0, 1fr); } }

/* Dwie ikony pod wprowadzeniem: siatka 1fr 1fr przy 320 px daje kolumny
   węższe niż ikona + tekst, więc rząd wypycha układ. Poniżej 480 px
   układamy je jedna pod drugą. */
@media (max-width: 480px) {
	.ob-intro__ikony { grid-template-columns: minmax(0, 1fr); }
}
.ob-intro__ikona { min-width: 0; }
.ob-intro__ikona span { min-width: 0; overflow-wrap: anywhere; }


/* Telefon dostaje przeskalowaną wersję tła hero (ten sam kadr, mniej bajtów) */
@media (max-width: 768px) {
	.ob-hero { background: var(--ziel-hero) url("../img/31-800.jpg") center center / cover no-repeat; }
}


/* E-mail w karcie kontaktowej: mniejszy zamiast łamania po literze */
.ob-footer__kol--dane a { overflow-wrap: anywhere; font-size: var(--fs-xs); }
/* Pasek Poradnik/Polityka z mu-pluginu — nasza stopka MA te odnośniki
   w kolumnie „Dodatkowe", więc dubel pod stopką chowamy. */
/* Ramki roomadmin rosną płynnie, gdy widget nadaje wysokość */
iframe[src*="roomadmin"] { transition: height .25s ease; }


/* ==========================================================================
   BORUCZA — runda premium 13.08.2026
   ========================================================================== */

/* Ikona na zielonym kwadracie ma być BIAŁA — nie zielona na zielonym. */
.ob-hero__kafel-ikona,
.ob-intro__ikona .ob-icon,
.ob-chip .ob-icon,
.ob-social__fb,
.ob-kontakt-karta__ikona { color: var(--biel); }
.ob-hero__kafel-ikona svg,
.ob-intro__ikona .ob-icon,
.ob-kontakt-karta__ikona svg { stroke: currentColor; }
/* kafle hero: ikona biała na zielonym kwadracie */
.ob-hero__kafel-ikona { background: var(--ziel); color: var(--biel); }

/* ---------- delikatny ruch ---------- */
.ob-js .ob-anim {
	opacity: 0;
	transform: translateY(12px);
	transition: opacity var(--t-obraz) var(--ease), transform var(--t-obraz) var(--ease);
	transition-delay: var(--opoznienie, 0ms);
}
.ob-js .ob-anim--widoczny { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
	.ob-js .ob-anim { opacity: 1; transform: none; transition: none; }
}

/* ---------- NAGŁÓWEK po przewinięciu ---------- */
.ob-header { transition: box-shadow var(--t-base) var(--ease); }
.ob-header--zwiniety { box-shadow: var(--cien-md); }
.ob-nav a[aria-current="page"] { color: var(--ziel-ciemna); }
.ob-nav a[aria-current="page"]::after { right: 0; }

/* ---------- CENNIK od nowa: dwie karty obok siebie ---------- */
.ob-cennik { background: var(--jasny); padding-block:var(--sekcja-y); }
.ob-cennik__glowa { text-align: center; margin-bottom:2.25rem; }
.ob-cennik__glowa .ob-h2 { margin-bottom:0.5rem; }
.ob-cennik__pod { color: var(--tekst-mig); margin:0; }
.ob-cennik__lista { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap:1.5rem; max-width: none; }
.ob-cennik__poz {
	position: relative;
	background: var(--biel);
	border: 1px solid var(--c-border-light);
	border-radius: var(--radius-lg);
	padding:1.75rem;
	box-shadow: var(--cien-sm);
	display: flex;
	flex-direction: column;
	gap:.25rem;
	transition: box-shadow var(--t-base) var(--ease), transform var(--t-base) var(--ease), border-color var(--t-base) var(--ease);
}
@media (hover: hover) { .ob-cennik__poz:hover { box-shadow: var(--cien-lg); transform: translateY(-3px); border-color: var(--ziel); } }
.ob-cennik__poz--polecany { border-color: var(--ziel); box-shadow: var(--cien-md); }
.ob-cennik__polecamy {
	position: absolute; top: -.75rem; left: 1.6rem;
	background: var(--ziel-tekst); color: var(--biel);
	font-size: var(--fs-xs); font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
	padding:0.25rem 0.75rem; border-radius: var(--radius-full-pill);
}
.ob-cennik__ikona { display: inline-flex; align-items: center; justify-content: center; width: 46px; height: 46px; border-radius: var(--radius-md); background: var(--ziel); color: var(--biel); margin-bottom:0.5rem; }
.ob-cennik__nazwa { font-size: var(--fs-md); font-weight: 700; color: var(--ziel-ciemna); margin:0; }
.ob-cennik__opis { display: block; font-size: var(--fs-sm); color: var(--tekst-mig); margin-bottom:1rem; }
.ob-cennik__stawki { display: flex; flex-direction: column; gap:.5rem; margin-top:auto; }
.ob-cennik__stawka {
	display: flex; justify-content: space-between; align-items: baseline; gap:1rem;
	padding:0.75rem 1rem; border-radius: var(--radius-md); background: var(--jasny);
	font-size: var(--fs-sm); color: var(--tekst-mig); margin:0;
	font-variant-numeric: tabular-nums;
}
.ob-cennik__stawka strong { color: var(--ziel-ciemna); font-size: var(--fs-md); font-weight: 800; white-space: nowrap; }
.ob-cennik__nota { text-align: center; font-size: var(--fs-xs); color: var(--tekst-mig); margin-top:1.5rem; }
.ob-cennik__cta { display: inline-flex; align-items: center; gap:.5rem; min-height: 44px; }
.ob-cennik__stopka { text-align: center; margin-top:0.5rem; }
@media (max-width: 860px) { .ob-cennik__lista { grid-template-columns: 1fr; } }

/* ---------- REZERWACJA na tle: karta z nagłówkiem i krokami ---------- */
/* Rytm pionowy jest wspólny dla wszystkich sekcji. Mnożnik 1,1 dawał tu
   97 px przy 88 px w pozostałych: różnica na tyle mała, że nie czytała się
   jako zamiar, a na tyle duża, że psuła regularność przewijania. */
.ob-rezerwacja { position: relative; background-size: cover; background-position: center; padding-block: var(--sekcja-y); }
/* ⚠️ Przesłona 30 % u góry była za słaba: akapit „Proszę wybrać termin…"
   dawał 2,12 : 1, a punkty listy 4,09 : 1 przy progu 4,50. Mierzone
   z pikseli, bo tłem jest zdjęcie lasu, a nie kolor. */
.ob-rezerwacja::before { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(20, 34, 0, .62), rgba(20, 34, 0, .74)); }
.ob-rezerwacja .ob-container { position: relative; }
.ob-rezerwacja__in { display: grid; grid-template-columns: 1fr 1.05fr; gap:1.5rem; align-items: start; }
.ob-rezerwacja__tekst { color: var(--biel); padding-top:.5rem; }
.ob-rezerwacja__tekst .ob-h2 { color: var(--biel); }
.ob-rezerwacja__lead { font-size: var(--fs-base); line-height: 1.7; }
.ob-rezerwacja__punkty { list-style: none; margin:1.25rem 0 0; padding:0; display: flex; flex-direction: column; gap:.75rem; }
.ob-rezerwacja__punkty li { display: flex; gap:.75rem; align-items: flex-start; font-size: var(--fs-sm); }
.ob-rezerwacja__punkty .ob-icon { color: var(--biel); flex-shrink: 0; }
.ob-rezerwacja__box { background: var(--biel); border-radius: var(--radius-lg); padding:1.75rem; box-shadow: var(--cien-xl); max-width: none; }
.ob-rezerwacja__box .ob-h2 { font-size: var(--fs-lg); margin-bottom:.25rem; }
.ob-rezerwacja__box-pod { color: var(--tekst-mig); font-size: var(--fs-sm); margin-bottom:1rem; }
/* Miejsce na ramkę rezerwacji rezerwujemy Z GÓRY.
   Ramka wjeżdża dopiero po dojechaniu do sekcji i po wczytaniu rośnie
   do 248 px. Bez tej rezerwacji karta puchła w trakcie oglądania o 138 px,
   a treść pod spodem podskakiwała pod kursorem. Zmierzone na żywo. */
.ob-rezerwacja__widget { min-height: 248px; }
/* Zajawka trzyma wysokość, dopóki nie ma czego pokazać, i sama znika,
   gdy skrypt wstawi ramkę w to samo miejsce. */
.ob-rezerwacja__zajawka {
	height: 248px;
	border-radius: var(--radius-md);
	background: linear-gradient(180deg, rgba(0,0,0,.03), rgba(0,0,0,.05));
}
.ob-rezerwacja__tel { display: inline-flex; align-items: center; gap:.5rem; margin-top:1rem; color: var(--ziel-ciemna); font-weight: 700; min-height: 44px; }
@media (max-width: 860px) { .ob-rezerwacja__in { grid-template-columns: 1fr; } }

/* ---------- ORGANIZACJA WYDARZEŃ: zdjęcie + karta z liczbami ---------- */
.ob-org { background: var(--biel); padding-block:var(--sekcja-y); }
.ob-org__in { display: grid; grid-template-columns: 1.05fr 1fr; gap:2rem; align-items: center; }
.ob-org__foto { position: relative; border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--cien-xl); }
.ob-org__foto img { border: 0; border-radius: 0; box-shadow: none; width: 100%; height: 100%; object-fit: cover; display: block; }
.ob-org__plakietka {
	position: absolute; left: 1.2rem; bottom: 1.2rem;
	background: rgba(255, 255, 255, .95); color: var(--ziel-ciemna);
	border-radius: var(--radius-md); padding:0.75rem 1rem; box-shadow: var(--shadow-md);
	display: flex; gap:0.75rem; align-items: center; font-size: var(--fs-xs); font-weight: 700;
}
.ob-org__plakietka strong { font-size: var(--fs-lg); color: var(--ziel); }
.ob-org__box { background: transparent; border-radius: 0; padding:0; box-shadow: none; }
/* Duplikat reguły z linii 406, przebijał ją samą swoistością i pozycją
   niżej w arkuszu. Zostaje jedna definicja, ta z `flex-start`. */
.ob-org__box p { color: var(--tekst-mig); font-size: var(--fs-sm); line-height: 1.75; }
/* Trzy kafle z liczbami: przy 320 px trzy kolumny nie mieszczą się
   (zmierzone: prawa krawędź 391 przy oknie 320). Poniżej 480 px
   układamy je w dwie kolumny, a najwęższy telefon dostaje jedną. */
.ob-org__liczby { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap:.75rem; margin:1.25rem 0; }
.ob-org__liczba { min-width: 0; }
.ob-org__liczba strong { overflow-wrap: anywhere; }
@media (max-width: 520px) { .ob-org__liczby { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 360px) { .ob-org__liczby { grid-template-columns: minmax(0, 1fr); } }
.ob-org__liczba { background: var(--jasny); border-radius: var(--radius-md); padding:1rem; text-align: center; }
.ob-org__liczba strong { display: block; font-size: var(--fs-lg); color: var(--ziel); font-weight: 800; }
.ob-org__liczba span { font-size: var(--fs-xs); color: var(--tekst-mig); }
@media (max-width: 860px) { .ob-org__in { grid-template-columns: 1fr; } }

/* ---------- FAQ: dwie kolumny pełnej szerokości ---------- */
.ob-faq__lista { max-width: none; }
.ob-faq__kolumny { column-count: 2; column-gap:2.5rem; }
.ob-faq__kolumny .ob-faq__poz { break-inside: avoid; page-break-inside: avoid; display: block; margin-bottom:.25rem; }
@media (max-width: 900px) { .ob-faq__kolumny { column-count: 1; } }

/* ---------- KONTAKT: karty danych ---------- */
.ob-kontakt__karty { display: grid; grid-template-columns: repeat(3, 1fr); gap:1rem; margin-top:1.5rem; }
.ob-kontakt-karta {
	display: flex; flex-direction: column; gap:.25rem;
	background: var(--biel); border: 1px solid var(--c-border-light); border-radius: var(--radius-lg);
	padding:1.25rem; box-shadow: var(--cien-sm);
	transition: box-shadow var(--t-base) var(--ease), transform var(--t-base) var(--ease), border-color var(--t-base) var(--ease);
}
@media (hover: hover) { .ob-kontakt-karta:hover { box-shadow: var(--cien-lg); transform: translateY(-3px); border-color: var(--ziel); } }
.ob-kontakt-karta__ikona { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: var(--radius-md); background: var(--ziel); color: var(--biel); margin-bottom:0.5rem; }
.ob-kontakt-karta__etyk { font-size: var(--fs-xs); letter-spacing: .06em; text-transform: uppercase; color: var(--tekst-mig); }
.ob-kontakt-karta__tresc { font-size: var(--fs-base); color: var(--ziel-ciemna); overflow-wrap: anywhere; }
.ob-kontakt-karta__pod { font-size: var(--fs-xs); color: var(--tekst-mig); }
@media (max-width: 860px) { .ob-kontakt__karty { grid-template-columns: 1fr; } }

/* ---------- REGULAMIN i podstrony tekstowe ---------- */
.ob-strona__tresc { line-height: 1.85; }
.ob-strona__tresc h2 { color: var(--ziel-ciemna); font-size: var(--fs-lg); margin-top:2.25rem; padding-top:1.25rem; border-top: 1px solid var(--c-border-light); }
.ob-strona__tresc h3 { color: var(--ziel-ciemna); font-size: var(--fs-md); margin-top:1.5rem; }
.ob-strona__tresc ul, .ob-strona__tresc ol { padding-left:1.25rem; }
.ob-strona__tresc li { margin-bottom:.5rem; }
.ob-strona__tresc li::marker { color: var(--ziel-tekst); }
.ob-strona__tresc strong { color: var(--ziel-ciemna); }

/* ---------- OPINIE: karuzela (te same reguły co u Rakowca, prefiks ob) ---------- */
.ob-opinie { background: var(--jasny); padding-block:var(--sekcja-y); }
.ob-opinie__glowa { display: grid; grid-template-columns: auto 1fr auto; gap:0.5rem 1.25rem; align-items: center; background: var(--biel); border-radius: var(--radius-lg); box-shadow: var(--shadow-md); padding:1.5rem 1.5rem; }
.ob-opinie__avatar { width: 56px; height: 56px; border-radius: 50%; grid-row: 1 / 3; object-fit: contain; background: var(--jasny); }
.ob-opinie__tytul { margin:0; font-size: var(--fs-md); color: var(--ziel-ciemna); }
.ob-opinie__ocena { display: flex; align-items: center; gap:.5rem; flex-wrap: wrap; margin:0.25rem 0 0; }
.ob-opinie__ocena strong { font-size: var(--fs-lg); font-variant-numeric: tabular-nums; }
.ob-gwiazdki { color: #fb8e28; letter-spacing: .05em; }
.ob-opinie__liczba { color: var(--tekst-mig); font-size: var(--fs-xs); }
.ob-opinie__zrodlo { grid-column: 2; margin:0.25rem 0 0; font-size: var(--fs-xs); color: var(--tekst-mig); }
.ob-opinie__akcje { grid-row: 1 / 3; grid-column: 3; display: flex; flex-direction: column; gap:.5rem; }
.ob-btn--google { background: #3c6df0; color: var(--biel); }
.ob-btn--kontur-ciemny { background: transparent; color: var(--ziel-ciemna); border: 1px solid var(--c-border); }
.ob-opinie-karuzela { position: relative; margin-top:1.5rem; }
.ob-opinie-karuzela__tor { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(min(100%, 22rem), 1fr); gap:1.25rem; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; padding-bottom:0.5rem; }
.ob-opinie-karuzela__tor::-webkit-scrollbar { display: none; }
.ob-opinia { scroll-snap-align: start; background: var(--biel); border-radius: var(--radius-lg); box-shadow: var(--shadow-md); padding:1.5rem; margin:0; display: flex; flex-direction: column; gap:.75rem; }
.ob-opinia__tekst { margin:0; font-size: var(--fs-sm); line-height: 1.7; }
.ob-opinia__stopka { margin-top:auto; display: flex; gap:0.5rem; align-items: baseline; flex-wrap: wrap; }
.ob-opinia__autor { font-weight: 700; color: var(--ziel-ciemna); }
.ob-opinia__kiedy { font-size: var(--fs-xs); color: var(--tekst-mig); }
.ob-opinie-karuzela__strzalka { position: absolute; top: 45%; z-index: 2; width: 44px; height: 44px; border-radius: 50%; border: 1px solid var(--c-border); background: var(--biel); color: var(--ziel-ciemna); font-size: var(--fs-lg); line-height: 1; cursor: pointer; box-shadow: var(--shadow-sm); }
.ob-opinie-karuzela__strzalka[data-krok="-1"] { left: -10px; }
.ob-opinie-karuzela__strzalka[data-krok="1"] { right: -10px; }
.ob-opinie-karuzela__kropki { display: flex; justify-content: center; gap:0.5rem; margin-top:1rem; }
.ob-opinie-karuzela__kropka { width: 10px; height: 10px; padding:0; border: none; border-radius: 50%; background: var(--c-border); cursor: pointer; }
.ob-opinie-karuzela__kropka.is-teraz { background: var(--ziel); transform: scale(1.25); }
@media (max-width: 900px) {
	.ob-opinie__glowa { grid-template-columns: auto 1fr; }
	.ob-opinie__akcje { grid-row: auto; grid-column: 1 / -1; flex-direction: row; }
	.ob-opinie__akcje .ob-btn { flex: 1 1 auto; justify-content: center; }
	.ob-opinie-karuzela__strzalka { display: none; }
}

/* ---------- FORMULARZ (te same zasady co u Rakowca) ---------- */
.ob-form__pulapka { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.ob-form label { display: block; margin-bottom:1rem; color: var(--tekst-mig); font-size: var(--fs-xs); }
.ob-form input, .ob-form textarea { display: block; width: 100%; margin-top:.25rem; border: 1px solid var(--c-border-light); border-radius: var(--radius-md); padding:0.75rem 1rem; font-family: inherit; font-size: var(--fs-base); background: var(--biel); color: var(--tekst); min-height: 44px; }
.ob-form input:focus, .ob-form textarea:focus { outline: none; border-color: var(--ziel); box-shadow: 0 0 0 3px rgba(103, 151, 27, .16); }
.ob-form__row { display: grid; grid-template-columns: 1fr 1fr; gap:1rem; }
.ob-form__zgoda { display: flex; gap:0.5rem; align-items: flex-start; font-size: var(--fs-xs); }
.ob-form__zgoda input { width: 20px; height: 20px; min-height: 20px; margin:0; flex-shrink: 0; accent-color: var(--ziel); }
.ob-form__odp { padding:1rem 1rem; border-radius: var(--radius-md); margin-bottom:1.25rem; font-size: var(--fs-sm); }
.ob-form__odp--ok { background: rgba(103, 151, 27, .12); color: var(--ziel-ciemna); border: 1px solid rgba(103, 151, 27, .35); }
.ob-form__odp--blad { background: rgba(192, 57, 43, .08); color: #a5332a; border: 1px solid rgba(192, 57, 43, .3); }
.ob-form__nota { font-size: var(--fs-xs); color: var(--tekst-mig); }
@media (max-width: 700px) { .ob-form__row { grid-template-columns: 1fr; } }


/* Ikony social w stopce: pełne pole dotyku 44x44 (zmierzone 46 wys., <44 szer.) */
.ob-footer__social a { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 50%; background: rgba(255,255,255,.14); color: var(--biel); }
@media (hover: hover) { .ob-footer__social a:hover { background: rgba(255,255,255,.26); } }
/* Kalendarz/rezerwacja na podstronie */
.ob-kalendarz { padding-block:var(--sekcja-y); }
.ob-kalendarz__tytul { text-align: left; }
.ob-kalendarz__wstep { color: var(--tekst-mig); margin-bottom:1.5rem; }
.ob-kalendarz__karta { background: var(--biel); border: 1px solid var(--c-border-light); border-radius: var(--radius-lg); box-shadow: var(--shadow-md); padding:1.5rem; }
.ob-kalendarz__widget { min-height: 110px; overflow: visible; }
.ob-kalendarz__widget iframe { display: block; width: 100%; border: 0; }
.ob-kalendarz__cta { display: flex; gap:0.75rem; flex-wrap: wrap; margin-top:1.5rem; }


/* Przycisk pod cennikiem: biały tekst na ciemnej zieleni (stara reguła
   robiła z niego ciemny podkreślony link — tekst znikał na tle). */
.ob-cennik__cta.ob-btn--rez { color: var(--biel); text-decoration: none; }


/* Telefon: opisy kart cennika i nota miały 14 px (pomiar audytu) */
@media (max-width: 767px) {
	.ob-cennik__opis, .ob-cennik__nota, .ob-rezerwacja__box-pod,
	.ob-kontakt-karta__pod, .ob-org__liczba span { font-size: var(--fs-sm); }
}


/* ⚠️ ROZDĘCIE SIATKI (zmierzone: dokument 394 px przy oknie 390).
   Element siatki ma domyślnie `min-width: auto`, więc nie kurczy się
   poniżej swojej treści i wypycha układ w bok. Zdjęcie z lotu ptaka
   w sekcji „Organizacja wydarzeń" robiło dokładnie to.
   Poprawka u źródła: każdy element naszych siatek może się kurczyć. */
.ob-org__in > *,
.ob-cennik__lista > *,
.ob-rezerwacja__in > *,
.ob-kontakt__karty > *,
.ob-budynki__grid > *,
.ob-hero__in > *,
.ob-intro__in > * { min-width: 0; }
.ob-org__foto img { max-width: 100%; }


/* Telefon: punkty przy rezerwacji i podpisy kart mierzone na 15,0 px —
   próg czytelności zaczyna się dokładnie tam, więc podnosimy do 16 px. */
@media (max-width: 767px) {
	.ob-rezerwacja__punkty li,
	.ob-rezerwacja__lead,
	.ob-kontakt-karta__pod,
	.ob-cennik__opis { font-size: var(--fs-base); }
}


/* ==========================================================================
   WAGA STRONY NA TELEFONIE
   Pomiar (390 px): 2,6 MB przy budżecie 800 KB. Telefon pobierał pełne
   rozdzielczości teł i zdjęć. Poniżej te same kadry w wersji 800–960 px.
   ========================================================================== */



/* Wąski ekran = lżejszy kadr. Decyduje SZEROKOŚĆ OKNA, nie gęstość
   ekranu: `image-set` z wariantem 2x na telefonie z gęstym wyświetlaczem
   pobierał dokładnie ten duży plik, którego mieliśmy uniknąć (pomiar:
   waga strony spadła tylko o 21%). */
@media (max-width: 900px) {
	.ob-budynek__kadr,
	.ob-rezerwacja { background-image: var(--male, var(--duze)) !important; }
	.ob-intro__foto { background-image: url("../img/intro-las-mal.jpg"); }
}


/* Karuzela opinii: strzałki nachodziły na tekst kart (zmierzone na zrzucie).
   Wsuwamy je poza tor, a na wąskim ekranie chowamy — tam przewija się palcem. */
.ob-opinie-karuzela { padding-inline:2rem; }
.ob-opinie-karuzela__strzalka[data-krok="-1"] { left: 0; }
.ob-opinie-karuzela__strzalka[data-krok="1"] { right: 0; }
/* Karty równej wysokości w rzędzie */
.ob-opinie-karuzela__tor { align-items: stretch; }
.ob-opinia { height: 100%; }
@media (max-width: 900px) { .ob-opinie-karuzela { padding-inline:0; } }


/* Kropki karuzeli: kropka ma 10 px, ale palec potrzebuje 44 px.
   Powiększamy POLE DOTYKU przezroczystą obwódką — kropka wygląda
   tak samo, a trafia się w nią bez celowania. */
.ob-opinie-karuzela__kropka {
	width: 44px;
	height: 44px;
	background: transparent;
	position: relative;
	transform: none;
}
.ob-opinie-karuzela__kropka::before {
	content: "";
	position: absolute;
	inset: 17px;
	border-radius: 50%;
	background: var(--c-border);
	transition: background var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.ob-opinie-karuzela__kropka.is-teraz { background: transparent; transform: none; }
.ob-opinie-karuzela__kropka.is-teraz::before { background: var(--ziel); transform: scale(1.3); }
.ob-opinie-karuzela__kropki { gap:0; }


/* ⚠️ SKACZĄCY NAGŁÓWEK (bounce przy przewijaniu) — USUNIĘTA PRZYCZYNA.
   Przyklejony nagłówek zmieniał WYSOKOŚĆ po przewinięciu (min-height
   i szerokość logo). Zmiana wysokości elementu `sticky` przesuwa treść
   pod nim, więc przy progu 60 px powstawała pętla: zwinięcie → treść
   skacze w górę → próg przestaje być przekroczony → rozwinięcie → i tak
   w kółko. Reguły zmieniające wymiary zostały usunięte; po przewinięciu
   zmienia się wyłącznie cień, który nie rusza układu. */


/* ==========================================================================
   BUDYNKI: zdjęcia mają być DUŻE i dobrze widoczne (uwaga Pawła 13.08).
   Trzy wąskie karty dawały kadr ~350×260 px. Teraz: dwie kolumny na
   biurku i pełna szerokość dla trzeciej karty, proporcja 3:2 zamiast 4:3,
   czyli kadr ponad dwa razy większy.
   ========================================================================== */
.ob-budynki__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap:1.75rem; }
.ob-budynki__grid > :last-child { grid-column: 1 / -1; }
.ob-budynek__kadr { aspect-ratio: 3/2; }
.ob-budynki__grid > :last-child .ob-budynek__kadr { aspect-ratio: 21/9; }
.ob-budynek__kolo { font-size: var(--fs-base); padding:0.5rem 1rem; }
@media (max-width: 860px) {
	.ob-budynki__grid { grid-template-columns: minmax(0, 1fr); }
	.ob-budynki__grid > :last-child .ob-budynek__kadr { aspect-ratio: 3/2; }
}


/* ==========================================================================
   STOPKA BORUCZY od nowa: cztery kolumny, ciemna zieleń, pasek prawny.
   Zastępuje zieloną płachtę z falą i nachodzącą białą kartą kontaktową,
   w której dane łamały się w pół (uwaga Pawła 13.08).
   ========================================================================== */
.ob-footer { background: var(--ziel-ciemna); color: rgba(255, 255, 255, .80); padding-top:0; position: static; }
.ob-footer__fala { display: none; }
.ob-footer__gora { display: grid; grid-template-columns: 1.5fr .85fr .85fr 1.15fr; gap:2rem; padding-block:3rem 2.25rem; }
.ob-footer__kol--marka { min-width: 0; }
.ob-footer__logo { width: 240px; height: auto; margin-bottom:1rem; filter: brightness(0) invert(1); }
.ob-footer__opis { font-size: var(--fs-sm); line-height: 1.7; }
.ob-footer__tytul { color: var(--biel); font-weight: 700; font-size: var(--fs-sm); margin:0 0 1rem; }
.ob-footer__kol ul { list-style: none; margin:0; padding:0; display: flex; flex-direction: column; gap:.5rem; }
.ob-footer__kol a { color: rgba(255, 255, 255, .80); font-size: var(--fs-sm); transition: color var(--t-base) var(--ease); }
@media (hover: hover) { .ob-footer__kol a:hover { color: var(--biel); } }
.ob-footer__kol--dane { display: none; }
.ob-footer__kol--kontakt { background: none; color: inherit; border-radius: 0; padding:0; margin:0; box-shadow: none; }
/* ⚠️ `center`, nie `flex-start`. Odnośnik obok ma 44 px wysokości (pole
   dotyku) i tekst wyśrodkowany w tym polu, a ikona wisiała przyklejona
   do góry stałym marginesem 4 px. Rozjazd wynosił 9 px i było go widać
   przy każdej z trzech pozycji kontaktowych. Wszystkie trzy mieszczą się
   w jednym wierszu, więc środkowanie jest tu bezpieczne. */
.ob-footer__dana { display: flex; gap:0.5rem; align-items: center; font-size: var(--fs-sm); margin:0 0 .75rem; color: rgba(255, 255, 255, .80); }
.ob-footer__dana .ob-icon { color: var(--biel); opacity: .75; flex-shrink: 0; }
.ob-footer__dana a { color: rgba(255, 255, 255, .88); overflow-wrap: anywhere; }
/* Jasna zieleń pod białym napisem dawała 3,49:1 (próg 4,5). Głębszy odcień
   tej samej barwy: 5,07:1, a na ciemnym tle stopki i tak wygląda jaśniej. */
.ob-footer__cta { margin-top:0.5rem; background: var(--ziel-tekst); color: var(--biel); }
@media (hover: hover) { .ob-footer__cta:hover { background: var(--biel); color: var(--ziel-ciemna); } }
.ob-footer__social { display: flex; gap:0.5rem; margin-top:1rem; }
.ob-footer__social a { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 50%; background: rgba(255, 255, 255, .12); color: var(--biel); }
@media (hover: hover) { .ob-footer__social a:hover { background: var(--ziel); } }
.ob-footer__dol { background: rgba(0, 0, 0, .22); border-top: 1px solid rgba(255, 255, 255, .12); font-size: var(--fs-xs); }
.ob-footer__dol-in { display: flex; justify-content: space-between; align-items: center; gap:1rem; flex-wrap: wrap; padding-block:1rem; }
.ob-footer__prawne { display: flex; gap:1.25rem; flex-wrap: wrap; }
.ob-footer__prawne a, .ob-footer__wyk a { color: rgba(255, 255, 255, .85); }
.ob-footer__wyk a { font-weight: 700; color: var(--biel); }
@media (max-width: 900px) {
	.ob-footer__gora { grid-template-columns: 1fr 1fr; }
	.ob-footer__kol--marka { grid-column: 1 / -1; }
}


/* ==========================================================================
   KONTAKT BORUCZY od nowa
   ========================================================================== */
.ob-kontakt { background: var(--jasny); padding-block:var(--sekcja-y); }
.ob-kontakt__glowa { margin-bottom:1.75rem; }
.ob-kontakt__lead { color: var(--tekst-mig); font-size: var(--fs-sm); line-height: 1.75; }
.ob-kontakt__chipy { display: flex; flex-wrap: wrap; gap:.5rem; margin-top:1rem; }
.ob-chip { display: inline-flex; align-items: center; gap:0.5rem; background: var(--biel); color: var(--ziel-ciemna); font-size: var(--fs-xs); font-weight: 600; padding:.5rem 1rem; border-radius: var(--radius-full-pill); box-shadow: 0 1px 4px rgba(0, 0, 0, .05); }
.ob-chip .ob-icon { color: var(--ziel); }
.ob-kontakt__in { display: grid; grid-template-columns: .95fr 1.05fr; gap:1.5rem; align-items: start; }
.ob-kontakt__karty { display: grid; grid-template-columns: minmax(0, 1fr); gap:1rem; margin-top:0; }
.ob-kontakt__mapa { background: var(--biel); border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-md); }
.ob-kontakt__mapa-ramka { line-height: 0; }
.ob-kontakt__mapa-ramka iframe { display: block; width: 100%; border: 0; }
.ob-kontakt__trasa { display: flex; align-items: center; gap:1rem; padding:1rem 1.25rem; color: var(--ziel-ciemna); border-top: 1px solid var(--c-border-light); transition: background var(--t-base) var(--ease); min-height: 44px; }
.ob-kontakt__trasa-ikona { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border-radius: var(--radius-md); background: var(--ziel); color: var(--biel); flex-shrink: 0; }
.ob-kontakt__trasa-tekst { display: flex; flex-direction: column; line-height: 1.35; }
.ob-kontakt__trasa-tekst strong { font-size: var(--fs-base); }
.ob-kontakt__trasa-tekst em { font-style: normal; font-size: var(--fs-xs); color: var(--tekst-mig); }
.ob-kontakt__trasa-strzalka { margin-left:auto; color: var(--ziel); }
@media (hover: hover) { .ob-kontakt__trasa:hover { background: var(--jasny); } }
@media (max-width: 860px) { .ob-kontakt__in { grid-template-columns: minmax(0, 1fr); } }

/* ==========================================================================
   TELEFON: stopka kompaktowa, menu dopracowane
   ========================================================================== */
@media (max-width: 700px) {
	.ob-footer__gora { grid-template-columns: repeat(2, minmax(0, 1fr)); gap:1.25rem 1rem; padding-block:2rem 1.5rem; }
	/* Marka i kontakt na całą szerokość, dwie listy odnośników obok siebie.
	   Dzieci siatki NIE reagują na inline-block/width — kolumny ustawia się
	   wyłącznie w grid-template-columns rodzica. */
	.ob-footer__kol--marka, .ob-footer__kol--kontakt { grid-column: 1 / -1; }
	.ob-footer__logo { width: 200px; margin-bottom:.75rem; }
	.ob-footer__opis { font-size: var(--fs-sm);   /* 13 px to plakietka, nie akapit */ line-height: 1.6; margin-bottom:0; }
	.ob-footer__kol ul { gap:0.5rem; }
	/* 44 px, nie 40: reguła celuje w każde `a` w kolumnie, więc przykrywała
	   też przycisk CTA (.ob-btn ma 44). Pole dotykowe trzyma standard,
	   zbitość robi mniejszy odstęp listy, nie niższe pola. */
	.ob-footer__kol a { font-size: var(--fs-xs); min-height: 44px; display: inline-flex; align-items: center; }
	.ob-footer__tytul { margin-bottom:0.5rem; font-size: var(--fs-sm); }
	.ob-footer__dana { margin-bottom:.5rem; font-size: var(--fs-xs); }
	.ob-footer__dol-in { flex-direction: column; align-items: flex-start; gap:0.5rem; padding-block:1rem; font-size: var(--fs-xs); }
	.ob-footer__prawne { gap:1rem; }
}

/* Menu mobilne: pełny ekran, wygodne pozycje, wyraźny przycisk zamknięcia */
@media (max-width: 980px) {
	.ob-header__nav-wrap { width: min(86vw, 340px); padding-top:5rem; }
	.ob-header__nav-in { gap:1rem; padding:1.25rem 1.5rem 2rem; }
	.ob-nav ul { gap:.25rem; width: 100%; }
	.ob-nav li { width: 100%; border-bottom: 1px solid var(--c-border-light); }
	.ob-nav li:last-child { border-bottom: none; }
	.ob-nav a { width: 100%; min-height: 52px; font-size: var(--fs-base); letter-spacing: .02em; }
	.ob-nav a::after { display: none; }
	.ob-social { width: 100%; margin-top:1rem; padding-top:1rem; border-top: 1px solid var(--c-border-light); }
	body.ob-menu-open { overflow: hidden; }
	/* przyciemnienie tła pod otwartym menu */
	.ob-header__nav-wrap { z-index: 200; }
	.ob-burger { z-index: 210; }
}


/* ==========================================================================
   PŁYWAJĄCY PASEK SPOŁECZNOŚCIOWY (zastępuje wtyczkę fuse social sidebar)
   Prawa krawędź, dokładnie tam, gdzie stał do tej pory. Pole dotykowe 48 px,
   pod paskiem ciasteczek (z-index 80 < 90), więc niczego nie zasłania.
   ========================================================================== */
.ob-rail {
	position: fixed;
	right: 0;
	top: 50%;
	transform: translateY(-50%);
	z-index: 80;
	display: flex;
	flex-direction: column;
	border-radius: var(--radius) 0 0 var(--radius);
	overflow: hidden;
	box-shadow: 0 6px 20px rgba(20, 34, 0, .18);
}
.ob-rail__poz {
	width: 48px;
	height: 48px;
	display: grid;
	place-items: center;
	background: var(--ziel);
	color: var(--biel);
	transition: background var(--t-base) var(--ease);
}
.ob-rail__poz + .ob-rail__poz { border-top: 1px solid rgba(255, 255, 255, .25); }
@media (hover: hover) { .ob-rail__poz:hover { background: var(--ziel-ciemna); } }
.ob-rail__poz:focus-visible { outline: 3px solid var(--ziel-ciemna); outline-offset: -3px; }
/* Na telefonie pasek zakrywał początek odnośników w stopce (pełna
   szerokość tekstu = każda pozycja pionowa koliduje z czymś dotykowym).
   Ikony społecznościowe są w nagłówku i stopce, pasek to dodatek na
   szerokie ekrany. */
@media (max-width: 1023px) { .ob-rail { display: none; } }
@media print { .ob-rail { display: none; } }


/* ==========================================================================
   BUDYNKI: TRZY duże kadry obok siebie (uwaga Pawła 13.08)
   Poprzedni układ 2 + 1 dawał wprawdzie większe zdjęcia, ale rozbijał rytm:
   dwie karty w rzędzie i jedna pod spodem czytały się jak dwie sekcje.
   Wracamy do trzech kolumn, tyle że kadr jest wyższy (proporcja 4:5 zamiast
   4:3), więc każde zdjęcie jest i tak większe niż w pierwotnej wersji.
   ========================================================================== */
.ob-budynki__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap:1.5rem; }
.ob-budynki__grid > :last-child { grid-column: auto; }
.ob-budynek__kadr { aspect-ratio: 4/5; }
.ob-budynki__grid > :last-child .ob-budynek__kadr { aspect-ratio: 4/5; }

/* Efekt inny niż w pozostałych sekcjach: kadr rozjaśnia się i delikatnie
   przybliża, a spod dolnej krawędzi wysuwa się ciemna toń, na której siada
   plakietka z metrażem. Zamiast samego cienia pod kartą, jak wszędzie. */
.ob-budynek { overflow: hidden; }
.ob-budynek__kadr { position: relative; filter: saturate(.92) brightness(.97); transition: filter var(--t-obraz) var(--ease), background-size var(--t-obraz) var(--ease); }
.ob-budynek__kadr::after {
	content: "";
	position: absolute; inset: auto 0 0 0; height: 55%;
	background: linear-gradient(to top, rgba(20, 34, 0, .55), rgba(20, 34, 0, 0));
	opacity: .75; transition: opacity var(--t-obraz) var(--ease);
	pointer-events: none;
}
.ob-budynek__kolo { position: absolute; left: 1rem; bottom: 1rem; z-index: 1; /* Pełne krycie, nie 94 %. Przez te 6 % przebijało zdjęcie pod spodem
   i zieleń napisu spadała do 3,89 : 1 przy progu 4,50. */
  background: #fff; color: var(--ziel-ciemna); }
@media (hover: hover) {
	.ob-budynek:hover .ob-budynek__kadr { filter: saturate(1.06) brightness(1.04); background-size: 112%; }
	.ob-budynek:hover .ob-budynek__kadr::after { opacity: .35; }
	.ob-budynek:hover .ob-budynek__kolo { background: var(--ziel-tekst); color: var(--biel); }
}
@media (max-width: 900px) { .ob-budynki__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px) { .ob-budynki__grid { grid-template-columns: minmax(0, 1fr); } .ob-budynek__kadr { aspect-ratio: 4/3; } }

/* ==========================================================================
   ORGANIZACJA WYDARZEŃ: zdjęcie większe (uwaga Pawła 13.08)
   Kolumna zdjęcia była węższa od kolumny tekstu (1,05 : 1 przy gęstym
   akapicie obok), więc zdjęcie z lotu ptaka wychodziło małe. Odwracamy
   proporcję na korzyść zdjęcia i dajemy mu wysoki kadr.
   ========================================================================== */
.ob-org__in { grid-template-columns: 1.35fr 1fr; gap:2.5rem; }
.ob-org__foto { aspect-ratio: 4/3; }
.ob-org__foto img { height: 100%; }
.ob-org__plakietka { left: 1.5rem; bottom: 1.5rem; }
@media (max-width: 860px) { .ob-org__in { grid-template-columns: minmax(0, 1fr); } .ob-org__foto { aspect-ratio: 3/2; } }


/* ==========================================================================
   MENU MOBILNE OD NOWA (uwagi Pawła 13.08)
   Było: wąska szuflada z prawej + ciemna nakładka na resztę strony.
   Jest: panel na cały ekran w barwach strony, bez przyciemniania niczego
   pod spodem. Pozycje jako duże wiersze na liniach włosowych, numer
   telefonu jako pełny przycisk, media społecznościowe na dole.
   Wjeżdża od prawej, pozycje pojawiają się kolejno z niewielkim opóźnieniem.
   ========================================================================== */
@media (max-width: 980px) {
	.ob-header__nav-wrap {
		position: fixed;
		inset: 0;
		width: 100%;
		max-width: none;
		background: var(--biel);
		transform: translateX(100%);
		visibility: hidden;
		transition: transform var(--t-panel) var(--ease), visibility 0s var(--t-panel);
		z-index: 300;
		padding:0;
		overflow-y: auto;
		overscroll-behavior: contain;
		display: flex;
		flex-direction: column;
		border: 0;
		box-shadow: none;
	}
	body.ob-menu-open .ob-header__nav-wrap {
		/* `display` MUSI być w regule z tą samą swoistością co ta wyżej
		   (`body.ob-menu-open .ob-header__nav-wrap` = 0,0,2,1), inaczej
		   wygrywa tamta i panel wraca do `block`, a wtedy `margin-top:auto`
		   w stopce panelu nic nie robi. Zmierzone: display był `block`,
		   przez co telefon i ikony stały tuż pod menu zamiast przy dolnej
		   krawędzi. Lekcja: kaskada, zmierz, która reguła wygrywa. */
		display: flex;
		flex-direction: column;
		transform: translateX(0);
		visibility: visible;
		transition-delay: 0s;
		box-shadow: none;
	}
	body.ob-menu-open { overflow: hidden; }

	/* pasek panelu: logo po lewej, krzyżyk po prawej — ten sam co w nagłówku,
	   więc przycisk nie „przeskakuje" przy otwarciu */
	.ob-header__nav-wrap::before {
		content: "";
		display: block;
		height: 88px;
		flex-shrink: 0;
	}

	.ob-header__nav-wrap ul {
		flex-direction: column;
		gap:0;
		padding:.5rem 0 0;
		margin:0;
		list-style: none;
	}
	.ob-header__nav-wrap li { border-top: 1px solid var(--c-border-light); }
	.ob-header__nav-wrap li:first-child { border-top: 0; }
	.ob-header__nav-wrap li a {
		display: flex;
		align-items: center;
		min-height: 60px;
		padding-inline:var(--gutter);
		font-size: var(--fs-base);
		font-weight: 700;
		letter-spacing: .02em;
		width: 100%;
		opacity: 0;
		transform: translateY(6px);
	}
	body.ob-menu-open .ob-header__nav-wrap li a {
		animation: ob-poz var(--t-panel) var(--ease) forwards;
		animation-delay: calc(60ms + var(--i, 0) * 45ms);
	}
	/* strzałka na prawym końcu wiersza: czytelny sygnał „to jest do kliknięcia" */
	.ob-header__nav-wrap li a::after {
		content: "";
		margin-left:auto;
		width: .45rem; height: .45rem;
		border-right: 2px solid currentColor;
		border-top: 2px solid currentColor;
		transform: rotate(45deg);
		opacity: .35;
	}
	/* podkreślenie z wersji na biurko nie ma tu sensu */
	.ob-header__nav-wrap a::before { display: none; }

	@keyframes ob-poz { to { opacity: 1; transform: none; } }
}

@media (max-width: 980px) and (prefers-reduced-motion: reduce) {
	.ob-header__nav-wrap { transition: none; }
	body.ob-menu-open .ob-header__nav-wrap li a { animation: none; opacity: 1; transform: none; }
}

/* Krzyżyk: ten sam przycisk co hamburger, tylko nad panelem i przemieniony
   w X. Dzięki temu palec trafia w to samo miejsce przy otwieraniu
   i zamykaniu, zamiast szukać drugiego przycisku w innym rogu. */
@media (max-width: 980px) {
	.ob-burger { position: relative; z-index: 320; }
	body.ob-menu-open .ob-burger span { background: var(--tekst); }
}


/* Panel mobilny Boruczy: kontener treści ograniczał pozycje do 180 px,
   więc wiersze menu były wąskim słupkiem przy lewej krawędzi. W panelu
   zdejmujemy z niego szerokość i marginesy — wiersz ma iść od krawędzi
   do krawędzi, bo to on jest polem dotykowym. */
.ob-nav__tel { display: none; }
@media (max-width: 980px) {
	.ob-header__nav-in {
		max-width: none;
		width: 100%;
		padding:0;
		gap:0;
		flex-direction: column;
		align-items: stretch;
		flex: 1 1 auto;   /* odstępnik u góry już zajął swoje, więc nie 100% */
		min-height: 0;
	}
	.ob-nav { width: 100%; }
	.ob-nav ul { width: 100%; gap:0; padding:0; }

	.ob-nav__tel {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		gap:0.5rem;
		margin:auto var(--gutter) .75rem;   /* margin-top:auto spycha na dół */
		min-height: 52px;
		border-radius: var(--radius-md);
		background: var(--ziel-tekst);
		color: var(--biel);
		font-weight: 800;
		font-size: var(--fs-base);
	}
	/* podpis „Nasze social media" na dole panelu, wyśrodkowany razem z ikonami */
	.ob-social {
		width: auto;
		margin:0 var(--gutter) 1.5rem;
		padding-top:1.25rem;
		border-top: 1px solid var(--c-border-light);
		justify-content: center;
	}
}


/* Krzyżyk w rogu, nie na środku.
   Hamburger stoi w środkowej kolumnie nagłówka (logo | przycisk | rezerwacja),
   więc po otwarciu panelu X wypadał na środku górnej krawędzi i wyglądał jak
   pomyłka. Przy otwartym panelu przypinamy go do prawego górnego rogu. */
@media (max-width: 980px) {
	body.ob-menu-open .ob-burger {
		position: fixed;
		top: .875rem;
		right: var(--gutter);
		z-index: 320;
	}
}


/* ==========================================================================
   PRZYKLEJONY NAGŁÓWEK A SKOK DO ELEMENTU
   Nagłówek stoi na wierzchu, więc gdy przeglądarka przewija do kotwicy albo
   do pola formularza, ląduje ono DOKŁADNIE pod paskiem i jest zasłonięte.
   Widać to i na skokach z menu, i przy poprawianiu błędnie wypełnionego pola.
   `scroll-margin-top` mówi przeglądarce, żeby zostawiła nad elementem tyle
   miejsca, ile zajmuje pasek.
   ========================================================================== */
[id], input, textarea, select, summary, label, button, a[href^="#"] { scroll-margin-top:clamp(88px, 14vw, 200px); }


/* ==========================================================================
   GALERIA (podstrona /galeria/)
   Zdjęcia klienta z 14.08.2026. Siatka o stałej proporcji kafla, żeby rząd
   nie skakał przy różnych kadrach (są i pionowe, i poziome). Kafel to
   odnośnik do wersji dużej, powiększanie obsługuje `[data-lightbox]`.
   ========================================================================== */
.ob-galeria-str { padding-block:var(--sekcja-y); background: var(--biel); }
.ob-galeria-str__tytul { margin-bottom:.5rem; }
.ob-galeria-str__wstep { color: var(--tekst-mig); margin-bottom:2rem; text-wrap: pretty; }
.ob-galeria-str__grid {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap:1rem;
}
.ob-galeria-str__poz {
	position: relative;
	display: block;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	border-radius: var(--radius-md);
	background: var(--jasny);
	box-shadow: var(--shadow-sm);
}
.ob-galeria-str__poz img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform var(--t-obraz) var(--ease), filter var(--t-panel) var(--ease);
}
.ob-galeria-str__lupa {
	position: absolute;
	right: .625rem;
	bottom: .625rem;
	width: 38px;
	height: 38px;
	display: grid;
	place-items: center;
	border-radius: var(--radius-full-pill);
	background: rgba(255, 255, 255, .92);
	color: var(--ziel-tekst);
	opacity: 0;
	transform: translateY(6px);
	transition: opacity var(--t-base) var(--ease), transform var(--t-base) var(--ease);
	pointer-events: none;
}
@media (hover: hover) {
	.ob-galeria-str__poz:hover img { transform: scale(1.06); filter: brightness(1.04); }
	.ob-galeria-str__poz:hover .ob-galeria-str__lupa { opacity: 1; transform: none; }
}
/* na dotyku nie ma najechania, więc lupa jest widoczna od razu */
@media (hover: none) {
	.ob-galeria-str__lupa { opacity: .92; transform: none; }
}
.ob-galeria-str__poz:focus-visible { outline: 3px solid var(--ziel-tekst); outline-offset: 3px; }
.ob-galeria-str__pusto { color: var(--tekst-mig); }

@media (max-width: 980px) { .ob-galeria-str__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 700px)  { .ob-galeria-str__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap:0.5rem; } }

/* ==========================================================================
   SZLIF 14.08: cztery drobiazgi, które składają się na wrażenie dopracowania
   ========================================================================== */

/* 1. Przyciski dziedziczą krój pisma.
   `<button>` bez `font-family` bierze systemowy, czyli Arial. Pomiar wykrył
   go na strzałkach karuzeli opinii: na całej stronie dwa kroje, a tam nagle
   trzeci. `font: inherit` naprawia to raz dla wszystkich przycisków. */
button, input, select, textarea { font: inherit; }

/* 2. Zaznaczenie tekstu w barwie marki, zamiast domyślnego niebieskiego. */
::selection { background: rgba(103,151,27,.28); color: #fff; }

/* 3. Widoczne obramowanie przy nawigacji klawiaturą, jednakowe wszędzie.
   `:focus-visible`, nie `:focus`, więc kliknięcie myszą nie rysuje ramki. */
a:focus-visible, button:focus-visible, summary:focus-visible,
input:focus-visible, textarea:focus-visible, select:focus-visible {
	outline: 3px solid var(--ziel-tekst);
	outline-offset: 2px;
	border-radius: 2px;
}

/* 4. Lekki docisk przy kliknięciu: przycisk ma reagować na naciśnięcie,
   nie tylko na najechanie. Na dotyku to jedyna informacja zwrotna. */
@media (prefers-reduced-motion: no-preference) {
	.ob-btn:active { transform: translateY(1px); }
}

/* Pola formularza na telefonie: iOS powiększa stronę, gdy pole ma mniej
   niż 16 px. Wymuszamy próg niezależnie od reszty skali. */
@media (max-width: 700px) {
	input, textarea, select { font-size: 1rem; }
}


/* ==========================================================================
   STANY NAJECHANIA, KTÓRYCH BRAKOWAŁO (pomiar 14.08)
   Sprawdzenie: najechać na każdy element klikalny i porównać styl przed i po.
   Pięć rodzajów nie zmieniało niczego: strzałki i kropki karuzeli opinii,
   wiersze pytań, numer telefonu w karcie rezerwacji i odnośniki w treści
   regulaminu. Element, który wygląda na klikalny, ale nie odpowiada na kursor,
   czyta się jak zepsuty.
   ========================================================================== */
@media (hover: hover) {
	/* Pasek prawny w stopce: „Polityka prywatności", „Regulamin", „Wykonanie".
	   Jedyne odnośniki na stronie, które nie reagowały na kursor. */
	.ob-footer__dol a:hover, .ob-footer__prawne a:hover, .ob-footer__wyk a:hover {
		text-decoration: underline;
		text-underline-offset: .2em;
	}

	/* karuzela opinii */
	.ob-opinie-karuzela__strzalka:hover { background: var(--ziel-tekst); color: #fff; border-color: var(--ziel-tekst); }
	.ob-opinie-karuzela__kropka:hover { background: var(--ziel-tekst); transform: scale(1.35); }

	/* wiersz pytania: całe pytanie jest polem kliknięcia, więc całe ma reagować */
	.ob-faq__q:hover { color: var(--ziel-tekst); }
	.ob-faq__q:hover::after { opacity: 1; }

	/* numer telefonu w karcie rezerwacji */
	.ob-rezerwacja__tel:hover, .ob-rez__mail:hover { text-decoration: underline; text-underline-offset: .2em; }

	/* odnośniki w treści podstron: regulamin, polityka, poradnik */
	.ob-strona__tresc a:hover, .ob-faq__a a:hover { text-decoration-thickness: 2px; }
}

/* Przejście, żeby zmiana nie następowała skokiem. */
.ob-opinie-karuzela__strzalka, .ob-opinie-karuzela__kropka,
.ob-faq__q, .ob-rezerwacja__tel {
	transition: background var(--t-zwykle) var(--ease), color var(--t-zwykle) var(--ease),
	            transform var(--t-zwykle) var(--ease), border-color var(--t-zwykle) var(--ease);
}


/* ==========================================================================
   DŁUGI TEKST NIE MA BYĆ WYŚRODKOWANY (pomiar 14.08)
   Na telefonie akapit wstępu Rakowca zajmował PIĘTNAŚCIE linii, każda
   wyśrodkowana. Oko przy takim układzie za każdym razem szuka początku
   następnej linii w innym miejscu, więc czytanie męczy, choć nikt nie
   powie, że „coś jest nie tak z tekstem".
   Nagłówki i krótkie hasła zostają na środku. Akapity idą do lewej,
   zgodnie z resztą strony.
   ========================================================================== */
.ob-wstep__tekst,
.ob-caloroczne p,
.ob-budynki__stopka {
	text-align: left;
	text-wrap: pretty;
}

/* ===========================================================================
   ZDJĘCIA WESEL I PRZYJĘĆ (mozaika, 14.08.2026)
   ---------------------------------------------------------------------------
   Osiem kadrów w mozaice, nie w siatce równych kwadratów. Równe kafle czytają
   się jak katalog; nierówne prowadzą wzrok od dużego kadru do szczegółów.

   Wysokość rzędów wynika z proporcji małych kafli (kwadrat), a duży kadr
   rozpina się na dwa rzędy i dwie kolumny. Dzięki temu nie ma nigdzie
   sztywnej wysokości w pikselach, więc układ nie pęka przy dłuższym tekście
   ani na innym ekranie.

   `minmax(0, 1fr)` zamiast `1fr`: ścieżka domyślna to `minmax(auto, 1fr)`,
   przy której szerokie zdjęcie rozpycha kolumnę poza ekran, a `overflow`
   na rodzicu ukrywa dowód i testy świecą na zielono.
   =========================================================================== */

.ob-wesela {
	padding-block: var(--sekcja-y);
	background: var(--c-surface-alt, #f4f6f1);
}

.ob-wesela__nag {
	margin-bottom: var(--space-8);
}

.ob-wesela__wstep {
	margin: var(--space-3) 0 0;
	color: var(--c-muted);
	font-size: var(--fs-md);
	line-height: var(--lh-body);
	text-wrap: pretty;
}

.ob-wesela__mozaika {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: var(--space-3);
}

.ob-wesela__kadr {
	position: relative;
	display: block;
	overflow: hidden;
	border-radius: var(--radius-md);
	background: var(--c-border-light, #e6e9e1);
	box-shadow: var(--cien-sm);
	aspect-ratio: 1;
	/* Kolejność wjazdu przy przewijaniu: kadr po kadrze, nie wszystkie naraz. */
	transition: box-shadow var(--t-zwykle) var(--ease), transform var(--t-zwykle) var(--ease);
}

/* Duży kadr otwierający: dwa pola na dwa. `span` na OBU osiach, bo samo
   `grid-row` bez `grid-column` wypycha element do nowej, niejawnej kolumny.

   Kwadrat, nie `auto`. Przy `aspect-ratio: auto` wysokość brała się z proporcji
   PLIKU, a zdjęcia z telefonu są pionowe: kadr urósł do 950 px i rozepchnął
   oba rzędy, przez co małe kafle wisiały w pustce po 230 px. Kwadrat o boku
   dwóch kolumn plus przerwa to dokładnie wysokość dwóch rzędów plus przerwa,
   więc geometria się domyka sama. */
.ob-wesela__kadr--1 { grid-column: span 2; grid-row: span 2; }

.ob-wesela__kadr img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform var(--t-obraz) var(--ease);
}

.ob-wesela__kadr:hover,
.ob-wesela__kadr:focus-visible {
	box-shadow: var(--cien-lg);
	transform: translateY(-2px);
}

.ob-wesela__kadr:hover img,
.ob-wesela__kadr:focus-visible img {
	transform: scale(1.05);
}

/* Znak, że kadr się powiększa. Bez tego zdjęcie wygląda na ozdobę,
   a nie na coś, w co warto kliknąć. */
.ob-wesela__kadr::after {
	content: "";
	position: absolute;
	inset-block-end: var(--space-2);
	inset-inline-end: var(--space-2);
	width: 34px;
	height: 34px;
	border-radius: var(--radius-full);
	background: rgba(255, 255, 255, .92) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23294a08' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M20 20l-4-4M11 8v6M8 11h6'/%3E%3C/svg%3E") center / 18px no-repeat;
	opacity: 0;
	transform: scale(.85);
	transition: opacity var(--t-zwykle) var(--ease), transform var(--t-zwykle) var(--ease);
	pointer-events: none;
}

.ob-wesela__kadr:hover::after,
.ob-wesela__kadr:focus-visible::after {
	opacity: 1;
	transform: scale(1);
}

/* Na dotyku nie ma najechania, więc lupka jest widoczna od razu. */
@media (hover: none) {
	.ob-wesela__kadr::after { opacity: .92; transform: scale(1); }
}

.ob-wesela__wiecej {
	display: inline-flex;
	align-items: center;
	gap: var(--space-2);
	margin-top: var(--space-6);
	min-height: 44px;
	padding: 0 var(--space-5);
	border: 1px solid var(--c-brand);
	border-radius: var(--radius-full-pill);
	color: var(--c-brand-ink);
	font-weight: 600;
	text-decoration: none;
	transition: background var(--t-zwykle) var(--ease), color var(--t-zwykle) var(--ease);
}

/* ⚠️ `--c-brand` (#67971b) daje z bielą 3,49:1, czyli PONIŻEJ progu 4,50.
   `--c-brand-ink` (#517a0c) daje 5,07:1. Zieleń marki nadaje się na
   obramowanie (próg dla elementów sterujących to 3:1), ale nie pod biały
   tekst. Ten sam błąd miałby stan najechania, więc oba są tu razem. */
.ob-wesela__wiecej:hover,
.ob-wesela__wiecej:focus-visible {
	background: var(--c-brand-ink);
	border-color: var(--c-brand-ink);
	color: var(--c-on-brand, #fff);
}

.ob-wesela__licznik {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 30px;
	height: 24px;
	padding: 0 var(--space-2);
	border-radius: var(--radius-full-pill);
	background: var(--c-brand-ink);
	color: var(--c-on-brand, #fff);
	font-size: var(--fs-xs);
	font-weight: 700;
}

.ob-wesela__wiecej:hover .ob-wesela__licznik,
.ob-wesela__wiecej:focus-visible .ob-wesela__licznik {
	background: var(--c-on-brand, #fff);
	color: var(--c-brand-ink);
}

/* Tablet: trzy kolumny. Duży kadr zostaje duży, szeroki domykający też. */
@media (max-width: 980px) {
	.ob-wesela__mozaika { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* Telefon: dwie kolumny. Duży kadr na całą szerokość, ale nie na dwa rzędy,
   bo przy 46 vw wysokość dwóch rzędów zjadałaby cały ekran. */
@media (max-width: 700px) {
	.ob-wesela__mozaika { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2); }
	.ob-wesela__kadr::after { width: 30px; height: 30px; background-size: 16px; }
}

/* ===========================================================================
   POWIĘKSZANIE ZDJĘĆ (15.08.2026)
   ---------------------------------------------------------------------------
   ⚠️ TYCH REGUŁ TU NIE BYŁO. JavaScript podglądu przeniesiono z Rakówca,
   arkusza stylów już nie. Skutek: okno miało `position: static`, przezroczyste
   tło i doklejało się na SAM DÓŁ dokumentu. Gość klikał w zdjęcie w galerii,
   a „podgląd" lądował pięć tysięcy pikseli niżej, poza ekranem. Z jego strony
   wyglądało to tak, jakby kliknięcie nie robiło nic.

   Komplet audytów wizualnych świecił przy tym na zielono, bo żaden nie
   klikał. Stąd `dzialanie.py`: test tego, co dzieje się PO kliknięciu.
   =========================================================================== */

.ob-lightbox {
	position: fixed;
	inset: 0;
	z-index: 9999;
	display: none;
	align-items: center;
	justify-content: center;
	padding: clamp(.5rem, 3vw, 2.5rem);
	background: rgba(12, 16, 12, .94);
}

.ob-lightbox.is-otwarte { display: flex; }

.ob-lightbox__scena {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--space-3);
	margin: 0;
	max-width: min(100%, 1400px);
	max-height: 100%;
}

.ob-lightbox__scena img {
	width: auto;
	height: auto;
	max-width: 100%;
	max-height: calc(100dvh - 7rem);
	border-radius: var(--radius);
	box-shadow: var(--cien-xl);
	/* Póki plik się nie wczyta, `img` jest pustym prostokątem. Bez tego
	   przez sekundę widać samą ciemność i nie wiadomo, czy coś się dzieje. */
	background: rgba(255, 255, 255, .06);
	opacity: 0;
	transition: opacity var(--t-zwykle) var(--ease);
}

.ob-lightbox__scena img.jest { opacity: 1; }

/* Wskaźnik wczytywania: obraca się dopóty, dopóki zdjęcie nie jest gotowe.
   Ukrywany klasą, nie usuwany, żeby nie przebudowywać drzewa przy każdej
   zmianie kadru. */
.ob-lightbox__czekaj {
	position: absolute;
	top: 50%;
	left: 50%;
	width: 38px;
	height: 38px;
	margin: -19px 0 0 -19px;
	border: 3px solid rgba(255, 255, 255, .25);
	border-top-color: var(--biel);
	border-radius: var(--radius-full);
	animation: ob-kreci .8s linear infinite;
}

.ob-lightbox__czekaj[hidden] { display: none; }

@keyframes ob-kreci { to { transform: rotate(360deg); } }

@media (prefers-reduced-motion: reduce) {
	.ob-lightbox__czekaj { animation-duration: 2.4s; }
	.ob-lightbox__scena img { transition: none; }
}

.ob-lightbox__licznik {
	color: rgba(255, 255, 255, .78);
	font-size: var(--fs-xs);
	font-variant-numeric: tabular-nums;
}

.ob-lightbox__zamknij,
.ob-lightbox__strzalka {
	position: absolute;
	z-index: 2;
	display: flex;
	align-items: center;
	justify-content: center;
	/* 52 px, nie domyślne 26x32 przeglądarki. Na telefonie trafienie
	   w krzyżyk wielkości paznokcia to loteria. */
	width: 52px;
	height: 52px;
	border: none;
	border-radius: var(--radius-full);
	background: rgba(255, 255, 255, .14);
	color: var(--biel);
	font-size: 2rem;
	line-height: 1;
	cursor: pointer;
	transition: background var(--t-zwykle) var(--ease);
}

.ob-lightbox__zamknij { top: 1rem; right: 1rem; font-size: 2.2rem; }
.ob-lightbox__strzalka--wstecz { left: 1rem; top: 50%; transform: translateY(-50%); }
.ob-lightbox__strzalka--dalej { right: 1rem; top: 50%; transform: translateY(-50%); }

@media (hover: hover) {
	.ob-lightbox__zamknij:hover,
	.ob-lightbox__strzalka:hover { background: rgba(255, 255, 255, .28); }
}

.ob-lightbox__zamknij:focus-visible,
.ob-lightbox__strzalka:focus-visible { outline: 3px solid var(--biel); outline-offset: 2px; }

/* Na wąskim ekranie strzałki schodzą na dół, żeby nie leżeć na zdjęciu. */
@media (max-width: 600px) {
	.ob-lightbox__strzalka { top: auto; bottom: 1rem; transform: none; }
	.ob-lightbox__strzalka--wstecz { left: 1.5rem; }
	.ob-lightbox__strzalka--dalej { right: 1.5rem; }
	.ob-lightbox__scena img { max-height: calc(100dvh - 10rem); }
}

/* ⚠️ Tej reguły też nie było, a JavaScript dodawał tę klasę. Skutek:
   przy otwartym podglądzie strona przewijała się pod spodem, więc po
   zamknięciu gość lądował w zupełnie innym miejscu galerii. */
body.ob-blokada-przewijania { overflow: hidden; }


/* Treść widoczna od pierwszej klatki nie przechodzi rozjaśnienia: pojawianie
   się jest dla tego, do czego gość przewija. Powód i pomiar: komentarz
   w `assets/js/main.js`, sekcja o pojawianiu się sekcji. */
.ob-anim--natychmiast { transition: none !important; }

/* ---------------------------------------------------------------------------
   IKONA W WIERSZU SIADA NA ŚRODKU PIERWSZEGO WIERSZA (15.08)
   ---------------------------------------------------------------------------
   Punktory w sekcji rezerwacji miały `align-items: flex-start`, więc ikona
   siadała na samej górze pola wiersza, a litery leżą w nim niżej: wiersz ma
   26,4 px, a znaki zajmują z tego środkowe kilkanaście. Ikona wychodziła
   5 px za wysoko przy każdym z trzech punktów.

   Odstęp to połowa różnicy między wysokością wiersza a wysokością ikony:
   (26,4 - 20) / 2 = 3,2 px. Zapisany w `em` skaluje się z krojem, więc
   trzyma się przy każdej wielkości pisma.

   Dlaczego nie `align-items: center`: pozycje łamią się na dwa wiersze,
   a wtedy środkowanie postawiłoby ikonę MIĘDZY nimi. Ten sam błąd
   poprawialiśmy dziś w nagłówku sekcji weselnej.
   --------------------------------------------------------------------------- */
.ob-rezerwacja__punkty li > svg {
	flex-shrink: 0;
	margin-top: calc((1.65em - 20px) / 2);
}

/* Nagłówek sekcji budynków stał w zieleni marki (#67971b) na jasnym deseniu:
   2,71 : 1 przy progu 4,50. Ta sama barwa o stopień głębiej daje 5,07 : 1
   i na jasnym tle wygląda tak samo „zielono". */
.ob-budynki .ob-h2 { color: var(--c-brand-dark); }

/* ---------------------------------------------------------------------------
   CZYTELNOŚĆ TEKSTU W HERO (15.08)
   ---------------------------------------------------------------------------
   Biały akapit leżał na zieleni marki ze zdjęciem lasu pod spodem: 1,79 : 1
   przy progu 4,50, mierzone z pikseli zrzutu, bo tłem jest obraz, a nie kolor.
   Sam odcień zieleni daje z bielą najwyżej 3,49 : 1, więc żadne poprawianie
   przezroczystości tekstu tego nie ratuje.

   Przyciemniamy WYŁĄCZNIE pas pod kolumną z tekstem, od lewej krawędzi.
   Zieleń zostaje zielenią po prawej, gdzie leżą kafle i zdjęcia, a tekst
   dostaje tło, na którym da się go przeczytać.
   --------------------------------------------------------------------------- */
.ob-hero { position: relative; }

.ob-hero::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(100deg, rgba(16, 28, 4, .72) 0%, rgba(16, 28, 4, .58) 42%, rgba(16, 28, 4, 0) 72%);
	pointer-events: none;
}

.ob-hero__in { position: relative; z-index: 1; }

@media (max-width: 860px) {
	/* Na telefonie kolumny stoją jedna pod drugą, więc przesłona idzie z góry. */
	.ob-hero::after {
		background: linear-gradient(180deg, rgba(16, 28, 4, .70) 0%, rgba(16, 28, 4, .60) 52%, rgba(16, 28, 4, .30) 100%);
	}
}

/* Sekcja rezerwacji: 3,65 : 1 to nadal poniżej progu. Ostatni krok. */
.ob-rezerwacja::before { background: linear-gradient(180deg, rgba(20, 34, 0, .74), rgba(20, 34, 0, .80)) !important; }

/* ---------------------------------------------------------------------------
   IKONA W DANYCH KONTAKTOWYCH STOPKI (15.08, druga podejscie)
   ---------------------------------------------------------------------------
   `align-items: center` naprawilo telefon i e-mail, ale zepsulo ADRES:
   na biurku kolumna jest wezsza, adres lamie sie na dwa wiersze i ikona
   siadala miedzy nimi (10,4 px od srodka pierwszego wiersza).

   Rozwiazanie dziala w obu przypadkach: pole dotyku 44 px bierze na siebie
   CALY WIERSZ, a nie sam odnosnik. Dzieki temu odnosnik jest zwyklym
   tekstem o przewidywalnej wysokosci wiersza, a ikone mozna wyrownac
   do srodka PIERWSZEGO wiersza jednym wyliczeniem.
   --------------------------------------------------------------------------- */
.ob-footer__dana {
	align-items: flex-start;
	min-height: 44px;
}

.ob-footer__dana a {
	min-height: 0;
	display: inline;
	align-items: initial;
}

.ob-footer__dana .ob-icon {
	margin-top: calc((1.65em - 18px) / 2);
}

/* ---------------------------------------------------------------------------
   POLA DOTYKU: DECYDUJE URZĄDZENIE, NIE SZEROKOŚĆ OKNA (16.08)
   ---------------------------------------------------------------------------
   Reguła 44 px siedziała w zapytaniu o szerokość ekranu, więc tablet
   trzymany w ręku przy 1024 px dostawał odnośniki wysokie na 20 px.
   Szerokość okna nie mówi nic o tym, czy ktoś celuje myszą, czy palcem.
   `(hover: none)` mówi to wprost.

   Odnośniki kontaktowe w stopce zostają w wierszu (inaczej ikona nie da się
   wyrównać do pierwszego wiersza), ale dostają odstęp wewnętrzny w pionie.
   Na elemencie liniowym `padding-block` NIE zmienia wysokości wiersza,
   a powiększa obszar, w który da się trafić: 21 px rośnie do 45 px.
   --------------------------------------------------------------------------- */
@media (hover: none) {
	.ob-footer__kol a,
	.ob-nav a,
	.ob-footer__prawne a {
		min-height: 44px;
		display: inline-flex;
		align-items: center;
	}

	.ob-footer__dana a {
		padding-block: .75rem;
	}
}

/* ---------------------------------------------------------------------------
   WIDGET REZERWACJI: STAN WCZYTYWANIA I AWARII (16.08)
   ---------------------------------------------------------------------------
   Ramka należy do roomadmin.pl i leży w innej domenie, więc nie da się jej
   ostylować od środka. Po naszej stronie zostaje to, co widać ZANIM widget
   się odezwie i CO SIĘ STANIE, gdy nie odezwie się wcale.

   Szkielet pulsuje delikatnie, żeby było widać, że coś się dzieje. Przy
   ograniczeniu animacji w systemie zostaje sam spokojny prostokąt.
   --------------------------------------------------------------------------- */
.ob-rezerwacja__widget.is-wczytywanie,
.ob-rez__widget.is-wczytywanie,
.ob-kalendarz__widget.is-wczytywanie {
	position: relative;
	min-height: 241px;
	border-radius: var(--radius-md);
	background: linear-gradient(100deg,
		rgba(0, 0, 0, .04) 30%, rgba(0, 0, 0, .07) 50%, rgba(0, 0, 0, .04) 70%);
	background-size: 220% 100%;
	animation: arlek-szkielet 1.4s ease-in-out infinite;
}

.ob-rezerwacja__widget.is-wczytywanie iframe,
.ob-rez__widget.is-wczytywanie iframe,
.ob-kalendarz__widget.is-wczytywanie iframe { opacity: 0; }

@keyframes arlek-szkielet { to { background-position: -120% 0; } }

@media (prefers-reduced-motion: reduce) {
	.ob-rezerwacja__widget.is-wczytywanie,
	.ob-rez__widget.is-wczytywanie,
	.ob-kalendarz__widget.is-wczytywanie { animation: none; }
}

/* Gdy dostawca nie odpowie: ramka znika, zostaje zdanie i telefon. */
.is-blad iframe { display: none; }

.arlek-rez-awaria {
	margin: 0;
	padding: var(--space-5, 1.25rem);
	border: 1px solid var(--c-border, rgba(0, 0, 0, .12));
	border-radius: var(--radius-md);
	background: var(--c-surface-alt, #f4f6f1);
	font-size: var(--fs-sm);
	line-height: 1.6;
}

.arlek-rez-awaria a {
	display: inline-block;
	margin-top: .25rem;
	font-weight: 700;
	white-space: nowrap;
}

/* ===========================================================================
   ZAMKNIĘTE MENU NIE MOŻE POWIĘKSZAĆ OBSZARU PRZEWIJANIA (16.08)
   ---------------------------------------------------------------------------
   Zgłoszenie Pawła: „na Rakowiec jadę w dół, pasek cookies robi się taki
   długi poziomy, to rozwala stronę".

   Zmierzony łańcuch przyczyn, od skutku do źródła:

   1. Pasek ciasteczek ma `left: 12px; right: 12px`, więc jego szerokość
      wynika z LAYOUTOWEGO okna. Rozciągał się do 756 px przy ekranie 390.
   2. Layoutowe okno miało 780 px, bo `document.scrollWidth` wynosił 780.
   3. Za 780 odpowiadał ZAMKNIĘTY panel menu: jest `position: fixed`,
      ma pełną szerokość ekranu i stoi odsunięty `translateX(100%)`,
      czyli jego prawa krawędź wypada na 780.
   4. `visibility: hidden` tego NIE ZAŁATWIA. Element ukryty tą własnością
      nadal zajmuje miejsce i nadal powiększa obszar przewijania.

   Borucza miała ten sam błąd, tylko niewidoczny: `overflow-x: clip` na
   `body` przycinał skutek. Rakówiec tej reguły nie miał, więc było widać.

   Rozwiązanie na OBU: przycięcie na `html`, czyli na tym elemencie, wobec
   którego zaczepia się `position: fixed`. Przycięcie na `body` nie jest
   właściwym miejscem, bo panel nie jest jego potomkiem w sensie układu.

   `clip`, nie `hidden`: `clip` nie tworzy kontenera przewijania, więc
   przyklejony nagłówek i płynne przewijanie do kotwic działają dalej.
   Sprawdzone po zmianie: 18/18 w teście menu i przejścia z menu do sekcji.
   =========================================================================== */
html { overflow-x: clip; }
