/* Wygenerowane z indexv5.html — współdzielony arkusz hub + podstrony (P0.1) */

/* Noto Sans — self-hosted (RODO: bez zależności od Google, subset łaciński) */
@font-face { font-family: 'Noto Sans'; font-style: italic; font-weight: 400; font-stretch: 100%; font-display: swap; src: url(/fonts/noto-400i.woff2) format('woff2'); unicode-range: U+20-7e, U+91-92, U+99, U+a0-17f, U+3b1-3b2, U+3ba, U+3bc, U+2010, U+2013-2014, U+2018-2019, U+201c-201e, U+2022, U+2026, U+2032-2033, U+2078, U+20ac, U+2122, U+2190, U+2192, U+2197, U+2260, U+2264-2265, U+25b8, U+25be, U+25cf, U+2640, U+2713; }
@font-face { font-family: 'Noto Sans'; font-style: normal; font-weight: 400; font-stretch: 100%; font-display: swap; src: url(/fonts/noto-400n.woff2) format('woff2'); unicode-range: U+20-7e, U+91-92, U+99, U+a0-17f, U+3b1-3b2, U+3ba, U+3bc, U+2010, U+2013-2014, U+2018-2019, U+201c-201e, U+2022, U+2026, U+2032-2033, U+2078, U+20ac, U+2122, U+2190, U+2192, U+2197, U+2260, U+2264-2265, U+25b8, U+25be, U+25cf, U+2640, U+2713; }
@font-face { font-family: 'Noto Sans'; font-style: normal; font-weight: 500; font-stretch: 100%; font-display: swap; src: url(/fonts/noto-500n.woff2) format('woff2'); unicode-range: U+20-7e, U+91-92, U+99, U+a0-17f, U+3b1-3b2, U+3ba, U+3bc, U+2010, U+2013-2014, U+2018-2019, U+201c-201e, U+2022, U+2026, U+2032-2033, U+2078, U+20ac, U+2122, U+2190, U+2192, U+2197, U+2260, U+2264-2265, U+25b8, U+25be, U+25cf, U+2640, U+2713; }
@font-face { font-family: 'Noto Sans'; font-style: normal; font-weight: 600; font-stretch: 100%; font-display: swap; src: url(/fonts/noto-600n.woff2) format('woff2'); unicode-range: U+20-7e, U+91-92, U+99, U+a0-17f, U+3b1-3b2, U+3ba, U+3bc, U+2010, U+2013-2014, U+2018-2019, U+201c-201e, U+2022, U+2026, U+2032-2033, U+2078, U+20ac, U+2122, U+2190, U+2192, U+2197, U+2260, U+2264-2265, U+25b8, U+25be, U+25cf, U+2640, U+2713; }
@font-face { font-family: 'Noto Sans'; font-style: normal; font-weight: 700; font-stretch: 100%; font-display: swap; src: url(/fonts/noto-700n.woff2) format('woff2'); unicode-range: U+20-7e, U+91-92, U+99, U+a0-17f, U+3b1-3b2, U+3ba, U+3bc, U+2010, U+2013-2014, U+2018-2019, U+201c-201e, U+2022, U+2026, U+2032-2033, U+2078, U+20ac, U+2122, U+2190, U+2192, U+2197, U+2260, U+2264-2265, U+25b8, U+25be, U+25cf, U+2640, U+2713; }
@font-face { font-family: 'Noto Sans'; font-style: normal; font-weight: 800; font-stretch: 100%; font-display: swap; src: url(/fonts/noto-800n.woff2) format('woff2'); unicode-range: U+20-7e, U+91-92, U+99, U+a0-17f, U+3b1-3b2, U+3ba, U+3bc, U+2010, U+2013-2014, U+2018-2019, U+201c-201e, U+2022, U+2026, U+2032-2033, U+2078, U+20ac, U+2122, U+2190, U+2192, U+2197, U+2260, U+2264-2265, U+25b8, U+25be, U+25cf, U+2640, U+2713; }
/* ═══════════════════════════════════════════════════════════════════════════
   WARSTWA TOKENÓW — v4, spójna z panelem partnera Office (2026-08-13)
   Wartości ze ŹRÓDŁA panelu (office/public/assets/app.css), nie próbkowane
   ze zrzutów — próbkowanie dawało #8B6238 zamiast #92602f i promień 12px
   zamiast 18px, a te różnice widać przy zestawieniu obok siebie.
   ZASADA: żadna nazwa tokenu nie znika (474 klasy, 500+ wywołań var()).
   Nazwy zostają, zmieniają się wartości.
   KONTRAST policzony. Dwa tokeny Office ŚWIADOMIE odrzucone, bo oblewają AA:
   --muted #877a6a (4,18:1) i --gold #a4761f (4,05:1). Nie kopiuj ich tu
   z powrotem „dla spójności z Office" — to spójność z błędem.
   ═══════════════════════════════════════════════════════════════════════════ */
