/* =============================================================================
   Walk-Check konzola: jeden stylesheet pre index.html, prirucky/, app/,
   annotate/dataset/nakrucanie/mapa.
   =============================================================================
   ZDROJ PRAVDY PRE FARBY A SKALU je packages/design-tokens/tokens.ts.
   Blok `:root` nizsie je jeho DOSLOVNY OPIS, nie druha paleta: kazda hodnota ma
   pri sebe napisane, z ktoreho tokenu pochadza. Preco opis a nie `<link>` na
   packages/design-tokens/theme.css:
     1. console/deploy.sh kopiruje na Vercel VYMENOVANE subory z console/
        (app.js, auth.js, config.js, logika.js, meranie.js, index.html,
        styles.css). Cesta ../packages/... na prode neexistuje, takze
        @import aj <link> by tam skoncili 404 a konzola by ostala bez farieb.
     2. theme.css ma svetlu temu pod triedou `.theme-light`; zapnut ju znamena
        pridat class na <html>, a index.html patri druhemu baliku.
   Az bude oboje hotove (link v <head> + class="theme-light"), tento blok sa
   zmaze a nic ine sa menit nemusi: nazvy premennych su zhodne s theme.css.

   Rozdiely oproti theme.css, ktore su ZAMER a nie drift (viac v reporte):
     --line     = ink[200] #C4D3E5, nie tokens.light.border rgba(11,26,47,.10).
                  Ram panela musi byt na obrazovke pri dennom svetle vidno.
     --shadow   ostava. tokens.ts predpisuje "ziadne tiene" pre TMAVU appku,
                  kde sa hlbka robi vrstvami povrchov; svetly dashboard ma
                  biele karty na skoro bielom pozadi a bez tienov splynu.
   ============================================================================= */

:root{
  /* ── Paleta (tokens.ts → palette) ───────────────────────────────────────── */
  --wc-brand-100:#CFE3FF;  --wc-brand-200:#A6CCFB;  --wc-brand-400:#4593EC;
  --wc-brand-500:#2F84E4;  --wc-brand-600:#1F6BC4;  --wc-brand-700:#18539A;
  --wc-brand-900:#15314F;
  --wc-ink-50:#F4F8FD;     --wc-ink-100:#E7EEF7;    --wc-ink-200:#C4D3E5;
  --wc-ink-500:#52688A;    --wc-ink-900:#0B1A2F;
  --wc-teal-50:#E3F6EF;    --wc-teal-500:#149B6B;   --wc-teal-600:#0F7E58;
  --wc-teal-700:#0C6147;
  --wc-amber-50:#FBF0DD;   --wc-amber-300:#E0A33A;  --wc-amber-500:#A66B12;
  --wc-amber-600:#8F5B0F;
  --wc-red-50:#FCEBEB;     --wc-red-500:#C5302F;    --wc-red-600:#9E2322;

  /* ── Semantika (tokens.ts → theme.light) ────────────────────────────────── */
  --wc-bg:var(--wc-ink-50);              /* plocha za panelmi */
  --wc-surface:#FFFFFF;                  /* panel, karta */
  --wc-surface-2:var(--wc-ink-50);       /* zebra, jemne podfarbenie */
  --wc-surface-3:var(--wc-ink-100);      /* treti stupen hlbky */
  --wc-text-primary:var(--wc-ink-900);
  --wc-text-muted:var(--wc-ink-500);
  /* accent = FARBA TEXTU a ramov; accentFill = VYPLN pod bielym textom.
     Su to dva tokeny zamerne: biela na brand[500] ma 3,79:1 (pod AA),
     na brand[600] 5,31:1 (tokens.ts:71-77). */
  --wc-accent:var(--wc-brand-600);
  --wc-accent-hover:var(--wc-brand-700);
  --wc-accent-fill:var(--wc-brand-600);
  --wc-accent-fill-pressed:var(--wc-brand-700);
  --wc-on-accent:#FFFFFF;
  --wc-verified:var(--wc-teal-600);      /* text a vypln pod bielym textom */
  --wc-verified-ink:var(--wc-teal-700);  /* text na teal[50] podklade */
  --wc-review:var(--wc-amber-600);
  --wc-review-ink:#7E4F0C;
  --wc-fail:var(--wc-red-500);
  --wc-fail-ink:var(--wc-red-600);

  /* ── Skala rozostupov (tokens.ts → space, 4px krok) ─────────────────────── */
  --sp-05:2px;  --sp-1:4px;   --sp-2:8px;   --sp-3:12px;  --sp-4:16px;
  --sp-5:20px;  --sp-6:24px;  --sp-8:32px;  --sp-10:40px; --sp-16:64px;

  /* ── Skala pisma: SEDEM stupnov (tokens.ts → typography.scale) ──────────── */
  /* 11 px je jediny stupen navyse oproti tokenom (tam konci na 12): nesu ho
     verzalkove mikropopisky tabuliek a stitkov, ktore v mobilnej appke nie su. */
  --fs-2xs:11px; --fs-xs:12px; --fs-sm:13px; --fs-md:14px;
  --fs-lg:16px;  --fs-xl:20px; --fs-2xl:28px;

  /* ── Polomery (tokens.ts → radius) ──────────────────────────────────────── */
  --r-sm:6px; --r-md:8px; --r-lg:12px; --r-xl:16px; --r-full:9999px;

  /* ── Jeden obsahovy stlpec ──────────────────────────────────────────────── */
  /* Hlavicka je cez celu sirku okna, obsah je stlpec 1200 px v strede. Do
     28.08. mala hlavicka pevny padding 20 px, takze logo stalo na x=20 a nadpis
     stranky na 380 pri sirke 1920. --wc-bleed je to iste odsadenie, ktore ma
     .page: pri sirke pod 1200 px je to gutter, nad nou polovica zvysku + gutter.
     Vdaka tomu sedi logo, prva polozka navigacie a nadpis stranky na JEDNEJ osi
     pri kazdej sirke, a ziadny obal v HTML na to netreba. */
  --wc-page-max:1200px;
  --wc-gutter:var(--sp-5);
  --wc-bleed:max(var(--wc-gutter), calc((100% - var(--wc-page-max)) / 2 + var(--wc-gutter)));
  /* Uzsi obsah NEcentruje stranku: sedi na tej istej osi a len skor konci
     (pravidlo JEDNEJ OSI, 30.08.2026: kontajnery boli chaos, plna sirka /
     polovica vlavo / stred podla stranky). Centrovany ostava LEN login. */
  --wc-page-uzka:760px;

  /* ── Vyska hlavicky: JEDNA hodnota ──────────────────────────────────────── */
  /* Cita ju .topbar, sticky offset .navrow aj vyska prihlasovacej steny.
     Do 28.08. si ich kazda drzala vlastnu (62 / 62 / 54) a prihlasovacia
     stena preto rolovala o 8 px, hoci nemala co. */
  --wc-topbar-h:62px;

  /* Detekcna paleta (tokens.ts -> detection). Je nezavisla od temy: kresli sa
     nad obrazom kamery, nie nad UI plochou. */
  --wc-det-present:#2FE08A; --wc-det-missing:#FFB84D; --wc-det-chip-ink:#06261A;
  /* Modra na tmavom bare (stitok skupiny, CONSOLE v lockupe) a amber text
     Dielne. #F0C879 je tokens.dark.soft.review.text; #9CC2EF v tokenoch NIE JE
     (lezi medzi brand[200] a brand[300]) a je to jediny odtien, ktory tu
     nema svoj token: viac v reporte. */
  --wc-on-deep:#9CC2EF; --wc-on-deep-warn:#F0C879;

  --wc-shadow:0 1px 2px rgba(11,26,47,.06),0 8px 24px rgba(11,26,47,.06);

  /* ── Spatne kompatibilne nazvy ──────────────────────────────────────────── */
  /* Pouzivaju ich annotate.html, nakrucanie.html, dataset.html, mapa.html a
     prirucky/. Nie su to nove farby, len stare mena tych istych tokenov. */
  --brand:var(--wc-brand-500);
  /* Display rez ako token (audit 31.08.: .lb-veta referencovala neexistujuci
     token a padala na systemove pismo). Obrys poli: --line (ink-200, 1.5:1)
     je na deliace ciary, na 3:1 obrys ovladaca je ink-400. */
  --wc-font-display:"Saira",system-ui,sans-serif;
  --wc-ink-400:#8296AD;
  --brand-deep:var(--wc-brand-900);
  --ink:var(--wc-ink-900);
  --muted:var(--wc-ink-500);
  --line:var(--wc-ink-200);
  --zebra:var(--wc-ink-50);
  /* --teal a --amber su o stupen tmavsie nez do 28.08. (teal[500] -> teal[600],
     amber[500] -> amber[600]). Nie je to kozmetika: app.js:2286 z nich sklada
     vypln farebnej dlazdice pod BIELYM textom (`resultColor`) a rovnako to robia
     prirucky/test.css a annotate.html. Biela na teal[500] mala 3,54:1 a na
     amber[500] 3,92:1, teda pod AA; na 600 ma 5,09:1 a 5,77:1. Tie iste
     premenne sluzia inde ako farba TEXTU na bielej, kde tmavsi odtien tiez len
     pomaha. Svetlejsie odtiene ostavaju k dispozicii ako --wc-teal-500
     a --wc-amber-500 pre dekorativne bodky, ktore vyznam nenesu samy o sebe. */
  --teal:var(--wc-teal-600);
  --amber:var(--wc-amber-600);
  --red:var(--wc-red-500);
  --bg:var(--wc-bg);
  --card:var(--wc-surface);
  --shadow:var(--wc-shadow);
  --radius:var(--r-lg);
}

/* =============================================================================
   Zaklad
   ============================================================================= */
*{box-sizing:border-box}
/* MIESTO PRE SCROLLBAR SA REZERVUJE VZDY.
   Bez tohto sa pri objaveni scrollbaru zuzi viewport (zmerane: 1200 -> 1185 px)
   a cely obsah vratane hlavicky sa posunie o 15 px dolava. Konzola meni vysku
   stranky pri kazdom prepnuti pohladu, takze scrollbar sa objavuje a mizne
   a hlavicka pri tom vidielne skace. `stable` necha pruh rezervovany aj na
   kratkej stranke, co je presne ta vymena, ktora skakanie odstrani.
   Norbert to nahlasil 28.08.2026. */
