/* ═══════════════════════════════════════════════════════════════════
   AUDYT 12 MOTYWÓW (14.10.2026) — poprawki zaakceptowane przez Dawida
   Plik ładowany jako ostatni w zaproszenie.html, więc nadpisuje motywy
   bez grzebania w ich arkuszach. Każda sekcja ma numer z listy audytu
   (claude/AUDYT-12-MOTYWOW.md) — łatwo znaleźć i w razie czego cofnąć.
   ═══════════════════════════════════════════════════════════════════ */

/* ── A1. Ekran startowy na laptopie ────────────────────────────────
   W motywach, w których plansza odsłony ma wymiar płótna (760 × 1267)
   i leży 1:1 na ekranie 2 — dzięki temu przejście jest bezszwowe —
   na laptopie (okno ~780 px) dół planszy wychodził poza ekran, a razem
   z nim napis „Dotknij, aby otworzyć" (7, 11, 12). Napis trzymamy więc
   w oknie: stoi tam, gdzie w projekcie, ALBO 72 px nad dołem okna —
   co wyżej. Planszy nie zmniejszamy, bo wtedy w chwili zamiany na
   ekran 2 obraz by „skakał" (odrzucony wariant z rosnącą planszą). */
body[data-theme="olive-green"] .plate-cta {
  top: min(calc(min(100vw, var(--rg-w, 760px)) * 5 / 3 * 0.772), calc(100svh - 72px));
}
body[data-theme="terracotta-arch"] .plate-cta {
  top: min(calc(var(--t-h) * 0.70), calc(100svh - 84px));
}
body[data-theme="deco-emerald"] .plate-cta {
  top: min(calc(var(--t-h) * 0.88), calc(100svh - 84px));
}

/* ── A2. Granatowy Aksamit: 4. punkt harmonogramu pod płytkami ─────
   Płytki miały najsilniejszą paralaksę (--rg-depth 1.9–3.7), więc przy
   przewijaniu podjeżdżały do 150 px w górę i zakrywały ostatni punkt.
   Do tego ich wysokość była procentem SEKCJI — przy 5–6 punktach sekcja
   rośnie, a płytki puchły razem z nią. Teraz: bez paralaksy, przyklejone
   do dołu sekcji, wysokość z własnej proporcji (liczona od szerokości),
   a sekcja rezerwuje pod listą miejsce na płytki + oddech. */
body[data-theme="navy-velvet"] .rg-schedule .rg-bg img[src*="plytka"] {
  transform: none !important;
  top: auto !important;
  bottom: 0;
  height: auto !important;
}
body[data-theme="navy-velvet"] .rg-schedule {
  padding-bottom: calc(var(--rg-w) * 0.36);
}

/* ── A3. Czerń i Biel (mono-ink) ───────────────────────────────────
   Ekran 2: imię wchodziło na zdanie pod spodem (kaligrafia ma długie
   zejścia), etykiety licznika na datę z miejscem, a długie imię
   („Maksymiliana") wychodziło poza kartkę. Stopnie liczone wprost
   z szerokości płótna (bez podłóg clamp, które na 320 px psuły
   proporcje), imiona dopasowują się do szerokości pola (--rg-fit-w). */
body[data-theme="mono-ink"] .rg-date .rg-names {
  --rg-fit-w: 1;
  top: 22.4%;
  font-size: calc(var(--rg-w, 760px) * 0.1 * var(--rg-kw, 1));
  white-space: nowrap;
  overflow-wrap: normal;
}
body[data-theme="mono-ink"] .rg-date .rg-sub { top: 39%; }
body[data-theme="mono-ink"] .rg-date .rg-count { top: 84.3%; }
body[data-theme="mono-ink"] .rg-date .rg-count .num {
  font-size: max(14px, calc(var(--rg-w, 760px) * 0.0378));
  line-height: 1.05;
}
body[data-theme="mono-ink"] .rg-date .rg-count .lbl {
  font-size: max(10.5px, calc(var(--rg-w, 760px) * 0.0289));
  line-height: 1.1;
}
body[data-theme="mono-ink"] .rg-date .rg-count > div + div::before {
  font-size: max(17px, calc(var(--rg-w, 760px) * 0.0611));
}
body[data-theme="mono-ink"] .rg-date .rg-dateline {
  top: 92.7%;
  font-size: max(13px, calc(var(--rg-w, 760px) * 0.0422));
  line-height: 1.1;
}

/* Ekran 3: ikonka przy KAŻDYM punkcie (parts.scheduleIcons), a nie
   cztery na sztywno w tle — przy 1–3 albo 5–6 punktach ikonki stały
   obok pustego miejsca. Lista dzieli pas 25–91 % i w razie potrzeby
   zmniejsza się (--rg-fit). Biały tekst dostaje cień, bo w prawej
   połowie leży na jasnej kalii. */
