/* =============================================================================
   RAMA · JEDYNE ŹRÓDŁO PRAWDY  (2026-08-27)
   -----------------------------------------------------------------------------
   Ten plik opisuje ramę całej witryny: kolory, ramkę na obrzeżach, belkę z logo
   i pasek stanu (godzina + język). Wcześniej te same reguły stały w ~20 plikach
   HTML w WEBSITE/ i drugi raz w WORKS/public/style_v2.css — dlatego strona główna
   i works miały inny odcień tła i inne proporcje ramki.

   OD TERAZ: zmiana tutaj = zmiana wszędzie. Plik jest linkowany JAKO OSTATNI
   w <head>, więc wygrywa kaskadą z lokalnymi stylami stron; duplikaty w HTML-ach
   zostają jako martwy kod i można je sprzątać stopniowo, bez ryzyka.

   Do WORKS/ plik trafia kopią — `WEBSITE/sync-rama.command`. Nie edytuj kopii
   w WORKS/public/css/rama.css, zostanie nadpisana.

   -----------------------------------------------------------------------------
   ZASADA SKALOWANIA (polecenie Jarka 2026-08-27):
   MNIEJSZY EKRAN → MNIEJSZA RAMKA I MNIEJSZE ODLEGŁOŚCI OD KRAWĘDZI,
   PRZY CZYM LOGO MA MIEĆ ODDECH.

   Realizacja: każdy odstęp to jedno `clamp(podłoga, prosta funkcja vw, sufit)`.
   Bez media query, bez progów, bez JS — czyli bez skoków. Zwężanie okna zmienia
   ramę płynnie, piksel po pikselu.

   Dwa punkty zaczepienia, między nimi linia prosta:
     · 3840 px (UHD)  — wartości jak dotąd, bo UHD jest wzorcem (nie ruszamy);
     · ~900 px (iPad) — wartości takie, jak dziś wygląda strona główna na iPadzie.

   LOGO celowo maleje WOLNIEJ niż odstępy (60 → ~46 px na całej drodze, gdy ramka
   robi się dwa razy mniejsza). To jest ten „oddech": im ciaśniej robi się dokoła,
   tym większą część belki zajmuje monogram.

   ODSTĘPY PIONOWE MAJĄ DODATKOWO SUFIT LICZONY Z WYSOKOŚCI OKNA (`min(..., Nvh)`).
   Powód z sierpnia: na laptopie 1512×945 belka i pasek zabierały tyle samo pikseli
   co na 4K, czyli dwa razy większą część ekranu, i na treść galerii zostawało za
   mało. Sufit działa tylko na niskich oknach; na iPadzie w pionie (1112 px) nie
   dotyka niczego.

   ŚWIADOMIE NIE UŻYWAMY `zoom` — przy skalowaniu niecałkowitym hairline'y (1 px)
   wychodzą raz grube, raz szare. Tutaj zmieniają się wyłącznie odstępy.
   ========================================================================== */

/* ── POKRĘTŁA ────────────────────────────────────────────────────────────────
   Chcesz grubszą ramkę? Zmień sufit w `--frame`. Wyższą belkę? Sufit w `--hdr-pv`.
   Pierwsza liczba to podłoga (najwęższy ekran), ostatnia — sufit (UHD).        */
:root{
  /* PALETA — kanoniczna dla całej witryny. works/ miał tu własne, lekko inne
     odcienie i to było widać jako „inny kolor strony" przy porównaniu obu. */
  --cream:      #F5F1E5;
  --cream-2:    #EBE5D6;
  --ink:        #1C1C1A;
  --mid:        #6a6a5f;
  --accent:     #4c4c44;
  --line:       rgba(24,24,22,.5);
  --line-soft:  rgba(24,24,22,.16);

  /* RAMKA na obrzeżach strony: 30 px na UHD → ~16 px na iPadzie → znika na telefonie */
  --frame:      clamp(12px, calc(0.476vw + 11.7px), 30px);

  /* BELKA Z LOGO — odstęp nad i pod logo */
  --hdr-pv:     clamp(11px, min(calc(0.31vw + 10px), 2.05vh), 22px);

  /* PASEK STANU (godzina · język) — odstęp nad i pod tekstem */
  --stat-pv:    clamp(9px,  min(calc(0.22vw + 6.5px), 1.4vh), 15px);

  /* ODSTĘP OD LEWEJ I PRAWEJ KRAWĘDZI w belce i pasku stanu */
  --edge-h:     clamp(18px, calc(0.8vw + 11px), 42px);

  /* LOGO — maleje wolniej niż odstępy (patrz „oddech" wyżej) */
  --logo-h:     clamp(42px, calc(0.42vw + 44px), 60px);
}

