/* =====================================================================
   PLATFORMA INŻYNIERSKA — KOMPOZYCJA (design system)
   ---------------------------------------------------------------------
   JEDNO źródło wyglądu dla huba i wszystkich podstron. Wzorcem był
   index.html — ten plik jest jego ekstrakcją, więc hub korzysta z tych
   samych klas co kalkulatory (żadnych dwóch prawd).

   Zasada podziału pracy:
     • portal.css — chrom platformy (pasek górny, stopka, PL/EN, wskazówki)
     • pf-ui.css  — kompozycja treści strony (tło, karty, pola, przyciski)
     • Tailwind   — WYŁĄCZNIE układ: grid, flex, gap-*, max-w-*, breakpointy
   Kolorów, ramek, promieni i cieni NIE hardkodujemy w stronach — biorą się
   stąd, dzięki czemu zmiana akcentu w config.js przechodzi przez całość.

   Kolejność ładowania w <head>: portal.css → pf-ui.css → styl strony.
   ===================================================================== */

/* =====================================================================
   1. TOKENY
   Dokładka do zmiennych z portal.css (--pf-accent, --pf-bg, --pf-line,
   --pf-text, --pf-text-2). Tu żyje paleta „sceny" przeniesiona z huba.
   ===================================================================== */
:root {
  --pf-canvas:      #020617;                  /* tło strony — ciemniejsze niż slate-900 */
  --pf-surface:     rgba(30, 41, 59, .55);    /* szkło: karty, panele */
  --pf-surface-hi:  rgba(30, 41, 59, .85);    /* szkło pod kursorem */
  --pf-surface-lo:  rgba(15, 23, 42, .55);    /* wgłębienie: wynik, blok wzoru */
  --pf-edge:        rgba(148, 163, 184, .14); /* ramka-włos */
  --pf-edge-hi:     rgba(148, 163, 184, .28); /* ramka wyróżniona */

  --pf-r:      16px;   /* karta, panel */
  --pf-r-sm:   10px;   /* pole, przycisk, zakładka */
  --pf-r-xs:    8px;   /* drobiazgi: badge, chip-ikona */

  --pf-lift:   0 18px 40px -20px color-mix(in srgb, var(--pf-accent) 60%, #000);
  --pf-ring:   0 0 0 3px color-mix(in srgb, var(--pf-accent) 35%, transparent);

  --pf-mono:   ui-monospace, 'Courier New', monospace;

  /* Barwy statusu — CAŁA paleta poza akcentem. Kolor w tej platformie ma
     znaczyć werdykt, nie ozdabiać: OK / uwaga / przekroczone / informacja.
     Nie dokładaj tu odcieni „bo ładny" — od wyróżnienia jest --pf-accent. */
  --pf-ok:    #22c55e;
  --pf-warn:  #f59e0b;
  --pf-bad:   #ef4444;
  --pf-info:  #a78bfa;
}

/* Tekst w barwie statusu */
.pf-ok   { color: var(--pf-ok); }
.pf-warn { color: var(--pf-warn); }
.pf-bad  { color: var(--pf-bad); }
.pf-info { color: var(--pf-info); }
.pf-accent-text { color: var(--pf-accent-soft); }

/* =====================================================================
   2. RESET
   To, co do tej pory było przeklejane w <style> każdej strony z osobna.
   ===================================================================== */
html { background: var(--pf-canvas); scroll-behavior: smooth; }

* { scrollbar-width: thin; scrollbar-color: var(--pf-line) transparent; }
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--pf-line); border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: #475569; }

/* Font ładuje portal.css (@import vendor/fonts/inter.css) */
body { font-family: 'Inter', system-ui, -apple-system, Segoe UI, sans-serif; color: var(--pf-text); }

/* Strzałki w polach liczbowych tylko mieszają — inżynier wpisuje wartość */
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
input[type="number"] { -moz-appearance: textfield; }