:root{
  /* ——— SKALA ODSTĘPÓW (jedyna dopuszczalna) ——— */
  --space-1:4px; --space-2:8px; --space-3:16px; --space-4:24px; --space-5:40px; --space-6:64px;
  /* ——— SKALA TYPOGRAFICZNA ——— */
  --fs-xs:11px; --fs-sm:13px; --fs-base:15px; --fs-md:18px; --fs-lg:24px; --fs-xl:32px;

  /* ——— POWIERZCHNIE ———
     Było #EFEBE3 — dwa stopnie ciemniej i bardziej żółto niż Office.
     --paper       = Office --bg-canvas  (obszar treści)
     --paper2      = Office --field      (tła pól, nagłówek tabeli, badge neutralny)
     --paper3      = Office --bg-app     (tło poza kartami)
     --surface-hero: hero przestaje mieć własne ciemniejsze tło. Pas nagłówka
                     odróżnia się OBRAMOWANIEM DOLNYM, nie zmianą tła (§6.2). */
  --paper:#f7f6f2; --paper2:#f4f5f1; --paper3:#eceae4;
  --surface-hero:#f7f6f2; --surface-inset:#faf9f5;

  /* ——— TEKST ———
     --ink, --ink-soft prosto z Office.
     --ink-faint NIE jest Office'owym --muted #877a6a: ten ma 4,18:1 na bieli
     i 3,82:1 na --paper2, a w tym arkuszu stoi pod tekstem w 53 miejscach.
     #6f6357 to ta sama rodzina barwna przy 5,84:1 / 5,33:1. */
  --ink:#2c2219; --ink-soft:#5c4d3c; --ink-faint:#6f6357;

  /* ——— MARKA ———
     --brand      = Office --brown        5,33:1 na bieli — wypełnienia i tekst
     --brand-deep = Office --brown-hover  6,92:1 — hover, linki w treści
     --brand-950  = Office --ink          15,56:1 — nagłówki (63 użycia; było
                    #2D1D1B, czyli osobny kolor tekstu obok --ink; teraz jeden) */
  /* A-02: brąz ma DWIE role, nie jedną.
     --brand      TYLKO wypełnienia (przycisk główny, aktywna pigułka, aktywna zakładka)
     --brand-text TYLKO tekst (linki w treści, przycisk drugorzędny) — 7,0:1 na --paper,
                  podczas gdy --brand daje tam 4,98:1, czyli na styku progu. */
  --brand:#8B6238; --brand-text:#674F40; --brand-deep:#674F40; --brand-950:#2c2219;
  --brand-soft:#f1eae4; --brand-200:#dfd0bd;

  /* ——— STATUSY — wzorzec „dwa odcienie na barwę" z Office ———
     Office rozdziela token PASKA od tokenu TEKSTU, bo pasek może być jaśniejszy,
     a tekst musi trzymać kontrast. Tu ten sam podział:
       --{x}        kolor tekstu i pigułki   (≥4,5:1 na bieli i na własnej tincie)
       --{x}-deep   ciemniejszy wariant tekstu
       --{x}-soft   tinta 13% — JEDYNE dopuszczalne kolorowe tło
       --{x}-line   obramowanie tinty
       --acc-{x}    pasek akcentu 5px na karcie (nie niesie tekstu)
     Bursztyn: tekst to #8a6318 (5,41:1), a NIE Office'owe --gold #a4761f
     (4,05:1). Złoto zostaje wyłącznie na pasku --acc-amber. */
  --green:#2f7a57; --green-deep:#33604a; --green-soft:#e4eee9; --green-line:#c3ded1;
  --amber:#8a6318; --amber-deep:#6d4e13; --amber-soft:#f3ede2; --amber-line:#e2d3b4;
  --red:#96362c;   --red-deep:#7d2c24;   --red-soft:#f1e5e4;   --red-line:#e0c4c1;
  --rev:#7a4a3d;   --rev-deep:#5f382e;   --rev-soft:#efe6e2;   --rev-line:#d5c0b7;
  --leaf:#2f7a57; --leaf-soft:#e4eee9;

  /* Paski akcentu — z Office (--acc-*). Karta neutralna to NIE karta bez paska,
     tylko karta z paskiem szarym. Ustalenie rundy v5 panelu, nie cofać. */
  --acc-green:#3d6b4f; --acc-amber:#b8862b; --acc-red:#a5402d;
  --acc-blue:#3a6b96;  --acc-neutral:#c4bba9;
  /* Tekst etykiet sparowany z paskiem — Office --ink-* */
  --ink-green:#33604a; --ink-amber:#8a6318; --ink-red:#98392a;
  /* --ink-blue USUNIĘTY (PATCH-05 P-03): jedynym jego użyciem była plakietka
     „Alergen", która wróciła do bursztynu. Niebieski nie ma w tym systemie
     przypisanego znaczenia — token bez znaczenia zostawiony „na później"
     wraca jako czwarta barwa semantyczna. */
  --ink-neutral:#6f6357;
  --blue:#35688f; --blue-soft:#e6ecf2; --blue-line:#c5d4e2;

  /* ——— LINIE I CIENIE — z Office ——— */
  --card:#FFFFFF;
  --line:rgba(51,39,29,.09); --line-soft:rgba(51,39,29,.06); --border-strong:rgba(51,39,29,.16);
  --shadow-sm:0 1px 2px rgba(51,39,29,.06);
  --shadow-md:0 6px 18px -6px rgba(51,39,29,.16),0 2px 5px -2px rgba(51,39,29,.08);
  --shadow-lg:0 18px 50px -12px rgba(51,39,29,.20);

  /* ——— PROMIENIE — z Office: karta 18px, kontrolka 10px ——— */
  --radius:10px; --radius-sm:10px; --radius-card:18px; --radius-lg:18px;

  --sans:'Noto Sans', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --mono:ui-monospace,'SF Mono','IBM Plex Mono',Menlo,Consolas,monospace;
  /* --measure 65ch → 68ch: audyt zmierzył akapity na ~1150px (~140 znaków) */
  --container:1200px; --results-max:900px; --measure:68ch;

  /* ——— Tokeny wymagane przez komponenty przeniesione z Office ———
     Pozostałe nazwy Office (--surface, --field, --muted, --brown…) NIE są tu
     dopisywane: wklejany CSS ma je przepisane na nazwy tego projektu.
     Te pięć nie ma odpowiednika i musi istnieć. */
  --brand-ring:rgba(146,96,47,.13);   /* Office --brown-soft: pierścień fokusu pól */
  --pad-card:1.75rem;                 /* Office --pad-card: 28 px */
  --btn-2:#eef0ea;                    /* Office --btn-secondary */
  --btn-2-hover:#e4e8df;
  --btn-2-ink:#5c6a54;

  /* ——— Zestaw statusowy wg SPEC-u wykonawczego: jeden odcień = jedno znaczenie ———
     Trzy role na status: -bg (tinta, JEDYNE dopuszczalne kolorowe tło),
     -fg (tekst, ≥4,5:1 na swojej tincie), -accent (pasek 4 px, nie niesie tekstu). */
  --ok-bg:#EAEFE8;   --ok-fg:#395942;   --ok-accent:#486A51;
  --hold-bg:#FBF3E3; --hold-fg:#7A5A1E; --hold-accent:#B0883E;
  --bad-bg:#F6E4E3;  --bad-fg:#8E3B37;  --bad-accent:#A8443F;
  --border:#E6E2D9;
  --ink-muted:#6B6259;
  --brand-tint:#F2EBE1;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;overflow-x:clip}
body{font-family:var(--sans);background:var(--paper);color:var(--ink);line-height:1.6;font-size:var(--fs-base);overflow-x:clip}
.claim-orig,.meta,.card-meta,.cond,.f-phrase,.preview{overflow-wrap:anywhere}
img{max-width:100%}
input,button,textarea,td,th,.mono,.meta,.id,time{font-variant-numeric:tabular-nums}
a{color:var(--brand);text-decoration-thickness:1px;text-underline-offset:2px}
a:hover{color:var(--brand-deep)}
.wrap{max-width:var(--container);margin:0 auto;padding:0 var(--space-4)}
::selection{background:var(--brand-200);color:var(--brand-950)}
h1,h2,h3,h4{font-weight:500;letter-spacing:-.01em;line-height:1.2}

/* pasek prawny (sticky u góry) */
/* PATCH-06 P-04 — pasek zostaje na wszystkich ekranach, ale jako JEDNA linia.
   line-height 1.45 zamiast dziedziczonego 1.6: 41 px → 39 px, próg ≤40 px. */
.notice{background:var(--brand-950);color:#EDE4D8;font-size:var(--fs-sm);line-height:1.45;padding:10px 0;text-align:center;position:static}
.notice b{color:#E2C39C;font-weight:500}
.notice .wrap{display:flex;gap:var(--space-2);align-items:center;justify-content:center;flex-wrap:wrap;text-align:center}

/* nagłówek marki — pas pełnej szerokości (tło/border sięga krawędzi), treść w kontenerze */
.siteband{background:var(--surface-hero);border-bottom:1px solid var(--line)}
/* ── PATCH-06 P-04 — geometria hero ─────────────────────────────────────────
   Odzyskujemy wysokość na blokach wtórnych i odstępach, NIGDY na H1 ani na
   pierwszym zdaniu podtytułu (patrz „Czego nie robić”).
   40 px nad H1 = padding-top paska + wyzerowany margin-top nagłówka; wcześniej
   te dwie wartości się sumowały (24 + 24 = 48).
   padding-bottom 24 px to jednocześnie odstęp „karta KPI → pasek zakładek”:
   spec podaje w P-04 dwie liczby na tę samą odległość (32 i 24) — biorę
   mniejszą, bo test 7 jest wiążący, a różnica to 8 px zapasu. */
.siteband>.wrap{padding-top:40px;padding-bottom:24px}
.hero-fresh{display:flex;flex-wrap:wrap;align-items:baseline;gap:.35rem;
  margin:12px 0 0;font-size:var(--fs-sm);color:var(--ink-soft)}
.hero-fresh a{color:var(--brand-text);font-weight:600;text-decoration:none}
.hero-fresh a:hover{text-decoration:underline}
#herostats{margin-top:20px}
/* Etap 2 — hero „narzędziowy": tytuł → zdanie → pasek liczb → DUŻE pole → chipy */
.hero-inner{max-width:760px}
/* ── Hero DWUKOLUMNOWY od 1024 px (23.08.2026) ──────────────────────────────
   Kafle KPI stały POD tekstem i dokładały ~110 px wysokości, spychając pole
   wyszukiwania — to, po co użytkownik przyszedł — coraz niżej. Przeniesione do
   prawej kolumny wchodzą w wysokość, którą i tak zajmuje tytuł z lidem, więc
   sekcja kurczy się do wysokości samego tekstu.
   ⚠ Poniżej 1024 px WRACAMY do jednej kolumny: przy węższym oknie druga kolumna
     zwęża tytuł bardziej, niż oszczędza wysokości. Próg był chwilowo na 1180 px,
     bo linia świeżości niosła jeszcze datę przebudowy i link do metodologii
     i przy węższej kolumnie łamała się na dwa wiersze; po jej skróceniu
     do samego „Stan bazy … · Rejestr KE + EFSA + GIS" mieści się w jednym.
   ⚠ Statystyki nadal są w hero (patrz komentarz przy .ph-kpibar) — zmienia się
     ich MIEJSCE, nie obecność. */
@media(min-width:1024px){
  .hero-inner{max-width:none;display:grid;
    grid-template-columns:minmax(0,1fr) minmax(300px,380px);
    column-gap:var(--space-5);align-items:start}
  .hero-inner>h1.hero,.hero-inner>.lede,.hero-inner>.hero-fresh{grid-column:1}
  .hero-inner>.lede{max-width:var(--measure)}
  /* span 3 = trzy elementy lewej kolumny (h1 + lede + linia świeżości).
     Dopisanie czwartego wymaga podniesienia tej liczby, inaczej KPI wyląduje
     w wierszu pod nim i wysokość wróci. */
  .hero-inner>#herostats{grid-column:2;grid-row:1 / span 3;margin-top:0;align-self:center}
  .hero-inner>#herostats .ph-kpibar{grid-template-columns:repeat(2,minmax(0,1fr))}
  .hero-inner>#herostats .ph-kpibar__cell:nth-child(3){border-left:0}
  .hero-inner>#herostats .ph-kpibar__cell:nth-child(n+3){border-top:1px solid var(--border)}
}
.db-strip{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);margin:var(--space-4) 0;font-size:var(--fs-sm);color:var(--ink-soft)}
.db-strip .pill{display:inline-flex;align-items:center;gap:6px;background:var(--card);border:1px solid var(--line);border-radius:999px;padding:5px 12px;box-shadow:var(--shadow-sm)}
.db-strip .pill b{font-weight:600;color:var(--ink)}
.db-strip .pill.aut b{color:var(--green-deep)} .db-strip .pill.hold b{color:var(--amber)} .db-strip .pill.rej b{color:var(--red-deep)}
.db-strip a{font-weight:500;color:var(--brand-deep);white-space:nowrap;text-decoration:none}
.db-strip a:hover{text-decoration:underline}
.hero-search{display:flex;gap:var(--space-2);margin-top:var(--space-2);max-width:640px}
.hero-search .ac-wrap{flex:1;position:relative}
.hero-search input{width:100%;height:64px;font-size:var(--fs-md);font-family:inherit;color:var(--ink);padding:0 var(--space-4);border:1.5px solid var(--border-strong);border-radius:var(--radius-lg);background:var(--card);box-shadow:var(--shadow-md)}
.hero-search input::placeholder{color:var(--ink-faint)}
.hero-search input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 4px rgba(107,78,61,.16)}
/* po KLASIE, nie po id — pole-bohater stoi w dwóch modułach (#qbtn i #gbtn) */
.hero-search .btn{height:64px;padding:0 var(--space-5);font-size:var(--fs-base);border-radius:var(--radius-lg);flex:none}
.hero-explainer{margin-top:var(--space-4);max-width:var(--measure)}
.hero-explainer summary{cursor:pointer;font-weight:500;color:var(--brand-deep);font-size:var(--fs-sm)}
.hero-explainer[open] summary{margin-bottom:var(--space-2)}
.hero-explainer p{font-size:var(--fs-base);line-height:1.6;color:var(--ink);margin:0}
.hero-explainer strong{color:var(--brand-950);font-weight:600}
@media(max-width:640px){ .hero-search{flex-direction:column} .hero-search input,.hero-search #qbtn{width:100%} }
.brandline{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap}
.brandlogo{height:34px;width:auto;display:block}
.brandsep{width:1px;height:26px;background:var(--border-strong)}
.toolname{font-weight:500;font-size:var(--fs-base);color:var(--brand-950)}
.toolname span{color:var(--brand)}
.beta{font-size:var(--fs-xs);font-weight:500;letter-spacing:.08em;color:var(--brand);background:var(--brand-soft);padding:3px 9px;border-radius:var(--radius);text-transform:uppercase}
/* PATCH-06 P-04 — margin-top 0: odstęp nad H1 daje wyłącznie padding paska (40 px).
   Kegl H1 BEZ ZMIAN — wysokości nie odzyskujemy na komunikacie głównym. */
h1.hero{font-weight:600;font-size:clamp(1.6rem,4vw,var(--fs-xl));line-height:1.14;margin:0 0 var(--space-3);color:var(--brand-950)}
h1.hero em, h1.hero .hero-line2{font-style:normal;color:var(--brand);}
h1.hero .hero-line2{display:block}                 /* wymuszony podział: dokładnie 2 linie (tytuł / — wyszukiwarka składników beta) */
h1.hero .hero-line2 .beta-badge{color:var(--brand-deep)}
.beta-badge{display:inline-block;vertical-align:middle;margin-left:var(--space-3);font-size:var(--fs-xs);font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--brand-deep);background:rgba(107,78,61,.10);border:1px solid rgba(107,78,61,.30);border-radius:999px;padding:3px 11px;line-height:1.5;white-space:nowrap}
.lede{margin:0;color:var(--ink-secondary,var(--ink-soft));max-width:var(--measure);font-size:var(--fs-base)}
/* ——— SPEC nagłówków/copy (SEO/AEO/GEO) ——— */
.answer-block{max-width:var(--measure);margin:var(--space-3) 0 0;font-size:var(--fs-base);line-height:1.6;color:var(--ink);
  background:var(--paper2);border:1px solid var(--line);border-left:3px solid var(--brand);border-radius:var(--radius-card);padding:var(--space-3) var(--space-4)}
.answer-block strong{color:var(--brand-950);font-weight:600}
.stat-note{font-size:var(--fs-sm);color:var(--ink-soft);margin:var(--space-2) 0 0}
.panel-h2{font-size:var(--fs-lg);font-weight:600;color:var(--brand-950);margin:0 0 var(--space-2);line-height:1.2}
.panel-lead{color:var(--ink-soft);max-width:var(--measure);margin:0 0 var(--space-4);line-height:1.55}
/* ⚠ Wyróżnienie WEWNĄTRZ akapitu wprowadzającego jest zneutralizowane celowo.
   Cztery z sześciu modułów miały pierwsze zdanie w <strong>, a drugie bez — przez
   co jeden akapit niósł dwie wagi wizualne i moduły wyglądały jak osobne produkty,
   mimo że to jedno narzędzie. Wzorcem jest „Szukaj składnika": jeden akapit,
   jeden głos. Reguła stoi tu jako zabezpieczenie — gdyby ktoś dopisał <strong>
   w treści, akapit i tak zostanie jednolity. Wyróżnienia rób NIŻEJ, w treści
   modułu (.answer-block, .disclaimer), nie w lidzie. */
.panel-lead strong{color:inherit;font-weight:inherit}
.chips-label{font-size:var(--fs-xs);font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-soft);margin:var(--space-5) 0 var(--space-2)}
.section-lead{color:var(--ink-soft);max-width:var(--measure);margin:var(--space-2) 0 var(--space-3);line-height:1.55}
/* ===== R2-1: bohater panelu — narzędzie modułu wyeksponowane na górze (moduły = główna nawigacja) ===== */
.panel-hero{margin:0 0 var(--space-5)}
.panel-hero .hero-search{margin-top:var(--space-4)}
.panel-hero .chips-label{margin-top:var(--space-4)}
.section-lead strong{color:var(--ink)}
.eyebrow{font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.08em;color:var(--brand);font-weight:700;margin:var(--space-4) 0 2px}
.details-h3{display:inline;font-size:var(--fs-base);font-weight:500;color:var(--brand-950);margin:0}
.result-head{font-size:var(--fs-md);font-weight:600;color:var(--brand-950);margin:var(--space-3) 0 2px}
.result-counts{margin:0 0 var(--space-3);color:var(--ink-soft);font-size:var(--fs-sm)}
.result-counts strong{color:var(--ink);font-weight:500}
.scan-legend{margin-top:var(--space-5);border-top:1px solid var(--line);padding-top:var(--space-4)}
.scan-legend h3{font-size:var(--fs-md);color:var(--brand-950);margin:0 0 var(--space-2)}
.scan-legend ul{margin:0;padding-left:var(--space-4);color:var(--ink-soft);line-height:1.6}
.scan-legend li{margin:0 0 4px}.scan-legend strong{color:var(--ink)}
.status-note{font-size:var(--fs-sm);color:var(--ink-soft);background:var(--surface-inset);border-radius:var(--radius);padding:var(--space-2) var(--space-3);margin:var(--space-3) 0 0}
.tbl-scroll{overflow-x:auto;margin:var(--space-2) 0 var(--space-4)}
.compare{width:100%;border-collapse:collapse;font-size:var(--fs-sm);background:var(--card);border:1px solid var(--line);border-radius:var(--radius-card);min-width:520px;overflow:hidden}
.compare th{text-align:left;padding:10px 14px;background:var(--surface-inset);font-weight:600;border-bottom:1px solid var(--line)}
.compare th:first-child{color:var(--red-deep,#7D2020)}.compare th:last-child{color:var(--green-deep,#1F4620)}
.compare td{padding:10px 14px;border-bottom:1px solid var(--line);vertical-align:top;width:50%;color:var(--ink)}
.compare tr:last-child td{border-bottom:0}
.compare em{color:var(--green-deep,#1F4620);font-style:normal;font-size:var(--fs-xs)}
.faq-static{background:var(--paper2,#F4F3EF);border-top:1px solid var(--line);padding:var(--space-5) 0}
.faq-static h2{font-size:var(--fs-lg);color:var(--brand-950);margin:0 0 var(--space-4)}
.faq-static h3{font-size:var(--fs-md);color:var(--brand-950);margin:var(--space-4) 0 var(--space-2)}
.faq-static p{color:var(--ink-soft);max-width:var(--measure);line-height:1.6;margin:0}
/* FAQ jako akordeon — pytanie widoczne, odpowiedź rozwijana */
.faq-item{border-bottom:1px solid var(--line)}
.faq-item>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) 0}
.faq-item>summary::-webkit-details-marker{display:none}
.faq-item>summary::after{content:'+';margin-left:auto;font-size:1.35em;line-height:1;color:var(--brand);font-weight:400;flex:0 0 auto}
.faq-item[open]>summary::after{content:'\2212'}
.faq-item .faq-q{margin:0;font-size:var(--fs-md);color:var(--brand-950);font-weight:500}
.faq-item>summary:hover .faq-q{color:var(--brand)}
.faq-item .faq-a{padding:0 0 var(--space-4)}
.datebar{display:inline-flex;gap:var(--space-2);align-items:center;margin-top:var(--space-4);font-size:var(--fs-sm);color:var(--ink-soft);
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-2) var(--space-3)}
.dot{width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 0 3px rgba(59,109,17,.16)}
.datebar b,.datebar time{color:var(--ink);font-weight:500}

/* nawigacja zakładek — Etap 2: wyraźny biały „toolbar" odklejający się cieniem po przyklejeniu */
.tabwrap{position:sticky;top:0;z-index:40;background:var(--card);border-bottom:1px solid var(--border-strong);
  transition:box-shadow .15s ease}
.tabwrap.is-stuck{box-shadow:var(--shadow-md)}
nav.tabs{display:flex;gap:var(--space-1);flex-wrap:wrap}
.tab{position:relative;border:none;background:transparent;font-family:inherit;font-weight:500;font-size:var(--fs-sm);color:var(--ink-soft);
  padding:14px var(--space-3);min-height:48px;cursor:pointer;
  border-radius:var(--radius-sm) var(--radius-sm) 0 0;border-bottom:2px solid transparent;margin-bottom:-1px;
  display:inline-flex;align-items:center;gap:var(--space-2);transition:color .15s,background .15s}
.tab:hover{color:var(--brand-deep);background:var(--brand-soft)}
.tab.active{color:var(--brand-950);font-weight:600;border-bottom-color:var(--brand);background:var(--brand-soft)}
.tab .ti{width:18px;height:18px;flex-shrink:0;stroke:currentColor;fill:none;stroke-width:1.6}
.tab.active .ti{stroke:var(--brand)}
.tab:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}
.tab .tlab-s{display:none}   /* krótka etykieta modułu (używana w triggerze menu mobilnego) */
.tabs-trigger{display:none}  /* R2-6 A — trigger rozwijanego menu tylko na ≤720px */
main.wrap{padding:var(--space-5) var(--space-4) var(--space-4);min-height:56vh}
section.panel{display:none}
section.panel.active{display:block;animation:fade .4s ease}
@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

/* wyszukiwarka */
/* §3.1 — współdzielony autocomplete (wyszukiwarka składników + „po działaniu"); wzorzec z Kreatora, ale niezależny komponent */
.ac-wrap{position:relative;flex:1;min-width:240px}
.ac-wrap>input{width:100%}
.ac-list{position:absolute;top:100%;left:0;right:0;z-index:60;background:var(--card);border:1px solid var(--border-strong);border-top:none;border-radius:0 0 var(--radius) var(--radius);box-shadow:var(--shadow-md);max-height:min(320px,60vh);overflow-y:auto}
.ac-item{padding:9px var(--space-3);cursor:pointer;font-size:var(--fs-sm);color:var(--ink);border-top:1px solid var(--line-soft)}
.ac-item:first-child{border-top:none}
.ac-item b{color:var(--brand-deep);font-weight:700}
.ac-item:hover,.ac-item.on{background:var(--brand-soft);color:var(--brand-deep)}
.ac-empty{padding:10px var(--space-3);font-size:var(--fs-sm);color:var(--ink-faint)}
@media(max-width:640px){ .ac-wrap{flex:0 0 100%;width:100%} }
.btn{font-family:inherit;font-weight:500;font-size:var(--fs-sm);border:none;cursor:pointer;border-radius:var(--radius);height:44px;
  padding:0 var(--space-4);background:var(--brand);color:#fff;transition:background .16s;display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2)}
.btn:hover{background:var(--brand-deep)}
.btn.ghost{background:transparent;color:var(--brand);border:1px solid var(--brand-200);height:44px;padding:0 var(--space-3)}
.btn.ghost:hover{background:var(--brand-soft)}
.hint{font-size:var(--fs-sm);color:var(--ink-soft);margin-top:var(--space-3);max-width:var(--measure);display:flex;gap:var(--space-3);align-items:center;flex-wrap:wrap}
.hint a{color:var(--ink-soft);text-decoration:underline}
.hint a:hover{color:var(--brand)}
details.howto{margin-top:var(--space-3);max-width:var(--measure)}
details.howto>summary{cursor:pointer;font-size:var(--fs-sm);color:var(--brand);font-weight:500;list-style:none;display:inline-flex;align-items:center;gap:6px}
details.howto>summary::-webkit-details-marker{display:none}
details.howto>summary::before{content:'';width:0;height:0;border-left:5px solid currentColor;border-top:4px solid transparent;border-bottom:4px solid transparent;transition:transform .18s}
details.howto[open]>summary::before{transform:rotate(90deg)}
details.howto[open]>summary{margin-bottom:var(--space-2)}
details.howto .body{font-size:var(--fs-sm);color:var(--ink-soft);line-height:1.6}
.chips{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-4);max-width:var(--results-max)}
/* ── zwijanie list pigułek (23.08.2026) ────────────────────────────────────
   .chip ma 32 px wysokości, więc max-height:32px przycina DOKŁADNIE jeden wiersz
   niezależnie od tego, ile pigułek się w nim zmieści. Przycinamy CSS-em, a nie
   wycinaniem z HTML-a: wszystkie obszary zostają w drzewie dokumentu, więc
   czytnik ekranu i robot widzą komplet, a użytkownik — jeden wiersz. */
.chips--fold{overflow:hidden;max-height:32px}
.chips--fold.is-open{max-height:none}
.chips-label--row{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}
.chips-more{border:0;background:none;padding:0;font:inherit;font-size:var(--fs-xs);font-weight:600;
  letter-spacing:.05em;text-transform:uppercase;color:var(--brand-deep);cursor:pointer;text-decoration:underline}
.chips-more:hover{color:var(--brand-950)}
.chips-fold{margin-top:var(--space-5)}
.chips-fold>summary{cursor:pointer;margin:0;list-style:none;display:flex;align-items:center;gap:.45rem}
.chips-fold>summary::-webkit-details-marker{display:none}
.chips-fold>summary::before{content:"";flex:none;width:0;height:0;border-left:5px solid currentColor;
  border-top:4px solid transparent;border-bottom:4px solid transparent;transition:transform .15s}
.chips-fold[open]>summary::before{transform:rotate(90deg)}
.chips-fold .chips{margin-top:var(--space-2)}
.chip{height:32px;padding:0 var(--space-3);display:inline-flex;align-items:center;font-size:var(--fs-sm);font-weight:400;
  white-space:nowrap;background:var(--card);border:1px solid var(--line);border-radius:16px;
  cursor:pointer;color:var(--ink-soft);transition:border .16s,color .16s,background .16s}
.chip:hover{background:var(--brand-soft);border-color:var(--brand-200);color:var(--brand-deep)}
.chip[aria-pressed="true"]{background:var(--brand-950);color:#fff;border-color:var(--brand-950)}

/* pasek podsumowania składnika (Novel Food / alergen / GIS) */
/* WYTYCZNE-03 §3 — karta składnika (Novel Food / alergen / dawka GIS): beżowy
   box → BIAŁA karta z lewym paskiem akcentu, jak kafle KPI i karty oświadczeń.
   Beż był trzecim tłem na ekranie i nie znaczył nic — teraz znaczenie niesie pasek. */
.statusbar{position:relative;overflow:hidden;background:var(--card);border:1px solid var(--border);
  border-radius:var(--radius-card);padding:var(--space-3) var(--space-4);margin:var(--space-4) 0 var(--space-1);
  max-width:var(--results-max);box-shadow:var(--shadow-sm)}
.statusbar::before{content:'';position:absolute;left:0;top:0;bottom:0;width:5px;background:var(--acc-neutral)}
.statusbar .sb-name{font-weight:500;font-size:var(--fs-md);color:var(--brand-950);display:flex;align-items:baseline;gap:var(--space-2);margin-bottom:var(--space-2)}
.statusbar .sb-row{display:grid;grid-template-columns:auto 1fr;gap:var(--space-1) var(--space-3);font-size:var(--fs-sm);align-items:baseline}
/* Klucze wiersza jako eyebrow — ten sam język etykiet co na karcie oświadczenia. */
.statusbar .sb-k{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-muted);white-space:nowrap}
.statusbar .sb-v{color:var(--ink)}
.statusbar .sb-v .ok{color:var(--ink-green);font-weight:600}
.statusbar .sb-v .warn{color:var(--ink-amber);font-weight:600}
.statusbar .sb-note{font-size:var(--fs-sm);color:var(--ink-faint);margin-top:var(--space-2);border-top:1px solid var(--line);padding-top:var(--space-2)}
.gis-pill{display:inline-block;background:var(--leaf-soft);color:var(--green-deep);border:1px solid var(--green-line);border-radius:var(--radius);padding:2px 8px;font-weight:500;font-size:var(--fs-sm)}

/* przełącznik języka usunięty — brzmienie wiążące zależy od statusu (autoryzowane=PL urzędowe, on hold=oryginał) */
.langbar{display:none}
.langbar-x{display:flex;align-items:center;gap:var(--space-3);margin:var(--space-4) 0 var(--space-1);flex-wrap:wrap;font-size:var(--fs-sm)}
.langtoggle{display:inline-flex;background:var(--paper2);border:1px solid var(--line);border-radius:var(--radius);padding:2px;gap:2px}
.langtoggle button{border:none;background:transparent;font-family:inherit;font-weight:400;font-size:var(--fs-sm);color:var(--ink-soft);padding:var(--space-1) var(--space-3);border-radius:6px;cursor:pointer;transition:all .16s}
.langtoggle button.on{background:var(--card);color:var(--brand-950);box-shadow:var(--shadow-sm)}
.langnote{font-size:.78rem;color:var(--ink-faint)}

/* Z1.3 — link z wyników SPA do pełnej podstrony składnika (SEO/GEO wewnętrzne linkowanie) */
.subpage-link{display:block;background:var(--brand-soft);border:1px solid var(--brand-200);border-left:4px solid var(--brand);border-radius:var(--radius);padding:var(--space-3) var(--space-4);margin:var(--space-3) 0 var(--space-4);color:var(--brand-deep);text-decoration:none;font-size:var(--fs-sm);max-width:var(--results-max);transition:background .15s}
.subpage-link:hover{background:var(--brand-200)}
.subpage-link b{color:var(--brand-950)}
/* licznik wyników (jedna linia, filtruje po kliknięciu) */
.sumrow{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:center;margin:var(--space-4) 0 var(--space-2);font-size:var(--fs-sm);color:var(--ink-soft)}
.sumcard{border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-1) var(--space-3);cursor:pointer;transition:border .15s,opacity .15s;display:inline-flex;align-items:baseline;gap:var(--space-2);background:var(--card)}
.sumcard:hover{border-color:var(--brand)}
.sumcard.off{opacity:.45}
.sumcard .ico{display:none}
.sumcard .n{font-size:var(--fs-base);font-weight:500;line-height:1}
.sumcard .l{font-size:var(--fs-sm);font-weight:400}
.sc-g .n{color:var(--green-deep)} .sc-y .n{color:var(--amber)} .sc-r .n{color:var(--red)} .sc-rev .n{color:var(--rev-deep)}

/* karty oświadczeń */
.results{margin-top:var(--space-3);max-width:var(--results-max)}
.group-h{font-size:var(--fs-md);font-weight:500;margin:var(--space-5) 0 var(--space-2);display:flex;align-items:baseline;gap:var(--space-2);color:var(--brand-950)}
.group-h .cnt{font-size:var(--fs-sm);color:var(--ink-faint);font-weight:400}
.group-sub{font-size:var(--fs-sm);color:var(--ink-soft);margin-bottom:var(--space-3);max-width:var(--results-max)}
/* podnagłówek rozdzielający w obrębie jednej grupy statusu oświadczenia DLA SAMEGO SKŁADNIKA od tych DLA PREPARATU ZŁOŻONEGO */
.sub-split{font-size:var(--fs-sm);font-weight:600;color:var(--brand-950);margin:var(--space-4) 0 var(--space-2);padding-top:var(--space-2);border-top:1px dashed var(--line);display:flex;align-items:baseline;gap:var(--space-2)}
.sub-split.sub-combo{color:var(--brand-deep)}
.sub-split .cnt{font-weight:400;color:var(--ink-faint)}
.card-meta{font-family:var(--mono);font-size:var(--fs-sm);color:var(--ink-soft);margin-top:var(--space-1);line-height:1.5}
/* Karta — mechanika paska przeniesiona z Office (.ph-metric::before).
   Było: border-left:5px + border-radius:0 12px 12px 0, czyli lewa krawędź
   ścięta na płasko. Office maluje pasek PSEUDOELEMENTEM wewnątrz karty
   zaokrąglonej ze wszystkich czterech stron — dzięki temu karta zachowuje
   promień 18px, a pasek nie jest grubym obramowaniem, tylko akcentem.
   Kolor idzie przez lokalną --acc z fallbackiem na neutral: karta bez
   statusu to karta z paskiem SZARYM, nie karta bez paska (ustalenie v5). */
.card{position:relative;background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius-card);overflow:hidden;
  padding:var(--space-3) var(--space-4) var(--space-3) calc(var(--space-4) + 5px);
  margin-bottom:var(--space-4);box-shadow:var(--shadow-sm);transition:box-shadow .16s}