/* ── RAMKA ─────────────────────────────────────────────────────────────────── */
.shell{
  position:fixed; inset:var(--frame);
  border:1px solid var(--line);
  background:var(--cream);
  overflow:hidden; z-index:10;
}
.scroll{ position:absolute; inset:0; overflow-y:auto; overflow-x:hidden; }

/* ── BELKA Z LOGO ──────────────────────────────────────────────────────────── */
.site-header{
  background:var(--cream);
  border-bottom:1px solid var(--line);
  padding:var(--hdr-pv) var(--edge-h);
}
/* Dwie nazwy tej samej rzeczy: WEBSITE używa `.s-logo img`, works `.logo-img`.
   Ujednolicone tutaj, żeby logo miało jedną wysokość na całej witrynie. */
.s-logo img,
.logo-img{ height:var(--logo-h); width:auto; display:block; }

/* ── PASEK STANU (godzina · język) ─────────────────────────────────────────── */
.status,
.site-footer{
  background:var(--cream);
  border-top:1px solid var(--line);
  padding:var(--stat-pv) var(--edge-h);
}
/* =============================================================================
   TELEFON — WARUNEK, NIE SAMA SZEROKOŚĆ   (2026-08-27, po zgłoszeniu Jarka)
   -----------------------------------------------------------------------------
   Do dziś stało tu samo `max-width:600px`. iPHONE POŁOŻONY NA BOK MA 844–932 px
   SZEROKOŚCI, więc w poziomie NIE ŁAPAŁ SIĘ w ten blok i dostawał układ dużego
   ekranu: ramkę przyklejoną do okna, przewijanie w `.scroll` (czyli Safari nigdy
   nie zwijał paska adresu) i zero marginesów bezpiecznych.

   Drugi warunek pyta więc nie o szerokość, tylko o to, CZYM się w to klika: palec
   (`hover:none` + `pointer:coarse`) na ekranie niższym niż 560 px to telefon
   położony na bok. iPad zostaje przy układzie z ramką — tam jest na nią miejsce.

   -----------------------------------------------------------------------------
   ZASADA NADRZĘDNA (Jarek, 2026-08-27, druga tura):
   NA TELEFONIE STRONA MA BYĆ PEŁNOEKRANOWA. Cokolwiek stoi nieruchomo na wierzchu,
   psuje ten efekt — bo dopóki coś jest przyklejone, treść nie wjeżdża pod pasek
   adresu ani pod wyspę i Safari nie ma czego zwinąć.

   Zostaje więc DOKŁADNIE JEDEN element przyklejony: PRZYCISK MENU. Reszta jedzie
   razem z treścią:
     · belka z logo — `position:static`, odjeżdża w górę, treść wchodzi pod wyspę;
     · pasek stanu (godzina + PL/EN) — ZDJĘTY. Kontakt i przełącznik języka
       przeniesione do menu jako przyciski (`js/menu.js`, `.m-akcje` / `.m-lang`).

   I NADAL OBOWIĄZUJE, nie ruszać:
   1. RAMKA ZNIKA (`--frame:0`).
   2. SCROLLUJE SIĘ DOKUMENT, nie `.scroll` w `position:fixed` `.shell` — iOS Safari
      zwija pasek adresu WYŁĄCZNIE wtedy, gdy rusza się scroller dokumentu.
   3. `100dvh` zamiast `100vh`.
   4. `env(safe-area-inset-*)` — TŁO wchodzi pod wyspę i pod pasek adresu (celowo),
      ale tekst i klikalne rzeczy trzymają się od nich z daleka.
   ========================================================================== */
