/* Pyrylandia — design tokens.
 *
 * SINGLE SOURCE OF TRUTH dla kolorów markowych i DaisyUI theme overrides.
 * Każdy plik HTML / inny CSS który potrzebuje brand color powinien
 * referować przez CSS variable (--pyr-brand), nie hardkodować hex'a.
 *
 * `oklch(...)` (jako function call, nie raw triplet) MOŻE być TYLKO tu —
 * lint w CI (.github/workflows/test.yml) blokuje merge gdy ten string
 * pojawi się gdzie indziej. Reason: PR #50 (Sprint 1 F1) załatwił bug
 * gdzie DaisyUI default oklch() fioletowy nadpisywał brand blue —
 * lint zapobiega podobnym regresjom.
 *
 * Tailwind config (`templates/base/shell.html`) wciąż używa hex literałów
 * w `colors` (nazwane utility classes typu `bg-brand`, `text-signal-red`)
 * — to OK, bo to jeden plik definicji, nie scattered values w 50
 * komponentach. Lint nie tyka hex'ów, tylko `oklch()`.
 */

/* ---------- Pyrylandia brand tokens (hex) ----------
 * ETAP 2a: blok --pyr-* (hex) PRZENIESIONY do static/css/tokens.brand.css,
 * WYGENEROWANEGO z design-tokens.json (jedno SOT palety, współdzielone z
 * tailwind.config.js → utility classes). head_assets.html ładuje tokens.brand.css
 * PRZED tym plikiem. Tu zostaje WYŁĄCZNIE warstwa OKLCH theme DaisyUI (poniżej) —
 * jedyne legalne miejsce na `oklch(` wg lintu CI (+ wygenerowany app.css). */

/* ---------- DaisyUI OKLCH overrides ----------
 * DaisyUI v4 czyta CSS variables w formacie "L% C H" (3-element OKLCH).
 * Bez nich `.btn-primary` używa default `light` theme = fiolet
 * oklch(0.49 0.31 275) (bug znaleziony w QA F1 PR #50).
 *
 * Wartości tu są SOT — wszystkie shell-like templates (shell.html,
 * portal/base.html, errors/{403,404}.html) linkują ten plik.
 */
:root, [data-theme="light"] {
  --p:  45% 0.18 264;      /* primary  = #1a56db brand blue */
  --pc: 100% 0 0;          /* primary-content = white */
  --s:  25% 0.04 257;      /* secondary = #1e293b steel-800 */
  --sc: 100% 0 0;
  --a:  45% 0.18 264;      /* accent ⇒ primary */
  --ac: 100% 0 0;

  /* PR-A2 — Gantt (montaż/przeglądy) + matrix przeglądów. Kolory statusów
     wizyt/komórek jako zmienne, żeby [data-theme="pyrlandia-dark"] mógł je
     przygasić bez trzymania hexów w Pythonie (apps/service/views_ui.py) ani
     w szablonach. Wartości jasnego motywu = dotychczasowe hardcoded hexy 1:1. */
  --gantt-planned:    #94a3b8; /* steel-400 — zaplanowana */
  --gantt-traveling:  #3b82f6; /* blue — w drodze */
  --gantt-onsite:     #f59e0b; /* amber — na obiekcie */
  --gantt-done:       #16a34a; /* green — zakończona */
  --gantt-placeholder:#cbd5e1; /* slate-300 — harmonogram bez ticketu */
  --matrix-planned: #fef08a; /* yellow-200 */
  --matrix-overdue: #fecaca; /* red-200 */
  --matrix-done:    #bbf7d0; /* green-200 */
  /* Tło `code` w notatkach wydania (/co-nowego/). Osobny token, bo
     markdown renderuje się na karcie i musi się przygasić w ciemnym. */
  --release-code-bg: #f1f5f9; /* steel-100 */
  /* A14 (0585/0672) — kolor pierścienia fokusa (static/css/pyrlandia.css
     `:focus-visible`). Markowy błękit ma 6,2:1 na bieli karty. */
  --focus-ring: var(--pyr-brand); /* #1a56db */
}