body[data-theme="mono-ink"] .rg-schedule .rg-timeline {
  --rg-fit: 1;
  left: 12%;
  width: 74%;
  top: 25%;
  height: calc(var(--rg-w, 760px) * 5 / 3 * 0.66);
  justify-content: space-around;
}
body[data-theme="mono-ink"] .rg-schedule .rg-item {
  display: grid;
  grid-template-columns: 46% 1fr;
  column-gap: 11.2%;
  align-items: center;
  flex: 0 0 auto;
}
body[data-theme="mono-ink"] .rg-schedule .rg-item .ico {
  display: block;
  justify-self: center;
  width: auto;
  max-width: 100%;
  height: calc(var(--rg-w, 760px) * 5 / 3 * 0.085 * var(--rg-k, 1));
  object-fit: contain;
  filter: none;
}
body[data-theme="mono-ink"] .rg-schedule .rg-item .time,
body[data-theme="mono-ink"] .rg-schedule .rg-item .desc {
  font-size: calc(max(11px, calc(var(--rg-w, 760px) * 0.0222)) * var(--rg-k, 1));
  text-shadow: 0 1px 5px rgba(0, 0, 0, .55);
}

/* Ekran 6 (RSVP): „RSVP" łamało się na „RS / VP" i wchodziło na pytanie. */
body[data-theme="mono-ink"] .rg-rsvp .rg-h {
  left: 15%;
  width: 70%;
  white-space: nowrap;
}

/* Ekran 7: imiona i zdanie jako JEDNA grupa wyśrodkowana na karcie
   (x 27,3–72,9 %, y 22,3–73,3 %). Wcześniej obie części miały sztywne
   pozycje i dłuższe podziękowanie wjeżdżało na imiona. Zdanie ma
   sufit wysokości i w razie potrzeby się zmniejsza (--rg-fit). */
body[data-theme="mono-ink"] .rg-outro .rg-inner {
  /* v350: procenty liczone od PŁÓTNA, nie od sekcji — na komputerze sekcja
     ma szerokość okna (1440 px), więc 45,6 % dawało 657 px i zdanie
     wychodziło poza białą kartę na koronkę. */
  left: calc(50% - min(100vw, var(--rg-w, 760px)) * 0.228);
  width: calc(min(100vw, var(--rg-w, 760px)) * 0.456);
  top: 23.5%;
  height: calc(var(--rg-w, 760px) * 5 / 3 * 0.49);
  translate: none;
  padding: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: calc(var(--rg-w, 760px) * 5 / 3 * 0.025);
}
body[data-theme="mono-ink"] .rg-outro .rg-monogram,
body[data-theme="mono-ink"] .rg-outro .rg-cols {
  position: relative;
  left: auto; top: auto; translate: none;
  width: 100%;
}
body[data-theme="mono-ink"] .rg-outro .rg-monogram {
  --rg-fit-w: 1;
  font-size: calc(var(--rg-w, 760px) * 0.088 * var(--rg-kw, 1));
  white-space: nowrap;
}
body[data-theme="mono-ink"] .rg-outro .rg-cols {
  --rg-fit: 1;
  width: 92%;
  max-height: calc(var(--rg-w, 760px) * 5 / 3 * 0.335);
  overflow: hidden;
  flex: 0 1 auto;
}
body[data-theme="mono-ink"] .rg-outro .rg-cols,
body[data-theme="mono-ink"] .rg-outro .rg-cols .rg-p {
  font-size: calc(max(11px, calc(var(--rg-w, 760px) * 0.0322)) * var(--rg-k, 1));
  line-height: 1.42;
}
/* Adres w obrysie białej karty (x 22,6–77,4 %), nie szerzej — długi
   adres dotykał krawędzi karty. */
body[data-theme="mono-ink"] .rg-location .rg-addr { left: 24.5%; width: 51%; }

/* ── A4. Fotobudka: historia zasłonięta kwiatem, kopertą i „Save the date"
   Karteczka była za mała na prawdziwą historię (projekt miał dwa zdania),
   tekst spływał na kopertę. Teraz: większa karteczka, kwiat i dolna grupa
   (koperta, kartka, napis, data) niżej — w app.js — a tekst ma stałe pole
   na karteczce i w razie potrzeby się zmniejsza (--rg-fit). Stopień
   pisma liczony od płótna, więc na każdym telefonie łamie się tak samo. */
body[data-theme="photobooth-noir"] .rg-story .rg-cols {
  --rg-fit: 1;
  left: 44%;
  top: 16.6%;
  width: 49%;
  height: auto;
  max-height: calc(var(--rg-w) * 5 / 3 * 0.345);
  overflow: hidden;
  font-size: calc(var(--rg-w) * 0.028 * var(--rg-k, 1));
  line-height: 1.4;
}
body[data-theme="photobooth-noir"] .rg-story .rg-cols .rg-p,
body[data-theme="photobooth-noir"] .rg-story .rg-cols .rg-p:first-child,
body[data-theme="photobooth-noir"] .rg-story .rg-cols .rg-p:last-child {
  font-size: calc(var(--rg-w) * 0.028 * var(--rg-k, 1));
  line-height: 1.4;
}
/* Zakończenie w pasie papieru pod RSVP: imiona w JEDNEJ linii (długie
   łamały się i górna linijka wypadała na bordo), zdanie ma sufit
   i w razie potrzeby się zmniejsza. */