/* ── SAFARI NA IPHONIE SAM POWIEKSZAL TEKST W POZIOMIE ───────────────────────
   2026-08-29, zgloszenie Jarka: „w poziomie drukowane litery sa duzo za duze,
   w pionie jest ladnie". Piate podejscie — tym razem do PRZYCZYNY, nie do objawu.

   Cztery poprzednie proby kreciy rozmiarami w CSS i nie mogly pomoc, bo CSS byl
   poprawny. iOS Safari ma wlasny mechanizm — Text Autosizing: po polozeniu telefonu
   na bok MNOZY rozmiary fontow w blokach tekstu przez wspolczynnik liczony z szerokosci
   bloku wzgledem okna. Mnoznik jest ROZNY dla roznych blokow i tym wiekszy, im mniejszy
   font — dlatego wersaliki 9,5 px puchly mocniej niz opis 14,5 px obok i wychodzily
   prawie rowne. W pionie mechanizm sie nie wlacza; stad „w pionie jest ladnie".

   `text-size-adjust:100%` znaczy „nie poprawiaj mnie, pokaz dokladnie tyle, ile
   napisalem". NIE blokuje powiekszania dwoma palcami — to robi `none`, ktorego
   swiadomie nie uzywamy. Stoi tutaj, wiec obowiazuje na wszystkich ~30 stronach
   witryny naraz i zadna nowa strona nie zacznie od starego bledu.

   SKUTEK UBOCZNY DO ZAPAMIETANIA: wszystkie recznie zanizone rozmiary „na poziom"
   robily sie do tej pory wieksze niz w arkuszu. Po tej zmianie widac je tak, jak
   napisane — dlatego przy okazji wracaja do wartosci z pionu (patrz `.scope`
   w index.html).
   ────────────────────────────────────────────────────────────────────────── */
html{ -webkit-text-size-adjust:100%; text-size-adjust:100% }