[data-theme="pyrlandia-dark"] {
  /* Dyspozytornia 24/7 — Sprint 3 S5 (PR #55) */
  color-scheme: dark;
  --b1: 17% 0.02 257;
  --b2: 13% 0.015 257;
  --b3: 10% 0.01 257;
  --bc: 95% 0.005 257;
  --p:  60% 0.18 264;
  --pc: 100% 0 0;
  --s:  85% 0.02 257;
  --sc: 17% 0.02 257;
  --a:  60% 0.18 264;
  --ac: 100% 0 0;
  --n:  25% 0.02 257;
  --nc: 95% 0.005 257;
  --in: 65% 0.13 230;
  --inc: 10% 0.02 257;
  --su: 60% 0.18 145;
  --suc: 10% 0.02 257;
  --wa: 75% 0.16 80;
  --wac: 10% 0.02 257;
  --er: 65% 0.20 25;
  --erc: 100% 0 0;

  /* PR-A2 dark overrides. Gantt bars render `text-white` on top, so they stay
     saturated-but-darker (700-ish shade) instead of washing out against the
     dark card. Matrix cells + the placeholder bar render theme text (light in
     dark mode), so they go semi-transparent rgba tints of the same signal hue
     instead — readable without fighting the light text color. */
  --gantt-planned:     #64748b; /* steel-500 — przygaszony */
  --gantt-traveling:   #1d4ed8; /* blue-700 — w drodze */
  --gantt-onsite:      #b45309; /* amber-700 — na obiekcie */
  --gantt-done:        #15803d; /* green-700 — zakończona */
  --gantt-placeholder: rgba(148, 163, 184, 0.28); /* steel tint — brak ticketu */
  --matrix-planned: rgba(250, 204, 21, 0.25);  /* yellow tint — planowane */
  --matrix-overdue: rgba(248, 113, 113, 0.28); /* red tint — zaległe */
  --matrix-done:    rgba(74, 222, 128, 0.22);  /* green tint — zrealizowane */
  --release-code-bg: rgba(148, 163, 184, 0.22); /* steel tint — czytelne pod jasnym tekstem */
  /* A14 (0585/0672): ten sam --pyr-brand co w jasnym miał na tle --b1 tylko
     3,09:1 — pierścień fokusa ginął. Jaśniejszy wariant marki daje 5,2:1 na --b1
     i 5,5:1 na --b2, więc widać go i na karcie, i na tle strony. */
  --focus-ring: var(--pyr-brand-light); /* #3b82f6 */
}

/* #494 (uwaga klienta 2.3a) — tła pól w trybie ciemnym.
   shell.html forcuje `color-scheme: light` na input/select/textarea globalnie
   (żeby OS dark-mode nie psuł date pickerów w JASNYM motywie). Te reguły mają
   WYŻSZĄ specyficzność (selektor atrybutu), więc w pyrlandia-dark cofają to:
   pola idą w dark, a jawnie białe (Tailwind .bg-white) dostają ciemne tło. */
[data-theme="pyrlandia-dark"] input,
[data-theme="pyrlandia-dark"] select,
[data-theme="pyrlandia-dark"] textarea {
  color-scheme: dark;
}
[data-theme="pyrlandia-dark"] input.bg-white,
[data-theme="pyrlandia-dark"] select.bg-white,
[data-theme="pyrlandia-dark"] textarea.bg-white {
  background-color: oklch(var(--b2)) !important;
  color: oklch(var(--bc)) !important;
  border-color: oklch(var(--b3)) !important;
}

/* SRV-0585 (tryb ciemny wymaga poprawki): Tailwind `.bg-white` jest użyte 220+
   razy na kartach/panelach/modalach i wymusza białe tło niezależnie od motywu —
   w trybie ciemnym daje jasne tło + odziedziczony jasny tekst (--bc) = pola/treść
   nieczytelne (zgłoszone z listy postępowań). Jeden override remapuje każdy biały
   element na ciemną powierzchnię (--b1, jak bg-base-100), zamiast edytować 220
   szablonów. `color` na kontenerze ustawia tylko domyślny kolor tekstu — dzieci z
   własnym `text-*` (np. text-signal-red) zachowują swój kolor (!important rywalizuje
   tylko w obrębie tego samego elementu). */
[data-theme="pyrlandia-dark"] .bg-white:not(.keep-white):not(img):not(svg):not(iframe) {
  background-color: oklch(var(--b1)) !important;
  color: oklch(var(--bc)) !important;
}
/* Opt-out: powierzchnie które MUSZĄ zostać białe nawet w dark (np. tło quiet-zone
   kodu QR — czarne ścieżki SVG byłyby nieskanowalne na ciemnym; iframe podglądu
   PDF/oferty renderujący białą stronę). Dodaj klasę `keep-white`. img/svg/iframe
   są wykluczone domyślnie. */