body[data-theme="photobooth-noir"] .rg-rsvp .rg-outro-inline .rg-monogram {
  --rg-fit-w: 1;
  white-space: nowrap;
  font-size: calc(clamp(30px, 7.2vw, 62px) * var(--rg-kw, 1));
}
body[data-theme="photobooth-noir"] .rg-rsvp .rg-outro-inline .rg-cols {
  --rg-fit: 1;
  max-height: calc(var(--rg-w, 760px) * 5 / 3 * 0.15);
  overflow: hidden;
  font-size: calc(clamp(11px, 2.6vw, 15px) * var(--rg-k, 1));
  line-height: 1.55;
}
body[data-theme="photobooth-noir"] .rg-rsvp .rg-outro-inline .rg-cols .rg-p {
  font-size: calc(clamp(11px, 2.6vw, 15px) * var(--rg-k, 1));
  line-height: 1.55;
}

/* ── A5. Amalfi: historia ─────────────────────────────────────────
   v340: kolaż wraca na całą stronę (pozycje zdjęć w app.js). Tekst nie
   płynie już pod nagłówkiem, tylko ma dwa pola w lukach kolażu, w
   procentach płótna (jak zdjęcia): akapit A na prawo od zdjęcia 1,
   akapit B na lewo od zdjęcia 2. Każde pole samo zmniejsza pismo
   (--rg-fit), gdy historia jest długa — tekst nie wchodzi pod zdjęcia.
   Pocztówka ma wymiar płótna także na telefonie. */
body[data-theme="amalfi-lemon"] .rg-postcard {
  width: var(--rg-w) !important;
  margin-inline: 0 !important;
  left: 0;
}
body[data-theme="amalfi-lemon"] .rg-story .rg-inner {
  height: calc(var(--rg-w) * 5 / 3);
}
body[data-theme="amalfi-lemon"] .rg-story .rg-cols {
  position: absolute;
  inset: 0;
  display: block;
  width: auto !important;
  max-height: none;
  margin: 0 !important;
  overflow: visible;
  z-index: 2;
}
body[data-theme="amalfi-lemon"] .rg-story .rg-cols .rg-p {
  --rg-fit: 1;
  position: absolute;
  overflow: hidden;
  font-size: calc(clamp(11px, 2.4vw, 14px) * var(--rg-k, 1));
  line-height: 1.55;
  text-align: left;
}
body[data-theme="amalfi-lemon"] .rg-story #rgStoryA {
  left: 39.5%; top: 22.5%; width: 47.5%; height: 18.5%;
}
body[data-theme="amalfi-lemon"] .rg-story #rgStoryB {
  left: 12%; top: 45%; width: 41.5%; height: 19.5%;
}
/* Mapa: była spłaszczona do 203 × 54 px, bo w kolumnie pod adresem
   i przyciskiem zostawało dla niej za mało miejsca. Przycisk „Dojazd"
   stoi teraz NA dolnej krawędzi mapy (połową na niej) — kolumna
   odzyskuje ~45 px i mapa wraca do proporcji z projektu (5:2). */
body[data-theme="amalfi-lemon"] .rg-location .rg-card > .rg-map {
  order: 2;
  margin: calc(var(--am-1p) * 1.3) 0 0;
}
body[data-theme="amalfi-lemon"] .rg-location .rg-card > .rg-btn {
  order: 3;
  margin: calc(max(38px, calc(var(--am-1p) * 3.5)) * -0.5) 0 0;
  z-index: 2;
  box-shadow: 0 6px 16px rgba(0, 34, 102, .22);
}
/* RSVP + zakończenie: zdanie od pary kończyło się na dolnym pasie
   majoliki z cytrynami (nieczytelne). Sekcja ma teraz pod spodem
   zapas na ten pas, a nagłówek „Kilka słów od pary" mieści się
   w jednej linii (wcześniej łamał się na dwie). */
body[data-theme="amalfi-lemon"] .rg-rsvp {
  padding-bottom: calc(var(--rg-w, 760px) * 5 / 3 * 0.2);
}
body[data-theme="amalfi-lemon"] .rg-outro-inline .rg-h {
  --rg-fit-w: 1;
  white-space: nowrap;
  font-size: calc(clamp(22px, 7.4vw, 44px) * var(--rg-kw, 1));
}
body[data-theme="amalfi-lemon"] .rg-outro-inline .rg-inner {
  width: calc(var(--rg-w, 760px) * 0.62) !important;   /* wnętrze łuku, bez kolumn majoliki */
}

/* ── A6. Biały Len (white-linen) ──────────────────────────────────
   Ekran 3: kreski były NARYSOWANE na papierze (pięć), więc przy 1–3
   punktach zostawały puste, a szósty punkt nie miał swojej. Papier
   jest teraz bez kresek (03-schedule/papier_bez_linii.webp), a kreskę
   rysuje każdy punkt pod sobą — tyle kresek, ile punktów. Wymiary
   kreski zmierzone na starym papierze: kreska 12 px, przerwa 2 px,
   grubość 3 px przy papierze 768 px = 85,5 % płótna. */
body[data-theme="white-linen"] .rg-schedule .rg-item {
  --wl-k: calc(var(--rg-w, 760px) * 0.855 / 768);
  background: repeating-linear-gradient(90deg,
      rgba(128, 124, 121, .9) 0 calc(var(--wl-k) * 12),
      transparent calc(var(--wl-k) * 12) calc(var(--wl-k) * 14))
    left bottom / 100% max(1px, calc(var(--wl-k) * 3)) no-repeat;
}
/* Nagłówek odrobinę wyżej i mniejszy na wąskim telefonie — przy 320 px
   dotykał pierwszego punktu. */