@media (max-width:600px),
       (hover:none) and (pointer:coarse) and (max-height:560px){
  :root{ --frame:0px }

  html,body{ overflow:visible; height:auto; }
  body{ min-height:100dvh; overscroll-behavior-y:none; background:var(--cream); }

  /* POZIOMY OBSZAR PRZEWIJANIA PRZYCINA `html` (patrz „MENU STAŁO OBOK STRONY" niżej).
     `clip` byłoby czystsze, ale gdy druga oś jest `visible`, ta wartość zaraża i ją —
     i dokument przestaje się przewijać W OGÓLE (sprawdzone w works). `hidden` w tym
     samym miejscu zamienia drugą oś na `auto`, czyli dokładnie na to, czego chcemy:
     html zostaje głównym elementem przewijanym, a to jego ruch Safari wiąże
     z paskiem adresu. */
  html{ overflow-x:hidden; }

  /* `position:relative` + `overflow-x:clip` — TO NIE KOSMETYKA, TO NAPRAWA
     ROZDMUCHANEGO VIEWPORTU (2026-08-29, zgloszenie Jarka z works: „menu jest
     jakby kolumna 50% strony", „opis i szukajka wchodza pod wyspe", „w poziomie
     menu na cala strone").

     Szuflada czeka poza ekranem jako `translateX(103%)`. Odkad `.shell` nie jest
     zamknietym oknem, te 103% wchodzi do POZIOMEGO OBSZARU PRZEWIJANIA — a Safari
     na to nie odpowiada paskiem przewijania, tylko POSZERZA VIEWPORT UKLADU
     i pokazuje cala strone pomniejszona. Zmierzone w Chromium z emulacja iPhone'a
     (works): okno 393 px -> uklad 798 px, okno 852 px -> uklad 1256 px. Wszystko
     jedzie wtedy nie tam, gdzie powinno: karta zdjecia wychodzi poza ekran,
     `env(safe-area-inset-*)` opisuje inny obszar niz widac, a szuflada stoi obok
     strony jak druga kolumna.

     `html{overflow-x:hidden}` (wyzej) tego NIE lapie i nie zlapie: szuflada jest
     `position:absolute`, a przy `.shell` w `position:static` jej blokiem
     zawierajacym jest ICB — czyli `.shell` nie jest w ogole na jej drodze i nie ma
     czego przycinac. Dopiero `position:relative` wstawia `.shell` w ten lancuch.
     `clip`, nie `hidden`: `hidden` zrobiloby z `.shell` kontener przewijania.
     Sprawdzone po zmianie: uklad = okno, 393/852 px, w obu orientacjach. */
  .shell{ position:relative; inset:auto; margin:0; border:0;
          overflow-x:clip; overflow-y:visible;
          min-height:100dvh;
          /* PEŁNA SZEROKOŚĆ — bez bocznego paddingu. Zdjęcia i film mają iść od
             krawędzi do krawędzi; od wyspy odsuwają się POJEDYNCZE ELEMENTY
             (belka, przycisk menu, `--hpad` treści), a nie całe pudełko.
             Wcześniej robił to `js/menu.js` na `.shell` i strona wyglądała
             na uciętą z obu stron (zgłoszenie Jarka). */
          padding-left:0; padding-right:0;
          padding-bottom:env(safe-area-inset-bottom); }
  .scroll{ position:static; inset:auto; overflow:visible; height:auto; }

  /* ── LIGHTBOX GALERII JEDZIE Z DOKUMENTEM (2026-08-29) ─────────────────────
     Ten sam wzorzec, co nakładki w works — i z tego samego powodu. Sprawdzone
     na iPhonie: nakładka `position:fixed` na cały ekran sprawia, że Safari
     ROZWIJA dolny pasek (zasada „cokolwiek stoi nieruchomo na wierzchu, psuje
     pełny ekran"), a nakładka odklejona, ale wielkości widocznego pola, nie
     wchodzi pod wyspę ani pod pasek. Rozwiązanie: odklejona i CELOWO WIĘKSZA
     niż ekran — margines wchodzi pod wyspę i pod pasek, i daje zapas na piksel
     przewinięcia. Wysokość i padding (= margines) ustawia `js/lgrid.js`.

     Reguła siedzi TUTAJ, a nie w plikach galerii, bo `.lb{position:fixed;inset:0}`
     jest wklejone w <style> KAŻDEJ z ~14 stron galerii z osobna. `rama.css` jest
     linkowany jako ostatni w <head>, więc przy równej wadze (0,1,0) wygrywa.
     `.lb` jest przenoszony przez `lgrid.js` pod <body>, czyli `absolute` liczy się
     od początku dokumentu — dokładnie tak, jak potrzeba. */
  .lb{ position:absolute; inset:auto; left:0; right:0; top:0 }
  /* Krzyzyk i licznik sa `position:absolute` wzgledem PUDELKA nakladki, a ono zaczyna sie
     `--mn` nad ekranem — bez tego wyladowalyby poza nim. `--mn` ustawia `js/lgrid.js`.
     Strzalki (`top:50%`) sa OK same z siebie: pudelko jest symetryczne.

     SELEKTOR DWUCZLONOWY, tak jak przy ramie: `.lb-close{top:22px}` siedzi w <style>
     KAZDEJ strony galerii, a ten <style> stoi PO linkach do arkuszy. Przy rownej wadze
     (0,1,0) wygralby tamten — `.lb .lb-close` (0,2,0) rozstrzyga to niezaleznie od kolejnosci.
     Zmierzone przed poprawka: krzyzyk na y=-138 px, licznik na y=981 px przy ekranie 852. */
  .lb .lb-close{ top: calc(22px + var(--mn, 0px) + env(safe-area-inset-top)) }
  .lb .lb-count{ bottom: calc(22px + var(--mn, 0px) + env(safe-area-inset-bottom)) }

  /* ── BELKA Z LOGO PRZEWIJA SIĘ RAZEM Z TREŚCIĄ ─────────────────────────────
     Była `position:sticky`. Wyglądała dobrze, ale trzymała ekran w niepełnym
     trybie i treść nigdy nie wchodziła pod wyspę. Dwuczłonowo, bo `js/menu.js`
     stoi po tym pliku. */
  .shell .site-header{
    position:static; z-index:auto;
    padding-left:max(var(--edge-h), env(safe-area-inset-left));
    padding-right:max(var(--edge-h), env(safe-area-inset-right));
    padding-top:calc(var(--hdr-pv) + env(safe-area-inset-top));
  }

  /* ── PRZYCISK MENU — JEDYNA RZECZ, KTÓRA ZOSTAJE NA WIERZCHU ───────────────
     Decyzja Jarka: „menu powinno być cały czas na stronie". Wyjęty z belki
     i przyklejony do okna, więc jego pozycja nie zmienia się ani przy
     przewijaniu, ani po obrocie telefonu.
     BLOB DOSTAJE WYPEŁNIENIE. Przycisk to dwie ciemne kreski na przezroczystym
     tle — nad ciemnym zdjęciem znikał. Zamiast dokładać obcy kształt (kółko,
     kwadrat) wypełniamy kremem TEN SAM blob, który jest już znakiem witryny.

     BEZ CIENIA. Był tu `filter:drop-shadow()` i wychodził ŚCIĘTY od góry
     (zgłoszenie Jarka): filtr CSS nałożony na sam element <svg> liczy się
     w obszarze filtra SVG, a ten domyślnie sięga tylko -10%/+120% pudełka —
     rozmyty cień po prostu nie mieści się w tym obszarze i zostaje przycięty.
     Da się to obejść (filtr na <button>, albo <filter x/y/width/height> w SVG),
     ale krem plus hairline dają wystarczający kontrast i bez tego. */
  .shell .menu-btn{
    position:fixed; z-index:27;
    top:calc(env(safe-area-inset-top) + 6px);
    right:calc(env(safe-area-inset-right) + 10px);
  }
  .shell .menu-btn svg path{ fill:rgba(245,241,229,.92) }

  /* ── PASEK STANU ZDJĘTY ────────────────────────────────────────────────────
     Godzina na telefonie nikomu nie służyła, a Kontakt i PL/EN siedzą teraz
     w menu jako przyciski. Element ZOSTAJE w DOM (nie `display:none` na `.lang`),
     bo przełącznik w menu wywołuje właśnie jego `click()` — cała obsługa języka
     w `index.html` wisi na `.lang` i nie ma potrzeby jej ruszać. */
  .status{ display:none }

  /* works nie ma paska stanu — tam tę rolę pełni stopka na końcu strony. */
  .site-footer{
    position:static; left:auto; right:auto; bottom:auto;
    padding-left:max(var(--edge-h), env(safe-area-inset-left));
    padding-right:max(var(--edge-h), env(safe-area-inset-right));
    padding-bottom:calc(var(--stat-pv) + env(safe-area-inset-bottom));
  }

  .side{ display:none }                     /* pionowe napisy przy krawędziach */

  /* ── MENU STAŁO OBOK STRONY JAK DRUGA KOLUMNA ───────────────────────────────
     Szuflada czeka poza ekranem jako `transform:translateX(103%)`. Dopóki `.shell`
     była `position:fixed` z `overflow:hidden`, nikt tego nie widział. Odkąd `.shell`
     jest w zwykłym przepływie, a szuflada dalej `position:absolute`, te 103% weszło
     do POZIOMEGO obszaru przewijania dokumentu: przeciągnięcie palcem w bok
     odsłaniało menu jak drugą kolumnę obok treści.

     SELEKTORY SĄ DWUCZŁONOWE CELOWO. `js/menu.js` wstrzykuje swój <style> na koniec
     <head> w czasie działania, czyli PO tym pliku — przy równej wadze wygrałby
     późniejszy i `.menu-drawer{position:absolute}` stamtąd biłoby `fixed` stąd.
     `.shell .menu-drawer` (0,2,0) rozstrzyga to niezależnie od kolejności arkuszy.
     Media query wagi nie dodaje. */
  /* ── SZUFLADA NIE JEST JUŻ PRZYKLEJONA (2026-08-28) ────────────────────────
     Zgłoszenie Jarka: „samo menu nie wchodzi na full screen — jak je odpalam,
     pojawiają się paski w kolorze menu na górze i dole, a po zamknięciu zostają".
     To paski Safari: przy zwiniętych paskach ich kolor jest brany z tła strony,
     więc przy otwartym menu robią się kremowe jak szuflada. Wraca ta sama zasada,
     która jest wypisana wyżej w tym pliku: COKOLWIEK STOI NIERUCHOMO NA WIERZCHU,
     PSUJE PEŁNY EKRAN — a szuflada `position:fixed` zakrywająca cały ekran to
     największa taka rzecz na witrynie.
     Teraz szuflada jedzie Z DOKUMENTEM: `position:absolute`, a `js/menu.js`
     przy otwarciu ustawia jej `top` na aktualny `scrollY` (i zeruje po zamknięciu,
     żeby nie dokładała pustej przestrzeni na końcu strony).
     ZASŁONA NA TELEFONIE ZDJĘTA — szuflada ma tam 100% szerokości, więc zasłony
     i tak nie było widać, a była drugim elementem `position:fixed` na wierzchu.
     Zamyka się krzyżykiem, tak jak dotąd. */
  .shell .menu-veil{ display:none }
  .shell .menu-drawer{
    position:absolute; top:0; right:0; bottom:auto; left:auto;
    width:100%; height:100dvh; max-width:100vw;
    /* KOLOR WYCHODZI POZA PUDELKO (2026-08-28, zgloszenie Jarka: „menu ma przeswit na
       gorze i na dole" — widac go takze w karcie prywatnej, wiec to nie cache).
       Paski Safari sa PRZEZROCZYSTE: przy zwinietych paskach `visualViewport` opisuje
       pole MIEDZY nimi, wiec szuflada dokladnie tej wysokosci zostawia nad soba i pod
       soba wasy, przez ktore prosto widac strone. Zamiast zgadywac, o ile ma byc wyzsza,
       wypuszczamy sam KOLOR 300 px w gore i w dol: `box-shadow` bez rozmycia to kopia
       pudelka, nie wplywa na uklad ani na padding tresci. */
    box-shadow:0 -300px 0 var(--cream-2), 0 300px 0 var(--cream-2);
    padding-top:calc(64px + env(safe-area-inset-top));
    padding-bottom:calc(18px + env(safe-area-inset-bottom));
  }
  /* X leżał w całości w pasku stanu iOS — szuflada sięga krawędzi ekranu przez
     `viewport-fit=cover`, a tam dotknięcie należy do systemu, nie do strony. */
  .menu-drawer .menu-close{
    top:calc(8px + env(safe-area-inset-top));
    width:52px; height:52px;
  }
}