.card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:5px;
  background:var(--acc,var(--acc-neutral))}
.card:hover{box-shadow:var(--shadow-md)}
.card.g{--acc:var(--acc-green)} .card.y{--acc:var(--acc-amber)}
.card.r{--acc:var(--acc-red)}   .card.rev{--acc:var(--acc-red)}
.card-top{display:flex;justify-content:space-between;gap:var(--space-3);align-items:flex-start;flex-wrap:wrap}
.subst{margin:0;font-weight:500;font-size:var(--fs-md);color:var(--brand-950);line-height:1.3;display:flex;align-items:baseline;gap:var(--space-2);flex-wrap:wrap}
.light-dot{display:none}
.badges{display:flex;gap:var(--space-1);flex-wrap:wrap}
.badge{font-size:var(--fs-xs);font-weight:500;letter-spacing:.01em;border-radius:var(--radius);padding:3px 8px;white-space:nowrap}
/* E5 — plakietki tracą wypełnienie: w karcie ma być DOKŁADNIE JEDEN element
   z tłem i jest nim brzmienie do skopiowania. Znaczenie niesie obrys i kolor
   tekstu, oba z tej samej rodziny co pigułka statusu. */
.badge{background:transparent;border:1px solid currentColor}
.b-g{color:var(--ok-fg)}   .b-y{color:var(--hold-fg)}
.b-r{color:var(--bad-fg)}  .b-rev{color:var(--bad-fg)}
/* PATCH-05 P-03 — alergen wraca do bursztynu. WYTYCZNE-03 §5 dały mu własny,
   niebieski odcień, żeby nie mylił się z ostrzeżeniem o formule — ale wprowadziło
   to CZWARTĄ barwę semantyczną do systemu, w którym niebieski nie znaczy nic.
   Alergen jest ostrzeżeniem, więc nosi kolor ostrzeżenia; od „Składnika łączonego"
   odróżnia go dziś linia składu, w której alergen jest wskazany z nazwy.
   ⚠ Tekst i obrys w --hold-fg, NIE --hold-accent: #B0883E na bieli daje 2,9:1,
     poniżej progu WCAG 4.5:1 dla plakietki 11 px. --hold-fg to 6,9:1. */
.b-n{color:var(--ink-muted)} .b-al{color:var(--hold-fg)}
.b-part{color:var(--ink-muted)} .b-comb{color:var(--brand-text)}
/* PATCH-02 P-04 — „Oficjalne PL" przestaje być drugą zieloną etykietą obok
   pigułki statusu. Dwa identyczne zielone obrysy w jednym rzędzie czytały się
   jak para równorzędnych; kolor zostaje wyłącznie na pigułce.
   ⚠ Musi stać ZA .badge i .b-g — ta sama specyficzność, wygrywa kolejność. */
.badge--neutral{border:1px solid var(--border);color:var(--ink-muted);background:transparent}
/* ===== Etap 5 — pasek werdyktu (status = pierwsza, jednoznaczna informacja; ikona+tekst, nie sam kolor = WCAG 1.4.1) ===== */
.verdict{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;
  margin:calc(-1*var(--space-3)) calc(-1*var(--space-4)) var(--space-3);   /* pas na pełną szerokość, wpięty w górną krawędź karty */
  padding:var(--space-2) var(--space-4);border-radius:0 var(--radius-card) 0 0;
  border-bottom:1px solid var(--line);font-size:var(--fs-sm)}
.verdict .v-ic{width:22px;height:22px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border-radius:50%}
.verdict .v-ic svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}
.verdict .v-lab{font-weight:700;letter-spacing:.01em}
.verdict .v-act{color:var(--ink-soft)}
.v-g{background:var(--green-soft)}  .v-g .v-lab{color:var(--green-deep)}  .v-g .v-ic{background:var(--green);color:#fff}
.v-y{background:var(--amber-soft)}  .v-y .v-lab{color:var(--amber-deep)}  .v-y .v-ic{background:var(--amber);color:#fff}
.v-rev{background:var(--rev-soft)}  .v-rev .v-lab{color:var(--rev-deep)}  .v-rev .v-ic{background:var(--rev);color:#fff}
.v-r{background:var(--red-soft)}    .v-r .v-lab{color:var(--red-deep)}    .v-r .v-ic{background:var(--red);color:#fff}
@media(max-width:600px){ .verdict .v-act{flex-basis:100%} }
/* kolorowe znaczniki grup statusów — spójne z paskami werdyktu */
.group-h .gdot{width:11px;height:11px;border-radius:50%;flex-shrink:0;align-self:center}
.gdot-g{background:var(--green)} .gdot-y{background:var(--amber)} .gdot-rev{background:var(--rev)} .gdot-r{background:var(--red)}
.subst .lat{font-style:italic;font-weight:400;font-size:var(--fs-sm);color:var(--ink-soft)}
.subst .combo-tag{font-weight:500;font-size:var(--fs-xs);color:var(--brand-deep);background:var(--brand-soft);border-radius:var(--radius);padding:2px 7px;margin-left:4px}

/* podsumowanie na karcie — brzmienie wiążące zależne od statusu */
.summary{margin:var(--space-3) 0 var(--space-1)}
.s-lab{font-size:var(--fs-xs);font-weight:500;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-faint);display:flex;align-items:center;gap:5px;margin-bottom:var(--space-1)}
.s-lab .lock{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.8;flex-shrink:0}
.summary .s-txt{font-size:var(--fs-base);line-height:1.55;color:var(--ink)}
.summary.r .s-txt,.summary.rev .s-txt{color:var(--ink-soft)}
.summary .q{font-weight:400}
.s-sec{margin-top:var(--space-2);font-size:var(--fs-sm);color:var(--ink-soft);line-height:1.5}
.s-sec .mono{font-family:var(--mono);font-size:var(--fs-sm)}
.s-sec.warn{color:var(--amber-deep)}
.s-sec.plver{background:var(--surface-inset);border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-2) var(--space-3);color:var(--ink)}
.s-lab-pl{color:var(--ink-faint);margin-bottom:var(--space-1)}
.plver-txt{font-size:var(--fs-sm);color:var(--ink);line-height:1.5}
.plver-note{font-size:var(--fs-xs);color:var(--ink-faint);margin-top:var(--space-1)}
.plver-note b{color:var(--amber-deep);font-weight:500}
.summary .langtag{font-size:var(--fs-xs);color:var(--ink-faint);font-weight:400}
.s-note{font-size:var(--fs-sm);color:var(--ink-soft);background:var(--surface-inset);border-radius:var(--radius);padding:var(--space-2) var(--space-3);margin-top:var(--space-2);line-height:1.5}
.s-note b{color:var(--ink);font-weight:500}
.keychip{display:inline-flex;align-items:center;gap:var(--space-2);background:var(--green-soft);color:var(--green-deep);
  border-radius:var(--radius);padding:var(--space-2) var(--space-3);font-size:var(--fs-sm);font-weight:500;margin-top:var(--space-2)}

/* ═══════════════════════════════════════════════════════════════════════════
   KOMPONENTY PRZENIESIONE Z PANELU OFFICE (app.css) — brief §4.5
   Nazwy klas .ph-* ZOSTAJĄ takie jak w Office: te bloki są kopiowane dosłownie,
   a zmiana nazw zrywa możliwość porównania z panelem przy następnej rundzie.
   Zmienione wyłącznie nazwy TOKENÓW (Office → ten projekt):
     --surface→--card · --surface-soft→--surface-inset · --field→--paper2
     --muted→--ink-faint · --brown→--brand · --brown-hover→--brand-deep
     --brown-soft→--brand-ring · --line-strong→--border-strong
     --shadow-card→--shadow-md · --radius-ctrl→--radius · --gold→--amber
   ⚠ Office rysuje ikony przez Lucide z CDN (<i data-lucide>). Tu Lucide NIE MA
   i mieć nie będzie (CSP: script-src 'self' + googletagmanager). Wszystkie
   ikony wstawiamy jako inline <svg> w markupie. Reguły wymuszające rozmiar
   ikony ZOSTAJĄ — bez nich SVG bez atrybutów puchnie do 24 px.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Kafel metryki ───────────────────────────────────────────────────────────
   Równą wysokość rzędu daje WYŁĄCZNIE grid rodzica. ⚠ Nigdy min-height na
   kaflu. Liczby stoją na jednej linii bazowej dzięki min-height:32px etykiety
   (= dwa wiersze wersalików 11,5 px przy line-height 1.35). */
.ph-metric{--metric-pad-left:22px;position:relative;display:flex;flex-direction:column;
  align-items:flex-start;justify-content:flex-start;gap:0;
  padding:18px 20px 18px var(--metric-pad-left);
  border:1px solid var(--line);border-radius:var(--radius-card);background:var(--card);overflow:hidden}
/* Pasek dostaje KAŻDY kafel — kolor wchodzi lokalną --acc, nie regułą paska.
   Kafel bez statusu to kafel z paskiem SZARYM, nie kafel bez paska. */
.ph-metric::before{content:'';position:absolute;inset:-1px auto -1px -1px;width:5px;
  border-radius:var(--radius-card) 0 0 var(--radius-card);background:var(--acc,var(--acc-neutral))}
/* ⚠ Kolor etykiety wymaga DWÓCH klas naraz: --seg ORAZ --green/--gold/--red. */
.ph-metric--seg .ph-metric__label{color:var(--seg-ink,var(--ink-neutral))}
.ph-metric--green{--acc:var(--acc-green);--seg-ink:var(--ink-green)}
.ph-metric--gold {--acc:var(--acc-amber);--seg-ink:var(--ink-amber)}
.ph-metric--red  {--acc:var(--acc-red);  --seg-ink:var(--ink-red)}
.ph-metric__label{margin:0 0 6px;min-height:32px;font-size:11.5px;font-weight:700;
  line-height:1.35;text-transform:uppercase;letter-spacing:.11em;color:var(--ink-neutral)}
/* ⚠ Wartość NIGDY się nie łamie — ani między tysiącami, ani przed jednostką. */
.ph-metric__value{margin:0 0 6px;font-size:30px;font-weight:700;line-height:1;
  letter-spacing:-.02em;color:var(--ink);white-space:nowrap;font-variant-numeric:tabular-nums}
.ph-metric__desc{margin:0;font-size:12.5px;line-height:1.45;color:var(--ink-faint)}
/* ── PATCH-06 P-01 — pasek KPI: JEDNA karta z separatorami ──────────────────
   Wzorzec z Kokpitu Office, nie z Poleceń. Osobne kafle z paskiem akcentu są
   właściwe tam, gdzie każdy kafel jest osobną pozycją do kliknięcia; w hero to
   jeden odczyt stanu bazy, więc jedna karta, a granice niosą separatory.
   ⚠ Statystyki NIE znikają z hero i nie schodzą pod pasek zakładek — są
     sygnałem, że baza jest kompletna. Zmienia się wyłącznie ich wysokość:
     166 px → ~72 px.
   ⚠ Bez podpisów pod liczbami (patrz komentarz przy kpiBar w lib/ui.js). */
.ph-kpibar{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  background:var(--card);border:1px solid var(--border);border-radius:var(--radius-card);
  box-shadow:var(--shadow-sm);overflow:hidden}
.ph-kpibar__cell{padding:12px 16px;border-left:1px solid var(--border);min-width:0}
.ph-kpibar__cell:first-child{border-left:0}
.ph-kpibar__label{display:flex;align-items:center;gap:.4rem;margin:0 0 5px;
  font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--ink-neutral);line-height:1.3}
.ph-kpibar__value{margin:0;font-size:28px;font-weight:700;line-height:1;
  color:var(--brand-950);font-variant-numeric:tabular-nums}
@media(max-width:767px){
  .ph-kpibar{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ph-kpibar__cell:nth-child(3){border-left:0}
  .ph-kpibar__cell:nth-child(n+3){border-top:1px solid var(--border)}
  .ph-kpibar__value{font-size:24px}
}
.ph-kpi-grid{display:grid;gap:1rem;margin:var(--space-4) 0}
.ph-kpi-grid--4{grid-template-columns:repeat(4,minmax(0,1fr))}
.ph-kpi-grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}
@media(max-width:1023px){.ph-kpi-grid--4,.ph-kpi-grid--3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:767px){
  .ph-kpi-grid--4,.ph-kpi-grid--3{grid-template-columns:1fr}
  /* Jeden kafel w kolumnie — nie ma sąsiada, z którym trzeba trzymać linię. */
  .ph-metric__label{min-height:0}
  .ph-metric__value{font-size:26px}
  .ph-metric{--metric-pad-left:20px}
}

/* PATCH-02 P-03 — pasek udziałów procentowych USUNIĘTY (decyzja właściciela
   produktu: kafle KPI wystarczają). Razem z paskiem znika legenda i liczenie
   procent metodą największych reszt w scripts/build-pages.js. Nie przywracaj
   ani nie zastępuj wykresem: trzy kafle podają te same trzy liczby, a pasek
   dokładał czwarty sposób ich przeczytania. */

/* ── Chipy filtra ────────────────────────────────────────────────────────────
   ⚠ Rząd stoi BEZPOŚREDNIO nad listą, którą filtruje. Na wąskim ekranie
   przewija się w poziomie, a nie zawija na trzy linie. */
.ph-chip{display:inline-flex;align-items:center;gap:.35rem;height:32px;padding:0 .85rem;
  border:1px solid var(--border-strong);border-radius:999px;background:var(--card);
  color:var(--ink-soft);font-family:inherit;font-size:13px;font-weight:600;line-height:1;
  white-space:nowrap;cursor:pointer;transition:background-color .15s,border-color .15s,color .15s}
.ph-chip:hover{border-color:var(--brand);color:var(--ink)}
.ph-chip.is-active{background:var(--brand);border-color:var(--brand);color:#fff}
/* PATCH-02 P-08 — chip z licznikiem 0 zostaje na pasku, wyszarzony i nieklikalny.
   Ukrycie go zmieniałoby liczbę pigułek między składnikami, więc pasek co strona
   wyglądałby inaczej i przestałby być punktem odniesienia. */
.ph-chip:disabled{opacity:.45;cursor:default;border-style:dashed}
.ph-chip:disabled:hover{border-color:var(--border-strong);color:var(--ink-soft)}
.ph-chip-row{display:flex;gap:.5rem;margin-bottom:.9rem;overflow-x:auto;scrollbar-width:none;padding-bottom:2px}
/* Przyklejony wariant paska — pod H1, nad treścią. --stick-top ustawia strona,
   bo nad paskiem stoi już sticky pasek modułów i dwa top:0 nachodziłyby na siebie. */
.ph-chip-row--sticky{position:sticky;top:var(--stick-top,0px);z-index:30;
  background:var(--paper);margin:0 0 var(--space-4);padding:.7rem 0;
  border-bottom:1px solid var(--line)}
.ph-chip-row::-webkit-scrollbar{display:none}
.ph-chip--count{display:inline-flex;align-items:center;gap:.4rem;flex:none}
.ph-chip__count{font-variant-numeric:tabular-nums;font-weight:700;color:var(--ink-faint)}
.ph-chip--count.is-active .ph-chip__count{color:inherit;opacity:.75}
/* Kropka w chipie ma ten sam kolor co wycinek paska i kropka w tabeli —
   trzy miejsca, jedno znaczenie. */
.ph-dot{display:inline-block;width:8px;height:8px;border-radius:50%;vertical-align:middle;flex:none}
.ph-dot--green{background:var(--green)} .ph-dot--gold{background:var(--amber)}
.ph-dot--red{background:var(--red)}     .ph-dot--muted{background:var(--ink-faint)}
@media(max-width:767px){
  /* Cel dotykowy 44 px. Chip ma 32 px na desktopie — na telefonie to trafienie
     na wyczucie. */
  .ph-chip-row{flex-wrap:nowrap}
  .ph-chip-row .ph-chip{flex:none}
  .ph-chip{min-height:44px}
}

/* ── Breadcrumb ──────────────────────────────────────────────────────────────
   Office nie ma reguły separatora — „›" wpisujemy w markup. */
.ph-breadcrumb{margin-bottom:.6rem;display:inline-flex;align-items:center;gap:.35rem;
  font-size:.88rem;color:var(--ink-faint);flex-wrap:wrap}
.ph-breadcrumb a{color:var(--ink-soft);text-decoration:none}
.ph-breadcrumb a:hover{text-decoration:underline;color:var(--brand-deep)}

/* ── Znacznik świeżości ──────────────────────────────────────────────────────
   Brief §7: „Stan bazy: 10 lipca 2026" — BEZ monospace. Ikona to inline SVG
   (lucide refresh-cw), bo Lucide na tej stronie nie istnieje. */
.ph-freshness{display:inline-flex;align-items:center;gap:.35rem;font-size:12.5px;
  color:var(--ink-faint);white-space:nowrap;font-family:var(--sans)}
.ph-freshness svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;flex:none}
/* Nagłówek: tytuł po lewej, świeżość dosunięta do prawej; na telefonie schodzi pod tytuł. */
.ph-head-split{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:.5rem 1rem}
@media(max-width:767px){.ph-head-split{gap:.35rem}}

/* ── WYTYCZNE-03 §4 — powłoka wspólna hub ⇄ podstrona ────────────────────────
   .vt-bar / .vt-btn / .sec-head stały wcześniej WYŁĄCZNIE w ARTICLE_CSS
   (scripts/build-pages.js), więc hub renderował własny przełącznik .view-toggle
   z .ctl-btn — ciemny, pod treścią, z tekstem pomocniczym. Reguły są tutaj,
   bo ten arkusz obsługuje oba ekrany. Nie kopiuj ich z powrotem do generatora. */
.vt-bar{display:inline-flex;gap:8px;flex:none}
.vt-btn{background:var(--card);border:1px solid var(--border-strong);border-radius:var(--radius);
  padding:6px 14px;font:inherit;font-size:var(--fs-sm);cursor:pointer;color:var(--ink-soft)}
.vt-btn.on{background:var(--brand);color:#fff;border-color:var(--brand)}
.vt-btn:hover:not(.on){border-color:var(--brand);color:var(--ink)}
.sec-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);
  flex-wrap:wrap;margin:var(--space-5) 0 var(--space-3);scroll-margin-top:120px}