body[data-theme="white-linen"] .rg-schedule .rg-h {
  top: 13.3%;
  font-size: min(calc(var(--rg-w, 760px) * 0.092), 74px);
}

/* Ekran 2: imiona w obrysie karty w jednej linii każde (długie imię
   łamało się w środku: „Maksymilian / a"), licznik od góry etykiety,
   a nazwa miejsca pod nim — wcześniej licznik stał na środku etykiety
   i przy 320–360 px wchodził na nazwę miejsca. */
body[data-theme="white-linen"] .rg-date .rg-names {
  --rg-fit-w: 1;
  white-space: nowrap;
  overflow-wrap: normal;
  font-size: calc(clamp(26px, calc(var(--rg-w, 760px) * 0.093), 71px) * var(--rg-kw, 1));
}
body[data-theme="white-linen"] .rg-date .rg-count {
  top: 63.4%;
  height: auto;
  align-items: flex-start;
}
body[data-theme="white-linen"] .rg-date .dl-miejsce {
  top: max(70.9%, calc(63.4% + 46px));
  font-size: clamp(10px, calc(var(--rg-w, 760px) * 0.022), 17px);
  line-height: 1.25;
}
/* Zakończenie: imiona w jednej linii (długie łamały się na zdanie). */
body[data-theme="white-linen"] .rg-outro-inline .rg-monogram {
  --rg-fit-w: 1;
  white-space: nowrap;
  font-size: calc(clamp(22px, calc(var(--rg-w, 760px) * 0.069), 52px) * var(--rg-kw, 1));
}
/* Ekran 4: dłuższa historia nie mieściła się w polu na pogniecionym
   papierze i schodziła na sekcję Lokalizacja — teraz pole ma sufit
   i tekst w razie potrzeby się zmniejsza. */
body[data-theme="white-linen"] .rg-story .rg-cols {
  --rg-fit: 1;
  overflow: hidden;
}
body[data-theme="white-linen"] .rg-story .rg-cols .rg-p {
  font-size: calc(clamp(10px, calc(var(--rg-w, 760px) * 0.0222), 17px) * var(--rg-k, 1));
  line-height: 1.5;
}
/* Historia wyśrodkowana w polu, ale „bezpiecznie": gdy tekst się nie
   mieści, przykleja się do góry pola (bez `safe` połowa nadmiaru
   uciekała nad pole i dopasowanie jej nie widziało). */
body[data-theme="white-linen"] .rg-story .rg-cols { align-content: safe center; }

/* ── B1. Za mały tekst na telefonie ───────────────────────────────
   Minimalne stopnie: opis ≥ 9,5 px, etykieta / notka ≥ 9 px (przy 390 px).
   Motywy 11 i 12 mają większe pola tekstu w generatorze (m11). */
body[data-theme="navy-velvet"] .rg-date .rg-count .lbl { font-size: max(9.5px, calc(var(--rg-w, 760px) * 0.02)); }
body[data-theme="amalfi-lemon"] .rg-date .rg-count .lbl { font-size: max(9px, calc(var(--rg-w, 760px) * 0.0185)); letter-spacing: .12em; }
body[data-theme="white-linen"] .rg-rsvp .rg-note { font-size: max(9px, calc(var(--rg-w, 760px) * 0.0175)); }
body[data-theme="italian-linen"] .rg-schedule .rg-item .desc {
  font-size: calc(max(9.5px, calc(var(--il-f) * 0.8)) * var(--rg-k, 1));
}
body[data-theme="italian-linen"] .rg-rsvp .rg-note { font-size: max(9.5px, calc(var(--il-px) * 14.5)); }
@media (max-width: 359px) {
  body[data-theme="italian-linen"] .rg-rsvp .rg-note { font-size: 9px; }
}

/* Granatowy Aksamit, historia: akapity stały na sztywnych wysokościach
   (14 % i 30 %), więc dłuższy pierwszy wchodził na drugi. Teraz oba
   płyną jeden pod drugim w wolnym pasie na kaflach (x 64–97 %,
   y 13,5–47,5 %), z sufitem i dopasowaniem. */
body[data-theme="navy-velvet"] .rg-story .rg-cols {
  --rg-fit: 1;
  inset: auto;
  left: 64%;
  width: 33%;
  top: calc(var(--rg-w) * 5 / 3 * 0.135);
  max-height: calc(var(--rg-w) * 5 / 3 * 0.34);
  overflow: hidden;
  font-size: calc(max(9.5px, calc(var(--rg-w) * 0.0245)) * var(--rg-k, 1));
  line-height: 1.55;
}
body[data-theme="navy-velvet"] .rg-story .rg-cols .rg-p,
body[data-theme="navy-velvet"] .rg-story .rg-cols .rg-p:first-child,
body[data-theme="navy-velvet"] .rg-story .rg-cols .rg-p:last-child {
  position: static;
  left: auto; top: auto; width: auto;
  display: block;
  margin: 0 0 .5em;
  font-size: calc(max(9.5px, calc(var(--rg-w) * 0.0245)) * var(--rg-k, 1));
  line-height: 1.55;
}