/* ── TELEFON W POZIOMIE ──────────────────────────────────────────────────────
   390 px wysokości to cały ekran. Nic nie stoi nieruchomo poza przyciskiem menu,
   więc Safari samo wchodzi w pełny ekran. Warunek `pointer:coarse` zamiast
   `orientation:landscape`, żeby nie łapać iPada.
   Selektory dwuczłonowe — `js/menu.js` ma tu swój komplet reguł i stoi PO tym pliku. */
@media (hover:none) and (pointer:coarse) and (max-height:560px){
  :root{ --frame:0px }
  .side{ display:none }

  /* menu.js daje tu `padding:4px 0` (skrótem, czyli ZERO z boków) i logo 32 px.
     Logo za małe (zgłoszenie: „bardzo mała identyfikacja"), a boki muszą omijać
     wyspę — belka jest jedynym miejscem, gdzie to ma znaczenie, bo zdjęcia idą
     teraz przez całą szerokość. */
  .shell .site-header{
    padding-top:9px; padding-bottom:8px;
    padding-left:max(14px, env(safe-area-inset-left));
    padding-right:max(14px, env(safe-area-inset-right));
  }
  /* 38 -> 44 px (2026-08-29, Jarek o works w poziomie: „logo za male"). Ta sama
     reguła obowiazuje strone glowna i galerie — identyfikacja ma byc jednakowa. */
  .shell .s-logo img,
  .shell .logo-img{ height:44px }

  /* ── MENU W POZIOMIE: SZUFLADA, NIE CAŁY EKRAN ─────────────────────────────
     2026-08-29, zgłoszenie Jarka: „w poziomie menu jest zupełnie bezużyteczne —
     rozwija się na całą stronę i wyspa zasłania dużo rzeczy".

     Skąd 100%: `js/menu.js` daje szufladzie `width:min(46%,720px)`, a zwęża ją do
     pełnej szerokości dopiero w `@media(max-width:760px)` — czyli w PIONIE, gdzie to
     ma sens. Ale blok telefonowy wyżej w tym pliku wpisuje `width:100%` BEZ warunku
     na szerokość, więc łapie też telefon położony na bok, gdzie miejsca jest 852 px.
     Efekt: menu na cały ekran, z wyspą wchodzącą wprost w pozycje.

     Wracamy więc do proporcji z dużego ekranu, tylko liczonej z okna telefonu.
     `max-width:none` kasuje `100vw` z bloku telefonowego. Prawy padding i krzyżyk
     omijają wyspę — telefon można obrócić w obie strony, a `env()` wie, po której
     stronie ona akurat jest (na tej drugiej zwraca zero i zostaje zwykły odstęp).

     ZASŁONA ZOSTAJE SCHOWANA, tak jak w pionie — czyli menu zamyka się KRZYŻYKIEM,
     nie tapnięciem obok. Powód jest w komentarzu przy `.menu-veil` wyżej: po odklejeniu
     `.shell` zasłona przestała opisywać ekran i zaczęła opisywać cały dokument.
     Da się to zrobić inaczej, ale to osobna zmiana, nie dopisek przy szerokości. */
  .shell .menu-drawer{
    width:min(46vw,420px); max-width:none;
    padding-left:clamp(24px,3.2vw,44px);
    padding-right:max(clamp(24px,3.2vw,44px), calc(env(safe-area-inset-right) + 18px));
  }
  .menu-drawer .menu-close{ right:max(10px, calc(env(safe-area-inset-right) + 4px)) }

  /* ── NAGŁÓWEK GALERII W POZIOMIE ────────────────────────────────────────────
     Zgłoszenie Jarka 2026-08-28: „w opisach galerii na iPhonie w poziomie drukowane
     litery są dużo za duże, dużo większe niż opis".

     Skąd się to brało: strony galerii mają własną typografię w swoim <style>, a jej
     jedyne zejście na telefon to `@media(max-width:760px)`. iPhone POŁOŻONY NA BOK
     ma 852–932 px szerokości, więc ten warunek go NIE łapie i tytuł dostawał wersję
     desktopową: `clamp(40px, var(--vwu)*4.2, 92px)`, a przy `--vwu:min(1vw,19.2px)`
     wychodziło z tego twarde 40 px — obok opisu 15 px, na ekranie wysokim na 393 px.
     To ten sam błąd, co opisany wyżej przy ramie: `max-width` nie jest testem na telefon.

     Reguły siedzą TUTAJ, a nie w plikach galerii, bo tamtych jest ~14 i każdy nowy
     zaczynałby od starej wersji. `rama.css` jest linkowany jako ostatni w <head>, więc
     przy równej wadze (`.g-frame h1` = 0,1,1) wygrywa z kopią w <style> strony. */
  /* ODDECH POD HAIRLINE'EM (2026-08-29, polecenie Jarka: „odległość taka jak między
     linkiem home a początkiem galerii — musi tam być oddech").
     Stało tu sztywne 14 px, z czasów liczenia każdego piksela na niskim ekranie.
     Zamiast wpisywać nową liczbę na oko, bierzemy DOKŁADNIE TĘ SAMĄ formułę, którą ma
     górny margines siatki (`.lgrid{margin:clamp(48px,6vh,90px) …}` w `css/lgrid.css`) —
     czyli przerwę pod linkiem „Strona główna". Oba odstępy są wtedy równe z definicji,
     także po zmianie wysokości okna, i zostaną równe, gdy ktoś kiedyś ruszy tamtą wartość.
     Na iPhonie w poziomie wychodzi z tego 48 px (6vh z 393 px to tylko 24, więc rządzi
     podłoga clamp-a). JEŚLI ZMIENIASZ — zmieniaj w obu miejscach albo w żadnym. */
  .g-head{ margin-top:clamp(48px,6vh,90px) }
  /* NAZWA I OPIS GALERII WCHODZILY POD WYSPE (2026-08-29, zgloszenie Jarka: „nazwa i opis
     prawie dotykaja wyspy, chociaz po prawej jest pelno wolnego miejsca").
     `.g-frame` ma w kazdej galerii `margin:0 var(--hpad)`, a `--hpad` to zwykla liczba —
     nic w niej nie wie o wyspie. W POZIOMIE wyspa jest przy KROTSZEJ krawedzi, czyli
     dokladnie tam, gdzie zaczyna sie tekst. `env(safe-area-inset-*)` to jedyne zrodlo,
     ktore zna jej realna szerokosc (i to, z ktorej strony akurat jest, bo telefon mozna
     obrocic w obie strony) — dlatego `max()` po obu bokach naraz.
     Reguly nie widzi NIC poza iPhonem polozonym na bok: caly ten blok ma warunek
     `pointer:coarse` + `max-height:560px`, a `env()` na ekranie bez wyspy to zero,
     czyli zostaje dotychczasowy `--hpad`.

     POPRAWKA POPRAWKI (ten sam dzien, zgloszenie Jarka: „nie widze zmiany"). Pierwsza
     wersja brala `max(--hpad, env(...))` i przesuwala tekst o CALE 8 px, bo `--hpad`
     w galerii to `max(--ci, ...)`, a `--ci` = `clamp(46px, --vwu*6, 130px)` — na iPhonie
     w poziomie wychodzi z tego ~51 px, przy wyspie szerokiej ~59 px. Czyli tekst
     przestawal wchodzic POD wyspe, ale zaczynal sie dokladnie przy jej krawedzi:
     „prawie dotyka" zostawalo prawie dotykiem. Teraz do bezpiecznego pola dokladamy
     jeszcze 24 px oddechu — to jest ta liczba do krecenia, jesli bedzie za duzo albo
     za malo. Na ekranie bez wyspy `env()` to zero, wiec `max()` zostawia dawny `--hpad`. */
  .g-frame{ margin-left:max(var(--hpad,20px), calc(env(safe-area-inset-left) + 24px));
            margin-right:max(var(--hpad,20px), calc(env(safe-area-inset-right) + 24px)) }
  .g-frame h1{ font-size:clamp(28px,3.3vw,34px); line-height:1.08; margin-top:10px }
  .g-frame .desc{ font-size:14px; line-height:1.65; max-width:62ch;
                  margin-top:10px; padding-bottom:12px }
  .g-kicker{ font-size:10px; letter-spacing:.1em; line-height:1.5 }
  .g-frame .backlink,
  .g-head .backlink{ font-size:11px; letter-spacing:.18em; margin-top:10px }
}