/* ETAP 2b: .card-industrial używa `background: white` (właściwość, nie klasa
   .bg-white) — remap powyżej go NIE łapie. Jawna powierzchnia dark, by adopcja
   card-industrial nie świeciła bielą w pyrlandia-dark. (oklch legalny tylko tu.) */
[data-theme="pyrlandia-dark"] .card-industrial {
  background: oklch(var(--b1));
  border-color: oklch(var(--b3));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] .stat-tile { border-left-color: oklch(var(--b3)); }

/* ETAP 2b PR-B1: .badge-signal-* dark-mode contrast fix. The light-mode rules
   (static/css/pyrlandia.css :root, untouched) pair a pale rgba tint with a
   dark accent text color — tuned to read on a WHITE card. In pyrlandia-dark
   the same rgba blends into a near-black card (~oklch 17% b1), so the dark
   text sits on a dark composited background too: measured ~2.5-3.2:1 contrast
   for red/yellow/green/blue (all below the 4.5:1 target for 12px badge text;
   .badge-signal-sm in tables is even smaller). Fix: brighten the text to the
   -400 shade of each signal hue and bump background alpha so the chip stays
   readable without turning into a plain light pill. .badge-signal-steel used
   a fixed light background (--steel-100) that already reads fine on dark
   cards — darkened here only so it doesn't look like a mistake/blown-out
   highlight next to the other (dark, tinted) badges. */
[data-theme="pyrlandia-dark"] .badge-signal-red    { background: rgba(211,47,47,0.22);  color: #f87171; }
[data-theme="pyrlandia-dark"] .badge-signal-yellow { background: rgba(249,168,37,0.22); color: #fbbf24; }
[data-theme="pyrlandia-dark"] .badge-signal-green  { background: rgba(46,125,50,0.24);  color: #4ade80; }
[data-theme="pyrlandia-dark"] .badge-signal-blue   { background: rgba(26,86,219,0.24);  color: #60a5fa; }
[data-theme="pyrlandia-dark"] .badge-signal-steel  { background: rgba(51,65,85,0.55);   color: #cbd5e1; }

/* 0585/0672: dawne pastelowe utility muszą respektować motyw.
 * Zachowujemy jasny podgląd dokumentu/QR oznaczony keep-white.
 * Nowe komponenty powinny używać tokenów DaisyUI zamiast stałej palety. */
[data-theme="pyrlandia-dark"] :is(.bg-red-50, .bg-red-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-signal-red) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-red-600, .text-red-600\/70, .text-red-600\/80, .text-red-600\/90, .text-red-700, .text-red-700\/70, .text-red-700\/80, .text-red-700\/90, .text-red-800, .text-red-800\/70, .text-red-800\/80, .text-red-800\/90, .text-red-900, .text-red-900\/70, .text-red-900\/80, .text-red-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-signal-red) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-yellow-50, .bg-yellow-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-signal-yellow) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-yellow-600, .text-yellow-600\/70, .text-yellow-600\/80, .text-yellow-600\/90, .text-yellow-700, .text-yellow-700\/70, .text-yellow-700\/80, .text-yellow-700\/90, .text-yellow-800, .text-yellow-800\/70, .text-yellow-800\/80, .text-yellow-800\/90, .text-yellow-900, .text-yellow-900\/70, .text-yellow-900\/80, .text-yellow-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-signal-yellow) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-amber-50, .bg-amber-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-signal-yellow) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-amber-600, .text-amber-600\/70, .text-amber-600\/80, .text-amber-600\/90, .text-amber-700, .text-amber-700\/70, .text-amber-700\/80, .text-amber-700\/90, .text-amber-800, .text-amber-800\/70, .text-amber-800\/80, .text-amber-800\/90, .text-amber-900, .text-amber-900\/70, .text-amber-900\/80, .text-amber-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-signal-yellow) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-orange-50, .bg-orange-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-section-aktywa) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-orange-600, .text-orange-600\/70, .text-orange-600\/80, .text-orange-600\/90, .text-orange-700, .text-orange-700\/70, .text-orange-700\/80, .text-orange-700\/90, .text-orange-800, .text-orange-800\/70, .text-orange-800\/80, .text-orange-800\/90, .text-orange-900, .text-orange-900\/70, .text-orange-900\/80, .text-orange-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-section-aktywa) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-green-50, .bg-green-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-signal-green) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-green-600, .text-green-600\/70, .text-green-600\/80, .text-green-600\/90, .text-green-700, .text-green-700\/70, .text-green-700\/80, .text-green-700\/90, .text-green-800, .text-green-800\/70, .text-green-800\/80, .text-green-800\/90, .text-green-900, .text-green-900\/70, .text-green-900\/80, .text-green-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-signal-green) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-blue-50, .bg-blue-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-brand) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-blue-600, .text-blue-600\/70, .text-blue-600\/80, .text-blue-600\/90, .text-blue-700, .text-blue-700\/70, .text-blue-700\/80, .text-blue-700\/90, .text-blue-800, .text-blue-800\/70, .text-blue-800\/80, .text-blue-800\/90, .text-blue-900, .text-blue-900\/70, .text-blue-900\/80, .text-blue-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-brand) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-purple-50, .bg-purple-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-section-firma) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-purple-600, .text-purple-600\/70, .text-purple-600\/80, .text-purple-600\/90, .text-purple-700, .text-purple-700\/70, .text-purple-700\/80, .text-purple-700\/90, .text-purple-800, .text-purple-800\/70, .text-purple-800\/80, .text-purple-800\/90, .text-purple-900, .text-purple-900\/70, .text-purple-900\/80, .text-purple-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-section-firma) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-gray-50, .bg-gray-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-steel-400) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-gray-600, .text-gray-600\/70, .text-gray-600\/80, .text-gray-600\/90, .text-gray-700, .text-gray-700\/70, .text-gray-700\/80, .text-gray-700\/90, .text-gray-800, .text-gray-800\/70, .text-gray-800\/80, .text-gray-800\/90, .text-gray-900, .text-gray-900\/70, .text-gray-900\/80, .text-gray-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-steel-400) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-slate-50, .bg-slate-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-steel-400) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-slate-600, .text-slate-600\/70, .text-slate-600\/80, .text-slate-600\/90, .text-slate-700, .text-slate-700\/70, .text-slate-700\/80, .text-slate-700\/90, .text-slate-800, .text-slate-800\/70, .text-slate-800\/80, .text-slate-800\/90, .text-slate-900, .text-slate-900\/70, .text-slate-900\/80, .text-slate-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-steel-400) 32%, oklch(var(--bc)));
}