/* ── E3 + B1. Granatowy Aksamit, zakończenie ──────────────────────
   Na szerszych ekranach dwa akapity stały w dwóch kolumnach (renderer
   tnie tekst w pół zdania) — teraz jeden ciągły, wyśrodkowany akapit.
   Stopień pisma nie schodzi poniżej 9,5 px. */
body[data-theme="navy-velvet"] .rg-outro .rg-cols {
  --rg-fit: 1;
  display: block;
  text-align: center;
  max-height: calc(var(--rg-w) * 5 / 3 * 0.185);
  overflow: hidden;
  font-size: calc(max(9.5px, calc(var(--rg-w) * 5 / 3 * 0.0161)) * var(--rg-k, 1));
  line-height: 1.6;
}
body[data-theme="navy-velvet"] .rg-outro .rg-cols .rg-p {
  display: inline;
  font-size: calc(max(9.5px, calc(var(--rg-w) * 5 / 3 * 0.0161)) * var(--rg-k, 1));
  line-height: 1.6;
}
body[data-theme="navy-velvet"] .rg-outro .rg-cols .rg-p:first-child::after { content: " "; }

/* ── B2. Tekst na ilustracjach ────────────────────────────────────
   Ogród Różany: dolny akapit historii leżał na różach (różowe na
   różowym). */
body[data-theme="rose-garden"] .rg-story .rg-cols .rg-p {
  /* Zamiast białej plamy (zasłaniała róże): miękka biała aureola wokół
     liter — róże prześwitują między wierszami, a tekst jest czytelny. */
  text-shadow: 0 0 2px #fff, 0 0 5px #fff, 0 0 9px #fff, 0 0 14px rgba(255, 255, 255, .9);
}
@media (max-width: 480px) {
  /* Serce odrobinę mniejsze, tekst bliżej niego — róże wychodzą spod
     ostatnich wierszy jak girlanda. */
  body[data-theme="rose-garden"] .rg-heart { width: calc(var(--rg-w) * 0.66); margin-top: calc(var(--rg-w) * 0.04); }
  body[data-theme="rose-garden"] .rg-story .rg-cols { margin-top: calc(var(--rg-w) * 0.055); gap: .6em; }
}
/* Granatowy Aksamit, dress code: opis biegł od krawędzi do krawędzi
   ekranu (bez marginesów, na telefonie wchodził pod przycisk muzyki). */
body[data-theme="navy-velvet"] #rgDressText {
  width: calc(var(--rg-w) * 0.78);
  max-width: 86vw;
  margin-inline: auto;
  text-wrap: balance;
}
/* Zielona Oliwka, zakończenie: na telefonie 86 % szerokości (od brzegu
   do brzegu) — teraz 80 %, z sufitem pasu pod kaligrafią i dopasowaniem. */
@media (max-width: 480px) {
  body[data-theme="olive-green"] .rg-outro-inline .rg-cols { left: 10%; width: 80%; }
}
body[data-theme="olive-green"] .rg-outro-inline .rg-cols {
  --rg-fit: 1;
  max-height: calc(var(--rg-w, 760px) * 5 / 3 * 0.11);
  overflow: hidden;
  font-size: calc(clamp(10px, calc(var(--rg-w, 760px) * 0.0222), 20px) * var(--rg-k, 1));
  text-wrap: balance;
}
/* Czerń i Biel, harmonogram — biały tekst na jasnej kalii dostał cień
   (sekcja A3). */

/* ── B3. „Dotknij, aby otworzyć" ──────────────────────────────────
   W motywach 6, 8, 9 i 10 napis miał 11 px, szary, i pulsował do 34 %
   krycia — gość mógł go po prostu nie zauważyć. Teraz: większy, w pełni
   kryjący kolor motywu, na delikatnej mlecznej pigułce, z łagodnym
   tętnem (100 ↔ 70 %). */