html{scrollbar-gutter:stable}
html,body{margin:0}
body{
  font:var(--fs-md)/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  color:var(--wc-text-primary); background:var(--wc-bg); -webkit-font-smoothing:antialiased;
}
.tnum{font-variant-numeric:tabular-nums}
a{color:var(--wc-accent); text-decoration:none}
/* PODCIARKUJU SA LEN ODKAZY V TEXTE, nie prvky, ktore su odkazom len technicky
   (29.08.2026). Karta, tlacidlo, chip ani zalozka nie su veta: podciarknutie na
   nich vyzera ako chyba a `text-decoration:none` v ich ZAKLADNOM pravidle to
   neprebije, lebo `a:hover` ma vyssiu specificitu (0,1,1 proti 0,1,0).
   Afordancia tychto prvkov je ram, tien a farba, nie ciara. */
a:hover{text-decoration:underline}
a.wscard:hover, a.btn:hover, a.chip:hover, a.card:hover,
a.topbar-link:hover, a.dalej:hover, a.navtab:hover, a.brand:hover{text-decoration:none}
/* [hidden] musi vyhrat nad triedami s explicitnym display (flex/grid): inak
   atribut hidden NIC nespravi (UA stylesheet ma nizsiu specificitu). */
[hidden]{display:none!important}

/* SELECT: vlastna sipka s odstupom od okraja (Norbert 30.08.: nativna sedela
   nalepena na hrane). appearance:none zhodi nativny vzhlad, chevron je SVG
   na pozicii right 12px; padding-right drzia KONKRETNE pravidla selectov
   (.rolepick/.rolesel tu, Dielna vo svojich <style>), lebo shorthand padding
   s vyssou specificitou by globalnu hodnotu prebil. Chevron kresli tie iste
   uhly ako ikony (ploche zakoncenia, ziadne oble konce). */
select{appearance:none; -webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%2352688A' stroke-width='1.6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right var(--sp-3) center}
/* Na tmavom bare svetla verzia sipky (brand-100, ako text rolepicku). */
.topbar select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23CFE3FF' stroke-width='1.6'/%3E%3C/svg%3E")}

/* Nadpisy nesie display pismo znacky (Saira). Nacitava sa uz v <head> kvoli
   wordmarku; do 28.08. sa cely font stiahol kvoli jedinemu slovu v logu. */
.title,.panel-head h2,.card h3,.loopstep h2,.logincard h1,.wcdialog h3{
  font-family:"Saira",system-ui,sans-serif; font-weight:600; letter-spacing:-.005em;
}

/* =============================================================================
   HLAVICKA: JEDEN blok
   =============================================================================
   Do 28.08. bola rozpisana v PIATICH blokoch (riadky 19-48, 198-212, 214-222,
   224-238, 239-260), kazdy prepisoval predosly a `.topbar` sa deklaroval
   styrikrat. Platne hodnoty su tu a nikde inde.

   Centrovanie: bar ma PEVNU vysku, nulovy zvisly padding a align-items:center,
   takze flex center je presny stred. Znacka je hotovy lockup (mark 34 px,
   wordmark Saira 17 px, CONSOLE mono 10 px) doladeny na subpixel cez
   TextMetrics: line-height:1 tlaci ink Sairy hore, mono verzalky naopak dole.
   translateY dorovnava ink stredy na 0,00 a NEMENI layout. Lockup je jediny
   blok, ktory sa zamerne nesnapuje na 4px skalu: su to proporcie znacky.
   ============================================================================= */
.topbar{
  display:flex; align-items:center; flex-wrap:wrap; gap:var(--sp-4);
  min-height:var(--wc-topbar-h); padding:0 var(--wc-bleed);
  background:var(--wc-brand-900); color:#fff;
  position:sticky; top:0; z-index:10;
}
.spacer{flex:1 1 0; min-width:0}

.brand{display:inline-flex; align-items:center; gap:3px; line-height:1; flex:none;
  font-weight:700; letter-spacing:.2px; color:#fff; text-decoration:none}
.brand:hover{text-decoration:none}
/* Pomery lockupu su KANON (brand/logo-package/README.md): text/mark 0.4032,
   gap/mark 0.0645. Pri wordmarku 17 px je mark 42 px a gap 3 px. */
.brand .wcmark{display:block; width:42px; height:42px; margin-top:1px; flex:none}
.brand small{font-weight:500; color:var(--wc-brand-200); margin-left:var(--sp-05)}
.brand-text{display:inline-flex; align-items:baseline; gap:0; min-width:0}
.brand .wordmark{font-family:"Saira",system-ui,sans-serif; font-weight:600; font-size:17px;
  letter-spacing:-.01em; color:#fff; line-height:1; white-space:nowrap;
  transform:translateY(1.25px)}
/* SWITCHER PRIESTOROV pri logu (30.08.2026, nahradil divizny tag Console):
   segmentovany prepinac Konzola/Dielna/Prirucky v jednom pill kontajneri,
   dvoj- alebo troj- podla roly (Dielna len admin). Aktivny segment nesie
   vypln, ziadna spodna linka: segmented control ma stav VNUTRI. */
.prepinac{display:inline-flex; align-items:center; gap:2px; margin-left:var(--sp-3);
  padding:3px; border-radius:var(--r-full);
  background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.20); flex:none}
.prepinac .priestor{display:inline-flex; align-items:center; gap:var(--sp-2);
  padding:5px 13px; border-radius:var(--r-full); color:var(--wc-brand-100);
  font-size:var(--fs-sm); white-space:nowrap}
