/* Pyrlandia — design tokens: railway signaling + industrial precision */
/* ETAP 2a: font self-hostowany (IBM Plex), @import lokalnego fonts.css zamiast
   Google Fonts. fonts.css ładuje woff2 z static/fonts/ (latin + latin-ext, swap).
   Ten @import dociąga font na KAŻDEJ stronie linkującej pyrlandia.css. */
@import url("fonts.0d41cf4ce14c.css");
[x-cloak] { display: none !important; }

:root {
  --brand:        #1a56db;
  --brand-dark:   #1e429f;
  --brand-light:  #3b82f6;

  --signal-red:    #d32f2f;
  --signal-yellow: #f9a825;
  --signal-green:  #2e7d32;
  --signal-white:  #fafafa;
  --signal-blue:   #1a56db;

  --steel-50:  #f8fafc;
  --steel-100: #f1f5f9;
  --steel-200: #e2e8f0;
  --steel-400: #94a3b8;
  --steel-700: #334155;
  --steel-900: #0f172a;
}

html, body { font-family: 'IBM Plex Sans', system-ui, -apple-system, 'Segoe UI', sans-serif; }

h1, h2, h3, h4, h5, h6, .font-display { font-family: 'IBM Plex Sans', system-ui, sans-serif; letter-spacing: -0.01em; }

.font-mono-tech,
code, kbd, samp, pre,
.font-mono { font-family: 'IBM Plex Mono', ui-monospace, 'SFMono-Regular', monospace; font-feature-settings: 'tnum' 1, 'zero' 1; }

/* Signal badges — railway semantics */
.badge-signal {
  display: inline-flex; align-items: center; gap: 0.375rem;
  padding: 0.125rem 0.625rem; border-radius: 9999px;
  font-size: 0.75rem; font-weight: 600; letter-spacing: 0.02em;
  line-height: 1.25rem; white-space: nowrap;
}
.badge-signal::before {
  content: ''; width: 0.5rem; height: 0.5rem; border-radius: 9999px; background: currentColor;
  box-shadow: 0 0 0 2px rgba(255,255,255,0.4);
}
/* A14 (0585/0672): tekst badge'a bierze PRZYCIEMNIONY atrament, nie czysty
   sygnał. Kontrast liczymy ZAWSZE po skomponowaniu tintu badge'a z tłem karty
   (rgba na bieli albo na pastelowym wierszu `bg-<rodzina>-50`), nie atramentu z
   czystą bielą. Stan przed poprawką: czerwony #d32f2f 3,82:1 na `bg-red-50`
   (wiersz krytycznego ticketu, templates/dashboards/manager.html), żółty
   #b27600 3,36:1, zielony #2e7d32 4,19:1 — wszystkie poniżej progu 4,5 dla
   tekstu 12 px. Po poprawce (odbiór A14): czerwony #a91d1d 5,60:1 na tincie i
   6,08:1 na białej karcie, żółty #8a5a00 5,20/5,35:1, zielony #266b2a
   5,33/5,56:1, niebieski --brand 4,91/5,32:1, stalowy 9,45:1. Wartości pilnuje
   numerycznie apps/core/tests_kontrast_0672.py. */
.badge-signal-red    { background: rgba(211,47,47,0.12);  color: var(--pyr-signal-red-ink); }
.badge-signal-yellow { background: rgba(249,168,37,0.15); color: var(--pyr-signal-yellow-ink); }
.badge-signal-green  { background: rgba(46,125,50,0.12);  color: var(--pyr-signal-green-ink); }
.badge-signal-blue   { background: rgba(26,86,219,0.10);  color: var(--brand); }
.badge-signal-steel  { background: var(--steel-100);      color: var(--steel-700); }

/* Signal light — pulsating dot for live indicators */
.signal-light { display: inline-block; width: 0.625rem; height: 0.625rem; border-radius: 9999px; }
.signal-light-pulse { animation: signal-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; }
.signal-light-red    { background: var(--signal-red); }
.signal-light-yellow { background: var(--signal-yellow); }
.signal-light-green  { background: var(--signal-green); }
.signal-light-blue   { background: var(--brand); }
.signal-light-steel  { background: var(--steel-400); }

@keyframes signal-pulse {
  0%, 100% { opacity: 1; box-shadow: 0 0 0 0 currentColor; }
  50%      { opacity: 0.6; box-shadow: 0 0 0 6px transparent; }
}

/* Rail motif — decorative rule */
.rail-divider {
  height: 6px;
  background:
    linear-gradient(to bottom, transparent 0 1px, var(--steel-400) 1px 2px, transparent 2px 4px, var(--steel-400) 4px 5px, transparent 5px 6px);
}