body:is([data-theme="mono-ink"], [data-theme="gold-leaf"], [data-theme="violet-dusk"], [data-theme="italian-linen"]) .plate-cta {
  padding: .75em 1.6em;
  white-space: nowrap;
  border-radius: 999px;
  background: rgba(255, 255, 255, .78);
  -webkit-backdrop-filter: blur(6px);
          backdrop-filter: blur(6px);
  box-shadow: 0 6px 22px rgba(0, 0, 0, .12);
  font-size: clamp(11.5px, 1.4vw, 14px);
  font-weight: 500;
  color: var(--rg-ink, #333);
  opacity: 1;
  animation: audyt-cta 3.2s ease-in-out infinite;
}
body[data-theme="italian-linen"] .plate-cta { font-size: max(12px, calc(var(--pl-h) * 3 / 5 / 900 * 26)); }
@keyframes audyt-cta { 0%, 100% { opacity: 1; } 50% { opacity: .7; } }
body:is([data-theme="mono-ink"], [data-theme="gold-leaf"], [data-theme="violet-dusk"], [data-theme="italian-linen"]) .plate-reveal.opening .plate-cta {
  animation: none; opacity: 0; transition: opacity .3s;
}
/* Fioletowy Zmierzch: na niskim oknie (laptop) napis przyklejony do dołu
   okna lądował na lakowej pieczęci. Gdy dół okna wypada na wysokości
   pieczęci, napis staje nad nią, na zagięciu koperty. */
@media (min-width: 761px) and (max-height: 880px) {
  body[data-theme="violet-dusk"] .plate-cta { bottom: auto; top: calc(var(--rg-w, 760px) * 5 / 3 * 0.33); }
}
@media (max-width: 760px) and (min-aspect-ratio: 10 / 11) {
  body[data-theme="violet-dusk"] .plate-cta { bottom: auto; top: calc(100vw * 5 / 3 * 0.33); }
}

/* ── B4. Napisy startowe po polsku ────────────────────────────────
   „You received a message" (Biały Len, Zielona Oliwka) — po polsku
   „Masz wiadomość", po angielsku bez zmian. Serce w Photobooth ma
   polską grafikę („Kliknij guzik"), wybieraną w zaproszenie.html. */
html:not([lang="en"]) body:is([data-theme="white-linen"], [data-theme="olive-green"]) .plate-canvas::before {
  content: "Masz wiadomość";
}

/* ── B3 c.d. „Dotknij, aby otworzyć" na zasłonach i okiennicach ─────
   Ogród Różany, Granatowy Aksamit, Amalfi: kaligrafia 24 px o cienkiej
   kresce ginęła w fałdach (róż na różu, krem na błękicie). Większa,
   w ciemniejszym kolorze motywu, z jasną aureolą. */
body:is([data-theme="rose-garden"], [data-theme="navy-velvet"]) .curtain-cta,
body[data-theme="amalfi-lemon"] .shutter-cta {
  font-size: clamp(30px, 7.6vw, 52px);
  z-index: 50;
}
body[data-theme="rose-garden"] .curtain-cta,
body[data-theme="amalfi-lemon"] .shutter-cta {
  /* Cienka kaligrafia potrzebuje spokojnego tła: mleczna pigułka
     z rozmyciem (jak „Dotknij, aby otworzyć" w motywach 6, 8, 9, 10). */
  padding: .12em .9em .2em;
  border-radius: 999px;
  background: rgba(255, 252, 248, .72);
  -webkit-backdrop-filter: blur(6px);
          backdrop-filter: blur(6px);
  box-shadow: 0 6px 22px rgba(0, 0, 0, .10);
  text-shadow: none;
}
body[data-theme="rose-garden"] .curtain-cta { color: #7A2438; }
body[data-theme="amalfi-lemon"] .shutter-cta { color: #0A2A6E; }
/* Biały Len: napis łamał się na dwie linie i stał przy lewej krawędzi
   (pozycjonowany od środka bez nowrap). */
body[data-theme="white-linen"] .plate-cta { white-space: nowrap; text-align: center; }

/* Czerń i Biel, licznik pod kopertą: krój Italianno ma bardzo małe
   oczko — 15 px liczb i 11 px etykiet wyglądało jak 8 i 6 px. */
body[data-theme="mono-ink"] .rg-date .rg-count { top: 83.2%; }
body[data-theme="mono-ink"] .rg-date .rg-count .num { font-size: max(25px, calc(var(--rg-w, 760px) * 0.066)); line-height: 1; }
body[data-theme="mono-ink"] .rg-date .rg-count .lbl {
  /* etykiety antykwą w wersalikach — kaligrafia w tym stopniu była nieczytelna */
  font-family: var(--rg-serif);
  font-weight: 500;
  font-size: max(9.5px, calc(var(--rg-w, 760px) * 0.0245));
  letter-spacing: .16em;
  text-transform: uppercase;
  line-height: 1;
  margin-top: .45em;
}
body[data-theme="mono-ink"] .rg-date .rg-count > div + div::before { font-size: max(22px, calc(var(--rg-w, 760px) * 0.06)); }
body[data-theme="mono-ink"] .rg-date .rg-dateline {
  --rg-fit-w: 1;
  top: 94.6%;
  left: 5%;
  width: 90%;
  white-space: nowrap;
  font-size: calc(max(19px, calc(var(--rg-w, 760px) * 0.054)) * var(--rg-kw, 1));
}
/* Biały Len, harmonogram: bazowa pionowa linia osi czasu przecinała
   tekst punktów (w projekcie są tylko poziome kreski pod punktami). */
body[data-theme="white-linen"] .rg-schedule .rg-timeline::before { display: none; }

/* ── B1 c.d. Najmniejsze teksty na telefonie ───────────────────────
   Notki, etykiety licznika i opisy punktów miały 9–9,5 px. Na telefonie
   (do 480 px) podłoga 10 px dla treści i 9,5 px dla etykiet; listy
   z dopasowaniem (--rg-k) dalej mogą się zmniejszać, gdy punktów jest
   dużo. Na komputerze bez zmian. */
@media (max-width: 480px) {
  body:is([data-theme="photobooth-noir"], [data-theme="olive-green"], [data-theme="gold-leaf"], [data-theme="violet-dusk"], [data-theme="white-linen"]) #rgRsvp .rg-note {
    font-size: clamp(10px, 2.65vw, 11.5px);
  }
  body:is([data-theme="rose-garden"], [data-theme="amalfi-lemon"], [data-theme="white-linen"]) #rgCount .lbl,
  body[data-theme="photobooth-noir"] #rgCount .lbl {
    font-size: clamp(9.5px, 2.5vw, 11px);
  }
  body:is([data-theme="white-linen"], [data-theme="olive-green"], [data-theme="italian-linen"], [data-theme="terracotta-arch"], [data-theme="deco-emerald"]) #rgSchedule .rg-item .desc {
    font-size: calc(clamp(10px, 2.65vw, 11.5px) * var(--rg-k, 1));
  }
  body:is([data-theme="terracotta-arch"], [data-theme="deco-emerald"]) #rgSchedule .rg-item .godz {
    font-size: calc(clamp(10px, 2.6vw, 11.5px) * var(--rg-k, 1));
  }
  body[data-theme="violet-dusk"] #rgStory .rg-p {
    font-size: calc(clamp(10px, 2.65vw, 11.5px) * var(--rg-k, 1));
  }
}