/* A14 (0585/0672): rodziny dołożone po odbiorze — remap wyżej obejmował 9
   rodzin, a szablony używają też `rose` (top-3 kierowców na
   /auta/kierowcy/zachowanie/), `emerald` (zapas w aucie w PWA, legenda mapy)
   i `violet` (legenda mapy). Bez tych reguł wiersz `bg-rose-50` zostawał
   biały pod prawie białym --bc: zmierzone 1,05:1. Odcienie 400-500 celowo
   POZA polityką — to kropki legend i paski, bez tekstu na sobie.
   Strażnik: apps/core/tests_kontrast_0672.py. */
[data-theme="pyrlandia-dark"] :is(.bg-rose-50, .bg-rose-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-signal-red) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-rose-600, .text-rose-600\/70, .text-rose-600\/80, .text-rose-600\/90, .text-rose-700, .text-rose-700\/70, .text-rose-700\/80, .text-rose-700\/90, .text-rose-800, .text-rose-800\/70, .text-rose-800\/80, .text-rose-800\/90, .text-rose-900, .text-rose-900\/70, .text-rose-900\/80, .text-rose-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-signal-red) 32%, oklch(var(--bc)));
}
/* A14 (0585/0672), odbiór: wiersz wyróżniony w tabeli `table-zebra`. Sama klasa
   tła (`.bg-rose-50`, specyficzność 0-1-0) PRZEGRYWA z `.table-zebra tbody
   tr:nth-child(2n)` (0-2-2), więc z trójki top-3 kierowców podświetlony był
   tylko 1. i 3. wiersz, a remap pasteli w ciemnym (0-2-0) przegrywał tak samo —
   oba motywy pokazywały INNY zestaw wierszy. Klasa semantyczna z selektorem
   0-3-2 wygrywa w obu. Używa jej templates/fleet/driver_behavior_dashboard.html;
   7% w jasnym dobrane tak, by `text-orange-700` trzymał 4,66:1 (zebra --b2 daje
   4,63:1, rose-50 dawało 4,71:1). */