/* Industrial card shell */
.card-industrial {
  background: white;
  border: 1px solid var(--steel-200);
  border-radius: 0.75rem;
}

/* ===== ETAP 2b — komponenty (additive; wdrażane w call-sites Wave 1+) ===== */

/* Gęsta wersja signal-badge do tabel (status/priorytet w wierszach). */
.badge-signal-sm { padding: 0 0.4rem; font-size: 0.6875rem; line-height: 1rem; gap: 0.25rem; }
.badge-signal-sm::before { width: 0.375rem; height: 0.375rem; box-shadow: 0 0 0 1.5px rgba(255,255,255,0.4); }

/* Stat-tile — kafelek KPI „instrument", nie „big number SaaS". Lewa szyna signal,
   mono tabular value, drobny uppercase label. Używany przez _partials/stat_tile.html. */
.stat-tile { border-left: 3px solid var(--steel-200); }
.stat-tile-red    { border-left-color: var(--signal-red); }
.stat-tile-yellow { border-left-color: var(--signal-yellow); }
.stat-tile-green  { border-left-color: var(--pyr-signal-green-ink); }
.stat-tile-blue   { border-left-color: var(--brand); }
.stat-tile-steel  { border-left-color: var(--steel-400); }
.stat-tile-value  { font-feature-settings: 'tnum' 1, 'zero' 1; letter-spacing: -0.02em; }
.stat-tile-label  { font-size: 0.6875rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--steel-400); }

/* Pusty stan w tonacji steel (zamiast ad-hoc szarości). Layout przez partial. */
.empty-industrial { color: var(--steel-400); }
.empty-industrial svg { color: var(--steel-200); }

/* Gantt (montaż/przeglądy) + matrix przeglądów (PR-A2). Wartości per motyw
   żyją w static/css/tokens.css (`--gantt-*` / `--matrix-*`) — ten plik tylko
   mapuje klasę na zmienną, bez surowych kolorów tutaj. */
.gantt-planned     { background-color: var(--gantt-planned); }
.gantt-traveling   { background-color: var(--gantt-traveling); }
.gantt-onsite      { background-color: var(--gantt-onsite); }
.gantt-done        { background-color: var(--gantt-done); }
.gantt-placeholder { background-color: var(--gantt-placeholder); }

.matrix-planned { background-color: var(--matrix-planned); }
.matrix-overdue { background-color: var(--matrix-overdue); }
.matrix-done    { background-color: var(--matrix-done); }

/* Focus ring — obejmuje też pola formularzy (input/select/textarea), których nie
   łapie selektor a/button/[tabindex]. A14 (0585/0672): kolor idzie przez
   --focus-ring (static/css/tokens.css, wartość per motyw), bo markowy --brand
   (#1a56db) na ciemnym tle --b1 dawał 3,09:1 i nie było widać, co ma fokus.
   Fallback na --brand zostaje dla arkuszy ładowanych bez tokens.css. */
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
  outline: 2px solid var(--focus-ring, var(--brand));
  outline-offset: 2px;
}

/* Notatki wydania (/co-nowego/) — treść pochodzi z markdowna w CHANGELOG.md,
   więc to zwykłe h3/p/ul/li bez klas Tailwinda. Wtyczki @tailwindcss/typography
   NIE ma w buildzie (DaisyUI daje samo `.prose` ustawiające zmienne, bez reguł
   na dzieci), a preflight zdejmuje punktory i rozmiary nagłówków — bez tego
   bloku lista wydania renderowałaby się jako płaski tekst. Gotcha #15. */
.release-notes h3 { font-size: 1rem; font-weight: 600; margin: 1.25rem 0 .5rem; }
.release-notes h3:first-child { margin-top: 0; }
.release-notes h4 { font-size: .9375rem; font-weight: 600; margin: 1rem 0 .375rem; }
.release-notes p  { margin: .5rem 0; line-height: 1.6; }
.release-notes ul { list-style: disc; padding-left: 1.5rem; margin: .5rem 0; }
.release-notes ol { list-style: decimal; padding-left: 1.5rem; margin: .5rem 0; }
.release-notes li { margin: .25rem 0; line-height: 1.6; }
.release-notes code {
  font-family: ui-monospace, "IBM Plex Mono", monospace;
  font-size: .875em;
  background: var(--release-code-bg);
  padding: .1em .35em;
  border-radius: .25rem;
}
.release-notes strong { font-weight: 600; }