.prepinac .priestor:hover{background:rgba(255,255,255,.10); color:#fff; text-decoration:none}
.prepinac .priestor.on{background:rgba(255,255,255,.18); color:#fff}
.prepinac .priestor .ikona{width:1.05em; height:1.05em}

/* Odkaz na prirucky. Nie je to krok slucky plan/exekucia/audit, preto stoji
   vedla roly a nie v navigacii pod brandom. Ram zosilneny z .22 na .38:
   pri .22 mal voci baru 1,93:1, teda pod hranicou 3:1 pre obrys ovladaca. */
.topbar-link{
  display:inline-flex; align-items:center; gap:var(--sp-2);
  color:var(--wc-brand-100); padding:var(--sp-2) var(--sp-3); border-radius:var(--r-md);
  font-size:var(--fs-sm); border:1px solid rgba(255,255,255,.38); white-space:nowrap;
}
.topbar-link .ikona{width:1.05em; height:1.05em}
.topbar-link:hover{background:rgba(255,255,255,.14); color:#fff; text-decoration:none}
.rolepick{display:flex; align-items:center; gap:var(--sp-2); color:var(--wc-brand-100);
  font-size:var(--fs-sm); flex:none}
.rolepick select{
  background-color:rgba(255,255,255,.10); color:#fff; border:1px solid rgba(255,255,255,.38);
  border-radius:var(--r-md); padding:var(--sp-1) 30px var(--sp-1) var(--sp-2); font:inherit;
}
.rolepick select option{color:var(--wc-ink-900)}
/* DEMO stitok: biela na amber[500] mala 4,44:1 pri 11 px. amber[600] = 5,77:1. */
.demo-flag{font-size:var(--fs-xs); background:var(--wc-amber-600); color:#fff;
  padding:var(--sp-05) var(--sp-2); border-radius:var(--r-full); font-weight:600;
  white-space:nowrap}
.authbox{display:inline-flex; align-items:center; gap:var(--sp-3)}
.authbox .who{font-size:var(--fs-sm); color:#fff; opacity:.85;
  display:inline-block; transform:translateY(0.97px)}

/* Walk-Check logo (original z landing): swoosh+chevron sa periodicky pretoci,
   lietadlo staticke (rc-spin: 1.1 s otocka, potom pauza do 5 s cyklu). */
.rc-ring{transform-box:view-box;transform-origin:center;
  animation:rc-spin 5s cubic-bezier(.65,0,.35,1) infinite}
@keyframes rc-spin{0%{transform:rotate(0)}22%{transform:rotate(360deg)}100%{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.rc-ring{animation:none}}

/* =============================================================================
   NAVIGACIA
   =============================================================================
   Vlastny rad pod brandom (audit 31.07.): 15 poloziek v jednom 34px riadku sa
   lamalo a stitky PLAN/EXEKUCIA/AUDIT citali ako dalsie taby.

   Dve veci opravene 28.08.:
   1. `flex-wrap:wrap` je NATRVALO, nie az v media query. Rad potreboval 1178 px
      a zalamoval sa az pod 1100, takze medzi 1101 a 1173 px trcal von z okna.
   2. Ink prvej polozky sedi na osi obsahu. Retaz odsadeni bola
      20 (navrow) - 12 (zaporny margin) + 12 (padding skupiny) + 12 (padding
      tlacidla) = 32, teda o 12 px vpravo od loga. Skupiny uz nemaju vlastny
      vodorovny padding; odsadenie nesu tlacidla a stitky, a zaporny margin
      presne o ne kompenzuje.
   ============================================================================= */
.nav{display:flex; align-items:center; flex-wrap:wrap; gap:var(--sp-1); margin-left:var(--sp-2)}
/* .navtab je <a> podoba tej istej polozky: satelity (Dielna) su samostatne
   stranky, takze ich taby musia byt odkazy (middle-click, nova karta,
   citacka), nie button onclick. Vzhlad je JEDEN. */
.nav button, .nav .navtab{
  position:relative; background:transparent; border:0; color:var(--wc-brand-100);
  padding:var(--sp-2) var(--sp-3); border-radius:var(--r-md);
  font:inherit; line-height:1.2; cursor:pointer; display:inline-block;
}
.nav button:hover, .nav .navtab:hover{background:rgba(255,255,255,.16); color:#fff}
/* AKTIVNA POLOZKA NEMENI REZ PISMA. Do 28.08. na nej bolo font-weight:600,
   takze rad pri kazdom kliku poskocil o 2,7 az 4,7 px a blok Dielne o 15 az 19.
   Stav nesie 3px linka v brand[400]: voci baru ma 4,14:1 (podfarbenie .16 malo
   1,64:1, teda pod hranicou 3:1 pre stavovy prvok, WCAG 1.4.11). */
.nav button.on, .nav .navtab.on{background:rgba(255,255,255,.10); color:#fff}
.nav button.on::after, .nav .navtab.on::after{content:""; position:absolute; left:0; right:0; bottom:0; height:3px;
  background:var(--wc-brand-400)}

.navgrp{display:flex; align-items:center; gap:var(--sp-05)}
.navgrp>i{font-style:normal; font-size:var(--fs-2xs); letter-spacing:.12em;
  text-transform:uppercase; color:var(--wc-on-deep)}

.navrow{position:sticky; top:var(--wc-topbar-h); z-index:9; background:var(--wc-brand-900);
  border-top:1px solid rgba(255,255,255,.08); padding:0 var(--wc-bleed)}
.navrow:has(#nav[hidden]){display:none}   /* login stena: bez menu ani prazdny pruh */
.navrow .nav{margin-left:calc(-1 * var(--sp-3)); align-items:stretch; gap:0; flex:1}
.navrow .navgrp{flex-direction:column; align-items:stretch; justify-content:flex-end;
  gap:var(--sp-1); padding:var(--sp-2) 0; margin:0; border-left:0}
.navrow .navgrp + .navgrp{margin-left:var(--sp-3); padding-left:var(--sp-3);
  border-left:1px solid rgba(255,255,255,.10)}
.navrow .navgrp>i{display:block; padding:0 var(--sp-3)}
.navrow .grp{display:flex; flex-wrap:wrap; gap:var(--sp-05)}
.navrow .nav button{white-space:nowrap}
/* Dielna = interne naradie na stavbu modelu: opticky bokom vpravo, amber
   stitok (rovnaka farba ako "review/interne" inde), nech sa nemiesa s produktom. */
/* Pozn.: nalez "Organizacia ma opticky 324 px na 128 px obsahu" zanikol sam
   obsahovym stlpcom. Rad uz nema k dispozicii celu sirku okna, ale 1200 px, na
   ktorych potrebuje 1152,5 px, takze `auto` rozdava 19,5 px a nie 324. Preto tu
   NIE JE ziadny dalsi oddelovac: pri 19,5 px medzere by dve ciary vysli 6,5 px
   od seba a citali by sa ako jedna rozmazana. */
.navrow .navgrp.workshop{margin-left:auto; background:rgba(255,255,255,.035)}
.navrow .navgrp.workshop>i{color:var(--wc-on-deep-warn)}

/* =============================================================================
   Stranka
   ============================================================================= */
.page{max-width:var(--wc-page-max); margin:0 auto;
  padding:var(--sp-6) var(--wc-gutter) var(--sp-16)}
/* SIROKA PRACOVNA PLOCHA (anotacia, dataset, mapa): body trieda prepne
   os obsahu na 1500 px, takze logo v topbare aj obsah sa posunu SPOLU
   a jedna os plati dalej (--wc-bleed cita tu istu premennu). */
body.plocha-siroka{--wc-page-max:1500px}
/* UZKY OBSAH (instalacia, nakrucanie): stranka je normalna .page na osi,
   obsah v nej konci skor. Ziadne margin:auto, ziadny stred. */
.obsah-uzky{max-width:var(--wc-page-uzka)}
.title{font-size:var(--fs-xl); margin:0 0 var(--sp-1)}
/* SIRKA NA CITANIE, nie na sirku okna (29.08.2026). `.sub` nemal max-width,
   takze na 1100 px okne mal riadok 1045 px, co je zhruba 160 znakov: oko na
   konci riadku nenajde zaciatok dalsieho. Meria sa v `ch`, teda v znakoch,
   nie v pixeloch, aby to platilo aj pri inej velkosti pisma. */
.sub{color:var(--wc-text-muted); margin:0 0 var(--sp-5); max-width:78ch}
.crumb{color:var(--wc-text-muted); font-size:var(--fs-sm); margin:0 0 var(--sp-3)}
.crumb button{background:none;border:0;color:var(--wc-accent);cursor:pointer;font:inherit;padding:0}

/* =============================================================================
   KPI
   ============================================================================= */
/* POCET STLPCOV SA RIADI POCTOM KARIET, nie napevno styrmi (29.08.2026).
   `repeat(4,1fr)` fungovalo, kym mala kazda obrazovka presne styri KPI. Adopcia
   ma tri a stvrty stlpec ostal PRAZDNY: karty sa stlacili dolava a vpravo zostala
   diera na sirku jednej karty. `auto-fit` + `minmax` da pri styroch kartach na
   sirokom okne stale styri stlpce (overene) a pri troch ich roztiahne. */
.kpis{display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 190px), 1fr));
  gap:var(--sp-4); margin-bottom:var(--sp-5)}
.kpi{background:var(--wc-surface); border:1px solid var(--line); border-radius:var(--r-lg);
  padding:var(--sp-4); box-shadow:var(--wc-shadow); min-width:0}
.kpi .label{color:var(--wc-text-muted); font-size:var(--fs-xs); text-transform:uppercase;
  letter-spacing:.4px}
.kpi .value{font-size:var(--fs-2xl); font-weight:700; margin-top:var(--sp-1)}
.kpi .value small{font-size:var(--fs-md); color:var(--wc-text-muted); font-weight:600}
.kpi.flag .value{color:var(--wc-review)}

/* =============================================================================
   Panely a tabulky
   =============================================================================
   Vodorovne odsadenie buniek = vodorovne odsadenie hlavicky panela (--sp-4),
   takze prvy stlpec zacina presne pod nadpisom panela. Do 28.08. to bolo
   16 proti 14 a nadpis stal o 2 px vedla hlavicky tabulky.
   ============================================================================= */
.panel{background:var(--wc-surface); border:1px solid var(--line); border-radius:var(--r-lg);
  box-shadow:var(--wc-shadow); overflow:hidden}
.panel-head{display:flex; align-items:center; flex-wrap:wrap; gap:var(--sp-3);
  padding:var(--sp-3) var(--sp-4); border-bottom:1px solid var(--line)}
.panel-head h2{font-size:var(--fs-lg); margin:0}
.chips{display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-left:auto}
/* `.chips` sa zarovnava DOPRAVA (`margin-left:auto`), lebo vznikli ako filtre
   v hlavicke panelu. Prepinac organizacii je ale samostatny riadok pod
   nadpisom a doprava odtlaceny nema preco byt. */
.chips.chips-vlavo{margin-left:0; margin-bottom:var(--sp-4)}
/* Kod (slug, trieda) sa NELAME uprostred slova. `heli-pilot` sa zalomil na
   "h" a "eli-pilot" a vyzeralo to ako preklep v texte, nie ako zalomenie. */
.nolom{white-space:nowrap}

/* IKONY. Velkost sa viaze na PISMO (`1em`), nie na pixely: ikona vedla nadpisu
   ma byt vysoka ako pismeno, nie ako niekto raz odhadol. `currentColor` znamena,
   ze ikona dedi farbu textu, takze na tmavej hlavicke aj v tabulke sedi sama.
   `flex:none` brani tomu, aby ju uzky riadok stlacil na ovalik. */
.ikona{width:1.15em; height:1.15em; flex:none; vertical-align:-0.18em}
/* Ikona v tabe navigacie: pred textom, dedi farbu tabu (brand-100 / biela). */
.nav button .ikona,.nav .navtab .ikona{margin-right:var(--sp-2)}
/* Ikona v karte je vacsia a tlmena: nesie kategoriu, nie akciu, takze nesmie
   sutazit s nadpisom karty. */
.wscard .ikona{width:20px; height:20px; color:var(--wc-accent); opacity:.85;
  margin-bottom:var(--sp-2); vertical-align:0}
/* Zamok V NADPISE karty (plocha za heslom): maly, tlmeny, na ucely "vypyta
   si heslo" vedla mena, nie kategoria hore. Prebija predoslu deklaraciu. */
.wscard b .ikona{width:1em; height:1em; margin:0 0 0 var(--sp-1);
  color:var(--wc-text-muted); opacity:.7; vertical-align:-0.12em}
.panel-head h2 .ikona{margin-right:var(--sp-2); color:var(--wc-text-muted)}
.chip{border:1px solid var(--line); border-radius:var(--r-full);
  padding:var(--sp-1) var(--sp-3); font-size:var(--fs-xs); cursor:pointer;
  color:var(--wc-text-muted); background:var(--wc-surface); white-space:nowrap}
.chip.on{background:var(--wc-brand-900); color:#fff; border-color:var(--wc-brand-900)}
.tablewrap{overflow-x:auto}
/* UZKA SEKCIA pre obsah, ktory sirku nepotrebuje (29.08.2026).
   Pri dvojstlpcovej tabulke a sirokom okne stoji hodnota 600 px od svojho
   nazvu a medzi nimi je prazdno, ktore vyzera ako chyba sadzby.
   Obmedzuje sa CELY PANEL, nie len tabulka vnutri: pri obmedzeni samotnej
   tabulky koncili prúžky riadkov v polovici karty a napravo ostavalo biele
   miesto, teda ten isty nesulad, len posunuty o uroven nizsie. */
.panel.uzky{max-width:760px}
table{width:100%; border-collapse:collapse; font-size:var(--fs-sm)}
th,td{text-align:left; padding:var(--sp-2) var(--sp-4); border-bottom:1px solid var(--line)}
/* nowrap je vlastnost DATOVEJ tabulky konzoly, nie kazdeho <td> na kazdej
   stranke, ktora nacita tento subor. Do 28.08. bolo pravidlo globalne a
   presakovalo do prirucky/klub.html, kde sekalo prozu uprostred slova. */
.tablewrap th,.tablewrap td{white-space:nowrap}
th{color:var(--wc-text-muted); font-weight:600; font-size:var(--fs-2xs);
  text-transform:uppercase; letter-spacing:.5px; background:var(--wc-surface)}
/* Cisla patria doprava. Triedu .tnum uz rozdava app.js na 27 miestach
   (tabular-nums), chybalo len zarovnanie, ktore ju robi uzitocnou.
   ZAROVNANIE URCUJE HLAVICKA, nie bunka. Ploche `td.tnum{text-align:right}` by
   totiz otocilo doprava aj casove stlpce (app.js:422, 1919, 1980, 2082 davaju
   .tnum datumu kvoli tabular-nums), ale ich `th` .tnum nema, takze by hlavicka
   ostala vlavo a hodnoty utiekli vpravo. Stlpec sa preto zarovnava len vtedy,
   ked sa za cislovy oznacila HLAVICKA. */
.tablewrap th.tnum{text-align:right}
.tablewrap table:has(thead th:nth-child(1).tnum) tbody td:nth-child(1),
.tablewrap table:has(thead th:nth-child(2).tnum) tbody td:nth-child(2),
.tablewrap table:has(thead th:nth-child(3).tnum) tbody td:nth-child(3),
.tablewrap table:has(thead th:nth-child(4).tnum) tbody td:nth-child(4),
.tablewrap table:has(thead th:nth-child(5).tnum) tbody td:nth-child(5),
.tablewrap table:has(thead th:nth-child(6).tnum) tbody td:nth-child(6),
.tablewrap table:has(thead th:nth-child(7).tnum) tbody td:nth-child(7),
.tablewrap table:has(thead th:nth-child(8).tnum) tbody td:nth-child(8),
.tablewrap table:has(thead th:nth-child(9).tnum) tbody td:nth-child(9){text-align:right}
tbody tr:nth-child(even){background:var(--wc-surface-2)}
tbody tr.click{cursor:pointer}
tbody tr.click:hover{background:#EAF2FD}
/* Klikaci riadok je funkcne odkaz, tak sa musi dat trafit aj klavesnicou:
   riadky dostavaju tabindex a Enter (zviazRiadky v app.js) a prstenec ide
   DOVNUTRA (inset), lebo vonkajsi outline sa medzi riadkami tabulky odreze. */
tbody tr.click:focus-visible{outline:2px solid var(--wc-brand-500); outline-offset:-2px}
.reg{font-weight:600; font-variant-numeric:tabular-nums}
.op{color:var(--wc-text-muted)}

/* =============================================================================
   Stitky
   =============================================================================
   Text na farebnom podklade ide o stupen tmavsi nez dekorativna bodka: tokens.ts
   na to ma vlastne hodnoty a konzola ich do 28.08. nepouzivala (teal[500] na
   pass-podklade mal 3,14:1, amber[500] na review-podklade 3,93:1).
   ============================================================================= */
.badge{display:inline-flex; align-items:center; gap:var(--sp-1);
  padding:var(--sp-1) var(--sp-2); border-radius:var(--r-full);
  font-size:var(--fs-xs); font-weight:600}
.badge::before{content:""; width:7px; height:7px; border-radius:50%; flex:none}
.badge.pass{background:var(--wc-teal-50); color:var(--wc-verified-ink)}
.badge.pass::before{background:var(--wc-teal-500)}
.badge.review{background:var(--wc-amber-50); color:var(--wc-review)}
.badge.review::before{background:var(--wc-amber-500)}
.badge.fail{background:var(--wc-red-50); color:var(--wc-fail-ink)}
.badge.fail::before{background:var(--wc-red-500)}
/* Stav zaznamu bez vysledku (caka na video / spracuva sa): neutralny, nie
   amber: nie je to varovanie, len faza zivota zaznamu. */
.badge.wait{background:#EDF2F9; color:var(--wc-text-muted)}
/* Rozhodnutie supervizora: chip v zozname (schvalene/zamietnute/dotocit) */
.badge.dec-ok{background:var(--wc-teal-50); color:var(--wc-verified-ink)}
.badge.dec-no{background:var(--wc-red-50); color:var(--wc-fail-ink)}
.badge.dec-re{background:var(--wc-amber-50); color:var(--wc-review-ink)}
.badge.sim{background:var(--wc-amber-50); color:var(--wc-review); margin-left:var(--sp-2)}
.badge.sim::before{background:var(--wc-amber-500)}

.verify{display:inline-flex;align-items:center;gap:var(--sp-1);
  font-size:var(--fs-xs);font-weight:600}
.verify.VERIFIED{color:var(--wc-verified)}
.verify.PENDING{color:var(--wc-review)}
.verify.UNVERIFIED_DEV{color:var(--wc-text-muted)}
.verify.TAMPERED{color:var(--wc-fail)}

/* =============================================================================
   Detail zaznamu
   ============================================================================= */
/* min-width:0 na polozkach mriezky: bez neho roztlaci datova tabulka stlpec na
   svoju min-content sirku (532 px) a karty vytrcia z obrazovky. Pri 390 px to
   bolo 215 px pretecenia celeho dokumentu. */
.grid2{display:grid; grid-template-columns:1.4fr 1fr; gap:var(--sp-5); align-items:start}
.grid2>*{min-width:0}
.card{background:var(--wc-surface); border:1px solid var(--line); border-radius:var(--r-lg);
  box-shadow:var(--wc-shadow); padding:var(--sp-4); margin-bottom:var(--sp-4); min-width:0}
.card h3{margin:0 0 var(--sp-3); font-size:var(--fs-md)}
/* Tabulka v karte ide po okraj karty, takze prvy stlpec lici s nadpisom karty
   (do 28.08. bol o 14 px vpravo). */
.card>.tablewrap{margin:0 calc(-1 * var(--sp-4))}
.meta{display:grid; grid-template-columns:1fr 1fr; gap:var(--sp-3) var(--sp-5)}
/* Popiska a hodnota su KOMPONENT, nie vedlajsi ucinok toho, v com su zabalene.
   Do 28.08. platili len `.meta .k` a `.meta .v`, takze v karte Dokaz integrity
   vysli dva z trinastich `.k` ako 14px veta a jedenast ako 11px verzalky. */
.k{color:var(--wc-text-muted); font-size:var(--fs-2xs); text-transform:uppercase;
  letter-spacing:.4px}
.v{font-weight:600}
.mono{font-family:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:var(--fs-xs); word-break:break-all}
.verifybar{display:flex; align-items:center; flex-wrap:wrap; gap:var(--sp-3);
  padding:var(--sp-3) var(--sp-4); border-radius:var(--r-lg); color:#fff;
  font-weight:600; margin-bottom:var(--sp-4)}
.verifybar.VERIFIED{background:var(--wc-verified)}
.verifybar.PENDING{background:var(--wc-review)}
.verifybar.UNVERIFIED_DEV{background:var(--wc-text-muted)}
/* Verdikt bez pecate: zaznam este nie je dokaz (UNSEALED, 22.08.). */
.verifybar.UNSEALED{background:var(--wc-text-muted)}
.verifybar.TAMPERED{background:var(--wc-fail)}
.resultbig{display:flex; flex-wrap:wrap; gap:var(--sp-4)}
.resultbig .box{flex:1 1 200px; border-radius:var(--r-lg); padding:var(--sp-3) var(--sp-4);
  color:#fff; min-width:0}
.resultbig .box .l{font-size:var(--fs-2xs); opacity:.9; text-transform:uppercase}
.resultbig .box .n{font-size:var(--fs-2xl); font-weight:800}

/* =============================================================================
   Tlacidla
   ============================================================================= */
.btn{display:inline-flex; align-items:center; gap:var(--sp-2);
  background:var(--wc-accent-fill); color:var(--wc-on-accent); border:0;
  padding:var(--sp-2) var(--sp-4); border-radius:var(--r-md); font:inherit;
  font-weight:600; cursor:pointer}
.btn.ghost{background:var(--wc-surface); color:var(--wc-brand-900); border:1px solid var(--line)}
.btn:hover{filter:brightness(1.06)}
.btn.ghost:hover{border-color:var(--wc-accent); filter:none}
.btn.maly{padding:var(--sp-1) var(--sp-3); font-size:var(--fs-sm)}
/* Fronta ziadosti: schvalovaci formular v rozbalenom riadku.
   `.formrow` je ten isty tvar v karte organizacie (plan a fakturacia, 0055);
   selektory su spolocne zamerne, aby v konzole nevznikol druhy vzhlad
   formulara vedla prveho. */
.akcie{white-space:nowrap; display:flex; gap:var(--sp-2)}
.ziadost-form,.formrow{display:flex; gap:var(--sp-3); flex-wrap:wrap; align-items:flex-end; padding:var(--sp-2) 0}
.formrow{padding:0 var(--sp-4) var(--sp-4)}
.ziadost-form label,.formrow label{display:flex; flex-direction:column; gap:var(--sp-1); font-size:var(--fs-sm); color:var(--muted)}
/* Fakturacia ma sest poli a v jednom rade sa zliali do jedneho pasu bez
   medzery (najdene POHLADOM 09.09.2026, nie poistkou). Mriezka drzi rovnaku
   sirku a zalomi sa sama; `auto-fit` je preto, ze karta organizacie je raz
   siroka a raz uzka podla toho, kolko ma clovek organizacii. */
.formrow{display:grid; grid-template-columns:repeat(auto-fit, minmax(190px, 1fr));
  gap:var(--sp-3); align-items:end}
.formrow .grow{grid-column:1 / -1}
/* Tlacidlo ma VLASTNY RIADOK, nie bunku vedla posledneho pola: pri sestich
   poliach fakturacie padlo tesne vedla „E-mail na faktury" a vyzeralo ako
   sucast toho pola (najdene pohladom). */
.formrow .btn{grid-column:1 / -1; justify-self:start; white-space:nowrap; margin-top:var(--sp-1)}
.ziadost-form input,.ziadost-form select,.formrow input,.formrow select{font:inherit; color:var(--ink); padding:6px 10px;
  border:1px solid var(--line); border-radius:var(--r-md); background:var(--card); min-width:150px}
.ziadost-form .vysledok,.formrow .grow{flex-basis:100%}
.ziadosti-prep{margin:0 0 var(--sp-4)}
.btn:active{background:var(--wc-accent-fill-pressed); filter:none}
.btn.sm{padding:var(--sp-1) var(--sp-3); font-size:var(--fs-xs)}
.btnrow{display:flex; gap:var(--sp-3); flex-wrap:wrap}

/* =============================================================================
   Sektory
   ============================================================================= */
.sectors{display:grid; grid-template-columns:repeat(2,1fr); gap:var(--sp-2)}
.sector{display:flex; align-items:center; justify-content:space-between; gap:var(--sp-2);
  padding:var(--sp-2) var(--sp-3); border:1px solid var(--line); border-radius:var(--r-md);
  min-width:0}
.sector .nm{font-weight:600; min-width:0; overflow-wrap:anywhere}
.sector .st{font-size:var(--fs-xs); font-weight:700; white-space:nowrap}
.sector.ok .st{color:var(--wc-verified)}
.sector.miss{border-color:#F0C9C9; background:var(--wc-red-50)}
.sector.miss .st{color:var(--wc-fail)}
/* Sektor bez povinneho bodu (dvojmotorak: predne boky trupu): neutralny,
   nie zeleny (nic sa neoverilo) ani cerveny (nic nechyba). Do 28.08. to riesila
   `opacity:.6`, ktora stlacila kontrast textu pod polovicu; teraz je to
   vyslovena tlmena farba, takze stav ostava citatelny. */
.sector.nopoint{background:var(--wc-surface-2)}
.sector.nopoint .nm,.sector.nopoint .st{color:var(--wc-text-muted); font-weight:600}

.revisit{margin-top:var(--sp-3); padding:var(--sp-3) var(--sp-4); border-radius:var(--r-lg);
  background:var(--wc-amber-50); color:var(--wc-review-ink); font-size:var(--fs-sm)}
.revisit.none{background:var(--wc-teal-50); color:var(--wc-verified-ink)}
.revisit b{color:inherit}
.cap-yes{color:var(--wc-verified); font-weight:700}
.cap-no{color:var(--wc-fail); font-weight:700}

/* =============================================================================
   Snimky, rozpoznavanie, lightbox
   ============================================================================= */
.framegrid{display:grid; grid-template-columns:repeat(auto-fill,minmax(112px,1fr));
  gap:var(--sp-2)}
.thumb{position:relative; border:1px solid var(--line); border-radius:var(--r-md);
  overflow:hidden; cursor:pointer; background:var(--wc-ink-900)}
/* pomer stran zdroja (portret PA-46 1100x1956): object-fit:cover pri zhodnom
   pomere neoreze; rovnake aj v anotacnom GUI. */
.thumb img{display:block; width:100%; aspect-ratio:1100/1956; object-fit:cover}
.thumb .ord{position:absolute; left:var(--sp-1); top:var(--sp-1);
  background:rgba(11,26,47,.72); color:#fff; font-size:var(--fs-2xs);
  padding:var(--sp-05) var(--sp-2); border-radius:var(--r-full)}
.thumb .cnt{position:absolute; right:var(--sp-1); bottom:var(--sp-1);
  background:var(--wc-accent-fill); color:#fff; font-size:var(--fs-2xs);
  padding:var(--sp-05) var(--sp-2); border-radius:var(--r-full)}
.thumb:hover{border-color:var(--wc-accent); box-shadow:var(--wc-shadow)}
.scheme .sec{border:1px solid var(--line); border-radius:var(--r-md);
  padding:var(--sp-2) var(--sp-3); margin-bottom:var(--sp-2)}
.scheme .sec .hd{font-weight:700; font-size:var(--fs-xs); margin-bottom:var(--sp-1)}
.scheme .sec .cp{font-size:var(--fs-xs); color:var(--wc-text-muted)}
.scheme .sec .cp b{color:var(--wc-text-primary); font-weight:600}
.recflag{display:inline-block; font-size:var(--fs-2xs); padding:var(--sp-05) var(--sp-2);
  border-radius:var(--r-full); margin-left:var(--sp-2)}
.recflag.on{background:var(--wc-teal-50); color:var(--wc-verified-ink)}
.recflag.off{background:var(--wc-amber-50); color:var(--wc-review)}

.lb{position:fixed; inset:0; background:rgba(6,14,26,.86); z-index:50; display:flex;
  align-items:center; justify-content:center; padding:var(--sp-6)}
.lb-inner{position:relative; max-width:min(1100px,92vw); max-height:90vh}
.lb-stage{position:relative; display:inline-block}
.lb-stage img{display:block; max-width:100%; max-height:78vh; border-radius:var(--r-lg)}
.lb-box{position:absolute; border:2px solid var(--wc-det-present); border-radius:4px;
  box-shadow:0 0 0 1px rgba(0,0,0,.4)}
.lb-box span{position:absolute; left:-2px; top:-19px; background:var(--wc-det-present); color:var(--wc-det-chip-ink);
  font-size:var(--fs-2xs); font-weight:700; padding:0 var(--sp-1); border-radius:4px;
  white-space:nowrap}
.lb-box.miss{border-color:var(--wc-det-missing)} .lb-box.miss span{background:var(--wc-det-missing); color:#3A2600}
.lb-bar{display:flex; align-items:center; flex-wrap:wrap; gap:var(--sp-4); color:#fff;
  margin-top:var(--sp-3); font-size:var(--fs-sm)}
.lb-bar button{background:rgba(255,255,255,.18); color:#fff; border:0;
  border-radius:var(--r-md); padding:var(--sp-2) var(--sp-4); font:inherit; cursor:pointer}
.lb-bar button:hover{background:rgba(255,255,255,.28)}
.lb-close{position:absolute; right:-8px; top:-32px; background:rgba(255,255,255,.18);
  color:#fff; border:0; width:32px; height:32px; border-radius:50%; cursor:pointer;
  font-size:var(--fs-lg)}

/* =============================================================================
   Video a sektorova os
   ============================================================================= */
.videocard video{display:block; width:100%; max-height:430px; object-fit:contain;
  background:var(--wc-ink-900); border-radius:var(--r-lg)}
.vstage{position:relative}
.vlayer{position:absolute; inset:0; pointer-events:none; overflow:hidden;
  border-radius:var(--r-lg)}
.vbox{position:absolute; border:2px solid var(--wc-det-present); border-radius:4px;
  box-shadow:0 0 0 1px rgba(0,0,0,.35); animation:vpop .18s ease-out}
.vbox span{position:absolute; left:-2px; top:-19px; background:var(--wc-det-present); color:var(--wc-det-chip-ink);
  font-size:var(--fs-2xs); font-weight:700; padding:0 var(--sp-1); border-radius:4px;
  white-space:nowrap}
@keyframes vpop{from{transform:scale(.85); opacity:0} to{transform:scale(1); opacity:1}}
@media (prefers-reduced-motion: reduce){.vbox{animation:none}}
.sectorbar{display:flex; gap:var(--sp-1); margin-top:var(--sp-3)}
.sbseg{flex:1; text-align:center; font-size:var(--fs-2xs); padding:var(--sp-2) 0;
  border:1px solid var(--line); border-radius:var(--r-sm); background:var(--wc-surface-2);
  color:var(--wc-text-muted); cursor:pointer; user-select:none}
.sbseg:hover{border-color:var(--wc-accent)}
.sbseg.past{background:#DCEAF9; color:var(--wc-brand-900)}
.sbseg.on{background:var(--wc-brand-900); color:#fff; border-color:var(--wc-brand-900);
  font-weight:700}
.sbname{margin-top:var(--sp-2); font-size:var(--fs-sm)}
.sbname b{color:var(--wc-brand-900)}

/* =============================================================================
   Sprava (admin)
   ============================================================================= */
.rolesel{border:1px solid var(--line); border-radius:var(--r-md);
  padding:var(--sp-1) 30px var(--sp-1) var(--sp-2); font:inherit;
  background-color:var(--wc-surface)}
.note{color:var(--wc-text-muted); font-size:var(--fs-xs); margin-top:var(--sp-2)}
.empty{padding:var(--sp-10); text-align:center; color:var(--wc-text-muted)}
.spin{padding:var(--sp-10); text-align:center; color:var(--wc-text-muted)}

/* =============================================================================
   Skeleton (nacitanie tvarom obsahu, nie vetou)
   =============================================================================
   Pravidla (UI-JAZYK): skeleton dostavaju LEN kontajnery s datami (karty,
   tabulky), nikdy ovladace; tvar zodpoveda obsahu, ktory pride, aby obrazovka
   pri dobehnuti nepreskocila. Shimmer je jemny a pri prefers-reduced-motion
   stoji: tvar informuje aj bez pohybu. */
.skel{position:relative; overflow:hidden; background:var(--wc-ink-100);
  border-radius:var(--r-sm); color:transparent!important; user-select:none}
.skel::after{content:""; position:absolute; inset:0;
  background:linear-gradient(90deg, transparent, rgba(255,255,255,.55), transparent);
  transform:translateX(-100%); animation:skel-shimmer 1.4s ease-in-out infinite}
@keyframes skel-shimmer{to{transform:translateX(100%)}}
@media (prefers-reduced-motion:reduce){.skel::after{animation:none}}
.skel-r{height:1em; margin:var(--sp-2) 0}

/* Prekreslenie pohladu: obsah sa objavi jemnym nabehom (160 ms, ease-out),
   ziadne posuny layoutu. Jedina orchestracia na strankach konzoly; vsetko
   ostatne je okamzite. Pri reduced-motion sa nedeje nic. */
@keyframes page-in{from{opacity:.55} to{opacity:1}}
.page > *{animation:page-in .16s ease-out}
@media (prefers-reduced-motion:reduce){.page > *{animation:none}}
/* Textove vnutro panela bez tabulky (Adopcia, Pouzivanie). app.js tieto
   triedy pouzival od 28.08., ale deklaracie CHYBALI: odsek stal nalepeny
   na hlavicku panela a "muted" text mal plnu farbu (UI-INVENTAR, nalez N2). */
.panel-body{padding:var(--sp-2) var(--sp-4) var(--sp-4)}
.muted{color:var(--wc-text-muted)}

/* =============================================================================
   Prihlasenie (Cognito) a simulacia
   ============================================================================= */
.simbar{background:var(--wc-amber-50); color:var(--wc-review); border:1px solid #f0ddb8;
  border-radius:var(--r-lg); padding:var(--sp-3) var(--sp-4); margin:0 0 var(--sp-4);
  font-size:var(--fs-sm)}

/* PAS SIETE (02.09.2026, app.js prekresliSiet).
   Zije MEDZI navigacnym radom a strankou, teda mimo `.page`: odsadenie preto
   berie z --wc-bleed, aby veta zacinala na tej istej osi ako logo a nadpis
   (UI-JAZYK §7, jedna os pre vsetko).
   Amber je stav neistoty a cakania (UI-JAZYK §2). Pre navrat siete sa ZAMERNE
   nepouziva teal: cisla na obrazovke po navrate NIE su overene, su stale stare,
   a zelena by tvrdila opak. Neutralny ink hovori "vsimni si", nie "je to OK". */
.sietpas{display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:var(--sp-2) var(--sp-4); padding:var(--sp-2) var(--wc-bleed);
  font-size:var(--fs-sm); background:var(--wc-amber-50); color:var(--wc-review);
  border-bottom:1px solid var(--wc-amber-300)}
.sietpas p{margin:0; flex:1 1 320px; min-width:0}
.sietpas .btn{flex:none}
.sietpas.spat{background:var(--wc-ink-100); color:var(--wc-text-primary);
  border-bottom-color:var(--wc-ink-200)}
/* Vyska sa cita z --wc-topbar-h. Do 28.08. tu bola natvrdo 54px z verzie, ked
   mal bar 56, potom sa vyska dvakrat zmenila na 62 a toto calc sa neopravilo:
   stranka rolovala presne o 8 px a karta sedela 4 px pod stredom. */
.page.centered{display:grid; place-items:center;
  min-height:calc(100dvh - var(--wc-topbar-h)); padding-top:0; padding-bottom:0}
.logincard{max-width:380px; margin:0; text-align:center; background:var(--wc-surface);
  border:1px solid var(--line); border-radius:var(--r-xl); box-shadow:var(--wc-shadow);
  padding:var(--sp-6)}
.logincard .wcmark{width:56px; height:56px; margin:0 auto var(--sp-3)}
.logincard h1{margin:0 0 var(--sp-1); font-size:var(--fs-xl); line-height:1.2}
.logincard .sub{margin:var(--sp-2) 0 0; line-height:1.55}
.logincard form{display:flex; flex-direction:column; gap:var(--sp-3);
  margin-top:var(--sp-5); text-align:left}
.logincard label{display:flex; flex-direction:column; gap:var(--sp-1);
  font-size:var(--fs-sm); color:var(--wc-text-muted); font-weight:600}
.logincard input{border:1px solid var(--line); border-radius:var(--r-md);
  padding:var(--sp-2) var(--sp-3); font:inherit; font-size:var(--fs-md)}
/* Klavesnica. Nikde nie je `outline:none`, takze konzola bola prechodna aj
   predtym, ALE prehliadacov prstenec je tmavomodry a na tmavej hlavicke ho
   nevidno. Preto vlastny, v znackovej modrej a s odsadenim, aby nesplyval
   s ramom tlacidla. `:focus-visible`, nie `:focus`: mysou sa prstenec
   nezobrazuje, klavesnicou ano. */
:where(a, button, select, input, [tabindex]):focus-visible{
  outline:2px solid var(--wc-brand-500); outline-offset:2px; border-radius:var(--r-sm)}
.topbar :where(a, button, select):focus-visible{outline-color:#9CC2EF}

.logincard input:focus{outline:2px solid var(--wc-brand-500); outline-offset:0;
  border-color:var(--wc-brand-500)}
.logincard .btn{justify-content:center; padding:var(--sp-3)}
.loginerr{background:var(--wc-red-50); color:var(--wc-fail); border-radius:var(--r-md);
  padding:var(--sp-2) var(--sp-3); font-size:var(--fs-sm)}
.loginok{background:var(--wc-teal-50); color:var(--wc-verified-ink);
  border-radius:var(--r-md); padding:var(--sp-2) var(--sp-3); font-size:var(--fs-sm)}
.loginlink{font-size:var(--fs-sm); color:var(--wc-accent); text-align:center;
  text-decoration:none}
.loginlink:hover{text-decoration:underline}
.remember{display:flex !important; flex-direction:row !important; align-items:center;
  gap:var(--sp-2); font-size:var(--fs-sm); color:var(--wc-text-muted);
  font-weight:500 !important; cursor:pointer; user-select:none}
.remember input{accent-color:var(--wc-brand-500); width:16px; height:16px; margin:0}

/* =============================================================================
   Login (28. 9. 2026): svetla plocha konzoly, tmavy pas znacky hore, biela
   karta s formularom. Ta ista paleta ako hlavicka a karty konzoly, aby
   prihlasenie a to, co je za nim, boli jedna appka (Norbert: „pokojné,
   jednoduché, krásne“). Tmava karta na tmavom pozadi z 27. 9. sa od konzoly
   odlisovala a druhe plne tlacidlo „Zabudnuté heslo“ sutazilo s prihlasenim.
   ============================================================================= */
body.login-plocha .topbar,
body.login-plocha .navrow{display:none}
body.login-plocha{background:var(--wc-bg)}
body.login-plocha .page{max-width:none; padding:0}
body.login-plocha .page.centered{min-height:100dvh; place-items:stretch}
/* Pas znacky: horna tretina v brand-900 (farba hlavicky konzoly), karta ho
   prekryva. Gradient s ostrym prechodom, nie obrazok ani dekor. */
.login-scena{min-height:100dvh; width:100%; display:flex; justify-content:center;
  padding:var(--sp-16) var(--sp-4) var(--sp-10); color:var(--wc-text-primary);
  background:linear-gradient(var(--wc-brand-900) 0 300px, var(--wc-bg) 300px)}
.login-stlpec{width:100%; max-width:420px; display:flex; flex-direction:column;
  gap:var(--sp-6)}
.login-znacka{display:flex; align-items:center; justify-content:center; gap:var(--sp-2)}
.login-znacka .login-mark svg,.login-znacka .login-mark .wcmark{width:44px; height:44px; display:block}
/* Rovnaky rez ako topbar .wordmark (Saira 600): logo je jedno. */
.login-znacka b{font-family:var(--wc-font-display); font-size:22px;
  font-weight:600; letter-spacing:-.01em; line-height:1; white-space:nowrap; color:#fff}
.login-znacka span:last-child{margin-left:var(--sp-1); padding:3px var(--sp-2);
  border:1px solid rgba(255,255,255,.28); border-radius:var(--r-full);
  font-size:var(--fs-xs); line-height:1.2; color:var(--wc-brand-100)}
.login-pata{display:flex; flex-direction:column; align-items:center;
  gap:var(--sp-1); font-size:var(--fs-xs)}
.login-pata p{margin:0; display:flex; flex-wrap:wrap; justify-content:center;
  gap:var(--sp-1) var(--sp-4)}
.login-pata a{color:var(--wc-text-muted); text-decoration:none}
.login-pata a:hover{color:var(--wc-text-primary); text-decoration:underline;
  text-underline-offset:3px}

.login-scena .logincard{width:100%; max-width:none; margin:0; text-align:left;
  background:var(--wc-surface); border:1px solid var(--line);
  border-radius:var(--r-xl); box-shadow:0 1px 2px rgba(11,26,47,.06),0 18px 48px rgba(11,26,47,.14);
  padding:var(--sp-8); color:var(--wc-text-primary)}
.login-scena .logincard h1{color:var(--wc-text-primary); font-size:var(--fs-2xl); margin:0}
.login-scena .logincard .sub{color:var(--wc-text-muted); margin:var(--sp-2) 0 0}
.login-scena .logincard form{gap:var(--sp-4); margin-top:var(--sp-6)}
.login-scena .logincard form > label{color:var(--wc-text-primary); font-size:var(--fs-sm);
  font-weight:600; gap:var(--sp-2)}
/* 16px DOSLOVNE, nie var(--fs-lg), hoci je to ta ista hodnota: je to prah
   iOS Safari (pod nim zoomne viewport pri fokuse), nie typograficka volba,
   a poistka v console/test/run.sh ho cita ako cislo. Cez premennu by ju
   nedokazala overit a zmena --fs-lg by pole ticho rozbila. */
.login-scena .logincard input{
  font-size:16px; height:46px; padding:0 var(--sp-3); background:var(--wc-surface);
  border:1px solid var(--wc-ink-400); color:var(--wc-text-primary); border-radius:var(--r-md);
  font-weight:400}
.login-scena .logincard input:hover{border-color:var(--wc-ink-500)}
.login-scena .logincard input:focus{outline:none; border-color:var(--wc-brand-500);
  box-shadow:0 0 0 3px rgba(47,132,228,.22)}
.login-scena .logincard input[aria-invalid="true"]{border-color:var(--wc-red-500)}
.login-scena .logincard .note{color:var(--wc-text-muted)}
/* checkbox (doslovny popisok drzi prirucky_test) */
.login-scena .logincard form > label.remember{font-size:var(--fs-md); font-weight:400 !important;
  color:var(--wc-text-primary); position:relative; gap:10px}
.login-scena .remember input{position:absolute; opacity:0; width:18px; height:18px; margin:0}
.login-scena .remember .box{width:18px; height:18px; flex:none;
  border:1.5px solid var(--wc-ink-400); border-radius:4px; background:var(--wc-surface);
  display:inline-grid; place-items:center}
.login-scena .remember:hover .box{border-color:var(--wc-ink-500)}
.login-scena .remember input:checked + .box{background:var(--wc-accent-fill); border-color:var(--wc-accent-fill)}
.login-scena .remember input:checked + .box::after{content:""; width:9px; height:5px;
  border-left:2.5px solid #fff; border-bottom:2.5px solid #fff;
  transform:rotate(-45deg) translate(0,-1px)}
.login-scena .remember input:focus-visible + .box{outline:2px solid var(--wc-brand-500);
  outline-offset:2px}
.login-scena .logincard .btn[type="submit"]{height:48px; justify-content:center;
  font-size:var(--fs-lg); border-radius:var(--r-md); margin-top:var(--sp-1)}
.login-scena .logincard .btn[type="submit"]:disabled{cursor:progress; filter:none; opacity:.92}
/* Stav nacitania: kruzok pred textom (trieda `caka` z app.js zaneprazdni). */
.login-scena .logincard .btn.caka::before{content:""; width:16px; height:16px; flex:none;
  border:2px solid rgba(255,255,255,.45); border-top-color:#fff; border-radius:50%;
  animation:login-toc .8s linear infinite}
@keyframes login-toc{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.login-scena .logincard .btn.caka::before{animation:none}}
.login-scena .loginlink{color:var(--wc-accent); text-align:center; font-weight:600;
  font-size:var(--fs-sm); padding:var(--sp-1) 0}
.login-scena .loginlink:hover{color:var(--wc-accent-hover)}
/* Chyba a potvrdenie: farebny podklad + znak, text ostava tmavy a citatelny. */
.login-scena .loginerr,.login-scena .loginok{display:flex; gap:var(--sp-2); align-items:flex-start;
  border-radius:var(--r-md); padding:var(--sp-3); font-size:var(--fs-sm); line-height:1.45}
.login-scena .loginerr{background:var(--wc-red-50); color:var(--wc-red-600);
  border:1px solid #F0C9C9}
.login-scena .loginerr::before{content:"!"; flex:none; width:18px; height:18px; border-radius:50%;
  background:var(--wc-red-500); color:#fff; font-weight:700; font-size:12px; line-height:18px;
  text-align:center; margin-top:1px}
.login-scena .loginok{background:var(--wc-teal-50); color:var(--wc-verified-ink);
  border:1px solid #BFE6D6}
.login-scena .pwdoko{color:var(--wc-text-muted)}
.login-scena .pwdoko:hover{color:var(--wc-text-primary); background:var(--wc-ink-100)}
@media (max-width: 480px){
  .login-scena{padding:var(--sp-8) var(--sp-4) var(--sp-6);
    background:linear-gradient(var(--wc-brand-900) 0 200px, var(--wc-bg) 200px)}
  .login-stlpec{gap:var(--sp-5)}
  .login-scena .logincard{padding:var(--sp-6) var(--sp-5)}
  .login-scena .logincard h1{font-size:24px}
}

/* heslo s prepinacom viditelnosti */
.pwdwrap{position:relative; display:flex}
.pwdwrap input{width:100%; padding-right:46px}
.pwdoko{position:absolute; right:6px; top:50%; transform:translateY(-50%);
  width:34px; height:34px; display:flex; align-items:center; justify-content:center;
  background:none; border:0; border-radius:var(--r-md); cursor:pointer;
  color:var(--muted)}
.pwdoko:hover{color:var(--ink); background:var(--wc-brand-50, #EAF3FF)}
.pwdoko svg{width:19px; height:19px}
/* poznamka o hesle patri k poliam nad sebou, nie k tlacidlu pod sebou */
.logincard form .note{margin:calc(-1*var(--sp-1)) 0 var(--sp-1)}

/* =============================================================================
   Prehlad: slucka plan -> exekucia -> audit
   ============================================================================= */
.loop{display:grid; grid-template-columns:repeat(auto-fit,minmax(268px,1fr));
  gap:var(--sp-3); margin-top:var(--sp-4)}
.loopstep{background:var(--wc-surface); border:1px solid var(--line);
  border-radius:var(--r-lg); box-shadow:var(--wc-shadow); padding:var(--sp-4);
  display:flex; flex-direction:column; min-width:0}
.loopstep.flag{border-color:var(--wc-amber-300)}
.loophd{display:flex; align-items:center; gap:var(--sp-2); margin-bottom:var(--sp-2)}
.loopn{width:20px; height:20px; border-radius:50%; background:var(--wc-brand-900);
  color:#fff; font-size:var(--fs-2xs); font-weight:700; display:flex;
  align-items:center; justify-content:center; flex:none}
.looptag{font-size:var(--fs-2xs); letter-spacing:.8px; text-transform:uppercase;
  color:var(--wc-text-muted); font-weight:600}
.loopstep h2{font-size:var(--fs-lg); margin:0 0 var(--sp-2)}
.loopwhat{font-size:var(--fs-sm); color:var(--wc-text-muted); line-height:1.55;
  margin:0 0 var(--sp-3); flex:1}
.loopstat{font-size:var(--fs-sm); font-weight:600; margin:0 0 var(--sp-3);
  color:var(--wc-brand-900)}
.loopacts{display:flex; gap:var(--sp-2); flex-wrap:wrap}
.loopacts .btn{text-decoration:none}
.loopback{margin-top:var(--sp-3)}
.warnbar{margin-top:var(--sp-3); background:#FEF6E7; border:1px solid var(--wc-amber-300);
  border-radius:var(--r-lg); padding:var(--sp-3) var(--sp-4); font-size:var(--fs-sm)}

/* =============================================================================
   Prehlad: dielna (interne naradie, nie produkt)
   ============================================================================= */
.workshop{margin-top:var(--sp-5)}
.workshop .panel-head .op{font-size:var(--fs-xs)}
.wsgrid{display:grid; grid-template-columns:repeat(auto-fit,minmax(210px,1fr));
  gap:var(--sp-3); padding:var(--sp-4)}
.wscard{display:block; border:1px solid var(--line); border-radius:var(--r-lg);
  padding:var(--sp-3); text-decoration:none; color:inherit; background:var(--wc-surface);
  min-width:0}
.wscard:hover{border-color:var(--wc-accent); box-shadow:var(--wc-shadow)}
.wscard b{display:block; font-size:var(--fs-sm); margin-bottom:var(--sp-1)}
.wscard span{font-size:var(--fs-xs); color:var(--wc-text-muted); line-height:1.5}

/* =============================================================================
   Segmenty (balik H2, 23.08.): typ obhliadky, zber, par vypozicky, zdielanie
   ============================================================================= */
/* Chip v tabulke nie je tlacidlo, tak nema kurzor ruky. */
td .chip{cursor:default; margin-left:var(--sp-2)}
.chip.zber{background:#EAF1FB; color:var(--wc-brand-900); border-color:#C9DCF5}
.par{display:grid; grid-template-columns:1fr auto 1fr; gap:var(--sp-3); align-items:center}
.parstrana{border:1px solid var(--line); border-radius:var(--r-md); padding:var(--sp-3);
  display:flex; flex-direction:column; gap:var(--sp-1); min-width:0}
.parstrana.chyba{border-style:dashed; background:#FDF8F0}
.parstrana .v a{color:var(--wc-brand-900); text-decoration:none; font-weight:600}
.parstrana .v a:hover{text-decoration:underline}
.parsipka{color:var(--wc-text-muted); font-size:var(--fs-xl)}
.card.parotvorena{border-color:var(--wc-amber-300)}

.wcdialog{border:1px solid var(--line); border-radius:var(--r-xl); padding:var(--sp-6);
  max-width:440px; width:92vw; box-shadow:var(--wc-shadow)}
.wcdialog::backdrop{background:rgba(6,14,26,.55)}
.wcdialog h3{margin:0 0 var(--sp-3); font-size:var(--fs-lg)}
.wcdialog form{display:flex; flex-direction:column; gap:var(--sp-3)}
.wcdialog label{display:flex; flex-direction:column; gap:var(--sp-1);
  font-size:var(--fs-sm); color:var(--wc-text-muted); font-weight:600}

/* Pole registracie ma `text-transform:uppercase`, aby sa znacka pisala
   velkymi. Zvelkovalo to ale aj PLACEHOLDER, takze napoveda kricala
   "NAPR. OM-ABC" (26.08.2026). Napoveda nie je obsah. */
input[style*="uppercase"]::placeholder{text-transform:none}

/* =============================================================================
   Uzke sirky
   =============================================================================
   Prahy: 1240 (navigacia), 900 (dve mriezky), 760 (telefon), 520 (uzky telefon).
   Prah navigacie sa 28.08. posunul z 1100 na 1240: rad potreboval 1178 px, takze
   pas 1101 az 1173 px zalamovanie NEPOKRYVALO a hlavicka trcala von z okna.
   `flex-wrap:wrap` je uz v zakladnom pravidle, tu sa uz len upratuje.
   ============================================================================= */
@media(max-width:1240px){
  .navrow{top:auto; position:static}   /* sticky dvojrad by zabral privela vysky */
  /* Ked sa rad zalomi, oddelovace skupin PREKAZAJU: prva skupina na kazdom
     dalsom riadku si so sebou nesie ciaru aj 24 px odsadenia, takze zacina
     36 px od osi namiesto 20 a nad nou visi ciara, ktora nic neoddeluje.
     Skupiny preto rozdeluje medzera a vlastny stitok (ten je tu vzdy vidno),
     nie ciara, a kazdy riadok zacina na osi obsahu. */
  .navrow .nav{column-gap:var(--sp-6); row-gap:var(--sp-1)}
  .navrow .navgrp + .navgrp{margin-left:0; padding-left:0; border-left:0}
  .navrow .navgrp.workshop{margin-left:0; background:none}
}
@media(max-width:900px){
  .grid2{grid-template-columns:1fr}
  /* .kpis tu uz nie je: `auto-fit` sa zuzi sam a pevne dva stlpce by pri troch
     kartach zase vyrobili dieru, len o jeden breakpoint nizsie. */
}
@media(max-width:760px){
  /* Hlavicka sa zalomi na dva rady: znacka hore, ovladace pod nou. Do 28.08.
     nemala flex-wrap ani zmensovaciu strategiu, takze mala pevnu min-content
     sirku 505 px a pri 390 px trcal cely prepinac roly za okraj obrazovky. */
  .topbar{padding-top:var(--sp-2); padding-bottom:var(--sp-2); column-gap:var(--sp-3);
    row-gap:var(--sp-2)}
  /* Rola a ucet na zalomenom riadku sedia VPRAVO, pod ostatnymi ovladacmi:
     osamely select pri lavom okraji vyzeral ako zabudnuty (30.08.2026). */
  .rolepick,.authbox{margin-left:auto}
  /* Navigacia sa na telefone NEROZLIEVA do styroch radov, ale roluje vodorovne
     v jednom rade. Rozlievanie stalo 325 px z 390 px vysokej obrazovky (cela
     hlavicka 414 px), takze z konzoly nebolo vidno nic ine nez menu. Rolovanie
     je vnutri .nav, dokument sa neposuva: overene scrollWidth == clientWidth. */
  .navrow .nav{flex-wrap:nowrap; overflow-x:auto; overflow-y:hidden;
    scrollbar-width:none; -webkit-overflow-scrolling:touch}
  .navrow .nav::-webkit-scrollbar{display:none}
  .navrow .navgrp{flex:none}
  .chips{margin-left:0; width:100%}
  .par{grid-template-columns:1fr}
  .parsipka{display:none}
  .sectors{grid-template-columns:1fr}
}
@media(max-width:520px){
  .meta{grid-template-columns:1fr}
  .prepinac .priestor span{display:none}   /* na uzkom telefone ostanu len ikony */
}

/* Surovy identifikator (id profilu vedla jeho slovenskeho nazvu) sa zalomi
   CELY, nie uprostred slova. Do 02.09.2026 sa v detaile obhliadky lamalo
   `smallplane-canopy` na „smallplane-canop" a „y" na dalsom riadku. */
.rawid{white-space:nowrap; overflow-wrap:normal; word-break:keep-all}

/* =============================================================================
   REDIZAJN 28. 9. 2026 (konzola pre zakaznika: vedúci údržby a správca)
   =============================================================================
   Extend-only vrstva nad pravidlami vyssie: tie iste tokeny, ziadne nove
   pismo ani farba. Ciel (Norbert 27. 9.): „celé jednoducho prerobiť krásne
   a funkčne“. Tri veci: vzdusnejsi rytmus stranky (nadpis, karty, riadky),
   tabulky, ktore na telefone nie su rolovacie pasy ale karty, a navigacia,
   ktora sa na telefone zmesti cela.
   SCOPE: vsetko pod `body.konzola` (console/index.html). styles.css citaju aj
   prirucky, Dielna a app/, a tie sa tymto redizajnom menit nemaju (review 28. 9.).
   ============================================================================= */

/* Rytmus stranky: nadpis Saira 24, podnadpis, sekcie s jednou medzerou. */
.konzola .page{padding-top:var(--sp-8)}
.konzola .title{font-size:24px; line-height:1.25; margin:0 0 var(--sp-2)}
.konzola .sub{font-size:var(--fs-md); line-height:1.55; margin-bottom:var(--sp-6)}
.konzola .page > * + .panel, .konzola .page > * + div:has(> .panel), .konzola .page > * + .loop, .konzola .page > * + .kpis{margin-top:var(--sp-5)}
.konzola .page > .kpis + .panel{margin-top:0}
.konzola .page > .note{margin:var(--sp-3) 0 0}

/* Panel: hlavicka a bunky na tej istej osi (16 px), riadky vyssie, zebra
   jemnejsia. Hlavicka tabulky ma vlastny podklad, aby sa od riadkov oddelila
   aj bez tienov. */
.konzola .panel{border-radius:var(--r-lg)}
.konzola .panel-head{padding:var(--sp-4); gap:var(--sp-3)}
.konzola .panel-head h2{font-size:17px; line-height:1.3}
.konzola .panel-head .op{font-size:var(--fs-sm)}
.konzola th, .konzola td{padding:var(--sp-3) var(--sp-4)}
.konzola th{background:var(--wc-surface-2); padding-top:10px; padding-bottom:10px; letter-spacing:.6px}
.konzola tbody tr:nth-child(even){background:transparent}
.konzola tbody tr + tr > td{border-top:0}
.konzola tbody tr:last-child > td{border-bottom:0}
.konzola tbody tr.click:hover{background:var(--wc-surface-2)}
.konzola td .reg{font-size:var(--fs-md)}
.konzola .empty{padding:var(--sp-10) var(--sp-6); font-size:var(--fs-md); line-height:1.55}

/* KPI dlazdice: velke cislo, popisok normalnym pismom (nie verzalky), jemny
   odkaz, ked je dlazdica klikacia. */
.konzola .kpis{gap:var(--sp-4)}
.konzola .kpi{padding:var(--sp-4) var(--sp-5)}
.konzola .kpi .label{text-transform:none; letter-spacing:0; font-size:var(--fs-sm); font-weight:600}
.konzola .kpi .value{font-family:var(--wc-font-display); font-weight:600; font-size:30px; line-height:1.15;
  margin-top:var(--sp-2)}
.konzola .kpi .pod{margin-top:var(--sp-1); font-size:var(--fs-xs); color:var(--wc-text-muted)}
.konzola a.kpi{display:block; color:inherit; text-decoration:none; transition:border-color .15s, box-shadow .15s}
.konzola a.kpi:hover{border-color:var(--wc-accent); text-decoration:none}
.konzola a.kpi .value{color:var(--wc-text-primary)}
.konzola a.kpi.flag .value{color:var(--wc-review)}

/* Stitky stavu: jeden tvar pre vsetky, bez bodky pri neutralnom. */
.konzola .badge{padding:3px 10px; font-size:var(--fs-xs); white-space:nowrap}
.konzola .badge.wait::before{background:var(--wc-ink-400)}
.konzola .badge.skusobny{background:var(--wc-ink-100); color:var(--wc-text-primary)}
.konzola .badge.skusobny::before{background:var(--wc-ink-400)}
.konzola td .badge + .badge, .konzola td .badge + .chip, .konzola td .chip + .badge{margin-left:var(--sp-1)}
.konzola .stavy{display:flex; flex-wrap:wrap; gap:var(--sp-1); align-items:center}

/* Legenda stavov pod zoznamom: kazdy stav, ktory je v tabulke, jednou vetou. */
.konzola .legenda{display:grid; gap:var(--sp-2); margin:0; padding:var(--sp-4);
  border-top:1px solid var(--line); background:var(--wc-surface-2); font-size:var(--fs-sm)}
.konzola .legenda div{display:flex; gap:var(--sp-3); align-items:baseline}
.konzola .legenda dt{flex:none; min-width:124px}
.konzola .legenda dd{margin:0; color:var(--wc-text-muted); line-height:1.5}

/* Cas bez casu natacania: viditelna poznamka namiesto holej hviezdicky. */
.konzola .cas-pozn{display:block; font-size:var(--fs-2xs); color:var(--wc-text-muted); font-weight:400}

/* Prehlad: posledne obchodzky a rychle cesty. */
.konzola .dlazdice-akcie{display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-left:auto}
.konzola .loop{margin-top:var(--sp-5)}
.konzola .loopstep h2{font-size:17px}

/* Organizacia: hlavicka s druhom a rolou, suhrn v dlazdiciach. */
.konzola .org-hlava{display:flex; flex-wrap:wrap; align-items:center; gap:var(--sp-2) var(--sp-3);
  margin:0 0 var(--sp-6); color:var(--wc-text-muted)}
.konzola .org-hlava b{color:var(--wc-text-primary)}
.konzola .org-hlava .badge{font-weight:600}
.konzola .org-nastavenia{display:grid; gap:0}
.konzola .org-nastavenia .riadok{display:flex; flex-wrap:wrap; align-items:center; gap:var(--sp-2) var(--sp-4);
  padding:var(--sp-4); border-top:1px solid var(--line)}
.konzola .org-nastavenia .riadok:first-child{border-top:0}
.konzola .org-nastavenia .riadok .k{min-width:150px; font-size:var(--fs-sm); text-transform:none; letter-spacing:0;
  font-weight:600; color:var(--wc-text-primary)}
.konzola .org-nastavenia .riadok .vyklad{flex-basis:100%; margin:0; color:var(--wc-text-muted); font-size:var(--fs-sm)}
.konzola .bez-mena{color:var(--wc-text-muted); font-weight:400; font-style:italic}

/* Formular v paneli (Zapisat stroj, Pridat cloveka): polia pod sebou na
   telefone, v rade na sirokom okne; popisok nad polom. */
.konzola form.orgform.panel-head{align-items:flex-end; border-bottom:0; border-top:1px solid var(--line);
  background:var(--wc-surface-2)}
.konzola form.orgform label{display:flex; flex-direction:column; gap:var(--sp-1); font-size:var(--fs-sm);
  color:var(--wc-text-muted); font-weight:600}
.konzola form.orgform label:has(> input[type="checkbox"]){flex-direction:row; align-items:center;
  font-weight:400; color:var(--wc-text-primary); padding-bottom:var(--sp-2)}
.konzola .rolesel{min-height:36px; border-color:var(--wc-ink-400)}
.konzola input.rolesel{padding:var(--sp-1) var(--sp-3)}

.konzola .panel > .formrow{padding-top:var(--sp-4)}

/* Detail: video hore vlavo ako hlavny obsah, meta pod nim. */
.konzola .grid2{grid-template-columns:minmax(0,1.5fr) minmax(0,1fr); gap:var(--sp-5)}
.konzola .card{padding:var(--sp-5)}
.konzola .card h3{font-size:var(--fs-lg)}
.konzola .card>.tablewrap{margin:0 calc(-1 * var(--sp-5))}
.konzola .meta{gap:var(--sp-4) var(--sp-5)}
.konzola .k{font-size:var(--fs-xs); letter-spacing:.3px}
.konzola .v{margin-top:2px}
.konzola .verifybar{padding:var(--sp-3) var(--sp-5); font-weight:600}
.konzola .dokaz-riadky{display:grid; gap:var(--sp-3); margin:0 0 var(--sp-4)}
.konzola .dokaz-riadky .mono{margin-top:2px}

/* Tlacidla: 36 px vysoke, stale ohranicenie pre ghost. */
.konzola .btn{min-height:36px; border-radius:var(--r-md)}
.konzola .btn.sm, .konzola .btn.maly{min-height:30px}
.konzola .btn.ghost{border-color:var(--wc-ink-200)}
.konzola .btn.nebezpecne{color:var(--wc-fail-ink)}

@media (max-width:900px){ .konzola .grid2{grid-template-columns:minmax(0,1fr)} }

/* ── Telefon a uzky tablet ──────────────────────────────────────────────── */
@media (max-width:760px){
  .konzola .page{padding:var(--sp-5) var(--sp-4) var(--sp-10)}
  .konzola .title{font-size:22px}
  .konzola .sub{margin-bottom:var(--sp-5)}
  /* Navigacia: kazda polozka ikona nad textom, rovnaka sirka, cela v jednom
     rade (4 polozky zakaznika sa zmestia do 343 px). Admin s 8 polozkami
     roluje vodorovne ako doteraz. */
  .konzola .navrow{padding:0 var(--sp-2)}
  .konzola .navrow .nav{margin-left:0}
  .konzola .navrow .navgrp.solo, .konzola .navrow .navgrp.solo .grp{flex:1 1 auto; width:100%}
  .konzola .navrow .grp{flex-wrap:nowrap}
  .konzola .nav .navtab{flex:1 0 auto; display:flex; flex-direction:column; align-items:center; gap:3px;
    padding:var(--sp-2) var(--sp-2) 10px; font-size:var(--fs-xs); text-align:center; white-space:nowrap}
  .konzola .nav .navtab .ikona{margin-right:0; width:20px; height:20px}
  .konzola .kpi{padding:var(--sp-3) var(--sp-4)}
  .konzola .kpi .value{font-size:26px}
  .konzola .kpis{grid-template-columns:repeat(auto-fit, minmax(100px,1fr)); gap:var(--sp-3)}
  .konzola .kpi .value{font-size:24px}
  .konzola .kpi .pod{display:none}
  .konzola .panel-head{padding:var(--sp-3) var(--sp-4)}
  .konzola .card{padding:var(--sp-4)}
  .konzola .card>.tablewrap{margin:0 calc(-1 * var(--sp-4))}
  .konzola .legenda dt{min-width:0}
  .konzola .legenda div{flex-direction:column; gap:var(--sp-1)}
  .konzola form.orgform.panel-head{flex-direction:column; align-items:stretch}
  .konzola form.orgform label, .konzola form.orgform input, .konzola form.orgform select{width:100%}

}

/* Tabulky ako karty uz pod 900 px: pri 768 px (tablet na vysku) sa sedem stlpcov zoznamu
   nezmesti a Stav ostal odrezany za okrajom panela (snimka 28. 9. 2026). */
@media (max-width:900px){
  /* TABULKA AKO KARTY (trieda .karty na <table>): kazdy riadok je karta,
     kazda bunka riadok „popisok: hodnota“. Popisok nesie `data-l` bunky.
     Rolovaci pas s odrezanymi stlpcami (snimky 28. 9.) na telefone nikto
     necita. */
  .konzola .tablewrap table.karty, .konzola .tablewrap table.karty tbody{display:block}
  .konzola .tablewrap table.karty thead{display:none}
  .konzola .tablewrap table.karty tr{display:flex; flex-direction:column; padding:var(--sp-3) var(--sp-4); border-top:1px solid var(--line)}
  .konzola .tablewrap table.karty tr:first-child{border-top:0}
  .konzola .tablewrap table.karty td{display:block; position:relative; padding:3px 0 3px 112px; border:0;
    white-space:normal; text-align:left !important; min-height:22px; overflow-wrap:anywhere}
  .konzola .tablewrap table.karty td::before{content:attr(data-l); position:absolute; left:0; top:4px; width:104px;
    color:var(--wc-text-muted); font-size:var(--fs-xs); line-height:1.4}
  .konzola .tablewrap table.karty td.hlava{order:-1; padding:0 0 var(--sp-2) 0; font-size:var(--fs-md)}
  .konzola .tablewrap table.karty td.hlava::before{display:none}
  .konzola .tablewrap table.karty td.akcie-bunka{display:flex; flex-wrap:wrap; gap:var(--sp-2); padding:var(--sp-2) 0 0}
  .konzola .tablewrap table.karty td.akcie-bunka::before{display:none}
  .konzola .tablewrap table.karty td.akcie-bunka:empty{display:none}
  .konzola .tablewrap table.karty td.empty{padding:var(--sp-8) 0; text-align:center !important}
  .konzola .tablewrap table.karty td.empty::before{display:none}
  .konzola .tablewrap table.karty td:not([data-l]){padding-left:0}
  .konzola .tablewrap table.karty td:not([data-l])::before{display:none}
  .konzola .tablewrap table.karty tr[hidden]{display:none}
  .konzola .tablewrap table.karty tr.strojhistr td{padding-left:0}
  .konzola .tablewrap table.karty tr.strojhistr td::before{display:none}
  .konzola .tablewrap table.karty input.rolesel, .konzola .tablewrap table.karty select.rolesel{width:100%; min-width:0 !important}
}