.table-zebra tbody tr.wiersz-ryzyka,
.table tbody tr.wiersz-ryzyka {
  background-color: color-mix(in srgb, var(--pyr-signal-red) 7%, oklch(var(--b1)));
}
[data-theme="pyrlandia-dark"] .table-zebra tbody tr.wiersz-ryzyka,
[data-theme="pyrlandia-dark"] .table tbody tr.wiersz-ryzyka {
  background-color: color-mix(in srgb, var(--pyr-signal-red) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.bg-emerald-50, .bg-emerald-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-signal-green) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-emerald-600, .text-emerald-600\/70, .text-emerald-600\/80, .text-emerald-600\/90, .text-emerald-700, .text-emerald-700\/70, .text-emerald-700\/80, .text-emerald-700\/90, .text-emerald-800, .text-emerald-800\/70, .text-emerald-800\/80, .text-emerald-800\/90, .text-emerald-900, .text-emerald-900\/70, .text-emerald-900\/80, .text-emerald-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-signal-green) 32%, oklch(var(--bc)));
}
[data-theme="pyrlandia-dark"] :is(.bg-violet-50, .bg-violet-100):not(.keep-white, .keep-white *) {
  background-color: color-mix(in srgb, var(--pyr-section-firma) 16%, oklch(var(--b1)));
  color: oklch(var(--bc));
}
[data-theme="pyrlandia-dark"] :is(.text-violet-600, .text-violet-600\/70, .text-violet-600\/80, .text-violet-600\/90, .text-violet-700, .text-violet-700\/70, .text-violet-700\/80, .text-violet-700\/90, .text-violet-800, .text-violet-800\/70, .text-violet-800\/80, .text-violet-800\/90, .text-violet-900, .text-violet-900\/70, .text-violet-900\/80, .text-violet-900\/90):not(.keep-white, .keep-white *) {
  color: color-mix(in srgb, var(--pyr-section-firma) 32%, oklch(var(--bc)));
}

/* #751 — FullCalendar keeps white popovers and list hover surfaces by default.
   Scope the theme bridge to the visits calendar; event/status colors stay intact. */
[data-theme="pyrlandia-dark"] #calendar {
  --fc-page-bg-color: oklch(var(--b1));
  --fc-neutral-bg-color: oklch(var(--b2));
  --fc-neutral-text-color: oklch(var(--bc) / 0.8);
  --fc-border-color: oklch(var(--bc) / 0.35);
  --fc-list-event-hover-bg-color: oklch(var(--b2));
  --fc-more-link-bg-color: oklch(var(--b2));
  --fc-more-link-text-color: oklch(var(--bc));
}

/* SRV-2026-0706 — wspólny picker daty i zegara (_partials/clock_datetime_picker.html)
   ma tło popovera zadane na sztywno w inline CSS, a tekst dziedziczył --bc motywu:
   w pyrlandia-dark wychodził biały na białym (zmierzone 1,05-1,15:1). Partial deklaruje
   jasne wartości --dtp-*; tutaj przepinamy je na tokeny motywu (to jedyne miejsce, gdzie
   lint CI dopuszcza oklch). Selektor [data-theme] #pyr-dtp (1,1,0) wygrywa specyficznością
   z #pyr-dtp (1,0,0), więc kolejność ładowania arkuszy nie ma znaczenia. */
[data-theme="pyrlandia-dark"] #pyr-dtp {
  --dtp-surface: oklch(var(--b1));
  --dtp-fg: oklch(var(--bc));
  --dtp-muted: oklch(var(--bc) / 0.72);
  /* --soft (tarcza zegara, nieaktywna zakładka) zostaje na --b2: jaśniejsza tarcza
     zjada kontrast WSKAZÓWKI, która jest na niej rysowana akcentem (zmierzone
     3,97:1 przy tincie --bc/0.08, próg 4,5). Podświetlenie pod kursorem musi
     natomiast być JAŚNIEJSZE od tła — --b3 jest ciemniejszy od powierzchni
     popovera, więc hover ginął (1,08:1). Tint z --bc, jak `.btn-ghost:hover`
     w DaisyUI; kontrast tekstu na nim zostaje powyżej 10:1. */
  --dtp-soft: oklch(var(--b2));
  --dtp-hover: oklch(var(--bc) / 0.16);
  --dtp-border: oklch(var(--bc) / 0.35);
  --dtp-accent: oklch(var(--p));
  --dtp-accent-fg: oklch(var(--b1));
  --dtp-shadow: 0 10px 25px rgb(0 0 0 / .45);
}

/* SRV-2026-0705 — sygnał „wpisany tekst to jeszcze nie wybór" w combo pickera
   (_partials/object_picker_modal.html). W jasnym motywie idzie przyciemniony
   żółty (1,97:1 sygnałowego na bieli to za mało), w ciemnym wraca jasny żółty,
   który na tle --b1 daje 9,7:1. */
[data-theme="pyrlandia-dark"] .op-combo-box {
  --op-warn: var(--pyr-signal-yellow);
}