/* Rozwinięta lista <select> rysowana przez system — bez tego tekst się zlewa */
select option { background: var(--pf-bg-2); color: #f1f5f9; font-weight: 600; }

/* Kotwice (#id) zatrzymują się POD paskiem, nie za nim */
section[id] { scroll-margin-top: calc(var(--pf-bar-h) + 40px); }

/* Element „wieszany" na pasku: przy przewijaniu zatrzymuje się tuż pod nim
   i jedzie dalej razem z nim. Offset liczony z --pf-bar-h, więc zmiana
   wysokości paska nie wymaga poprawki w żadnej stronie.
   Używa go rail kategorii w hubie i lepkie nagłówki na podstronach. */
.pf-under-bar { position: sticky; top: calc(var(--pf-bar-h) + 20px); }

/* =====================================================================
   3. SCENA (tło)
   Warstwy wstrzykuje portal.js na stronach z atrybutem data-pf-stage.
   Wszystkie są position:fixed — przy przejściu hub → kalkulator tło stoi
   w miejscu, więc zmiana strony wygląda na wejście w głąb, nie na cięcie.
     data-pf-stage="live"   → bloby i aurora w ruchu (hub)
     data-pf-stage          → wersja statyczna (podstrony)
   ===================================================================== */
.pf-stage { position: relative; isolation: isolate; overflow-x: clip; }

/* Siatka techniczna, wygaszana ku dołowi maską */
.pf-stage::before {
  content: ""; position: fixed; inset: 0; z-index: -2; pointer-events: none;
  background-image:
    linear-gradient(rgba(148, 163, 184, .045) 1px, transparent 1px),
    linear-gradient(90deg, rgba(148, 163, 184, .045) 1px, transparent 1px);
  background-size: 32px 32px;
  -webkit-mask-image: radial-gradient(120% 90% at 50% 0%, #000 40%, transparent 100%);
          mask-image: radial-gradient(120% 90% at 50% 0%, #000 40%, transparent 100%);
}

.pf-blob {
  position: fixed; z-index: -1; border-radius: 9999px;
  filter: blur(90px); opacity: .5; pointer-events: none;
}
.pf-blob--a {
  width: 520px; height: 520px; top: -180px; left: -120px;
  background: radial-gradient(circle, color-mix(in srgb, var(--pf-accent) 65%, transparent), transparent 70%);
}
.pf-blob--b {
  width: 460px; height: 460px; top: -120px; right: -140px;
  background: radial-gradient(circle, rgba(139, 92, 246, .55), transparent 70%);
}
.pf-blob--c {
  width: 600px; height: 600px; bottom: -260px; left: 35%; opacity: .32;
  background: radial-gradient(circle, color-mix(in srgb, var(--pf-accent) 45%, transparent), transparent 70%);
}

.pf-aurora {
  position: fixed; inset: -30%; z-index: -2; pointer-events: none; opacity: .14;
  background: conic-gradient(from 0deg at 50% 50%,
    color-mix(in srgb, var(--pf-accent) 60%, transparent),
    rgba(139, 92, 246, .5),
    transparent 55%,
    color-mix(in srgb, var(--pf-accent) 50%, transparent));
  filter: blur(120px);
}

.pf-glow {
  position: fixed; z-index: -1; left: 0; top: 0; width: 440px; height: 440px;
  border-radius: 9999px; margin: -220px 0 0 -220px; pointer-events: none;
  filter: blur(90px); opacity: 0; transition: opacity .5s; will-change: transform;
  background: radial-gradient(circle, color-mix(in srgb, var(--pf-accent) 27%, transparent), transparent 65%);
}

/* Ruch tylko tam, gdzie strona sama o niego prosi (hub). Podstrony dostają
   tę samą kolorystykę i głębię, ale bez animacji — na stronach z ciężkimi
   tabelami i wizualizacjami trzy rozmyte warstwy w ruchu kosztują płynność. */
body[data-pf-stage="live"] .pf-blob { will-change: transform; }
body[data-pf-stage="live"] .pf-blob--a { animation: pf-drift-a 16s ease-in-out infinite; }
body[data-pf-stage="live"] .pf-blob--b { animation: pf-drift-b 20s ease-in-out infinite; }
body[data-pf-stage="live"] .pf-blob--c { animation: pf-drift-c 24s ease-in-out infinite; }
body[data-pf-stage="live"] .pf-aurora  { animation: pf-spin 40s linear infinite; will-change: transform; }

@keyframes pf-drift-a { 0%,100%{transform:translate(0,0) scale(1)} 33%{transform:translate(60px,40px) scale(1.08)} 66%{transform:translate(20px,80px) scale(.96)} }
@keyframes pf-drift-b { 0%,100%{transform:translate(0,0) scale(1)} 33%{transform:translate(-50px,60px) scale(1.05)} 66%{transform:translate(-80px,10px) scale(.94)} }
@keyframes pf-drift-c { 0%,100%{transform:translate(-50%,0) scale(1)} 50%{transform:translate(-50%,-70px) scale(1.1)} }
@keyframes pf-spin { to { transform: rotate(360deg); } }

/* Wydruk: żadnych warstw tła (patrz raport A4 w kalkulatorze wyboczenia) */
@media print {
  .pf-stage::before, .pf-blob, .pf-aurora, .pf-glow { display: none !important; }
}

/* =====================================================================
   4. UKŁAD STRONY
   ===================================================================== */
.pf-page {
  width: 100%; max-width: 72rem; margin: 0 auto;
  padding: 0 1rem 2rem;
}
.pf-page--narrow { max-width: 56rem; }
.pf-page--wide   { max-width: 90rem; }
@media (min-width: 640px) { .pf-page { padding: 0 1.5rem 2.5rem; } }

/* Nagłówek strony — wzorzec z huba: nadkreślnik, tytuł, jedno zdanie po co to */
.pf-head { margin-bottom: 1.75rem; }

/* Nagłówek dwuczłonowy: tytuł po lewej, po prawej slot [data-pf-hints]
   (wskazówka strony) albo przycisk akcji. Na wąskim ekranie schodzi pod
   tytuł. Dzięki temu wskazówka nie odpycha treści w dół. */
.pf-head--split { display: grid; grid-template-columns: 1fr; gap: 1rem; align-items: center; }
@media (min-width: 1024px) {
  .pf-head--split { grid-template-columns: minmax(0, 1fr) minmax(17rem, 24rem); gap: 2rem; }
  /* Brak wskazówek (albo zamknięte) — rdzeń dokłada .pf-head--solo i kolumna
     na slot znika, żeby pusty prawy blok nie ściskał tytułu. */
  .pf-head--split.pf-head--solo { grid-template-columns: 1fr; }
}
.pf-eyebrow {
  display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem;
  font-family: var(--pf-mono); font-size: .7rem; font-weight: 600;
  text-transform: uppercase; letter-spacing: .2em;
  color: var(--pf-accent-soft);
}
.pf-eyebrow::before {
  content: ""; width: 1.5rem; height: 1px; background: var(--pf-accent-soft); flex-shrink: 0;
}
.pf-h1 {
  display: flex; align-items: center; gap: .75rem;
  font-size: 1.75rem; font-weight: 800; letter-spacing: -.02em;
  color: #fff; line-height: 1.15;
}
.pf-h1 svg, .pf-h1 [data-lucide] { width: 1.75rem; height: 1.75rem; color: var(--pf-accent); flex-shrink: 0; }
@media (min-width: 768px) { .pf-h1 { font-size: 2rem; } }
.pf-sub { margin-top: .5rem; font-size: .875rem; line-height: 1.55; color: var(--pf-text-2); }
.pf-sub--norm { margin-top: .35rem; font-size: .75rem; font-weight: 600; color: var(--pf-accent-soft); }

.pf-h2 {
  display: flex; align-items: center; gap: .5rem;
  font-size: 1.0625rem; font-weight: 700; color: #fff;
}
.pf-h2 svg, .pf-h2 [data-lucide] { width: 1.125rem; height: 1.125rem; color: var(--pf-accent); flex-shrink: 0; }

/* =====================================================================
   5. POWIERZCHNIE
   ===================================================================== */
.pf-card {
  background: var(--pf-surface);
  backdrop-filter: blur(14px) saturate(140%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  border: 1px solid var(--pf-edge);
  border-radius: var(--pf-r);
  padding: 1.5rem;
}
.pf-card--tight { padding: 1rem; }
.pf-card--flush { padding: 0; overflow: hidden; }   /* pod tabelę na całą szerokość */

/* Karta klikalna — mikroruch przeniesiony z kafelków huba */
.pf-card--link {
  display: block; text-decoration: none;
  transition: transform .2s cubic-bezier(.16,1,.3,1), border-color .2s, background .2s, box-shadow .2s;
}
.pf-card--link:hover {
  transform: translateY(-3px);
  background: var(--pf-surface-hi);
  border-color: color-mix(in srgb, var(--pf-accent) 45%, transparent);
  box-shadow: var(--pf-lift);
}
.pf-card--link:active { transform: translateY(-1px) scale(.985); transition-duration: .06s; }

/* Wgłębienie: pole wyniku */
.pf-out {
  background: var(--pf-surface-lo);
  border: 1px solid var(--pf-edge);
  border-radius: var(--pf-r-sm);
  padding: .7rem .85rem;
}
.pf-out__k { font-size: .7rem; text-transform: uppercase; letter-spacing: .05em; color: var(--pf-text-2); }
.pf-out__v { font-family: var(--pf-mono); font-weight: 800; font-size: 1.25rem; line-height: 1.15; color: #fff; }
.pf-out__u { font-size: .7rem; color: #64748b; text-transform: uppercase; letter-spacing: .05em; }
.pf-out--ok   { border-color: color-mix(in srgb, #22c55e 45%, transparent); }
.pf-out--warn { border-color: color-mix(in srgb, #f59e0b 45%, transparent); }
.pf-out--bad  { border-color: color-mix(in srgb, #ef4444 45%, transparent); }

/* Blok wzoru / przeliczenia */
.pf-math {
  font-family: var(--pf-mono); font-size: .85rem; line-height: 1.6;
  background: var(--pf-surface-lo);
  border-left: 3px solid var(--pf-accent);
  border-radius: var(--pf-r-xs);
  padding: .75rem; margin: .5rem 0 1rem;
  color: var(--pf-text); overflow-x: auto;
}

/* Kafelek werdyktu — tło, ramka i tekst w barwie statusu JEDNĄ klasą.
   Używa go JS kalkulatorów przy przełączaniu wyniku (OK / uwaga / przekroczone),
   dzięki czemu nie buduje w kodzie łańcuchów typu
   „bg-red-900/30 border-red-500 text-red-400". Zakłada, że element ma już
   ramkę (np. .pf-out albo Tailwindowe `border`). */
.pf-verdict--ok   { background: color-mix(in srgb, var(--pf-ok) 12%, transparent);   border-color: var(--pf-ok);   color: var(--pf-ok); }
.pf-verdict--warn { background: color-mix(in srgb, var(--pf-warn) 12%, transparent); border-color: var(--pf-warn); color: var(--pf-warn); }
.pf-verdict--bad  { background: color-mix(in srgb, var(--pf-bad) 14%, transparent);  border-color: var(--pf-bad);  color: var(--pf-bad); }
.pf-verdict--info { background: color-mix(in srgb, var(--pf-info) 12%, transparent); border-color: var(--pf-info); color: var(--pf-info); }

.pf-note { font-size: .72rem; line-height: 1.5; color: #64748b; }
.pf-badge {
  display: inline-block; font-size: .6rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .05em;
  padding: .12rem .4rem; border-radius: var(--pf-r-xs);
  background: color-mix(in srgb, var(--pf-accent) 18%, transparent);
  color: var(--pf-accent-soft);
}

/* =====================================================================
   6. FORMULARZE
   ===================================================================== */
.pf-lbl {
  display: block; margin-bottom: .3rem;
  font-size: .7rem; font-weight: 600; text-transform: uppercase; letter-spacing: .06em;
  color: var(--pf-text-2);
}
.pf-fld {
  width: 100%;
  background: var(--pf-surface-lo);
  border: 1px solid var(--pf-edge-hi);
  border-radius: var(--pf-r-sm);
  padding: .55rem .7rem;
  color: #fff; font-family: inherit; font-size: .9rem; font-weight: 600;
  outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.pf-fld::placeholder { color: #64748b; font-weight: 400; }
.pf-fld:focus { border-color: var(--pf-accent); box-shadow: var(--pf-ring); }
.pf-fld:disabled { opacity: .5; cursor: not-allowed; }
.pf-fld--mono { font-family: var(--pf-mono); }

/* =====================================================================
   7. AKCJE
   ===================================================================== */
.pf-cta {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  padding: .6rem 1.1rem; border-radius: var(--pf-r-sm);
  border: 1px solid transparent; background: var(--pf-accent); color: #fff;
  font-family: inherit; font-size: .875rem; font-weight: 600;
  cursor: pointer; text-decoration: none; white-space: nowrap;
  transition: filter .15s, transform .1s, border-color .15s, background .15s;
}
.pf-cta:hover  { filter: brightness(1.12); }
.pf-cta:active { transform: scale(.97); }
.pf-cta svg, .pf-cta [data-lucide] { width: 1rem; height: 1rem; }

.pf-cta--ghost {
  background: var(--pf-surface); border-color: var(--pf-edge-hi); color: var(--pf-text);
}
.pf-cta--ghost:hover { border-color: var(--pf-accent); color: #fff; filter: none; background: var(--pf-surface-hi); }

.pf-tab {
  display: inline-flex; align-items: center; gap: .45rem;
  padding: .5rem .95rem; border-radius: var(--pf-r-sm);
  border: 1px solid var(--pf-edge-hi); background: var(--pf-surface-lo);
  color: var(--pf-text-2); font-family: inherit; font-size: .85rem; font-weight: 600;
  cursor: pointer; white-space: nowrap;
  transition: color .15s, border-color .15s, background .15s;
}
.pf-tab:hover  { color: #fff; border-color: var(--pf-edge-hi); }
.pf-tab.is-on  { background: var(--pf-accent); border-color: var(--pf-accent); color: #fff; }
.pf-tab svg, .pf-tab [data-lucide] { width: 1rem; height: 1rem; }

.pf-chip {
  display: inline-flex; align-items: center; gap: .3rem;
  font-size: .72rem; padding: .28rem .55rem; border-radius: 9999px;
  border: 1px solid var(--pf-edge-hi); background: var(--pf-surface-lo);
  color: #cbd5e1; cursor: pointer; white-space: nowrap;
  transition: color .12s, border-color .12s, background .12s;
}
.pf-chip:hover { border-color: #64748b; color: #fff; }
.pf-chip.is-on { background: var(--pf-accent); border-color: var(--pf-accent); color: #fff; }

/* =====================================================================
   8. TABELE
   ===================================================================== */
.pf-table { border-collapse: collapse; width: 100%; }
.pf-table th, .pf-table td {
  padding: .5rem .7rem; font-size: .82rem; text-align: left;
  border-bottom: 1px solid color-mix(in srgb, var(--pf-line) 50%, transparent);
}
.pf-table th {
  position: sticky; top: 0; z-index: 1;
  background: var(--pf-bg);           /* nieprzezroczyste — treść nie prześwituje */
  color: var(--pf-text-2); font-weight: 600;
  font-size: .66rem; text-transform: uppercase; letter-spacing: .06em;
}
.pf-table tbody tr:hover { background: color-mix(in srgb, var(--pf-line) 25%, transparent); }

/* Wiersz klikalny w tabeli rysowanej ręcznie (bez .pf-table) — np. wyniki
   wyszukiwarki EJL, gdzie klasę nadaje JS przy budowaniu wiersza. */
.pf-row:hover { background: color-mix(in srgb, var(--pf-line) 30%, transparent); }

/* Wiersz tabeli zabarwiony statusem (np. śruba przechodzi / nie przechodzi
   sprawdzenia). Delikatnie — to podkład dla całego wiersza, nie werdykt. */
.pf-row-ok        { background: color-mix(in srgb, var(--pf-ok) 7%, transparent); }
.pf-row-ok:hover  { background: color-mix(in srgb, var(--pf-ok) 14%, transparent); }
.pf-row-bad       { background: color-mix(in srgb, var(--pf-bad) 8%, transparent); }
.pf-row-bad:hover { background: color-mix(in srgb, var(--pf-bad) 16%, transparent); }
.pf-table td.pf-k { font-weight: 700; color: #fff; }
.pf-table .pf-num { font-family: var(--pf-mono); text-align: right; }
/* Trafienie / wiersz dobrany przez kalkulator */
.pf-table .pf-hl, .pf-hl { background: color-mix(in srgb, var(--pf-accent) 16%, transparent) !important; }
.pf-table--center th, .pf-table--center td { text-align: center; }
.pf-table--center td.pf-k { text-align: left; }

/* =====================================================================
   9. RUCH
   ===================================================================== */

/* Kaskadowe wejście listy — element ustawia --i (indeks) */
@keyframes pf-in { from { opacity: 0; transform: translateY(14px) scale(.97); } to { opacity: 1; transform: none; } }
.pf-stagger > * { animation: pf-in .42s cubic-bezier(.16,1,.3,1) both; animation-delay: calc(var(--i, 0) * 26ms); }

/* Rozwijanie bez znajomości docelowej wysokości (0fr → 1fr) */
.pf-exp { display: grid; grid-template-rows: 0fr; opacity: 0;
          transition: grid-template-rows .32s cubic-bezier(.16,1,.3,1), opacity .2s; }
.pf-exp > div { overflow: hidden; min-height: 0; }
.pf-exp.is-open { grid-template-rows: 1fr; opacity: 1; }
.pf-chev { display: inline-flex; transition: transform .2s; }
.pf-chev.is-open { transform: rotate(180deg); }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .pf-blob, .pf-aurora { animation: none !important; }
  .pf-glow { display: none; }
  .pf-card--link, .pf-cta, .pf-tab, .pf-chip, .pf-fld { transition: none; }
  .pf-stagger > * { animation: none; }
  .pf-exp { transition: none; }
}
@media (hover: none) { .pf-glow { display: none; } }