/* ── TABLET (iPad) — PRÓBA COFNIĘTA (2026-08-29) ─────────────────────────────
   Był tu blok, który na iPadzie oddawał przewijanie dokumentowi (żeby Safari zwijało
   pasek adresu i zakładek), zachowując ramkę: `body{padding:var(--frame)}`, statyczna
   `.shell` z obwódką, belka i pasek stanu na `position:sticky`, a `.side`, szuflada
   i zasłona wracały na `fixed`.

   WERDYKT JARKA PO OBEJRZENIU NA SPRZĘCIE: „masakra" — godzina i przełącznik PL/EN
   przeskoczyły na górę (`position:sticky; bottom:0` na `.status` nie odtwarza paska
   przyklejonego do dołu okna, gdy pudełko ma wysokość całej strony), a samo rozpychanie
   strony pod paski Safari wyglądało źle. Blok skasowany w całości; iPad wraca do układu
   desktopowego z `.shell` w `position:fixed`.

   CZEGO SIĘ PRZY OKAZJI DOWIEDZIELIŚMY (żeby nie zaczynać od zera, gdyby temat wrócił):
     · Szuflada menu czeka poza ekranem jako `translateX(103%)`. Gdy `.shell` przestaje
       być zamkniętym oknem, wystaje w prawo — a Safari POSZERZA WTEDY VIEWPORT UKŁADU
       i pokazuje całą stronę pomniejszoną (zmierzone: okno 834 px, układ 1197 px).
       Lekarstwo: `overflow-x:clip` na `.shell` (`hidden` robi z niej kontener przewijania
       i zabija `sticky`).
     · Wszystko, co jest w `.shell` `position:absolute` (`.side`, szuflada, zasłona),
       przestaje trafiać w ekran, bo `.shell` ma wtedy wysokość całego dokumentu —
       pionowe napisy lądowały ~4800 px w dół.
     · Pasek stanu (`.status`) to element, który przy takiej zmianie wymaga osobnego
       pomysłu, a nie `position:sticky`.
   ────────────────────────────────────────────────────────────────────────── */

