/* ===========================================================================
   ODS — Občanská digitální síť · konzole
   Kompletní redesign. Třídy a ID zůstávají shodné s PHP/JS kontraktem.
   Motiv: navy chrome + petrolejový akcent; světlý i tmavý režim.
   =========================================================================== */

/* Písma jsou na našem serveru: bez požadavků na cizí servery (licence SIL OFL). */
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:400;font-display:swap;src:url(fonts/hanken-latin-ext-400.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:400;font-display:swap;src:url(fonts/hanken-latin-400.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:500;font-display:swap;src:url(fonts/hanken-latin-ext-500.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:500;font-display:swap;src:url(fonts/hanken-latin-500.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:600;font-display:swap;src:url(fonts/hanken-latin-ext-600.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:600;font-display:swap;src:url(fonts/hanken-latin-600.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:700;font-display:swap;src:url(fonts/hanken-latin-ext-700.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:700;font-display:swap;src:url(fonts/hanken-latin-700.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:800;font-display:swap;src:url(fonts/hanken-latin-ext-800.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:800;font-display:swap;src:url(fonts/hanken-latin-800.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;src:url(fonts/plex-mono-latin-ext-400.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;src:url(fonts/plex-mono-latin-400.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;src:url(fonts/plex-mono-latin-ext-500.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;src:url(fonts/plex-mono-latin-500.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:600;font-display:swap;src:url(fonts/plex-mono-latin-ext-600.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:600;font-display:swap;src:url(fonts/plex-mono-latin-600.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}

:root{
  color-scheme:light dark;
  /* plochy */
  --bg:#eef2f7; --card:#ffffff; --card-2:#f8fafc; --ink:#0f172a; --muted:#64748b; --line:#e2e8f0;
  /* navy chrome (sidebar) */
  --side:#0b1f33; --side2:#132f4c; --side3:#1c4166; --sideink:#b6c7d8; --sidedim:#7f95aa;
  /* akcent */
  --accent:#0e7490; --accent2:#155e75; --soft:#e0f2f7; --on-accent:#ffffff; --link:#0e7490;
  /* stavy */
  --ok:#dcfce7; --okink:#166534; --err:#fee2e2; --errink:#991b1b;
  --green:#16a34a; --orange:#d97706; --red:#dc2626; --off:#94a3b8;
  /* elevace a poloměry */
  --shadow:0 1px 2px rgba(15,23,42,.06),0 4px 16px rgba(15,23,42,.05);
  --shadow-pop:0 2px 6px rgba(15,23,42,.08),0 14px 30px -6px rgba(15,23,42,.16);
  --radius:16px; --radius-md:11px; --radius-sm:9px;
  --glow:rgba(14,116,144,.11);
  /* písmo */
  --font-ui:"Hanken Grotesk",system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
  --font-mono:"IBM Plex Mono",ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  --motion:.16s ease;
}
@media(prefers-color-scheme:dark){:root:not([data-theme="light"]){
  --bg:#0a1320; --card:#13202f; --card-2:#0f1b29; --ink:#e6edf5; --muted:#93a4b6; --line:#243648;
  --side:#08111b; --side2:#16293d; --side3:#1f405f; --sideink:#b6c7d8; --sidedim:#6f8499;
  --accent:#17a2c4; --accent2:#0e93b6; --soft:#102c3b; --on-accent:#05151c; --link:#5cc8e0;
  --ok:#0f2e20; --okink:#86efac; --err:#3a1717; --errink:#fca5a5;
  --green:#34d399; --orange:#f59e0b; --red:#f87171; --off:#64748b;
  --shadow:0 1px 2px rgba(0,0,0,.4),0 4px 16px rgba(0,0,0,.35);
  --shadow-pop:0 2px 6px rgba(0,0,0,.5),0 16px 34px -6px rgba(0,0,0,.7);
  --glow:rgba(23,162,196,.16);
}}
:root[data-theme="dark"]{
  color-scheme:dark;
  --bg:#0a1320; --card:#13202f; --card-2:#0f1b29; --ink:#e6edf5; --muted:#93a4b6; --line:#243648;
  --side:#08111b; --side2:#16293d; --side3:#1f405f; --sideink:#b6c7d8; --sidedim:#6f8499;
  --accent:#17a2c4; --accent2:#0e93b6; --soft:#102c3b; --on-accent:#05151c; --link:#5cc8e0;
  --ok:#0f2e20; --okink:#86efac; --err:#3a1717; --errink:#fca5a5;
  --green:#34d399; --orange:#f59e0b; --red:#f87171; --off:#64748b;
  --shadow:0 1px 2px rgba(0,0,0,.4),0 4px 16px rgba(0,0,0,.35);
  --shadow-pop:0 2px 6px rgba(0,0,0,.5),0 16px 34px -6px rgba(0,0,0,.7);
  --glow:rgba(23,162,196,.16);
}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font-ui);font-size:15px;line-height:1.55;-webkit-font-smoothing:antialiased}
a{color:var(--link);text-decoration:none;transition:color var(--motion)}
a:hover{text-decoration:underline}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:5px}
.mono,.tile b,.vu-values strong,.vu-scale,.vu-values small{font-family:var(--font-mono);font-variant-numeric:tabular-nums}

.testbar{background:#b45309;color:#fff;text-align:center;padding:5px 10px;font-size:13px;font-weight:600;letter-spacing:.01em}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
[hidden]{display:none!important}

/* ---------- Layout ---------- */
.layout{display:flex;min-height:100vh}
.content{flex:1;min-width:0;display:flex;flex-direction:column}

/* ---------- Sidebar ---------- */
.sidebar{width:248px;flex:none;background:var(--side);color:var(--sideink);display:flex;flex-direction:column;
  padding:18px 14px;position:sticky;top:0;height:100vh;overflow-y:auto}
.brand{display:block;padding:4px 8px 16px;margin-bottom:2px}
.brand img{width:100%;max-width:192px;height:auto;display:block}
input.navtoggle{display:none!important}
.navbtn{display:none}
.navlinks{display:flex;flex-direction:column;flex:1}
.navgroup{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.11em;color:var(--sidedim);padding:15px 10px 6px}
.sidebar nav a{display:block;color:var(--sideink);text-decoration:none;padding:9px 11px;border-radius:10px;margin-bottom:2px;
  font-weight:500;transition:background var(--motion),color var(--motion)}
.sidebar nav a:hover{background:var(--side2);color:#fff;text-decoration:none}
.sidebar nav a.on{background:linear-gradient(90deg,var(--accent),var(--accent2));color:#fff;font-weight:600;
  box-shadow:0 7px 18px -8px var(--accent)}
.userbox{margin-top:auto;padding:14px 10px 2px;border-top:1px solid var(--side2);font-size:14px}
.userbox strong{display:block;color:#fff;font-weight:600;overflow-wrap:anywhere}
.logout{margin:9px 0 0}
.logout button{width:100%;background:transparent;border:1px solid var(--side3);color:var(--sideink);
  padding:7px 10px;font-size:14px;font-weight:500;border-radius:9px;cursor:pointer;transition:background var(--motion),color var(--motion)}
.logout button:hover{background:var(--side2);color:#fff}

/* ---------- Topbar (přidáno v lib.php) ---------- */
.apptop{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:16px;
  padding:14px 28px;background:color-mix(in srgb,var(--bg) 82%,transparent);backdrop-filter:blur(10px);
  border-bottom:1px solid var(--line)}
.apptop h1{margin:0;font-size:22px;line-height:1.2;font-weight:700;letter-spacing:-.01em;text-wrap:balance}
.themebtn{margin-left:auto;width:38px;height:38px;flex:none;border:1px solid var(--line);border-radius:10px;
  background:var(--card);color:var(--ink);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;
  transition:background var(--motion),box-shadow var(--motion),transform var(--motion)}
.themebtn:hover{background:var(--card-2);box-shadow:var(--shadow)}
.themebtn:active{transform:translateY(1px)}
.themebtn svg{width:18px;height:18px}
.themebtn .sun{display:none}
[data-theme="dark"] .themebtn .sun{display:block}
[data-theme="dark"] .themebtn .moon{display:none}
@media(prefers-color-scheme:dark){:root:not([data-theme="light"]) .themebtn .sun{display:block}
  :root:not([data-theme="light"]) .themebtn .moon{display:none}}

/* ---------- Main ---------- */
main{width:100%;max-width:1180px;margin:0 auto;padding:24px 28px 40px;flex:1;position:relative}
main::before{content:"";position:absolute;inset:-6px 0 auto 0;height:240px;
  background:radial-gradient(900px 240px at 22% -34%,var(--glow),transparent 70%);pointer-events:none;z-index:0}
main>*{position:relative;z-index:1}
h1{font-size:25px;line-height:1.2;margin:0 0 18px;letter-spacing:-.01em;text-wrap:balance}
h2{font-size:16px;font-weight:700;margin:0 0 13px;letter-spacing:-.005em}
h3{font-size:15px;font-weight:600;margin:0 0 12px}

/* ---------- Cards ---------- */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:20px;margin-bottom:18px;
  box-shadow:var(--shadow);transition:box-shadow var(--motion),transform var(--motion),border-color var(--motion)}
.card:hover{box-shadow:var(--shadow-pop);transform:translateY(-2px)}
.narrow{max-width:460px}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:18px;align-items:start}
.grid .card{margin:0}
.grid.wide{margin-bottom:18px}

/* ---------- KPI dlaždice ---------- */
.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:16px;margin-bottom:22px}
.tile{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:15px 17px;
  box-shadow:var(--shadow);min-width:0;transition:box-shadow var(--motion),transform var(--motion),border-color var(--motion)}
.tile:hover{box-shadow:var(--shadow-pop);transform:translateY(-2px)}
.tile span{display:block;color:var(--muted);font-size:12.5px;font-weight:600}
.tile b{display:block;font-size:26px;line-height:1.25;letter-spacing:-.02em;margin-top:5px;overflow-wrap:anywhere}
.tile.tg b{font-size:21px}
.tile.tg.active{border-color:var(--green);background:var(--ok)}
.tile.tg.active span,.tile.tg.active b{color:var(--okink)}

/* ---------- Forms ---------- */
label{display:block;margin-bottom:14px;font-size:13.5px;font-weight:600;color:var(--muted)}
label.check{display:flex;gap:9px;align-items:center;color:var(--ink);font-weight:400}
input,select,textarea{display:block;width:100%;padding:10px 12px;margin-top:6px;border:1px solid var(--line);
  border-radius:var(--radius-sm);font:inherit;font-size:14px;color:var(--ink);background:var(--card);transition:border-color var(--motion),box-shadow var(--motion)}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--soft)}
input[type=checkbox]{display:inline-block;width:17px;height:17px;margin:0;accent-color:var(--accent)}
input[readonly]{background:var(--card-2);color:var(--muted)}

/* ---------- Buttons ---------- */
button,.btn{display:inline-flex;align-items:center;gap:7px;background:var(--accent);color:var(--on-accent);
  border:1px solid transparent;border-radius:var(--radius-sm);padding:10px 16px;font:inherit;font-weight:600;font-size:14px;
  cursor:pointer;text-decoration:none;margin:2px 0;transition:background var(--motion),box-shadow var(--motion),transform var(--motion)}
button:hover,.btn:hover{background:var(--accent2);color:var(--on-accent);text-decoration:none}
button:active,.btn:active{transform:translateY(1px)}
.ghost{background:transparent;color:var(--link);border-color:var(--line)}
.ghost:hover{background:var(--card-2);color:var(--link);border-color:var(--accent)}
.small{padding:5px 11px;font-size:13px;font-weight:600}
.buttons{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px;align-items:center}
.buttons form{margin:0}

/* ---------- Messages ---------- */
.msg{padding:12px 15px;border-radius:var(--radius-sm);margin-bottom:16px;font-size:14px;font-weight:500;
  display:flex;align-items:center;gap:9px}
.msg.ok{background:var(--ok);color:var(--okink)}
.msg.err{background:var(--err);color:var(--errink)}
.muted{color:var(--muted);font-size:14px}

/* ---------- Definition lists ---------- */
dl{display:grid;grid-template-columns:auto 1fr;gap:7px 16px;margin:0 0 18px}
dt{color:var(--muted);font-size:13.5px;font-weight:600}
dd{margin:0;overflow-wrap:anywhere}

/* ---------- Search ---------- */
.search{display:flex;gap:8px;margin-bottom:14px;max-width:560px}
.search input{margin:0}

/* ---------- Tables ---------- */
.tablewrap{overflow:auto;max-height:75vh;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}
.tablewrap.flat{box-shadow:none;max-height:320px}
table{border-collapse:collapse;width:100%;font-size:14px}
th,td{padding:10px 13px;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
th{background:var(--card-2);position:sticky;top:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
tbody tr{transition:background var(--motion)}
tbody tr:hover{background:var(--card-2)}
tbody tr:last-child td{border-bottom:0}
table.list{font-size:13px}
table.list th,table.list td{padding:7px 8px;white-space:normal}
table.list th{white-space:nowrap;font-size:11px;letter-spacing:.02em}
table.list td.mail{overflow-wrap:anywhere;min-width:110px}
table.list td:first-child,table.list td:nth-child(2){white-space:nowrap}
@media(max-width:1100px){table.list{min-width:980px}}

/* ---------- Post / avatar ---------- */
.post{display:flex;gap:14px}
.avatar{flex:none;width:40px;height:40px;border-radius:50%;background:var(--soft);color:var(--accent);
  display:flex;align-items:center;justify-content:center;font-weight:700}
.postbody{flex:1;min-width:0}
.post p{margin:8px 0;overflow-wrap:anywhere}

/* ---------- Chips ---------- */
.chips{display:flex;flex-wrap:wrap;gap:7px}
.chip{background:var(--card-2);border:1px solid var(--line);border-radius:999px;padding:4px 12px;font-size:13px;font-weight:500}
.chip.small-text{padding:1px 8px}
.small-text{font-size:11px}

/* ---------- Scroll / misc ---------- */
.scroll{max-height:320px;overflow-y:auto}
.bb{border-bottom:1px solid var(--line);padding:9px 0}
.bb:last-child{border-bottom:0}
.top-gap{margin-top:18px}
.top-gap-s{margin:6px 0 0}
.hash{overflow-wrap:anywhere;font-family:var(--font-mono);font-size:13px}

/* ---------- Status dots ---------- */
.dot{display:inline-block;width:10px;height:10px;border-radius:50%}
.dot.on{background:var(--green);box-shadow:0 0 0 3px color-mix(in srgb,var(--green) 22%,transparent)}
.dot.off{background:var(--off)}
.dot.big{background:var(--card);border:2px solid #7c3aed}

/* ---------- Map ---------- */
#mapa{height:72vh;min-height:380px;border-radius:var(--radius);border:1px solid var(--line);box-shadow:var(--shadow)}
.small-map{height:300px!important;min-height:0!important}

/* ---------- VU metr ---------- */
.vu-head{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;margin-bottom:10px}
.vu-head h2{margin:0}
.vu-values{text-align:right;min-width:84px;display:flex;flex-direction:column}
.vu-values strong{font-size:21px;font-weight:600;line-height:1.1}
.vu-note{margin:10px 0 8px;font-size:13px}
.vu{position:relative;height:20px;background:var(--card-2);border:1px solid var(--line);border-radius:7px;overflow:hidden}
#vu-fill{height:100%;width:0;border-radius:6px 2px 2px 6px;background:var(--green);transition:width 120ms ease-out,background 120ms ease-out}
#vu-peak{position:absolute;top:0;left:0;width:3px;height:100%;background:var(--ink);border-radius:1px;opacity:.7;transition:left 100ms}
.vu-mark{position:absolute;top:0;height:100%}
.vu-mark.green{left:58.3%;border-left:2px solid rgba(22,163,74,.5)}
.vu-mark.orange{left:70%;border-left:1px dashed rgba(217,119,6,.6)}
.vu-mark.red{left:83.3%;border-left:2px solid rgba(220,38,38,.6)}
.vu-scale{position:relative;height:18px;font-size:11px;color:var(--muted);margin:5px 0 8px}
.vu-scale span{position:absolute;transform:translateX(-50%);white-space:nowrap}
.vu-scale span:first-child{transform:none}
.vu-scale span:last-child{transform:translateX(-100%)}
.c-green{color:var(--green)}.c-orange{color:var(--orange)}.c-red{color:var(--red)}

/* ---------- Toolbar ---------- */
.toolbar{display:flex;flex-wrap:wrap;gap:6px 18px;align-items:center;margin-bottom:12px}
.toolbar label{margin:0}

/* ---------- Download rows ---------- */
.dl{display:flex;justify-content:space-between;align-items:center;gap:24px;padding:22px 0;border-top:2px solid var(--line)}
.dl:last-child{padding-bottom:4px}
.dl h3{font-size:17px;margin:0 0 4px}
.dl-text{min-width:0}
.dl p{margin:0 0 4px}
.dl .btn{flex:none}
@media(max-width:600px){.dl{display:block}.dl .btn{margin-top:6px}}

/* ---------- Legacy cards ---------- */
.legacy .row{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:16px;margin-bottom:16px}
.legacy .card{padding:0;overflow:hidden}
.legacy .card-header{padding:13px 16px;border-bottom:1px solid var(--line);font-weight:600}
.legacy .card-title{font-size:16px;margin:0}
.legacy .card-body{padding:15px 16px}
.legacy table{white-space:normal}
.legacy th,.legacy td{white-space:normal}

/* ---------- Footer ---------- */
footer{text-align:center;color:var(--muted);font-size:13px;padding:20px}

/* ---------- Leaflet (funkční, needit) ---------- */
.leaflet-marker-icon.radio-icon{background:none;border:0;overflow:visible}
.radio-icon svg{position:absolute;left:0;top:0;width:var(--radio-size,16px);height:var(--radio-size,16px);
  transform:translate(-50%,-50%);filter:drop-shadow(0 1px 2px rgba(0,0,0,.45));transition:width .15s,height .15s}
.leaflet-tooltip.radio-label{background:rgba(255,255,255,.9);border:0;border-radius:4px;padding:0 4px;
  margin-left:var(--radio-gap,0);font-size:var(--radio-font,10px);line-height:1.5;font-weight:600;color:#0f3d5e;box-shadow:0 1px 2px rgba(0,0,0,.25)}
.leaflet-tooltip.radio-label:before{display:none}
.radio-popup strong{font-size:15px}
.labels-off .leaflet-tooltip.radio-label{display:none}

/* ---------- Wide page ---------- */
.widepage main{max-width:none;padding-left:18px;padding-right:18px}

/* ===========================================================================
   Login
   =========================================================================== */
.loginpage{min-height:100vh;display:flex;flex-direction:column;
  background:radial-gradient(1100px 520px at 50% -8%,#15688a 0,transparent 62%),var(--side)}
.loginpage main{max-width:420px;margin:auto;padding:28px 20px;flex:none}
.loginpage main::before{display:none}
.loginbrand{text-align:center;color:#fff;margin-bottom:22px}
.loginbrand img{width:220px;height:auto;max-width:80%}
.loginbrand h1{margin:14px 0 4px;font-size:26px;font-weight:800;letter-spacing:.3px}
.loginbrand p{margin:0;color:#c5d6e4;font-size:14px}
.loginpage .card{max-width:none;margin:0;border:0;border-radius:18px;box-shadow:0 24px 60px rgba(0,0,0,.4)}
.loginpage .card:hover{transform:none;box-shadow:0 24px 60px rgba(0,0,0,.4)}
.loginpage button{width:100%;margin-top:6px;justify-content:center;padding:11px}
.loginpage footer{color:#8fa6ba}
.login-link{text-align:center;margin:14px 0 0;font-size:14px}

/* ===========================================================================
   Animace (jemné; vypnuté při prefers-reduced-motion níže)
   `backwards` fill → po nájezdu se transform uvolní, takže hover zdvih funguje.
   =========================================================================== */
@keyframes ods-rise{from{transform:translateY(12px)}to{transform:none}}
@keyframes ods-dot{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--green) 45%,transparent)}70%{box-shadow:0 0 0 7px transparent}100%{box-shadow:0 0 0 0 transparent}}
.tile{animation:ods-rise .5s cubic-bezier(.2,.7,.3,1) backwards}
.tiles .tile:nth-child(2){animation-delay:.05s}
.tiles .tile:nth-child(3){animation-delay:.1s}
.tiles .tile:nth-child(4){animation-delay:.15s}
.tiles .tile:nth-child(5){animation-delay:.2s}
.tiles .tile:nth-child(6){animation-delay:.25s}
.card{animation:ods-rise .55s cubic-bezier(.2,.7,.3,1) backwards}
.grid .card:nth-child(2){animation-delay:.08s}
.grid .card:nth-child(3){animation-delay:.16s}
.grid .card:nth-child(4){animation-delay:.24s}
.msg{animation:ods-rise .4s ease backwards}
.dot.on{animation:ods-dot 2.4s ease-out infinite}

/* ===========================================================================
   Responsive
   =========================================================================== */
@media(max-width:860px){
  .layout{display:block}
  .sidebar{position:static;width:auto;height:auto;flex-direction:row;flex-wrap:wrap;align-items:center;padding:10px 12px;overflow:visible}
  .brand{padding:0 4px;flex:1;margin:0}
  .brand img{max-width:150px}
  .navbtn{display:inline-flex;align-items:center;color:#fff;border:1px solid var(--side3);border-radius:9px;
    padding:6px 13px;font-size:14px;margin:0;font-weight:600;cursor:pointer;background:transparent}
  .navlinks{display:none;flex:0 0 100%;width:100%;padding-top:8px}
  .navtoggle:checked~.navlinks{display:block}
  .userbox{margin-top:12px}
  .apptop{padding:12px 16px}
  .apptop h1{font-size:19px}
  main{padding:16px 14px 32px}
  h1{font-size:22px;margin-bottom:14px}
  .card{padding:16px}
  .grid{grid-template-columns:minmax(0,1fr)}
}
@media(prefers-reduced-motion:reduce){
  *{animation-duration:.001ms!important;animation-iteration-count:1!important}
  .card,.tile,button,.btn,a,.sidebar nav a,tbody tr,.themebtn,.logout button{transition:none}
  .card:hover,.tile:hover,button:active,.btn:active,.themebtn:active{transform:none}
}

/* ---------- Tmavý režim: „Signál" pozadí ---------- */
@media(prefers-color-scheme:dark){
  :root:not([data-theme="light"]) body:not(.loginpage){background:radial-gradient(1000px 520px at 78% -8%,var(--glow),transparent 65%) fixed,radial-gradient(760px 480px at 12% 104%,rgba(23,162,196,.09),transparent 65%) fixed,#070f1a}
  :root:not([data-theme="light"]) .sidebar{background-image:repeating-linear-gradient(0deg,rgba(255,255,255,.014) 0 1px,transparent 1px 3px)}
}
:root[data-theme="dark"] body:not(.loginpage){background:radial-gradient(1000px 520px at 78% -8%,var(--glow),transparent 65%) fixed,radial-gradient(760px 480px at 12% 104%,rgba(23,162,196,.09),transparent 65%) fixed,#070f1a}
:root[data-theme="dark"] .sidebar{background-image:repeating-linear-gradient(0deg,rgba(255,255,255,.014) 0 1px,transparent 1px 3px)}

/* ---------- Přehled na jednu obrazovku ---------- */
.dash-side{display:flex;flex-direction:column;gap:18px;min-width:0}
.dash-side .card{margin:0}
@media(min-width:1100px) and (min-height:560px){
  body.dashpage{height:100vh;height:100dvh;overflow:hidden;display:flex;flex-direction:column}
  .dashpage .layout{flex:1;min-height:0}
  .dashpage .sidebar{position:static;height:auto}
  .dashpage .content{min-height:0}
  .dashpage main{max-width:none;padding:12px 18px;min-height:0;display:flex;flex-direction:column;overflow:hidden}
  .dashpage footer{display:none}
  .dashpage #live{flex:1;min-height:0;display:flex;flex-direction:column;gap:10px}
  .dashpage #live .msg{margin:0;flex:none}
  .dashpage .tiles{flex:none;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;margin:0}
  .dashpage .tile{padding:7px 11px;border-radius:var(--radius-md)}
  .dashpage .tile span{font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .dashpage .tile b,.dashpage .tile.tg b{font-size:16px;margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .dashpage .card{padding:11px 14px;border-radius:var(--radius-md)}
  .dashpage .card:hover,.dashpage .tile:hover{transform:none}
  .dashpage h2{margin-bottom:7px;font-size:14px}
  .dash-vu{flex:none;margin:0}
  .dash-vu .vu-head{margin-bottom:6px}
  .dash-vu h2{margin:0}
  .dash-vu .vu-values strong{font-size:18px}
  .dash-vu .vu{height:16px}
  .dash-vu .vu-scale{height:15px;margin:3px 0 2px}
  .dash-vu .vu-note{margin:2px 0 4px;font-size:12px}
  .dash-vu #vu-history{flex-wrap:nowrap;overflow:hidden}
  .dash-vu #vu-history .chip{white-space:nowrap;flex:none}
  .dash-rest{flex:1;min-height:0;margin:0;gap:10px;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) minmax(0,1fr);align-items:stretch}
  .dash-rest>.card,.dash-side>.card{display:flex;flex-direction:column;min-height:0;overflow:hidden}
  .dash-rest p{margin:6px 0 0;flex:none}
  .dashpage .small-map{flex:1;height:auto!important;min-height:0!important}
  .dashpage .scroll{flex:1;min-height:0;max-height:none}
  .dash-side{min-height:0;gap:10px}
  .dash-side>.card:last-child{flex:1}
  .dash-side>.card:not(:last-child){flex:none;max-height:35%}
  .dash-side #viewers-list{overflow:auto}
  .dash-side .tablewrap{flex:1;min-height:0;overflow:auto;margin:0}
}

/* Mapa hotspotů: velký dosah má větší anténku */
.radio-icon.hotspot-big svg{width:calc(var(--radio-size,18px)*1.3);height:calc(var(--radio-size,18px)*1.3)}

/* Konektivita: sloupcový přehled 24 h a stavové pilulky (tokeny, oba motivy) */
.spark{display:inline-flex;gap:2px;align-items:flex-end;height:24px;vertical-align:middle}
.spark i{display:block;width:5px;min-height:2px;border-radius:1px;background:var(--green)}
.spark i.warn{background:var(--orange)}
.spark i.bad{background:var(--red)}
.spark i.none{background:var(--line)}
.state{display:inline-flex;align-items:center;gap:7px;font-weight:600;white-space:nowrap}
.state .dot.warn{background:var(--orange)}
.state .dot.bad{background:var(--red)}
.tile.kon b{font-family:var(--font-ui);font-size:15px;letter-spacing:0;margin-top:6px}
.tile.kon .state .dot{display:inline-block;flex:none;width:10px;height:10px;margin:0}
.tile.kon .state{display:inline-flex;color:var(--ink)}
.tablewrap.kon-all{max-height:none;overflow:auto}
.kon-all th,.kon-all td{padding-left:9px;padding-right:9px}
.tile.kon.warn{border-color:var(--orange)}
.tile.kon.bad{border-color:var(--red)}

/* Historie VU: průměr řeči barevně podle stejných prahů jako VU metr */
.chip.vu-avg{--lvl:var(--green);background:color-mix(in srgb,var(--lvl) 20%,var(--card));border-color:var(--lvl);color:var(--ink)}
.chip.vu-avg.yellow{--lvl:#ca8a04}
.chip.vu-avg.orange{--lvl:var(--orange)}
.chip.vu-avg.red{--lvl:var(--red)}
.chip.vu-avg b{font-weight:600}
.vu-hist-label{align-self:center;flex:none}

/* Mapa hotspotů: stav připojení u zapsaných hotspotů */
.leaflet-marker-icon.hs-on::after,.leaflet-marker-icon.hs-off::after{content:"";position:absolute;width:5px;height:5px;border-radius:50%;border:1.5px solid #fff;
  left:calc(var(--radio-size,18px) * .3);top:calc(var(--radio-size,18px) * -.6);box-shadow:0 1px 1px rgba(0,0,0,.35)}
.leaflet-marker-icon.hs-on::after{background:#22e5ff;border-color:#e0fbff;box-shadow:0 0 3px 1px #22e5ff,0 0 8px 2px rgba(34,229,255,.75)}
.leaflet-marker-icon.hs-off::after{background:#94a3b8}
.leaflet-marker-icon.hs-off svg{filter:grayscale(1) drop-shadow(0 1px 2px rgba(0,0,0,.45));opacity:.7}

/* Mapa uživatelů: kdo právě vysílá a oblouček k předchozímu řečníkovi */
.leaflet-marker-icon.talking{z-index:1000!important}
.leaflet-marker-icon.talking svg{animation:ods-talk 1.1s ease-in-out infinite;filter:drop-shadow(0 0 4px #22e5ff) drop-shadow(0 0 2px #22e5ff)}
@keyframes ods-talk{0%,100%{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.35)}}
@media(prefers-reduced-motion:reduce){.leaflet-marker-icon.talking svg{animation:none;transform:translate(-50%,-50%) scale(1.25)}}
.leaflet-marker-icon.arc-label{background:none;border:0;overflow:visible}
.arc-label span{position:absolute;transform:translate(-50%,-50%);white-space:nowrap;background:rgba(255,255,255,.92);color:#0b4a5e;
  border:1px solid #0e7490;border-radius:6px;padding:0 5px;font:600 11px/1.5 var(--font-mono)}

/* Kontakty do stanice (test, jen superadmin) */
.rw-log{font:12px/1.4 var(--font-mono);white-space:pre-wrap;max-height:220px;overflow:auto;color:var(--muted);
  background:var(--card-2);border:1px solid var(--line);border-radius:var(--radius-sm);padding:8px 10px}
.rw-prog{width:100%;height:12px;accent-color:var(--accent)}

/* Výběr přesné polohy hotspotu na mapě */
.pick-map{height:320px;border-radius:var(--radius-md);border:1px solid var(--line);margin:4px 0 14px;cursor:crosshair}

/* Přepínač motivu s textem, samotná ikonka nebyla vidět */
.themebtn,.themebtn:hover{width:auto;padding:0 12px;display:inline-flex;align-items:center;gap:8px;color:var(--ink)}
.themebtn-txt{font-size:13px;font-weight:600;white-space:nowrap}