.sec-head h2{margin:0}
.sec-head .vt-bar{margin-left:auto}
/* Nagłówek sekcji wyników: kropka statusu + tytuł + licznik. */
.sec-title{display:flex;align-items:center;gap:.55rem;margin:var(--space-5) 0 var(--space-2)}
/* Zwinięta uwaga o preparatach złożonych (§5) — ten sam wzorzec co „Jak czytać wyniki". */
details.combo-legend{margin:0 0 var(--space-3);padding:var(--space-2) 0;border-top:1px solid var(--border);border-bottom:1px solid var(--border)}
details.combo-legend>summary{cursor:pointer;list-style:none;font-size:var(--fs-sm);font-weight:600;color:var(--brand-text)}
details.combo-legend>summary::-webkit-details-marker{display:none}
details.combo-legend>summary::before{content:'▸ ';color:var(--ink-muted)}
details.combo-legend[open]>summary::before{content:'▾ '}
details.combo-legend p{margin:var(--space-2) 0 0;font-size:var(--fs-sm);line-height:1.55;color:var(--ink-soft);max-width:var(--measure)}
.sec-title__h{margin:0;font-size:var(--fs-lg);font-weight:600;color:var(--brand-950);line-height:1.25}
.sec-head__count{color:var(--ink-faint);font-weight:500}
/* .hero-note i .hero-meta USUNIĘTE razem z blokami, które opisywały (PATCH-06
   P-02 i P-03). Reguły bez elementów wracają jako „przecież jest klasa". */

/* ── Stan pusty ──────────────────────────────────────────────────────────────
   Office trzyma ten komponent na aliasach --ph-bg-card/--ph-border/--ph-radius-xl.
   Aliasów NIE importujemy (byłaby trzecia warstwa nazw) — cztery odwołania
   przepisane na tokeny tego projektu. */
.ph-empty-state{text-align:center;padding:3rem 1.5rem;background:var(--card);
  border:1px solid var(--line);border-radius:var(--radius-card);margin-bottom:1.5rem}
.ph-empty-state__title{margin:0 0 .5rem;font-size:1.25rem;font-weight:700;color:var(--ink)}
.ph-empty-state__description{margin:0 0 1.5rem;color:var(--ink-soft);font-size:.95rem}


/* ═══════════════════════════════════════════════════════════════════════════
   KARTA OŚWIADCZENIA v4 — anatomia wg SPEC-u wykonawczego (B-02)
   Reguły bezwzględne, sprawdzane testami odbioru E1–E9:
     • JEDEN element z niebiałym tłem: .claim__text (albo .claim__alt na karcie
       odrzuconej). Pigułka statusu dostaje OBRYS I KROPKĘ, nie wypełnienie —
       inaczej tła są dwa i żadne nie jest sygnałem.
     • JEDEN przycisk wypełniony: .btn--primary.
     • WERSALIKI wyłącznie w .eyebrow.
     • MONOSPACE wyłącznie w .claim__id i .claim__sig.
   ═══════════════════════════════════════════════════════════════════════════ */
.claim{--acc:var(--acc-neutral)}
.claim--ok{--acc:var(--ok-accent);--st-fg:var(--ok-fg);--st-bg:var(--ok-bg)}
.claim--hold{--acc:var(--hold-accent);--st-fg:var(--hold-fg);--st-bg:var(--hold-bg)}
.claim--bad{--acc:var(--bad-accent);--st-fg:var(--bad-fg);--st-bg:var(--bad-bg)}

.claim__head{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;margin-bottom:var(--space-2)}
/* Pigułka: obrys + kropka. Bez tła — patrz reguła bezwzględna wyżej. */
.pill{display:inline-flex;align-items:center;gap:.4rem;height:24px;padding:0 .6rem;
  border:1px solid var(--acc);border-radius:999px;background:transparent;
  font-size:var(--fs-xs);font-weight:700;line-height:1;color:var(--st-fg,var(--ink-soft));white-space:nowrap}
.pill::before{content:'';width:7px;height:7px;border-radius:50%;background:var(--acc);flex:none}
/* Identyfikator — jedyne monospace w karcie obok sygnatury EFSA. */
.claim__id{margin-left:auto;font-family:var(--mono);font-size:12px;
  color:var(--ink-muted);white-space:nowrap;font-variant-numeric:tabular-nums}
.claim__sig{font-family:var(--mono);font-size:.95em}

/* Mikroetykieta — JEDYNE miejsce z wersalikami w całym serwisie. */
.eyebrow{margin:0 0 4px;font-family:var(--sans);font-size:11px;font-weight:700;
  line-height:1.35;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-muted)}

/* ── PATCH-04 P-01 — brzmienie w boxie: 16 px, waga zwykła ──────────────────
   Regresja mierzona na „Szukaj po działaniu": box niósł CZTERY sygnały
   wyróżnienia naraz — tintę, pełną szerokość karty, kegl prawie równy nazwie
   składnika (17 vs 19–20 px) i pogrubienie (500). Treść przekrzykiwała nagłówek,
   a to nagłówek odróżnia karty od siebie na liście mieszającej składniki.
   Zasada: box jest wyróżniony TINTĄ. Tinta wystarczy — kegl i waga jak w tekście
   zwykłym. Hierarchia po zmianie: nazwa składnika 20 px/500 → brzmienie 16 px/400.
   ⚠ JEDNA definicja dla wszystkich wariantów boxu (zielony, czerwony, bursztynowy,
     neutralny). Warianty różnią się WYŁĄCZNIE tłem — nie powielaj tu font-size
     ani font-weight per wariant, bo natychmiast się rozjadą (testy 1–2).
   ⚠ Zasięg wyłącznie .claim — na body/:root nie wolno tego skalować, bo H1,
     H2 i kafle KPI są zmierzone jako poprawne (patch-02 §0, testy 13–15).
   ⚠ Nie kompensuj lżejszej wagi obramowaniem, większym paddingiem ani mocniejszą
     tintą. Box ma zostać spokojny. */
.claim__text{margin:0;padding:14px 16px;border:0;
  background:var(--st-bg,var(--surface-inset));border-radius:var(--radius);
  font-size:16px;line-height:1.55;color:var(--ink);font-weight:400;quotes:none}
.claim__text::before,.claim__text::after{content:none}
/* WYTYCZNE-03 §1 — brzmienie odrzucone ma TEN SAM slot i TEN SAM stopień co
   autoryzowane; różni je wyłącznie tinta (--bad-bg przychodzi z .claim--bad).
   Nie chowaj go z powrotem do <details> — ochroną jest brak przycisków kopiowania. */
.claim__text--bad{color:var(--ink)}
/* ── PATCH-04 P-03 — tinta mówi, CO WOLNO ZROBIĆ z tekstem w boxie ───────────
     zielona  (--ok-bg)   wolno skopiować dosłownie na etykietę → tylko oficjalne PL
     bursztyn (--hold-bg) na własną odpowiedzialność            → status on hold
     czerwona (--bad-bg)  nie używać                            → odrzucone i cofnięte
     neutralna(--paper2)  tekst pomocniczy, nie do skopiowania  → tłumaczenia robocze
                                                                  i oryginały obcojęzyczne
   Karta „Estry stanoli roślinnych" pokazywała tłumaczenie pomocnicze na ZIELONYM
   tle, z tagiem „to nie jest brzmienie oficjalne" w środku i przyciskiem
   kopiującym tekst, którego na karcie nie widać — trzy sprzeczne sygnały naraz.
   Zielone tło jest obietnicą „przepisz to na etykietę"; tekst pomocniczy jej nie
   spełnia, więc schodzi na tło neutralne — to samo, którego .sec-alt--none
   używa dla treści bez akcji.
   ⚠ Specyficzność 0,2,0 celowo: reguła ma wygrać z .claim--ok/--hold niezależnie
     od kolejności w arkuszu. */
.claim .claim__text--translation{background:var(--paper2)}
.tag{display:inline-block;margin-right:.55rem;padding:3px 9px;border-radius:999px;
  font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  line-height:1.2;vertical-align:.1em;white-space:nowrap}
.tag--bad{background:var(--bad-accent);color:#fff}
/* Wypełniony bursztyn czytał się jak odznaka jakości przyznana tekstowi, a tag
   mówi dokładnie odwrotność. Zostaje obrys w tej samej rodzinie kolorów. */
.tag--hold{background:transparent;border:1px solid var(--hold-accent);color:var(--hold-fg);font-weight:600}
.claim .eyebrow{font-size:11px;font-weight:600;letter-spacing:.08em}
.claim .btn{font-size:14px}

.claim__actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:12px}
.btn{font-family:inherit;font-size:var(--fs-sm);font-weight:600;line-height:1;
  border-radius:var(--radius);padding:9px var(--space-3);cursor:pointer;
  transition:background-color .15s,border-color .15s,color .15s}
/* JEDYNY przycisk wypełniony w karcie. --brand tylko tutaj (wypełnienie), nigdy pod tekstem. */
.btn--primary{border:1px solid var(--brand);background:var(--brand);color:#fff}
.btn--primary:hover{background:var(--brand-text);border-color:var(--brand-text)}
.btn--ghost{border:1px solid var(--border);background:transparent;color:var(--brand-text)}
.btn--ghost:hover{border-color:var(--brand);background:var(--brand-tint)}
.claim__actions .link{margin-left:auto;font-size:var(--fs-sm);font-weight:600;
  color:var(--brand-text);text-decoration:none;white-space:nowrap}
.claim__actions .link:hover{text-decoration:underline}

/* Warunek — jedna linia „etykieta + wartość", bez pudełka i bez tła.
   (max-width zdjęte w PATCH-05 P-01 razem z resztą wnętrza karty.) */
.claim__cond{display:flex;flex-wrap:wrap;align-items:baseline;gap:.5rem;
  margin:12px 0 0;font-size:15px;line-height:1.5;color:var(--ink-soft)}
.claim__cond .eyebrow{margin:0;flex:none}
/* Przypis pod boxem — 14 px. Na karcie odrzuconej niesie zdanie o zakazie, które
   WCZEŚNIEJ było nagłówkiem karty mimo że brzmi identycznie na wszystkich. */
.claim__note{margin:var(--space-2) 0 0;font-size:14px;line-height:1.5;color:var(--ink-muted)}

/* ── PATCH-05 P-01 — miara 68ch dotyczy PROZY NA POZIOMIE STRONY, nie wnętrza karty ──
   --measure (68ch ≈ 544 px przy 16 px) skalibrowano na akapity, które bez ograniczenia
   ciągnęły się przez 1150 px. Wewnątrz karty o obszarze treści 842 px ta sama reguła
   cięła notki na 494–540 px, czyli 59–64% dostępnej szerokości: jednowierszowe zdania
   łamały się na dwa, a karta wyglądała na wypełnioną w połowie. Miarę wyznacza tu
   sama karta — dodatkowe ograniczenie tylko szkodzi.
   ⚠ Nie kasuj --measure globalnie. Dla .panel-lead, .section-lead, .rules p/li,
     .faq-static p i reszty prozy na poziomie strony reguła ZOSTAJE — zawężamy
     zasięg, nie usuwamy zasadę.
   ⚠ Selektor 0,1,1 wygrywa z komponentowymi 0,1,0 niezależnie od kolejności, więc
     nowy element karty nie odziedziczy 68ch przez przeoczenie. */
.claim p,.claim li,.claim blockquote,.claim dd,.claim dt{max-width:none}

/* ── PATCH-05 P-02 — skład preparatu złożonego, stan zwinięty karty ─────────
   Metadana o PRZEDMIOCIE karty, nie o oświadczeniu: stoi nad obszarem i nad
   brzmieniem. Jedna linia z separatorem „·" — nie lista, nie tabela. */
.claim__composition{margin:0;font-size:15px;line-height:1.6;color:var(--ink-muted)}
.claim__composition .eyebrow{display:block;margin:0 0 4px}
.claim__comp-none{font-style:italic}
.comp-more{margin-left:.4rem;padding:0;border:0;background:none;font-family:inherit;
  font-size:14px;font-weight:600;color:var(--brand-text);cursor:pointer;white-space:nowrap}
.comp-more:hover{text-decoration:underline}
/* PATCH-05 P-03 — pigułka „Alergen" ostrzega, ale nie mówi, CO ją wywołało.
   Wyróżnienie w linii składu daje jej adres. Bursztyn = ostrzeżenie, ta sama
   rodzina co pigułka statusu wstrzymanego — bez wprowadzania nowej barwy. */
.claim__composition mark.allergen{background:var(--hold-bg);color:var(--hold-fg);
  border-radius:3px;padding:0 4px;cursor:help;
  text-decoration:underline wavy var(--hold-accent);text-underline-offset:3px}
/* Podpis pod wartością w zwinięciu: mówi, że dziwny zapis pochodzi ze źródła. */
.claim__src-note{display:block;margin-top:3px;font-size:12px;color:var(--ink-faint)}

/* ── PATCH-04 P-02 — rytm pionowy: reguła na KAŻDYM następniku ──────────────
   Poprzednia wersja wiązała odstępy do konkretnych PAR (.eyebrow + .claim__text).
   Karta bez obszaru („Estry stanoli roślinnych") eyebrow nie ma, więc nazwa
   składnika lądowała bezpośrednio nad boxem i przyklejała się do niego — zmierzone
   1 px. Dlatego odstęp definiujemy dla każdego możliwego NASTĘPNIKA, nie dla par:
   przy każdym wariancie karty, w którym brakuje jednego elementu, para „się
   rozpina" i dwa sąsiednie znów by się skleiły.
   Warianty do sprawdzenia: z eyebrow / bez × z nazwą składnika / bez nazwy.
   ⚠ Marginesy sąsiadów SIĘ ZLEWAJĄ (max), nie sumują — .claim__head zachowuje
     swój margin-bottom, a wartość dyktuje margin-top następnika.
   ⚠ Ten blok MUSI stać ZA definicjami .claim__text i .claim__note. Obie mają
     własny skrót `margin` o tej samej specyficzności (0,1,0); przy odwrotnej
     kolejności to one wygrałyby z regułami rytmu i odstępy znów by znikły. */
.claim__head+*{margin-top:20px}
.claim__name{margin-bottom:0}
.claim__name+.eyebrow{margin-top:10px}
.claim__name+.claim__text{margin-top:16px}
.claim__name+.claim__note{margin-top:10px}
/* Nazwa + skład preparatu = jedna grupa (przedmiot karty), stąd ciasny odstęp
   nad składem i duży pod nim — przed grupą oświadczenia (PATCH-05 P-02). */
.claim__name+.claim__composition{margin-top:10px}
.claim__composition+.eyebrow,
.claim__composition+.claim__note,
.claim__composition+.claim__text{margin-top:20px}
.eyebrow+.eyebrow{margin-top:10px}
.eyebrow+.claim__note{margin-top:10px}
.eyebrow+.claim__text{margin-top:14px}
.claim__note+.claim__text{margin-top:12px}
.claim__text+.claim__actions{margin-top:16px}
.claim__text+.claim__note{margin-top:12px}
.claim__actions+.claim__cond{margin-top:16px}
.claim__note+.claim__alt{margin-top:12px}

/* Sekcja dowodowa — drugi poziom, nie ukrycie. Odstęp 14 px + linia (§2). */
.claim__evidence{margin-top:14px;border-top:1px solid var(--border);padding-top:14px}
.claim__evidence>summary{cursor:pointer;font-size:var(--fs-sm);
  font-weight:600;color:var(--brand-text);list-style:none;padding:2px 0}
.claim__evidence>summary::-webkit-details-marker{display:none}
.claim__evidence>summary::before{content:'▸ ';color:var(--ink-muted)}
.claim__evidence[open]>summary::before{content:'▾ '}
.claim__evidence dl{display:grid;grid-template-columns:minmax(120px,auto) 1fr;
  gap:.35rem var(--space-3);margin:var(--space-2) 0 0;font-size:var(--fs-sm);line-height:1.5}
.claim__evidence dt{color:var(--ink-muted);font-weight:600}
.claim__evidence dd{margin:0;color:var(--ink-soft);overflow-wrap:anywhere}
.claim__evidence a{color:var(--brand-text)}
@media(max-width:600px){.claim__evidence dl{grid-template-columns:1fr;gap:.15rem}
  .claim__evidence dt{margin-top:.5rem}}

/* ── Alternatywa dla oświadczenia odrzuconego ────────────────────────────────
   WYTYCZNE-03 §1 — na karcie zostaje TYLKO wariant konkretny (brzmienie z tego
   samego obszaru). Wariant ogólny („ten składnik ma N autoryzowanych") wyszedł
   do .sec-alt, raz pod nagłówek sekcji.
   USUNIĘTE stąd: .claim__verdict, .claim__alt--none, .claim__text--struck,
   .claim__void, .claim__void-meta — cała maszyneria chowania odrzuconej treści. */
.claim__alt{display:block;margin-top:var(--space-3);padding:var(--space-3) var(--space-4);
  background:var(--ok-bg);border-radius:var(--radius);text-decoration:none;
  font-size:var(--fs-sm);font-weight:600;color:var(--ok-fg)}
/* PATCH-04 P-01 — brzmienie alternatywy schodzi razem z .claim__text na 16/400.
   Zostawione na 17/500 byłoby WIĘKSZE niż brzmienie główne na sąsiedniej karcie. */
.claim__alt em{display:block;margin-top:6px;font-style:normal;font-size:16px;
  font-weight:400;line-height:1.55;color:var(--ink)}
.claim__alt:hover{background:#e0e8dd}
/* Ten sam komponent na poziomie SEKCJI — jeden raz, pod nagłówkiem. */
.sec-alt{display:block;margin:0 0 var(--space-4);padding:var(--space-3) var(--space-4);
  background:var(--ok-bg);border-radius:var(--radius);text-decoration:none;
  font-size:var(--fs-sm);font-weight:600;color:var(--ok-fg)}
.sec-alt:hover{background:#e0e8dd}
.sec-alt--none{background:var(--paper2);color:var(--ink-muted);font-weight:400}

/* pasek narzędzi wyników: widok (karty/tabela) + sortowanie + filtr typu + CSV */
.controls{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-3);align-items:center;max-width:var(--results-max);
  margin:var(--space-3) 0;padding:var(--space-2) 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.view-toggle{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius);overflow:hidden}
.ctl-btn{font-family:inherit;font-size:var(--fs-sm);font-weight:500;border:none;background:var(--card);color:var(--ink-soft);padding:7px 13px;cursor:pointer;transition:background .14s,color .14s}
.view-toggle .ctl-btn+.ctl-btn{border-left:1px solid var(--line)}
.ctl-btn.on{background:var(--brand-950);color:#fff}
.ctl-btn.csv{border:1px solid var(--brand-200);border-radius:var(--radius);color:var(--brand-deep);background:transparent;margin-left:auto}
.ctl-btn.csv:hover{background:var(--brand-soft)}
.ctl-sel{font-size:var(--fs-sm);color:var(--ink-soft);display:inline-flex;align-items:center;gap:6px}
.ctl-sel select{font-family:inherit;font-size:var(--fs-sm);padding:6px 8px;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--card);color:var(--ink);cursor:pointer}
.ctl-chk{font-size:var(--fs-sm);color:var(--ink-soft);display:inline-flex;align-items:center;gap:6px;cursor:pointer;user-select:none}
.ctl-chk input{cursor:pointer}

/* widok tabeli — pełny układ stały, mieści się bez przewijania w poziomie */
.results.tablewide{max-width:100%}
.tablewrap{max-width:100%;overflow-x:auto;border:1px solid var(--line);border-radius:var(--radius-card);margin-top:var(--space-2)}
table.rtab{border-collapse:collapse;width:100%;font-size:var(--fs-sm);table-layout:fixed}
.rtab th,.rtab td{text-align:left;padding:9px 11px;border-bottom:1px solid var(--line);vertical-align:top;overflow-wrap:break-word;word-break:normal}
.rtab thead th{font-weight:500;color:var(--ink-faint);text-transform:uppercase;letter-spacing:.03em;font-size:var(--fs-xs);white-space:nowrap;background:var(--surface-inset)}
.rtab tbody tr:last-child td{border-bottom:none}
.rtab tbody tr:hover{background:var(--surface-inset)}
.rtab tbody tr.t-g{box-shadow:inset 3px 0 0 var(--green-line)} .rtab tbody tr.t-y{box-shadow:inset 3px 0 0 var(--amber-line)}
.rtab tbody tr.t-r{box-shadow:inset 3px 0 0 var(--red-line)} .rtab tbody tr.t-rev{box-shadow:inset 3px 0 0 var(--rev-line)}
.rtab .t-name{font-weight:500;color:var(--brand-950)}
.rtab .t-lat{font-style:italic;font-weight:400;color:var(--ink-faint);display:block;font-size:var(--fs-xs)}
.rtab .t-combo{font-size:var(--fs-xs);background:var(--brand-soft);color:var(--brand-deep);border-radius:var(--radius);padding:1px 5px;margin-left:4px}
.rtab .t-claim{color:var(--ink)}
.rtab .t-pl{color:var(--ink)}
.rtab .t-plaux{color:var(--ink-soft);font-style:italic}
.rtab .t-pltag{display:block;font-size:var(--fs-xs);color:var(--amber);margin-top:2px;font-style:normal}
.rtab .t-dash{color:var(--ink-faint)}
.rtab .t-cond{color:var(--ink-soft)}
.rtab .t-type{font-family:var(--mono);color:var(--ink-soft)}
.rtab .t-reg a{text-decoration:none;font-weight:600}
.ctl-hint{font-size:var(--fs-sm);color:var(--ink-faint)}
.table-note{max-width:100%;font-size:var(--fs-sm);color:var(--ink-soft);margin-top:var(--space-2);line-height:1.5}
.table-note b{color:var(--ink);font-weight:500}
@media(max-width:720px){ .tablewrap{overflow-x:auto} table.rtab{min-width:640px} .ctl-hint{display:none} }

.card-foot{display:flex;gap:var(--space-2);align-items:center;flex-wrap:wrap;margin-top:var(--space-3)}
.copybtn,.detail-btn{font-size:var(--fs-sm);font-weight:500;border-radius:var(--radius);padding:var(--space-2) var(--space-3);cursor:pointer;font-family:inherit;transition:all .16s}
/* Hierarchia przycisków — było: oba z obrysem, wizualnie równe, więc żeby
   wybrać, trzeba je PRZECZYTAĆ. „Kopiuj brzmienie" to jedyna akcja, po którą
   użytkownik tu przyszedł, więc dostaje wypełnienie; reszta jest obrysem.
   Jedna karta = jeden przycisk wypełniony. */
/* .copybtn jest już tylko HAKIEM DLA JS (handler kopiowania) — wygląd niosą
   .btn--primary / .btn--ghost. Wcześniej ta reguła malowała OBA przyciski na
   brąz, bo stoi w arkuszu za nimi przy tej samej specyficzności. Nie przywracaj
   tu tła: test odbioru E8 wymaga dokładnie jednego wypełnionego przycisku. */
.copybtn{font-weight:600}
.detail-btn{border:1px solid var(--line);background:transparent;color:var(--ink-soft)}
.detail-btn:hover{border-color:var(--brand);color:var(--brand)}
/* Fokus klawiaturowy — wzorzec z Office: pierścień wyłącznie dla klawiatury,
   nigdy przy kliknięciu myszą. Arkusz nie miał tego wcale. */
.copybtn:focus-visible,.detail-btn:focus-visible,.chip:focus-visible,
.btn:focus-visible,a:focus-visible,summary:focus-visible{
  outline:2px solid var(--brand);outline-offset:2px;border-radius:var(--radius)}
.detail-btn .chev{transition:transform .2s;display:inline-block}
.detail-btn.open .chev{transform:rotate(180deg)}
/* link do oficjalnego rejestru w stopce karty (deep-link, buduje zaufanie) */
.reglink{font-size:var(--fs-sm);font-weight:500;color:var(--brand-deep);text-decoration:none;padding:var(--space-2) 0;white-space:nowrap;margin-left:auto}
.reglink:hover{text-decoration:underline}
/* ── PATCH-04 P-04 — „Wszystkie oświadczenia (N)" to NAWIGACJA, nie kopiowanie ──
   Stało w rzędzie z „Kopiuj brzmienie" i „Kopiuj z ID", w tinicie brandowej, więc
   czytało się jak trzeci przycisk tej samej rodziny — cztery akcje w jednym rzędzie
   i żadnej podpowiedzi, która z nich zmienia ekran. Zjeżdża na koniec karty i traci
   wypełnienie: zostaje linkiem. W rzędzie akcji zostają wyłącznie DWA przyciski
   kopiowania (+ „Rejestr KE ↗" dosunięty do prawej — to link, nie przycisk). */
.claim__foot{margin-top:14px;border-top:1px solid var(--border);padding-top:12px}
.claim__evidence+.claim__foot{margin-top:12px;border-top:0;padding-top:0}
.gotobtn{display:inline-block;padding:0;border:0;background:none;font-family:inherit;
  font-size:var(--fs-sm);font-weight:600;color:var(--brand-text);cursor:pointer;text-align:left}
.gotobtn:hover{text-decoration:underline}
/* pasek podsumowania celu (Szukaj po działaniu) — zastępuje długi akapit */
.goalsummary{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-3);flex-wrap:wrap;
  max-width:var(--results-max);margin:var(--space-4) 0 var(--space-3);padding-bottom:var(--space-2);border-bottom:1px solid var(--line)}
.goalsummary .gs-name{font-weight:500;font-size:var(--fs-md);color:var(--brand-950)}
.goalsummary .gs-counts{font-size:var(--fs-sm);color:var(--ink-soft)}
.goalsummary .gs-counts b{font-weight:500;color:var(--ink)}
/* stan pusty z przykładowymi pytaniami (przed pierwszym wyszukaniem) */
.starthint{max-width:var(--results-max);margin-top:var(--space-5);background:var(--surface-inset);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-4)}
.starthint .sh-lab{font-size:var(--fs-xs);font-weight:500;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:var(--space-3)}
.starthint .sh-list{display:flex;flex-direction:column;gap:2px}
.starthint button{text-align:left;border:none;background:transparent;font-family:inherit;font-size:var(--fs-base);color:var(--brand-deep);
  cursor:pointer;padding:var(--space-2);border-radius:var(--radius);transition:background .14s;width:100%}