/* ── B5. Ogród Różany: monogram R&P ───────────────────────────────
   Stał na samej górze zakończenia, czyli w pasie, na który nachodzi
   sekcja RSVP (−7 % szerokości) — był rozcięty: połowa pod łabędziami,
   połowa nad nagłówkiem. Treść zakończenia zaczyna się pod zakładką. */
body[data-theme="rose-garden"] .rg-outro .rg-inner { padding-top: calc(var(--rg-w, 760px) * 0.085); }
body[data-theme="rose-garden"] .rg-outro .rg-monogram { margin-bottom: calc(var(--rg-w, 760px) * 0.035); }

/* ── E2. Złoty Liść, RSVP: wszystko o ~10 px w lewo ────────────────
   Pola stały na 14 % + 67 % (środek 47,5 %), a biała karta ma środek
   na 50 %. */
body[data-theme="gold-leaf"] .rg-rsvp :is(.rg-h, .rg-q, .rg-radios, .rg-msg-label) { left: 16.5%; }
body[data-theme="gold-leaf"] .rg-rsvp :is(.rg-sep, .rg-textarea) { left: 50%; translate: -50% 0; }

/* ── D1. Granatowy Aksamit: zasłony ruszają od razu ─────────────────
   Środek ma ten sam granat co skrzydła, więc jego gaśnięcie (0,15–1,25 s)
   było niewidoczne i przez 1,2 s po dotknięciu „nic się nie działo".
   Środek gaśnie szybko, skrzydła ruszają po 0,3 s. */
body[data-theme="navy-velvet"] .curtain-reveal { --zaslona-srodek: .35s; --zaslona-skrzydla: .3s; }

/* ── C2. Harmonogram z 1–3 punktami ────────────────────────────────
   Ogród Różany, Granatowy Aksamit, Biały Len: krótka lista była
   przyklejona pod nagłówkiem, a pod nią zostawało puste pół ekranu.
   Przy 1–3 punktach lista staje na środku wolnego miejsca (przy 4+
   układ bez zmian — tak jak w projekcie). */
body:is([data-theme="rose-garden"], [data-theme="navy-velvet"]) #rgSchedule:not(:has(.rg-item:nth-child(4))) .rg-inner {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  padding-bottom: calc(var(--rg-w, 760px) * 5 / 3 * 0.1);
}
body:is([data-theme="rose-garden"], [data-theme="navy-velvet"]) #rgSchedule:not(:has(.rg-item:nth-child(4))) .rg-timeline {
  margin-block: auto;
  flex: 0 0 auto;
}
body[data-theme="white-linen"] #rgSchedule:not(:has(.rg-item:nth-child(4))) .rg-timeline {
  justify-content: center;
  height: calc(var(--rg-w, 760px) * 5 / 3 * 0.46);
}

/* ── C2. Fioletowy Zmierzch: 5–6 punktów na wąskim telefonie ────────
   Punkty dzieliły pas po równo (flex 1 1 0, min-height 0), więc gdy
   tekst nie mieścił się w swojej części, wchodził na sąsiedni punkt.
   Teraz punkt ma co najmniej wysokość tekstu, a cała lista zmniejsza
   się (--rg-fit), gdy razem nie mieszczą się w pasie. */
body[data-theme="violet-dusk"] .rg-schedule .rg-timeline { --rg-fit: 1; }
body[data-theme="violet-dusk"] .rg-schedule .rg-item { flex: 1 0 auto; }
body[data-theme="violet-dusk"] #rgSchedule .rg-item :is(.time, .desc) {
  font-size: calc(clamp(10px, calc(var(--rg-w, 760px) * 0.019), 17px) * var(--rg-k, 1));
}

/* ── C1. Zielona Oliwka przy długich treściach ─────────────────────
   Długie imiona łamały się na dwie linie i druga wchodziła na zdanie
   zapraszające; historia (450 znaków) i dress code (140) wychodziły
   pod sekcję. Imiona w jednej linii z dopasowaniem do szerokości,
   historia i dress code z sufitem wysokości i dopasowaniem stopnia. */
body[data-theme="olive-green"] .rg-date .rg-names {
  --rg-fit-w: 1;
  white-space: nowrap;
  font-size: calc(clamp(26px, calc(var(--rg-w, 760px) * 0.0533), 48px) * var(--rg-kw, 1));
}
body[data-theme="olive-green"] .rg-story .rg-cols {
  --rg-fit: 1;
  max-height: calc(var(--rg-w, 760px) * 5 / 3 * 0.25);
  overflow: hidden;
}
body[data-theme="olive-green"] #rgStory .rg-cols .rg-p { font-size: calc(1em * var(--rg-k, 1)); }
body[data-theme="olive-green"] #rgDressText {
  --rg-fit: 1;
  font-size: calc(clamp(10px, calc(var(--rg-w, 760px) * 0.0167), 15px) * var(--rg-k, 1));
  max-height: calc(var(--rg-w, 760px) * 5 / 3 * 0.08);
  overflow: hidden;
}
@media (max-width: 359px) {
  body[data-theme="olive-green"] #rgRsvp .rg-note { font-size: 9px; white-space: nowrap; }
}