/* ══ NAGŁÓWEK GALERII: RAMKA COFNIĘTA (2026-08-31) ═════════════════════════════════
   29.08 wrócił tu blok `@media (min-width:761px) and (min-height:561px)`, który na
   dużym ekranie odtwarzał starą ramkę nagłówka galerii (obwódka `.g-frame`, pionowa
   kreska `::before`, numer wyjęty na margines, kreska pod tytułem).

   WERDYKT JARKA PO OBEJRZENIU NA SPRZĘCIE: na iPadzie wygląda źle. Warunek łapał
   iPada (1024×768 w poziomie, 834×1112 w pionie) tak samo jak monitor, a ramka
   zaprojektowana pod 4K jest na tej szerokości za ciasna.

   Blok skasowany w całości — nagłówek galerii wraca do wersji spłaszczonej z 20.08
   (same poziome linie), która siedzi w <style> każdej ze stron galerii i teraz znowu
   obowiązuje na WSZYSTKICH szerokościach.

   JEŚLI TEMAT WRÓCI: sama ramka jest do odzyskania z
   `BACKUP/rama_przed-cofnieciem-ramki-naglowka_20260831.css` (ostatni blok pliku),
   ale nie wracać z warunkiem opartym na `min-width` — trzeba wyciąć iPada, np.
   `@media (min-width:1280px) and (hover:hover)`, i sprawdzić NA SPRZĘCIE, nie w emulacji.
   ────────────────────────────────────────────────────────────────────────── */