.starthint button:hover{background:var(--brand-soft)}
.starthint button::before{content:'→';color:var(--brand);margin-right:var(--space-2);font-weight:600}
/* ===== Runda A2/B5/C7 — akcje nagłówka wyniku, świeżość, szkielety, highlight kreatora ===== */
/* C7 — szkielet ładowania (delikatny shimmer; wygaszony przy reduced-motion) */
.skeleton{position:relative;overflow:hidden;background:var(--paper2);border-radius:var(--radius)}
.skeleton::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.5),transparent);animation:sk 1.2s infinite}
@keyframes sk{100%{transform:translateX(100%)}}
@media(prefers-reduced-motion:reduce){ .skeleton::after{animation:none} }
.sk-pill{display:inline-block;height:28px;width:120px;border-radius:999px}
.sk-cards{display:flex;flex-direction:column;gap:var(--space-3);margin-top:var(--space-3)}
.sk-card{height:120px;border-radius:var(--radius-card)}
/* A2/B5 — akcje w nagłówku wyniku składnika */
.sb-actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3);margin-top:var(--space-3)}
.sb-report{font-size:var(--fs-sm);color:var(--ink-soft);text-decoration:underline;text-underline-offset:2px}
.sb-report:hover{color:var(--brand-deep)}
.sb-fresh{font-size:var(--fs-xs);color:var(--ink-faint);margin-top:var(--space-2)}
/* A2 — podświetlenie pozycji dodanej/istniejącej w kreatorze */
.kre-hl{animation:kreHl 1.7s ease}
@keyframes kreHl{0%{background:var(--brand-soft)}70%{background:var(--brand-soft)}100%{background:transparent}}
@media(prefers-reduced-motion:reduce){ .kre-hl{animation:none;outline:2px solid var(--brand);outline-offset:-2px} }

/* sekcja rozwinięta */
.detail{margin-top:var(--space-3);padding-top:var(--space-1)}
.detail-sec-h{font-size:var(--fs-xs);font-weight:500;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-faint);
  margin:var(--space-3) 0 var(--space-2);display:flex;align-items:center;gap:var(--space-2)}
.detail-sec-h::after{content:'';flex:1;height:1px;background:var(--line)}
.warnline{font-size:var(--fs-sm);padding:var(--space-2) var(--space-3);border-radius:var(--radius);line-height:1.5}
.w-y{background:var(--amber-soft);color:var(--amber-deep);border:1px solid var(--amber-line)}
.w-r{background:var(--red-soft);color:var(--red-deep);border:1px solid var(--red-line)}
.w-g{background:var(--green-soft);color:var(--green-deep);border:1px solid var(--green-line)}
.w-rev{background:var(--rev-soft);color:var(--rev-deep);border:1px solid var(--rev-line)}
.warnline b{font-weight:500}

.doserow{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:var(--space-2);margin:var(--space-1) 0}
.dosecard{background:var(--surface-inset);border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-2) var(--space-3)}
.dosecard .dl{font-size:var(--fs-xs);font-weight:500;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-faint);display:flex;align-items:center;gap:6px}
.dosecard .dv{font-size:var(--fs-sm);color:var(--ink);margin-top:3px;line-height:1.5}
/* Pudełka dawkowania — cztery warianty miały cztery kolorowe tła, co razem
   z tłem pozycji listy i tłem oryginału dawało do siedmiu kolorowych plam
   w jednej karcie. Odtąd kolor niesie ETYKIETA i cienki pasek u góry, a tło
   zostaje neutralne.
   WYJĄTEK: .warn zachowuje tintę — to jest realne ostrzeżenie i jego zadaniem
   JEST zatrzymać wzrok. Nie odbieraj mu tła „dla spójności". */
.dosecard{position:relative;overflow:hidden}
.dosecard::before{content:'';position:absolute;left:0;right:0;top:0;height:3px;background:transparent}
.dosecard.calc::before{background:var(--acc-green)} .dosecard.calc .dl{color:var(--ink-green)}
.dosecard.warn{background:var(--red-soft);border-color:var(--red-line)}
.dosecard.warn::before{background:var(--acc-red)}
.dosecard.warn .dl{color:var(--ink-red)} .dosecard.warn .dv{color:var(--red-deep)}
.dosecard.safe::before{background:var(--acc-amber)} .dosecard.safe .dl{color:var(--ink-amber)}
.dosecard.gis::before{background:var(--acc-green)}  .dosecard.gis .dl{color:var(--ink-green)}

.claim-orig{font-family:var(--mono);font-size:var(--fs-sm);color:var(--ink);margin-top:var(--space-1);line-height:1.55;background:var(--surface-inset);border-radius:var(--radius);padding:var(--space-3)}
.claim-orig .ol{font-family:var(--sans);font-size:var(--fs-xs);font-weight:500;letter-spacing:.03em;color:var(--ink-faint);display:flex;align-items:center;gap:6px;margin-bottom:var(--space-2)}
.claim-pl-help{font-size:var(--fs-sm);color:var(--ink-soft);margin-top:var(--space-2)}
.fieldlab{font-size:var(--fs-xs);font-weight:500;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-faint);margin-top:var(--space-3)}
.cond{font-size:var(--fs-sm);color:var(--ink-soft);white-space:pre-line;margin-top:var(--space-1);line-height:1.55}
.meta{font-family:var(--mono);font-size:var(--fs-sm);color:var(--ink-secondary,var(--ink-soft));margin-top:var(--space-3)}
.more-btn{display:block;margin:var(--space-2) auto var(--space-5);background:transparent;border:1px solid var(--line);color:var(--ink-soft);
  font-family:inherit;font-weight:500;font-size:var(--fs-sm);border-radius:var(--radius);padding:var(--space-3);cursor:pointer;width:100%;max-width:var(--results-max);transition:all .16s}
.more-btn:hover{border-color:var(--brand);color:var(--brand)}
.noresults{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-5);color:var(--ink-soft);margin-top:var(--space-4);max-width:var(--results-max);box-shadow:var(--shadow-sm)}

/* skaner */
textarea{width:100%;min-height:200px;font-family:inherit;font-size:var(--fs-base);padding:var(--space-3);border:1px solid var(--border-strong);border-radius:var(--radius-card);background:var(--card);color:var(--ink);resize:vertical;outline:none;transition:border .18s,box-shadow .18s;line-height:1.6}
textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(107,78,61,.14)}
.scan-out{margin-top:var(--space-4);max-width:var(--results-max)}
.flag{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--border-strong);border-radius:0 var(--radius-card) var(--radius-card) 0;padding:var(--space-3);margin-bottom:var(--space-2)}
.flag.r{border-left-color:var(--red-line)} .flag.y{border-left-color:var(--amber-line)}
.flag .f-phrase{font-weight:500;font-size:var(--fs-base);color:var(--ink)}
.flag .f-why{font-size:var(--fs-sm);color:var(--ink-soft);margin-top:var(--space-1);line-height:1.5}
.flag .f-fix{font-size:var(--fs-sm);margin-top:var(--space-2);color:var(--green-deep);font-weight:400;line-height:1.5}
mark{background:var(--amber-soft);color:inherit;border-radius:2px;padding:1px 2px;box-decoration-break:clone;-webkit-box-decoration-break:clone}
mark.mr{background:var(--red-soft)} mark.my{background:var(--amber-soft)}
.scan-out>.warnline{margin-bottom:var(--space-4)}
.preview{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-4);margin-top:var(--space-3);white-space:pre-wrap;font-size:var(--fs-base);line-height:1.7;max-width:var(--results-max);box-shadow:var(--shadow-sm)}

/* edukacja / zasady */
.rules h2{font-size:var(--fs-lg);font-weight:500;margin:var(--space-5) 0 var(--space-2);color:var(--brand-950)}
.rules h2:first-child{margin-top:0}
.rules p{margin-bottom:var(--space-3);max-width:var(--measure);color:var(--ink)}
.rules ul{margin:0 0 var(--space-3) var(--space-1);list-style:none}
.rules li{margin-bottom:var(--space-2);max-width:var(--measure);padding-left:var(--space-4);position:relative}
.rules li::before{content:'';position:absolute;left:6px;top:.62em;width:6px;height:6px;border-radius:50%;background:var(--brand)}
.threecol{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:var(--space-3);margin:var(--space-4) 0}
.lc-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-3);margin:var(--space-4) 0}   /* Etap 4 — cztery statusy jako skanowalna siatka 2×2 */
@media(max-width:720px){ .lc-grid{grid-template-columns:1fr} }
.lightcard{border-radius:var(--radius-card);padding:var(--space-4);border:1px solid;border-left-width:3px}
.lightcard h3{font-size:var(--fs-md);font-weight:500;margin-bottom:var(--space-2)}
.lightcard p{font-size:var(--fs-sm);margin:0;line-height:1.6}
/* WYTYCZNE-03 §3 — cztery kafle statusów na tokenach --ok-*/--hold-*/--bad-*,
   tych samych, co pigułki i tinty na kartach. Wcześniej brały --green-soft /
   --amber-soft / --red-soft, czyli inny zestaw odcieni dla tego samego znaczenia. */
.lc-g{background:var(--ok-bg);border-color:var(--ok-accent)}     .lc-g h3{color:var(--ok-fg)}
.lc-y{background:var(--hold-bg);border-color:var(--hold-accent)} .lc-y h3{color:var(--hold-fg)}
.lc-r{background:var(--bad-bg);border-color:var(--bad-accent)}   .lc-r h3{color:var(--bad-fg)}
.lc-rev{background:var(--rev-soft);border-color:var(--rev-line)} .lc-rev h3{color:var(--rev-deep)}
.callout{background:var(--paper2);border:1px solid var(--line);border-left:3px solid var(--brand);border-radius:var(--radius-card);padding:var(--space-4);margin:var(--space-3) 0;max-width:var(--measure)}
.callout.imp{border-left:3px solid var(--brand)}
.callout p{margin-bottom:var(--space-2)}.callout p:last-child{margin-bottom:0}
.callout ol{margin:var(--space-1) 0 0 var(--space-4)}.callout ol li{margin-bottom:var(--space-2);padding-left:var(--space-1)}.callout ol li::before{display:none}

/* ===== Etap 4 — rytm treści + progresywne ujawnianie ===== */
.lead-take{font-weight:600;color:var(--brand-950);font-size:var(--fs-md);line-height:1.35;max-width:var(--measure);margin:0 0 var(--space-2)}
.disclose{border:1px solid var(--line);border-radius:var(--radius-card);background:var(--card);margin:var(--space-3) 0;overflow:hidden}
.disclose>summary{cursor:pointer;list-style:none;padding:var(--space-3) var(--space-4);font-weight:600;color:var(--brand-950);display:flex;justify-content:space-between;align-items:center;gap:var(--space-3)}
.disclose>summary::-webkit-details-marker{display:none}
.disclose>summary::after{content:"▸";color:var(--brand);transition:transform .15s}
.disclose[open]>summary::after{transform:rotate(90deg)}
.disclose>*:not(summary){padding:0 var(--space-4) var(--space-4);margin-top:0}
.disclose>.callout{margin:0 var(--space-4) var(--space-4);padding:var(--space-4)}   /* callout w rozwijce: własny padding, bez podwójnego */
/* nagłówki sekcji w #p-about — górna linia + oddech (rules-block są już kartami, więc ich nie ruszamy) */
#p-about > h3{font-size:var(--fs-lg);color:var(--brand-950);margin:var(--space-6) 0 var(--space-3);padding-top:var(--space-4);border-top:1px solid var(--line)}
#p-about > h3:first-of-type{border-top:none;padding-top:0;margin-top:var(--space-4)}
/* tabela Ryzykowne/Bezpieczne — kolumny z delikatnym tłem statusu */
.compare td.col-risk{background:var(--red-soft)} .compare td.col-safe{background:var(--green-soft)}
.compare th:first-child{background:var(--red-soft)} .compare th:last-child{background:var(--green-soft)}
@media(prefers-reduced-motion:reduce){ .disclose>summary::after{transition:none} }
@media(max-width:720px){
  /* stack par Ryzykowne/Bezpieczne zamiast poziomego scrolla */
  .compare thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .compare{display:block;width:auto;min-width:0}   /* nadpisz min-width:520px z bazy — inaczej tekst uciekałby poza kadr */
  .compare tbody,.compare tr,.compare td{display:block;width:auto}
  .compare tr{border-bottom:1px solid var(--line);padding:var(--space-2) 0}
  .compare tr:last-child{border-bottom:0}
  .compare td{border-bottom:0;padding:var(--space-2) var(--space-3)}
  .compare td::before{display:block;font-size:var(--fs-xs);font-weight:700;text-transform:uppercase;letter-spacing:.04em;margin-bottom:2px}
  .compare td.col-risk::before{content:"Ryzykowne";color:var(--red-deep)}
  .compare td.col-safe::before{content:"Bezpieczne";color:var(--green-deep)}
}