/* ── F1. Kolor akcentu wybrany w kreatorze (v342) ─────────────────
   body[data-akcent] ustawia zaproszenie.html tylko wtedy, gdy para
   wybrała kolor inny niż kolor motywu. Zmienna --rg-accent jest
   nadpisywana także tam, gdzie motyw definiuje ją na poziomie sekcji,
   a główne przyciski (w części motywów mają kolor wpisany na sztywno)
   dostają kolor wprost. */
body[data-akcent] #rgScreens,
body[data-akcent] #rgScreens *,
body[data-akcent] .sticky-cta { --rg-accent: var(--rg-akcent) !important; }
body[data-akcent] #rgRouteBtn,
body[data-akcent] .rg-rsvp .rg-btn,
body[data-akcent] .rg-rsvp button[type="submit"],
body[data-akcent] #stickyRsvp {
  background: var(--rg-akcent) !important;
  border-color: var(--rg-akcent) !important;
  color: var(--rg-akcent-tekst) !important;
}
body[data-akcent] #rgRouteBtn *,
body[data-akcent] #stickyRsvp * { color: inherit !important; }
body[data-akcent] #rgRouteBtn svg,
body[data-akcent] #stickyRsvp svg { stroke: currentColor; }
body[data-akcent] .rg-rsvp input[type="radio"],
body[data-akcent] .rg-rsvp input[type="checkbox"] { accent-color: var(--rg-akcent); }

/* ── v342: godzina ślubu ───────────────────────────────────────────
   Godzina z kreatora stoi przy dacie. W motywach z datą w osobnym polu
   (Biały Len — serce, Włoski Len) idzie pod datą, w nowej linijce.
   Fioletowa Wisteria: datę odkrywają zdrapki, godzina stoi pod nimi. */
.rg-dateline .dl-godz { display: block; font-size: .86em; margin-top: .15em; }
.rg-dateline .dl-godz:empty { display: none; }
body[data-theme="violet-dusk"] .rg-zdrapki .zd-godz {
  position: absolute;
  left: 0; right: 0;
  top: 92.5%;
  margin: 0;
  text-align: center;
  font-family: var(--rg-display);
  font-style: italic;
  font-size: calc(var(--rg-w, 760px) * 0.034);
  line-height: 1;
  color: var(--rg-ink);
  pointer-events: none;
}
/* Granatowy Aksamit: dłuższe imię („Maksymiliana") łamało się w owalu na
   „Maksymilian / a". Imię w jednej linijce, pismo zmniejsza się do szerokości. */
body[data-theme="navy-velvet"] .rg-date .rg-names {
  --rg-fit-w: 1;
  white-space: nowrap;
  font-size: calc(var(--rg-w) * 0.105 * var(--rg-kw, 1));
}
body[data-theme="photobooth-noir"] .rg-postcard .ov.data.godz { font-size: max(9.5px, calc(var(--rg-w, 760px) * 0.026)); }
/* Włoski Len: data była wyśrodkowana na 56,2 % — dopisana godzina
   wypychała ją w górę, pod długie zdanie zaproszenia. Pierwsza linijka
   zostaje na swoim miejscu, godzina idzie w dół. */
body[data-theme="italian-linen"] .rg-date .rg-dateline .dl-data { translate: 0 -0.575em; }

/* Starter — zaproszenie bez RSVP (body[data-bez-rsvp] ustawia zaproszenie.html
   z flag serwera): bez formularza i bez pływającego „Potwierdź obecność". */
body[data-bez-rsvp] #rgRsvpForm > :not(.rg-h):not(.rg-q),
body[data-bez-rsvp] #stickyRsvp,
body[data-bez-rsvp] .sticky-cta { display: none !important; }
body[data-bez-rsvp] #rgRsvpForm .rg-q { margin-top: .6em; text-wrap: balance; }

/* ── v345: napisy z grafiki w języku gościa ─────────────────────────
   Teksty rysowane przez ::before / ::after biorą treść ze zmiennych
   ustawianych przez js/zaproszenie-jezyki.js (AmoreZT.zmienneCss)
   na <html data-zt="…">. Bez skryptu zostają reguły motywów. */
html[data-zt] body:is([data-theme="white-linen"], [data-theme="olive-green"]) .plate-canvas::before { content: var(--zt-wiadomosc); }
html[data-zt] body[data-theme="olive-green"] .rg-outro-inline .rg-h::after { content: var(--zt-swietujmy); }
html[data-zt] body[data-theme="italian-linen"] .rg-outro-inline .rg-inner::before { content: var(--zt-swietujmy); }
html[data-zt] body[data-theme="italian-linen"] .plate-canvas::after { content: var(--zt-zaproszenie); }
html[data-zt] body[data-theme="violet-dusk"] .rg-date > .rg-inner::before { content: var(--zt-zdrap); }