/* CTA / lejek PlantaHerb */
.funnel{background:var(--brand-950);color:#EDE4D8;border-radius:var(--radius-card);padding:var(--space-5);margin:var(--space-5) 0 var(--space-3);max-width:var(--results-max)}
.funnel h3{font-size:var(--fs-md);font-weight:500;margin-bottom:var(--space-2);color:#fff}
.funnel p{font-size:var(--fs-sm);max-width:60ch;color:#D8CDBE;margin-bottom:var(--space-4)}
.funnel .btn{background:#fff;color:var(--brand-950)}
.funnel .btn:hover{background:#F5F2EC}
.funnel .row{display:flex;gap:var(--space-2);flex-wrap:wrap}
.funnel .btn.ghost{background:transparent;color:#EDE4D8;border-color:rgba(255,255,255,.25)}
.funnel .btn.ghost:hover{border-color:#fff;background:rgba(255,255,255,.08)}
.funnel-mini{background:var(--surface-inset);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-3) var(--space-4);margin:var(--space-4) 0 var(--space-1);display:flex;gap:var(--space-3);align-items:center;flex-wrap:wrap;justify-content:space-between;max-width:var(--results-max)}
.funnel-mini p{font-size:var(--fs-sm);color:var(--ink);margin:0;max-width:60ch}
.funnel-mini a{font-weight:500;font-size:var(--fs-sm);white-space:nowrap;color:var(--brand-deep)}
/* ===== §5 CTA — segmentacja: pasy PRODUKCYJNE (ciemne, z kolumną alertu) + karty PRAWNE (jasne) ===== */
.cta-band{background:var(--brand-950);color:#EDE4D8;border-radius:var(--radius-card);padding:var(--space-5);margin:var(--space-6) 0 var(--space-2);max-width:var(--results-max);display:grid;grid-template-columns:1fr;gap:var(--space-4)}
@media(min-width:760px){ .cta-band.has-side{grid-template-columns:1.25fr .9fr;align-items:stretch} }
.cta-band__body{display:flex;flex-direction:column;justify-content:center}
.cta-band__body h3{font-size:var(--fs-lg);font-weight:600;margin:0 0 var(--space-2);color:#fff;line-height:1.25}
.cta-band__body h3 em{font-style:italic;color:#E9D9A7}
.cta-band__body p{font-size:var(--fs-sm);color:#D8CDBE;margin:0 0 var(--space-3);max-width:62ch;line-height:1.5}
.cta-band__cta{align-self:flex-start;display:inline-block;background:#fff;color:var(--brand-950);font-weight:600;font-size:var(--fs-sm);padding:var(--space-3) var(--space-4);border-radius:var(--radius);text-decoration:none}
.cta-band__cta:hover{background:#F5F2EC}
.cta-band__side{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:var(--radius-card);padding:var(--space-4)}
.cta-band__side h4{font-size:var(--fs-md);font-weight:600;margin:0 0 var(--space-2);color:#fff}
.cta-band__side p{font-size:var(--fs-xs);color:#D8CDBE;margin:0 0 var(--space-3);line-height:1.45}
.alert-form{display:flex;flex-direction:column;gap:var(--space-2)}
.alert-form label{font-size:var(--fs-xs);color:#C9BEAE;font-weight:500}
.alert-form input[type=email]{width:100%;box-sizing:border-box;padding:var(--space-2) var(--space-3);border-radius:var(--radius);border:1px solid rgba(255,255,255,.2);background:rgba(255,255,255,.95);color:var(--ink);font-size:var(--fs-sm);font-family:inherit}
.alert-form button{background:#E9D9A7;color:var(--brand-950);border:0;font-weight:600;font-size:var(--fs-sm);font-family:inherit;padding:var(--space-3) var(--space-4);border-radius:var(--radius);cursor:pointer}
.alert-form button:hover{background:#F0E4BF}
.alert-form button[disabled]{opacity:.6;cursor:default}
.alert-form__note{font-size:var(--fs-xs);color:#B8AD9C;margin:var(--space-2) 0 0;line-height:1.4}
.alert-form__msg{font-size:var(--fs-sm);margin:var(--space-2) 0 0;min-height:1.1em;color:#E9D9A7}
.alert-form__msg.err{color:#F3B7A6}
.alert-hp{position:absolute!important;left:-9999px!important;width:1px;height:1px;overflow:hidden}
.cta-card{background:var(--surface-inset);border:1px solid var(--line);border-left:4px solid var(--brand-deep);border-radius:var(--radius-card);padding:var(--space-4) var(--space-5);margin:var(--space-6) 0 var(--space-2);max-width:var(--results-max);box-shadow:var(--shadow-sm)}
.cta-card__body h3{font-size:var(--fs-md);font-weight:600;margin:0 0 var(--space-2);color:var(--brand-950)}
.cta-card__body p{font-size:var(--fs-sm);color:var(--ink);margin:0 0 var(--space-3);max-width:64ch;line-height:1.5}
.cta-card__cta{display:inline-block;font-weight:600;font-size:var(--fs-sm);color:var(--brand-deep);text-decoration:none}
.cta-card__cta:hover{text-decoration:underline}
/* §3.2 — box „Nie wiesz, od czego zacząć?" (odwzorowanie #manufacturing-cta z b2b.plantaherb.pl na nasze zmienne,
   bez Tailwinda i bez zewnętrznego obrazu — CSP img-src 'self' data:). Nagłówek to h3 (panel ma już swój h2). */
.cta-b2b{background:linear-gradient(135deg,var(--brand-950),var(--brand-deep));color:#EDE4D8;border-radius:var(--radius-card);margin:var(--space-6) auto var(--space-2);max-width:var(--results-max);box-shadow:0 18px 40px -14px rgba(45,29,27,.45);overflow:hidden;display:flex;flex-direction:column}
.cta-b2b__body{display:flex;flex-direction:column;gap:var(--space-4);max-width:64ch;padding:var(--space-6) var(--space-5)}
.cta-b2b__h{font-size:var(--fs-lg);font-weight:600;color:#fff;margin:0;line-height:1.18}
.cta-b2b__h b{color:#79bd25;font-weight:600}
.cta-b2b__h em{font-style:normal;color:#79bd25}
.cta-b2b p{font-size:var(--fs-sm);color:#E7DCCD;margin:0;line-height:1.55}
.cta-b2b p em{color:#fff;font-style:italic}
.cta-b2b p strong{color:#fff;font-weight:600}
.cta-b2b__cta{align-self:flex-start;background:#F3EEE6;color:var(--brand-950);font-weight:600;font-size:var(--fs-sm);padding:var(--space-3) var(--space-4);border-radius:var(--radius);text-decoration:none;text-transform:lowercase;display:inline-flex;gap:var(--space-2);align-items:center}
.cta-b2b__cta:hover{background:#fff}
.cta-b2b__media{display:none}
@media(min-width:900px){
  .cta-b2b{flex-direction:row;align-items:stretch}
  .cta-b2b__body{flex:1;justify-content:center;max-width:none}
  .cta-b2b__media{display:block;flex:0 0 38%;max-width:340px;width:100%;object-fit:cover;align-self:stretch}
}
/* ===== Etap 7 — lekki wariant CTA (pasek tekst + przycisk, BEZ obrazu) — redukcja „ślepoty banerowej" ===== */
.cta-inline{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);flex-wrap:wrap;
  background:var(--surface-inset);border:1px solid var(--line);border-left:3px solid var(--brand);border-radius:var(--radius-card);
  padding:var(--space-3) var(--space-4);margin:var(--space-5) 0;max-width:var(--results-max)}
.cta-inline .ci-txt{max-width:var(--measure);font-size:var(--fs-sm);color:var(--ink);line-height:1.55}
.cta-inline .ci-txt b{color:var(--brand-950)} .cta-inline .ci-txt em{font-style:italic;color:var(--brand-deep)}
.cta-inline .ci-btn{flex-shrink:0;background:var(--brand);color:#fff;font-weight:600;font-size:var(--fs-sm);min-height:44px;padding:0 var(--space-4);border-radius:var(--radius);text-decoration:none;display:inline-flex;align-items:center;white-space:nowrap}
.cta-inline .ci-btn:hover{background:var(--brand-deep);color:#fff}
@media(max-width:600px){ .cta-inline .ci-btn{width:100%;justify-content:center} }
@media print{ .cta-b2b,.cta-inline{display:none} }

/* stopka / noty */
.disc{background:var(--surface-hero);border-top:1px solid var(--line);margin-top:var(--space-6);padding:var(--space-5) 0 var(--space-4);font-size:var(--fs-sm);color:var(--ink-soft)}
.disc h4{color:var(--ink);font-size:var(--fs-md);font-weight:500;margin-bottom:var(--space-2)}
.disc p{margin-bottom:var(--space-2);max-width:90ch}
/* §1.2/§1.3 — sekcje referencyjne (Źródła i zastrzeżenia + Nota prawna + Zasady i prawo) na pełną szerokość kontenera, 2 kolumny ≥1024px.
   Bloki narzędziowe (leady paneli, answer-block) zostają na czytelnych 65ch — nie ruszamy ich. */
#p-about .callout{max-width:none}
#p-about > p:not(.panel-lead){max-width:none}
.disc p{max-width:none}
/* „Zasady i prawo" — tekst na pełną szerokość kontenera (nie wąska kolumna 65ch); lead panelu zostaje czytelny */
#p-rules p:not(.panel-lead),
#p-rules li,
#p-rules .callout{max-width:none}
/* „Zasady i prawo" — treść podzielona na wyraźne sekcje-panele (po zmianie na pełną szerokość wszystko zlewało się w jedno) */
#p-rules .rules-block{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-5) var(--space-6) var(--space-6);margin:0 0 var(--space-5);box-shadow:var(--shadow-sm)}
#p-rules .rules-block>*:first-child{margin-top:0}
#p-rules .rules-block>h3{margin-top:0}
#p-rules .rules-block .callout{background:var(--surface-inset)}
@media(min-width:1024px){
  #p-about > ul,
  #p-about .callout ol{columns:2;column-gap:var(--space-6)}
  #p-about > ul > li,
  #p-about .callout ol > li{break-inside:avoid;-webkit-column-break-inside:avoid}
  #p-rules .rules-block > ul{columns:2;column-gap:var(--space-6)}
  #p-rules .rules-block > ul > li{break-inside:avoid;-webkit-column-break-inside:avoid}
  .disc .wrap{columns:2;column-gap:var(--space-6)}
  .disc .wrap h4{column-span:all;-webkit-column-span:all;margin-bottom:var(--space-3)}
  .disc .wrap p{break-inside:avoid;-webkit-column-break-inside:avoid}
}
.foot{padding:var(--space-3) 0 var(--space-5);font-size:var(--fs-sm);color:var(--ink-faint);border-top:1px solid var(--line);background:var(--surface-hero)}
.foot img{height:18px;vertical-align:middle;opacity:.7;margin-right:6px}

/* ===== Nagłówek marki — odwzorowanie b2b.plantaherb.pl (Zadanie 3) ===== */
.b2bhead{background:var(--surface-hero);border-bottom:1px solid var(--line)}
.b2bhead>.wrap{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);padding:var(--space-2) var(--space-4);min-height:54px}
.b2bhead .b2b-logo{display:inline-flex;align-items:center;flex-shrink:0}
.b2bhead .b2b-logo img{height:28px;width:auto;display:block}
.b2bnav{display:flex;align-items:center;gap:var(--space-4);flex:1;justify-content:center;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.b2bnav::-webkit-scrollbar{display:none}
.b2bnav a{color:var(--brand-950);font-weight:500;font-size:var(--fs-sm);text-decoration:none;white-space:nowrap;padding:6px 0;border-bottom:2px solid transparent}
.b2bnav a:hover{color:var(--brand)}
.b2bnav a.active{color:var(--brand);border-bottom-color:var(--brand);font-weight:600}
.b2bhead .b2bcta{flex-shrink:0;background:var(--brand);color:#fff;font-weight:600;font-size:var(--fs-sm);padding:9px 15px;border-radius:var(--radius);text-decoration:none;white-space:nowrap}
.b2bhead .b2bcta:hover{background:var(--brand-deep);color:#fff}
/* Etap 3 — hamburger (widoczny ≤960px; menu chowa się pod przycisk) */
.b2b-burger{display:none;align-items:center;justify-content:center;width:48px;height:48px;flex:none;
  border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--card);color:var(--brand-950);cursor:pointer}
.b2b-burger svg{width:22px;height:22px;stroke:currentColor;stroke-width:2;fill:none}
.b2b-burger .ic-x{display:none}
.b2b-burger[aria-expanded="true"] .ic-bars{display:none}
.b2b-burger[aria-expanded="true"] .ic-x{display:block}
@media(max-width:960px){
  .b2bhead>.wrap{flex-wrap:nowrap;gap:var(--space-2);padding:var(--space-2) var(--space-3);position:relative;justify-content:flex-start}
  .b2b-burger{display:inline-flex;margin-left:auto}
  .b2bnav{position:absolute;top:100%;left:0;right:0;flex-direction:column;align-items:stretch;justify-content:flex-start;
    gap:0;background:var(--card);border-bottom:1px solid var(--line);box-shadow:var(--shadow-md);
    padding:var(--space-2) var(--space-3);display:none;z-index:55;max-height:calc(100vh - 56px);overflow-y:auto;overflow-x:hidden}
  .b2bhead.nav-open .b2bnav{display:flex}
  .b2bnav a{min-height:48px;display:flex;align-items:center;padding:0 var(--space-1);border-bottom:1px solid var(--line);white-space:normal}
  .b2bnav a:last-child{border-bottom:none}
  .b2bnav a.active{border-bottom-color:var(--line);color:var(--brand)}
}
/* §2.1 — przyklejone menu marki na DESKTOPIE (≥1024px): logo+nav+CTA lepią się u góry, zakładki tuż pod nimi.
   Na mobile menu zawija się do ~139px → sticky byłby zbójem ekranu; tam przyklejony zostaje sam pasek zakładek
   (główna nawigacja narzędzia). Pasek prawny (.notice) przewija się — pełna nota jest na dole. Bez WordPressa → zero offsetów admin-bar.
   Warunek działania: html/body mają overflow-x:clip (nie hidden) — inaczej position:sticky top:0 nie trzyma. */
@media(min-width:1024px){
  .b2bhead{position:sticky;top:0;z-index:50;transition:box-shadow .15s ease,padding .15s ease}
  .b2bhead.is-scrolled{box-shadow:0 2px 12px rgba(28,27,24,.10)}
  .b2bhead.is-scrolled>.wrap{padding-top:6px;padding-bottom:6px;min-height:44px}
  .tabwrap{top:var(--tabtop,56px)}
  section.panel{scroll-margin-top:calc(var(--tabtop,56px) + 60px)}
}
@media(prefers-reduced-motion:reduce){ .b2bhead{transition:none} .tabwrap{transition:none} }
/* ===== Stopka marki — odwzorowanie b2b.plantaherb.pl (Zadanie 3) ===== */
.b2bfoot{background:var(--surface-hero);border-top:1px solid var(--line);color:var(--ink-soft);padding:var(--space-6) 0 var(--space-4);margin-top:var(--space-6)}
.b2bfoot a{color:var(--brand);text-decoration:none}
.b2bfoot a:hover{color:var(--brand-deep);text-decoration:underline}
.b2bfoot .cols{display:grid;grid-template-columns:1.6fr 1fr 1fr;gap:var(--space-5)}
.b2bfoot h3{color:var(--brand-950);font-size:var(--fs-sm);font-weight:600;text-transform:uppercase;letter-spacing:.05em;margin:0 0 var(--space-3)}
.b2bfoot ul{list-style:none;display:flex;flex-direction:column;gap:var(--space-2);font-size:var(--fs-sm)}
.b2bfoot .b2bf-brand img{height:30px;width:auto;margin-bottom:var(--space-3);display:block}
.b2bfoot .b2bf-co{font-size:var(--fs-sm);line-height:1.7;color:var(--ink-soft)}
.b2bfoot .b2bf-co b{color:var(--ink);font-weight:600}
.b2bfoot .b2bf-co a{color:var(--ink-soft)}
.b2bfoot .b2bf-social{display:flex;gap:var(--space-3);margin-top:var(--space-3)}
.b2bfoot .b2bf-social a{display:inline-flex}
.b2bfoot .b2bf-social svg{width:22px;height:22px;fill:var(--ink-faint)}
.b2bfoot .b2bf-social a:hover svg{fill:var(--brand)}
.b2bfoot .b2bf-bottom{border-top:1px solid var(--line);margin-top:var(--space-5);padding-top:var(--space-3);font-size:var(--fs-xs);color:var(--ink-faint);display:flex;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap}
@media(max-width:720px){ .b2bfoot .cols{grid-template-columns:1fr;gap:var(--space-4)} }
/* ===== Bramka e-mail (Zadanie 5) — reużywa .modal-bg ===== */
.phg-modal{position:relative;background:var(--card);border-radius:var(--radius-card);max-width:460px;width:100%;padding:var(--space-5);box-shadow:0 20px 60px rgba(0,0,0,.28);max-height:90vh;overflow-y:auto}
.phg-modal h3{color:var(--brand-950);font-size:var(--fs-lg);font-weight:600;margin:0 0 var(--space-2);padding-right:24px}
.phg-modal .phg-sub{color:var(--ink-soft);font-size:var(--fs-sm);margin-bottom:var(--space-4);line-height:1.5}
.phg-modal label.phg-flab{display:block;font-size:var(--fs-sm);font-weight:500;color:var(--ink);margin-bottom:var(--space-1)}
.phg-modal input[type=email]{width:100%;padding:12px 14px;border:1px solid var(--border-strong);border-radius:var(--radius);font-family:inherit;font-size:var(--fs-base);color:var(--ink);outline:none}
.phg-modal input[type=email]:focus{border-color:var(--brand)}
.phg-hp{position:absolute!important;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden}
.phg-consent{display:flex;gap:var(--space-2);align-items:flex-start;margin:var(--space-3) 0 0;font-size:var(--fs-sm);color:var(--ink-soft);line-height:1.5}
.phg-consent input{margin-top:3px;flex-shrink:0;width:16px;height:16px}
.phg-err{color:var(--red-line,#B42318);font-size:var(--fs-sm);margin-top:var(--space-2);min-height:1.1em}
.phg-actions{display:flex;gap:var(--space-2);margin-top:var(--space-4);align-items:center}
.phg-close{background:transparent;border:none;color:var(--ink-faint);font-size:24px;cursor:pointer;position:absolute;top:8px;right:12px;line-height:1;font-family:inherit}
.phg-close:hover{color:var(--ink)}
.phg-ok{text-align:center;padding:var(--space-3) 0}
.phg-ok .phg-check{font-size:38px;color:var(--brand);line-height:1}
.phg-note{font-size:var(--fs-xs);color:var(--ink-faint);margin-top:var(--space-3);line-height:1.4}

/* modal */
.modal-bg{position:fixed;inset:0;background:rgba(28,27,24,.5);display:flex;align-items:center;justify-content:center;z-index:80;padding:20px}
.modal{background:var(--card);border-radius:var(--radius-card);max-width:640px;width:100%;padding:var(--space-5);box-shadow:var(--shadow-lg);max-height:88vh;overflow:auto}
.modal h2{color:var(--brand-950);margin-bottom:var(--space-3);font-size:var(--fs-lg);font-weight:500}
.modal p,.modal li{font-size:var(--fs-sm);color:var(--ink-soft);line-height:1.6}
.modal p{margin-bottom:var(--space-3)}
.modal ul{margin:var(--space-3) 0 var(--space-4) var(--space-1);list-style:none}
.modal li{margin-bottom:var(--space-2);padding-left:var(--space-4);position:relative}
.modal li::before{content:'';position:absolute;left:5px;top:.62em;width:6px;height:6px;border-radius:50%;background:var(--brand)}
.modal .btn{width:100%}
.hidden{display:none!important}

@media(max-width:720px){
  .wrap{padding:0 var(--space-3)}
  header{padding:var(--space-3) 0 var(--space-4)} h1.hero{font-size:clamp(15px,5vw,24px);margin:var(--space-3) 0 var(--space-2)}  /* płynne zmniejszanie na wąskich ekranach → 2. linia (— wyszukiwarka składników beta) mieści się w jednej linii = 2 linie łącznie */
  /* R2-6 A — kompaktowe ROZWIJANE menu modułów (zamiast wysokiej siatki 2×3); maska/scroll z Etapu 2 wyłączone */
  .tabwrap{overflow:visible;-webkit-mask-image:none;mask-image:none;position:sticky;top:0}
  .tabwrap .wrap{position:relative;padding-top:8px;padding-bottom:8px}
  .tabs-trigger{display:flex;align-items:center;gap:var(--space-2);width:100%;min-height:52px;padding:0 var(--space-3);
    background:var(--card);border:1px solid var(--border-strong);border-radius:var(--radius);
    font-family:inherit;font-size:var(--fs-base);font-weight:600;color:var(--brand-950);cursor:pointer}
  .tabs-trigger .tt-ic{display:inline-flex;width:22px;height:22px;color:var(--brand);flex:none}
  .tabs-trigger .tt-ic svg{width:22px;height:22px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
  .tabs-trigger .tt-lab{flex:1;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .tabs-trigger .tt-chev{width:20px;height:20px;flex:none;stroke:var(--ink-soft);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .18s}
  .tabwrap.tabs-open .tabs-trigger .tt-chev{transform:rotate(180deg)}
  .tabwrap.tabs-open{z-index:70}   /* nakładka menu: nad autocomplete(60) i sticky-barami(20), pod modalem(80) */
  nav.tabs{position:absolute;left:var(--space-3);right:var(--space-3);top:calc(100% - 2px);display:none;flex-direction:column;gap:0;
    background:var(--card);border:1px solid var(--border-strong);border-radius:var(--radius-card);box-shadow:var(--shadow-md);overflow:hidden;width:auto}
  .tabwrap.tabs-open nav.tabs{display:flex}
  .tab{justify-content:flex-start;gap:var(--space-2);min-height:48px;width:100%;border:none;border-radius:0;margin-bottom:0;
    white-space:normal;line-height:1.2;padding:10px var(--space-3);background:var(--card);border-bottom:1px solid var(--line)}
  .tab:last-child{border-bottom:none}
  .tab.active{background:var(--brand-soft);box-shadow:inset 3px 0 0 var(--brand)}
  .tab .tlab{display:inline} .tab .tlab-s{display:none}   /* w rozwijanej liście jest miejsce → pełne etykiety */
  section.panel{scroll-margin-top:190px}
  .chips{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}
  .card{padding:var(--space-3)} .modal{padding:var(--space-4)}
  .doserow{grid-template-columns:1fr} .statusbar .sb-row{grid-template-columns:1fr}
  .btn,.copybtn{min-height:44px}
}
/* ===== Etap 3 — globalne dopięcia RWD ===== */
@media(max-width:720px){
  input,select,textarea{font-size:16px}                 /* anty-zoom iOS: min 16px w polach */
  .phg-modal input[type=email]{font-size:16px}          /* ta sama ochrona dla pola e-mail w bramce (wyższa specyficzność bazowej reguły) */
  .chip{min-height:48px}                                 /* R2-6 D4 — wygodny target dotykowy */
  .hero-explainer summary,.howto summary{min-height:44px;padding:8px 0}
  .hero-search input,.hero-search #qbtn{min-height:52px} /* duże pole szukania na całą szerokość */
  .view-toggle{display:none}                             /* R2-6 B — na telefonie wyłącznie widok kart (tabela nieczytelna) */
  .starthint button{min-height:48px}                     /* R2-6 D4 — chipy „popularne pytania" */
  .cta-b2b__cta,.cta-band__cta,.cta-inline .ci-btn{min-height:48px}   /* R2-6 D4 — przyciski CTA */
  .sb-actions .btn{min-height:48px}                     /* A2 — „Dodaj do kreatora" wygodny do dotyku */
}
/* R2-6: ≤400px swap etykiet USUNIĘTY — rozwijana lista modułów ma pełną szerokość, więc pełne etykiety mieszczą się na każdym telefonie */
@media(max-width:600px){
  .scan-actions{flex-direction:column} .scan-actions .btn{width:100%}
  .modal-bg{padding:var(--space-3);
    padding-top:max(var(--space-3),env(safe-area-inset-top));padding-bottom:max(var(--space-3),env(safe-area-inset-bottom));
    padding-left:max(var(--space-3),env(safe-area-inset-left));padding-right:max(var(--space-3),env(safe-area-inset-right))}
  .phg-modal,.modal{max-height:90vh}
  .phg-actions .btn,.phg-actions button:not(.phg-close),.modal .btn{min-height:48px}
}
@media print{ .notice,.tabwrap,.funnel,.funnel-mini,.cta-band,.cta-card,.cta-inline,.chips,.langbar,.modal-bg{display:none} details.claim__evidence>summary{display:none} details.claim__evidence{border-top:0} }

/* ============ KREATOR SKŁADU (Zadanie 6) ============ */
.kre-intro{max-width:var(--results-max)}
.kre-note-legal{font-size:var(--fs-sm);color:var(--ink-soft);background:var(--surface-inset);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-3);margin-top:var(--space-3);max-width:var(--results-max);line-height:1.55}
.kre-note-legal b{color:var(--brand-950);font-weight:500}
.disclaimer{background:var(--paper2);border-left:3px solid var(--brand)}   /* Etap 1: lewy akcent na boksie disclaimera kreatora (bg = paper2 = surface-inset) */
.kre-add{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-3) var(--space-4);margin-top:var(--space-4);max-width:var(--results-max);box-shadow:var(--shadow-sm)}
.kre-add .kre-add-lab{font-size:var(--fs-xs);font-weight:500;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:var(--space-2)}
.kre-add-grid{display:grid;grid-template-columns:minmax(0,1.6fr) 110px 96px auto;gap:var(--space-2);align-items:stretch}
.kre-add-grid input,.kre-add-grid select{font-family:inherit;font-size:var(--fs-base);height:44px;padding:0 var(--space-3);border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--card);color:var(--ink);min-width:0}
.kre-add-grid input:focus,.kre-add-grid select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-ring)}
/* WYTYCZNE-03 §3 — natywny <select> zostawiał systemową strzałkę i systemową
   wysokość, więc obok pól tekstowych wyglądał jak element innego produktu. */
.kre-add-grid select{appearance:none;-webkit-appearance:none;padding-right:34px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B6259' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 10px center;background-size:16px 16px}
.kre-add-grid input::placeholder{color:var(--ink-faint)}
.kre-add-hint{font-size:var(--fs-sm);color:var(--ink-soft);margin-top:var(--space-2)}
.kre-picks{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-3)}
.kre-pick{height:30px;padding:0 var(--space-3);display:inline-flex;align-items:center;font-size:var(--fs-sm);border:1px solid var(--brand-200);border-radius:20px;background:var(--card);color:var(--brand-deep);cursor:pointer;transition:background .14s}
.kre-pick:hover{background:var(--brand-soft)}
.kre-list{margin-top:var(--space-4);max-width:var(--results-max);display:flex;flex-direction:column;gap:var(--space-3)}
.kre-item{background:var(--surface-inset);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-3) var(--space-4)}
.kre-item-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-3);margin-bottom:var(--space-2)}
.kre-item-name{font-weight:500;font-size:var(--fs-md);color:var(--brand-950)}
.kre-item-name .kre-type{font-weight:400;font-size:var(--fs-xs);color:var(--ink-faint);text-transform:uppercase;letter-spacing:.04em;margin-left:var(--space-2)}
.kre-item-dose{font-size:var(--fs-sm);color:var(--ink-soft);margin-left:var(--space-2)}
.kre-rm{border:none;background:transparent;color:var(--ink-faint);cursor:pointer;font-size:var(--fs-sm);padding:2px 6px;border-radius:var(--radius);white-space:nowrap}
.kre-rm:hover{background:var(--red-soft);color:var(--red-deep)}
.kre-assess{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:var(--space-2)}
.kre-a{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-2) var(--space-3)}
.kre-a .ka-l{font-size:var(--fs-xs);font-weight:500;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-faint);display:flex;align-items:center;gap:6px}
.kre-a .ka-v{font-size:var(--fs-sm);color:var(--ink);margin-top:3px;line-height:1.5}
.kre-a.ok{background:var(--green-soft);border-color:var(--green-line)} .kre-a.ok .ka-l{color:var(--green-deep)} .kre-a.ok .ka-v{color:var(--green-deep)}
.kre-a.warn{background:var(--amber-soft);border-color:var(--amber-line)} .kre-a.warn .ka-l{color:var(--amber)} .kre-a.warn .ka-v{color:var(--amber-deep)}
.kre-a.over{background:var(--red-soft);border-color:var(--red-line)} .kre-a.over .ka-l{color:var(--red)} .kre-a.over .ka-v{color:var(--red-deep)}
.kre-a a{font-weight:500}
/* korekta „jednym ruchem" przy podejrzeniu pomyłki jednostki (spec §2.2 Krok 1) */
.kre-fixunit{display:inline-block;margin-left:6px;font:600 var(--fs-xs)/1 inherit;font-family:inherit;color:#fff;background:var(--amber-deep,#8a5a00);border:none;border-radius:999px;padding:4px 10px;cursor:pointer;white-space:nowrap}
.kre-fixunit:hover{filter:brightness(1.08)} .kre-fixunit:focus-visible{outline:2px solid var(--amber-deep,#8a5a00);outline-offset:2px}
.kre-empty{max-width:var(--results-max);margin-top:var(--space-4);background:var(--surface-inset);border:1px dashed var(--border-strong);border-radius:var(--radius-card);padding:var(--space-5) var(--space-4);text-align:center;color:var(--ink-soft)}
.kre-empty b{color:var(--brand-950);font-weight:500}
.kre-sum{max-width:var(--results-max);margin-top:var(--space-4);background:var(--card);border:1px solid var(--line);border-radius:var(--radius-card);padding:var(--space-4);box-shadow:var(--shadow-sm)}
.kre-sum h3{font-size:var(--fs-md);color:var(--brand-950);margin-bottom:var(--space-2)}
.kre-sum-row{display:flex;gap:var(--space-2);align-items:center;font-size:var(--fs-sm);color:var(--ink);padding:var(--space-1) 0}
.kre-sum-row .dot-r{width:8px;height:8px;border-radius:50%;flex:none}
/* Etap 3 — jawna suma gramatury w #kreSum (na mobile, gdy tabela z tfoot jest ukryta) */
.kre-sum-total{display:none;justify-content:space-between;align-items:baseline;gap:var(--space-3);
  margin:0 0 var(--space-2);padding-bottom:var(--space-2);border-bottom:1px solid var(--line);font-size:var(--fs-base)}
.kre-sum-total b{color:var(--brand-950);font-size:var(--fs-md);font-weight:600;white-space:nowrap}
.kre-sum-total .kre-miss{font-size:var(--fs-sm);color:var(--ink-faint);font-weight:400}
.kre-actions{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-3)}
/* autouzupełnianie */
.kre-ac-wrap{position:relative;width:100%}
.kre-ac-wrap>input{width:100%}
.kre-ac{position:absolute;top:100%;left:0;right:0;z-index:30;background:var(--card);border:1px solid var(--border-strong);border-top:none;border-radius:0 0 var(--radius) var(--radius);box-shadow:var(--shadow-md);max-height:264px;overflow-y:auto}
.kre-ac-item{padding:8px var(--space-3);cursor:pointer;font-size:var(--fs-sm);color:var(--ink);border-top:1px solid var(--line-soft)}
.kre-ac-item:first-child{border-top:none}
.kre-ac-item:hover,.kre-ac-item.on{background:var(--brand-soft);color:var(--brand-deep)}
/* kategoria -> pasujące składniki */
.kre-cat{margin-top:var(--space-3);display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:center}
.kre-cat-lab{font-size:var(--fs-sm);color:var(--ink-soft)}
.kre-cat-sel{height:38px;border:1px solid var(--border-strong);border-radius:var(--radius);padding:0 var(--space-2);font-family:inherit;font-size:var(--fs-sm);background:var(--card);color:var(--ink)}
.kre-catsug{width:100%;display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:2px}
.kre-catsug-lab{width:100%;font-size:var(--fs-xs);color:var(--ink-faint);margin-bottom:2px}
/* przełącznik widoku */
.kre-viewtoggle{display:flex;gap:var(--space-1);margin:var(--space-4) 0 var(--space-2);max-width:var(--results-max)}
.kre-vbtn{border:1px solid var(--brand-200);background:var(--card);color:var(--brand-deep);font-family:inherit;font-size:var(--fs-sm);font-weight:500;padding:8px var(--space-3);border-radius:var(--radius);cursor:pointer}
.kre-vbtn.on{background:var(--brand-950);color:#fff;border-color:var(--brand-950)}
/* tabela składu */
.kre-table{max-width:var(--results-max)}
.kre-tbl-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--radius-card)}
.kre-tbl{width:100%;border-collapse:collapse;font-size:var(--fs-sm);min-width:660px}
.kre-tbl th{text-align:left;font-weight:500;color:var(--ink-faint);text-transform:uppercase;letter-spacing:.03em;font-size:var(--fs-xs);padding:var(--space-2) var(--space-3);background:var(--surface-inset);border-bottom:1px solid var(--line);white-space:nowrap}
.kre-tbl td{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line);vertical-align:middle}
.kre-td-name{font-weight:500;color:var(--brand-950)}
.kre-td-type{display:block;font-size:var(--fs-xs);color:var(--ink-faint);font-weight:400;text-transform:none;letter-spacing:0}
.kre-td-dose,.kre-td-status{white-space:nowrap}
.kre-dose-edit{width:74px;height:34px;border:1px solid var(--border-strong);border-radius:var(--radius);padding:0 8px;font-family:inherit;font-size:var(--fs-sm);text-align:right;color:var(--ink);background:var(--card)}
.kre-unit-edit{height:34px;border:1px solid var(--border-strong);border-radius:var(--radius);margin-left:4px;font-family:inherit;font-size:var(--fs-sm);background:var(--card);color:var(--ink)}
.kre-dose-edit:focus,.kre-unit-edit:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(107,78,61,.14)}
.kre-tbl tfoot .kre-tbl-sum td{font-weight:600;color:var(--brand-950);background:var(--surface-inset);border-bottom:none}
/* ── PATCH-04 P-05 — legenda kreatora ───────────────────────────────────────
   Było: 110 słów w jednym akapicie, na stałe rozwinięte, w środku innerHTML
   tabeli. Jest: zwinięte <details> pod tabelą, treść skrócona bez utraty faktów
   (znaczenie myślnika, lista składników zależnych od formy, link do wykazu GIS,
   warunek pojawiania się % NRV, podstawa prawna braku NRV i kategorie bez NRV).
   Nie skracaj bardziej — każdy z tych faktów musi zostać. */
details.kre-legend{margin:var(--space-3) 0 0;padding:var(--space-2) 0;border-top:1px solid var(--line);max-width:var(--results-max)}
details.kre-legend>summary{cursor:pointer;list-style:none;font-size:var(--fs-sm);font-weight:600;color:var(--brand-text)}
details.kre-legend>summary::-webkit-details-marker{display:none}
details.kre-legend>summary::before{content:'▸ ';color:var(--ink-muted)}
details.kre-legend[open]>summary::before{content:'▾ '}
details.kre-legend p{margin:var(--space-2) 0 0;font-size:var(--fs-sm);line-height:1.55;color:var(--ink)}
details.kre-legend ul{margin:var(--space-2) 0 0;padding-left:var(--space-4);font-size:var(--fs-sm);line-height:1.6;color:var(--ink-soft)}
details.kre-legend li{margin:0 0 6px} details.kre-legend b{color:var(--ink)}
/* Myślnik objaśnia się sam — bez rozwijania legendy (P-05). */
.kre-dash{border-bottom:1px dotted var(--border);cursor:help}
.kre-rm-x{font-size:var(--fs-md);line-height:1;padding:2px 8px}
.kre-item-edit{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.kre-td-osw{white-space:nowrap}
.kre-td-osw .osw-a{color:var(--green-deep);font-weight:500}
.kre-td-osw .osw-h{color:var(--amber);font-weight:500}
.kre-desc-h{max-width:var(--results-max);margin:var(--space-5) 0 var(--space-2);font-size:var(--fs-md);font-weight:500;color:var(--brand-950);padding-bottom:var(--space-2);border-bottom:1px solid var(--line)}
/* zwijane karty składników — spójne z kartami wyszukiwarki */
.kre-card{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--border-strong);border-radius:0 var(--radius-card) var(--radius-card) 0;overflow:hidden;box-shadow:var(--shadow-sm);transition:box-shadow .16s}
.kre-card[open]{box-shadow:var(--shadow-md)}
.kre-card-g{border-left-color:var(--green-line)} .kre-card-y{border-left-color:var(--amber-line)} .kre-card-r{border-left-color:var(--red-line)}
.kre-card-sum{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-3) var(--space-4);flex-wrap:wrap}
.kre-card-sum::-webkit-details-marker{display:none}
.kre-card-sum:hover{background:var(--surface-inset)}
.kcs-main{display:flex;align-items:baseline;gap:var(--space-2);flex-wrap:wrap;min-width:0}
.kcs-name{font-weight:500;font-size:var(--fs-md);color:var(--brand-950)}
.kcs-type{font-size:var(--fs-xs);color:var(--ink-faint);text-transform:uppercase;letter-spacing:.04em}
.kcs-meta{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}
.kcs-dose{font-size:var(--fs-sm);color:var(--ink-soft);font-weight:500}
.kcs-badge{font-size:var(--fs-xs);font-weight:500;padding:2px 9px;border-radius:20px}
.kcs-osw{font-size:var(--fs-sm)} .kcs-osw .osw-a{color:var(--green-deep);font-weight:500} .kcs-osw .osw-h{color:var(--amber);font-weight:500}
.kcs-chev{color:var(--ink-faint);transition:transform .18s;font-size:var(--fs-sm)}
.kre-card[open] .kcs-chev{transform:rotate(180deg)}
.kre-card-body{padding:0 var(--space-4) var(--space-4);border-top:1px solid var(--line)}
.kre-card-body .kre-assess{margin-top:var(--space-3)}
/* sekcje oświadczeń — czytelna lista na całą szerokość */
.kre-claims-sec{margin-top:var(--space-3);background:var(--surface-inset);border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-3) var(--space-4)}
.kre-claims-sec.ca{border-left:3px solid var(--green-line)} .kre-claims-sec.ch{border-left:3px solid var(--amber-line)}
.kcl-h{font-weight:500;font-size:var(--fs-sm);color:var(--brand-950);margin-bottom:var(--space-2)}
.kcl-h .kcl-n{color:var(--ink-faint);font-weight:400}
.kre-claims{list-style:none;display:flex;flex-direction:column;gap:6px}
.kre-claims li{position:relative;padding-left:18px;font-size:var(--fs-sm);color:var(--ink);line-height:1.55}
.kre-claims li::before{content:"•";position:absolute;left:4px;color:var(--brand)}
.kre-claims-sec.ca .kre-claims li::before{color:var(--green-deep)} .kre-claims-sec.ch .kre-claims li::before{color:var(--amber)}
.kre-claims li.kcl-more{color:var(--ink-faint);font-style:italic} .kre-claims li.kcl-more::before{content:""}
.kcl-note{font-size:var(--fs-xs);color:var(--ink-faint);margin-top:var(--space-2);line-height:1.5}
.kre-card-actions{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3);flex-wrap:wrap;margin-top:var(--space-3)}
.kre-card-actions a{font-size:var(--fs-sm);font-weight:500} .kre-card-actions .kre-rm{font-size:var(--fs-sm)}
/* ===== Etap 6 — jakość kreatora: tabela audytowa + status-pigułki + sticky podsumowanie ===== */
.kre-tbl tbody td{height:52px}                                     /* czytelniejsze, wyższe wiersze */
.kre-tbl tbody tr{cursor:pointer;transition:background .12s}
.kre-tbl tbody tr:hover{background:var(--brand-soft)}              /* klik w wiersz → rozwija kartę szczegółów (patrz JS) */
.kre-tbl td:nth-child(3),.kre-tbl td:nth-child(4),.kre-tbl th:nth-child(3),.kre-tbl th:nth-child(4){text-align:right}
/* ===== R2-2: naprzemienne wiersze (zebra) + wyraźniejszy kontener tabel danych ===== */
/* Tabele siedzą na białej „karcie" nad ciepłym tłem strony → przestają się zlewać. */
.tablewrap,.kre-tbl-wrap{background:var(--card)}
.kre-tbl-wrap{border-color:var(--border-strong);box-shadow:var(--shadow-sm)}
/* mocniejszy nagłówek (wspólny wzorzec dla .rtab i .kre-tbl) */
.rtab thead th,.kre-tbl thead th{border-bottom:1px solid var(--border-strong);font-weight:600}
/* subtelna zebra — status niesie pigułka/rail, NIE tło wiersza (WCAG 1.4.1); tfoot pomijamy */
.rtab tbody tr:nth-child(2n),
.kre-tbl tbody tr:nth-child(2n){background:rgba(28,27,24,.035)}
/* hover deklarowany PO zebrze → zawsze wygrywa; ujednolicony na obu tabelach */
.rtab tbody tr:hover,
.kre-tbl tbody tr:hover{background:var(--brand-soft)}
.kre-card{border-left-width:5px}                                   /* rail 5px, spójnie z Etapem 5 */
/* status jako pigułka z ikoną (ikona+tekst, nie sam kolor — WCAG 1.4.1; spójne z werdyktami Etapu 5) */
.kre-stat{display:inline-flex;align-items:center;gap:6px;font-weight:600;font-size:var(--fs-xs);padding:3px 9px;border-radius:999px;white-space:nowrap}
.kre-stat svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;flex:none}
.kre-stat.over{background:var(--red-soft);color:var(--red-deep)}
.kre-stat.warn{background:var(--amber-soft);color:var(--amber-deep)}
.kre-stat.ok{background:var(--green-soft);color:var(--green-deep)}
/* wyraźny przycisk usuwania (≥40×40) */
.kre-rm-x{display:inline-flex;align-items:center;justify-content:center;min-width:40px;height:40px;font-size:var(--fs-lg);color:var(--ink-faint)}
.kre-rm-x:hover{color:var(--red);background:var(--red-soft)}
/* sticky pasek podsumowania — bezpośrednie dziecko panelu */
.kre-sticky{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;max-width:var(--results-max);
  position:sticky;bottom:var(--space-4);z-index:20;margin:var(--space-4) 0;background:var(--card);
  border:1px solid var(--border-strong);border-radius:var(--radius-card);padding:var(--space-3) var(--space-4);box-shadow:var(--shadow-md)}
.kre-sticky[hidden]{display:none}
.kre-sticky.over{border-color:var(--red-line);box-shadow:0 0 0 2px var(--red-soft),var(--shadow-md)}
.kre-sticky-info{font-size:var(--fs-base);color:var(--ink);display:flex;align-items:center;gap:var(--space-2) var(--space-3);flex-wrap:wrap}
.kre-sticky-info b{color:var(--brand-950);font-weight:700}
.kre-sticky-info .kre-miss{font-size:var(--fs-sm);color:var(--ink-faint);font-weight:400}
.kre-al{display:inline-flex;align-items:center;gap:5px;font-weight:600;font-size:var(--fs-sm)}
.kre-al svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;flex:none}
.kre-al.over{color:var(--red-deep)} .kre-al.warn{color:var(--amber-deep)} .kre-al.ok{color:var(--green-deep)}
.kre-sticky-act{display:flex;gap:var(--space-2);flex-wrap:wrap}
.kre-sticky-act .btn{height:40px}
@media(max-width:720px){ .kre-sticky{bottom:0;border-radius:var(--radius-card) var(--radius-card) 0 0;padding-bottom:calc(var(--space-3) + env(safe-area-inset-bottom))} }
/* R2-3: rezerwa u dołu panelu = realna wysokość paska (JS: --kre-sticky-h) + odstęp + safe-area → ostatnia karta / „Podsumowanie składu" / CTA nie są zasłaniane przy przewinięciu do końca. 0 gdy skład pusty. */
#p-kreator{padding-bottom:calc(var(--kre-sticky-h,0px) + var(--space-4) + env(safe-area-inset-bottom))}
/* stan pusty — chipy startowe */
.kre-empty-ex{display:flex;flex-wrap:wrap;gap:var(--space-2);justify-content:center;align-items:center;margin-top:var(--space-3)}
.kre-empty-lab{font-size:var(--fs-sm);color:var(--ink-faint)}
/* builder na pełną szerokość (nota prawna, tabela, karty) + odstęp od boxu dodawania */
#p-kreator .kre-note-legal,#p-kreator .kre-add,#p-kreator .kre-table,#p-kreator .kre-list,#p-kreator .kre-sum,#p-kreator .kre-empty,#p-kreator .kre-desc-h{max-width:none}
.kre-table{margin-top:var(--space-5)}
.kre-empty{margin-top:var(--space-5)}
@media(max-width:720px){
  /* Etap 3 — na mobile chowamy tabelę z poziomym scrollem; głównym widokiem są czytelne karty #kreList */
  #kreTable{display:none}
  .kre-sum-total{display:flex}          /* jawna „Suma gramatury składu" widoczna, gdy tfoot tabeli zniknął */
  .kre-add-grid{grid-template-columns:1fr 1fr;grid-auto-rows:48px}
  .kre-add-grid>.kre-ac-wrap{grid-column:1 / -1}
  .kre-add-grid .kre-add-btn{grid-column:1 / -1}
  .kre-add-grid input,.kre-add-grid select,.kre-add-grid .kre-add-btn{min-height:48px;height:auto;font-size:16px}
  .kre-assess{grid-template-columns:1fr}
  .kre-item-head{flex-wrap:wrap}
  .kre-cat{flex-direction:column;align-items:flex-start}
}


/* ── Krok 4: strony obszarów zdrowia ────────────────────────────────────────
   Tabela korzysta z .rtab (ten sam arkusz co widok tabelaryczny na stronie
   składnika) — tutaj tylko różnice: podpis, kolumna liczbowa i chipsy z licznikiem.
   Nie dubluj reguł .rtab; jeśli tabela ma wyglądać inaczej, zmień .rtab, nie tutaj. */
.areatbl{table-layout:auto}
.areatbl caption{caption-side:top;text-align:left;font:500 var(--fs-xs)/1.4 var(--sans);color:var(--ink-faint);text-transform:uppercase;letter-spacing:.03em;padding:0 0 var(--space-2)}
.areatbl th[scope=row]{font-weight:500;width:1%;white-space:nowrap}
.areatbl .t-num{text-align:right;font-variant-numeric:tabular-nums;width:1%;white-space:nowrap}
.areatbl .t-cond{color:var(--ink-faint);font-size:var(--fs-xs)}
.chips--area{gap:var(--space-1)}
.chips--area .chip{text-decoration:none}
.chip-n{display:inline-block;margin-left:6px;padding:0 5px;border-radius:3px;background:var(--amber-soft);color:var(--amber);font-size:var(--fs-xs);font-variant-numeric:tabular-nums}
/* Sekcja „Ten składnik ma oświadczenia w obszarach" na stronie składnika. */
.art-reg{color:var(--ink-faint);font-size:var(--fs-xs)}
.areanav{margin:var(--space-4) 0 0}
.areanav .chips{margin-top:var(--space-2)}

/* widok tabela + przełącznik — PATCH-02 P-07.
   .vt-bar, nie .view-toggle: hub trzyma pod tą nazwą inny komponent w tym samym
   style.css, a jego @media(max-width:1023px){.view-toggle{display:none}} chowało
   przy okazji przełącznik podstrony. Rząd .sec-head: nagłówek z lewej, przełącznik
   dociśnięty do prawej; na wąskim ekranie schodzi pod nagłówek. */
/* .sec-head / .vt-bar / .vt-btn PRZENIESIONE do współdzielonego arkusza
   (public_html/index.html) — WYTYCZNE-03 §4: hub i podstrona mają renderować
   TEN SAM przełącznik. Trzymanie ich tutaj oznaczało dwa różne wyglądy. */
/* Przyklejony filtr statusu (P-08) siada POD paskiem modułów, nie na nim —
   Pasek modułów (.tabwrap--links) jest sticky, więc filtr statusu w treści musi
   startować POD nim — inaczej oba lądują na top:0 i nachodzą na siebie.
   Wartość liczy app-lite.js (--tabtop + zmierzona wysokość paska); poniżej tylko
   sensowny start na czas, zanim skrypt się wykona.
*/
/* Wartości startowe; app-lite.js nadpisuje je zmierzoną wysokością paska
   modułów (--tabtop + wysokość .tabwrap), bo zależy ona od breakpointu. */
.art{--stick-top:49px}
@media(max-width:760px){.art{--stick-top:53px}}
.tbl-scroll{overflow-x:auto}
.claimtable{width:100%;border-collapse:collapse;font-size:var(--fs-sm);background:var(--card);border:1px solid var(--line);border-radius:var(--radius-card);min-width:720px}
.claimtable caption{text-align:left;font-size:var(--fs-xs);color:var(--ink-faint);padding:8px 12px 10px;caption-side:top;line-height:1.4}
.claimtable th,.claimtable td{text-align:left;padding:9px 12px;border-bottom:1px solid var(--line);vertical-align:top}
.claimtable thead th{background:var(--surface-inset);font-weight:600;color:var(--ink-soft);font-size:var(--fs-xs);white-space:nowrap;position:sticky;top:0}
.claimtable tbody tr:last-child th,.claimtable tbody tr:last-child td{border-bottom:0}
.claimtable th.t-name{font-weight:600;color:var(--brand-deep)}
.claimtable .t-lat{display:block;font-style:italic;color:var(--ink-faint);font-size:var(--fs-xs);font-weight:400}
.claimtable .t-typ{white-space:nowrap;color:var(--ink-soft)}
.claimtable .t-orig{min-width:220px}
.claimtable .t-plaux{color:var(--ink-soft)}
.claimtable .t-pltag{display:block;font-size:var(--fs-xs);color:var(--amber-deep)}
.claimtable .t-dash{color:var(--ink-faint)}
.claimtable .badge{white-space:nowrap}

/* ===== podstrony składnikowe (SEO) ===== */
.navtog{display:none;background:none;border:0;font-size:22px;cursor:pointer;color:var(--ink)}
/* ⚠ --results-max, NIE --container. Kolumna artykułu miała 1200 px, więc karta
   oświadczenia rozciągała się do 1152 px, a box brzmienia do 1097 px — po zdjęciu
   ograniczeń wewnątrz .claim (PATCH-05 P-01) krótkie zdanie zostawiało 60%
   pustego prostokąta. Na hubie ta sama karta ma 900 px i wygląda poprawnie.
   Jedna miara dla obu ekranów to sedno „jednego systemu" z WYTYCZNE-03 §0.
   Tabela w widoku tabelarycznym ma .tbl-scroll{overflow-x:auto} i min-width
   720 px, więc zwężenie kolumny jej nie łamie.
   ⚠ BLIŹNIACZA KOPIA tej reguły stoi w CRITICAL_CSS (szukaj drugiego „.art{max-width").
     Zmieniasz tutaj — zmień tam, inaczej strona mrugnie szerokim układem
     zanim doczyta style.css. */
.art{max-width:calc(var(--results-max) + 2*var(--space-4));padding:var(--space-4) var(--space-4) var(--space-5)}
.crumb{font-size:var(--fs-sm);color:var(--ink-faint);margin-bottom:var(--space-3)}
.crumb a{color:var(--ink-soft);text-decoration:none}.crumb a:hover{text-decoration:underline}
.art h1{font-size:var(--fs-xl);line-height:1.15;color:var(--brand-950);margin:0 0 var(--space-2)}
.art .meta{color:var(--ink-faint);font-size:var(--fs-sm);margin:0 0 var(--space-4)}
.art h2{font-size:var(--fs-lg);color:var(--brand-950);margin:var(--space-5) 0 var(--space-3);line-height:1.2}
.art section{margin-bottom:var(--space-4)}
.sec-intro{color:var(--ink-soft);margin:0 0 var(--space-3)}
.cardlist{display:grid;gap:var(--space-3);margin:0}
.tldr{background:var(--brand-soft);border-left:4px solid var(--brand);border-radius:var(--radius);padding:var(--space-3) var(--space-4);margin:0 0 var(--space-5);line-height:1.55}
.tldr-lbl{display:block;font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--brand-deep);font-weight:700;margin-bottom:6px}
.tbl-wrap{overflow-x:auto}
/* Podtytuł artykułu — rozdzielony na dwie części (§7c).
   „Stan bazy" wyszło z .meta, bo .meta dziedziczy font-family:var(--mono)
   z arkusza huba; sam znacznik świeżości ma być krojem tekstowym jak w Office. */
.art-sub{margin:0 0 var(--space-4)}
.art-alt{font-family:var(--sans);font-size:var(--fs-sm);color:var(--ink-faint);margin:0;max-width:var(--measure)}
/* Reguły .stbl skasowane razem z tabelą „Podsumowanie statusów" (§7a) —
   zastąpiły ją kafle KPI + pasek udziałów. Gdyby tabela wróciła, wróci też
   duplikat liczb, które stoją już w bloku „W skrócie" nad nią. */
.claimlist{list-style:none;padding:0;margin:0;display:grid;gap:var(--space-2)}
/* Pozycja listy — pasek akcentu jak w Office (.ph-metric::before).
   Było: kolorowy pasek ORAZ kolorowe tło całej pozycji. Przy siedmiu
   oświadczeniach dawało to siedem zielonych prostokątów pod sobą, w których
   nic nie mogło się wyróżnić — a wyróżnić ma się BRZMIENIE DO SKOPIOWANIA.
   Zostaje sam pasek; tło wraca do białego. Nie cofaj: kolorowe tło w karcie
   przysługuje wyłącznie brzmieniu, bo to jest produkt tej strony. */
.cl-item{position:relative;border:1px solid var(--line);border-radius:var(--radius);
  padding:var(--space-3) var(--space-3) var(--space-3) calc(var(--space-3) + 4px);
  background:var(--card);overflow:hidden}
.cl-item::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;
  background:var(--acc,var(--acc-neutral))}
.cl-ca .cl-item,.claimlist.ca .cl-item{--acc:var(--acc-green)}
.claimlist.ch .cl-item{--acc:var(--acc-amber)}
.claimlist.cr .cl-item{--acc:var(--acc-red)}
.cl-w{margin:0 0 6px;font-weight:500;color:var(--ink)}
.cl-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:var(--fs-xs);color:var(--ink-faint);margin-bottom:4px}
.cl-id{font-variant-numeric:tabular-nums}
.cl-rel{background:rgba(0,0,0,.05);padding:1px 7px;border-radius:20px}
.cl-cond{margin:6px 0 0;font-size:var(--fs-sm);color:var(--ink-soft)}
.cl-links{margin-top:6px;font-size:var(--fs-xs)}
.cl-links a{color:var(--brand-deep)}
.alert-box{background:var(--card);border:1px solid var(--amber-line);border-radius:var(--radius-card);padding:var(--space-3) var(--space-4);margin:0 0 var(--space-3)}
.alert-box>p{margin:0 0 var(--space-2)}
.alert-h{margin:0 0 4px !important;color:var(--brand-950)}
.alert-form{display:grid;gap:var(--space-2);max-width:440px}
.alert-form input[type=email]{padding:10px 12px;border:1px solid var(--border-strong);border-radius:var(--radius);font:inherit}
.alert-consent{font-size:var(--fs-sm);color:var(--ink-soft);display:flex;gap:8px;align-items:flex-start}
.alert-msg{font-size:var(--fs-sm);margin:0;min-height:1em}
.alert-msg.ok{color:var(--green-deep)}.alert-msg.err{color:var(--red-deep)}
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.faq{border:1px solid var(--line);border-radius:var(--radius);margin-bottom:var(--space-2);background:var(--card)}
.faq summary{cursor:pointer;padding:var(--space-3);font-weight:600;color:var(--brand-950);list-style:none}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";float:right;color:var(--brand);font-weight:700}
.faq[open] summary::after{content:"–"}
.faq-a{padding:0 var(--space-3) var(--space-3);color:var(--ink-soft);line-height:1.55}
.related{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--space-2)}
.related a{color:var(--brand-deep);text-decoration:none;font-weight:500}
.related a:hover{text-decoration:underline}
.related span{color:var(--ink-faint);font-size:var(--fs-xs)}
.back{margin-top:var(--space-3)}.back a{color:var(--ink-soft)}
.sep-note{background:var(--amber-soft,#FBF3E2);border:1px solid var(--amber-line,#EAD9B0);border-radius:var(--radius);padding:var(--space-2) var(--space-3);margin:0 0 var(--space-4);font-size:var(--fs-sm);color:var(--ink-soft)}
.sep-note a{color:var(--brand-deep);text-decoration:none}.sep-note a:hover{text-decoration:underline}
/* CTA kontekstowa (bez obrazu — usunięty na życzenie) */
.commercial{background:var(--brand-950);color:#F5EFE8;border-radius:var(--radius-card);margin:var(--space-5) 0 var(--space-4);overflow:hidden}
.commercial-body{padding:var(--space-4)}
.commercial h2{color:#fff;margin:0 0 var(--space-2);font-size:var(--fs-md)}
.commercial p{color:#E7DDD1;margin:0 0 var(--space-2)}
.commercial .btn{background:#fff;color:var(--brand-950);margin-top:var(--space-2)}
.commercial .btn:hover{background:var(--brand-soft)}
.disc{font-size:var(--fs-sm);color:var(--ink-faint);line-height:1.5;border-top:1px solid var(--line);padding-top:var(--space-3)}
.disc a{color:var(--brand-deep)}
@media(max-width:760px){
  .navtog{display:block;order:3}
  .b2bhead .b2bnav{display:none;flex-basis:100%;flex-direction:column;gap:2px}
  .b2bhead .b2bnav.open{display:flex}
  .art h1{font-size:var(--fs-lg)}
}
