/*
 * Admin Dashever — stejná řeč jako platforma: plátno a plocha, jedna linka,
 * inkoust #452053 místo černé, akcent #F67EE3 jen pro stav a fokus.
 * Grafy mají vlastní role (--s1…--s4 identita, --ok/--warn/--bad stav).
 */
:root {
  --canvas: #f8f7f6;
  --surface: #ffffff;
  --stroke: #e1e1e1;
  --ink: #452053;
  --ink-2: #8d7694;
  --ink-3: #a896ad;
  --ink-6: rgba(69, 32, 83, 0.06);
  --accent: #f67ee3;
  --font: "Geist", -apple-system, "SF Pro Text", "Segoe UI", system-ui, sans-serif;
  --mono: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
  --shadow-card: 0 1px 2px rgba(69, 32, 83, 0.04), 0 4px 12px -8px rgba(69, 32, 83, 0.08);
  --shadow-panel: 0 1px 2px rgba(69, 32, 83, 0.03), 0 24px 48px -32px rgba(69, 32, 83, 0.18);
  /* grafy */
  --s1: #6a45a3; /* vstup */
  --s2: #eb6834; /* výstup */
  --s3: #1baf7a; /* zápis do cache */
  --s4: #eda100; /* čtení z cache */
  --seq: #6a45a3;
  --seq-track: #ece6f2;
  --dim: #d9d4dc;
  --ok: #008300;
  --warn: #eda100;
  --bad: #e34948;
  --ok-bg: #e9f5e9;
  --warn-bg: #fff4d6;
  --bad-bg: #fde9e9;
}

* { box-sizing: border-box; }
html, body { height: 100%; }
body {
  margin: 0;
  background: var(--canvas);
  color: var(--ink);
  font-family: var(--font);
  font-size: 13px;
  line-height: 1.45;
  -webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
a:hover { color: var(--ink); }
h1, h2, h3 { margin: 0; font-weight: 600; letter-spacing: -0.01em; }
h1 { font-size: 18px; }
h2 { font-size: 14px; }
h3 { font-size: 13px; }
p { margin: 0; }
code, .mono { font-family: var(--mono); font-size: 12px; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #d9d6d3; border-radius: 5px; border: 2px solid transparent; background-clip: padding-box; }

.dot-grid {
  background-image: radial-gradient(circle, #d8d4d1 1px, transparent 1.3px);
  background-size: 18px 18px;
}

/* --- rám aplikace ------------------------------------------------------ */
.app { display: flex; height: 100vh; }
.sidebar { display: flex; flex-direction: column; width: 240px; flex-shrink: 0; padding: 16px 12px 12px; }
.brand { display: flex; align-items: center; gap: 10px; height: 36px; padding: 0 8px; margin-bottom: 20px; border-radius: 8px; }
.brand .mark { display: grid; place-items: center; width: 24px; height: 24px; border-radius: 6px; background: var(--ink); color: #fff; font-size: 11px; font-weight: 600; box-shadow: 0 1px 2px rgba(69, 32, 83, 0.3); }
.brand .name { flex: 1; font-weight: 600; }
.brand .env { font-size: 11px; color: var(--ink-3); }
.nav { display: flex; flex-direction: column; gap: 4px; }
.nav a { display: flex; align-items: center; gap: 10px; height: 36px; padding: 0 10px; border-radius: 8px; font-weight: 500; color: var(--ink-2); }
.nav a:hover { background: rgba(69, 32, 83, 0.05); color: var(--ink); }
.nav a.on { background: var(--surface); border: 1px solid var(--stroke); color: var(--ink); box-shadow: var(--shadow-card); }
.nav a.on::after { content: ""; margin-left: auto; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
.nav a svg { width: 16px; height: 16px; flex-shrink: 0; }
.nav .group { margin: 12px 10px 4px; font-size: 11px; font-weight: 500; color: var(--ink-3); text-transform: uppercase; letter-spacing: 0.04em; }
.sidebar .spacer { flex: 1; }
.sidebar .foot { display: flex; flex-direction: column; gap: 6px; padding: 10px; font-size: 12px; color: var(--ink-2); }

.panel { display: flex; flex-direction: column; flex: 1; min-width: 0; margin: 10px 10px 10px 0; overflow: hidden; border: 1px solid var(--stroke); border-radius: 16px; background: var(--surface); box-shadow: var(--shadow-panel); }
.panel > header { display: flex; align-items: center; justify-content: space-between; flex-shrink: 0; height: 52px; padding: 0 20px; border-bottom: 1px solid var(--stroke); }
.crumbs { display: flex; align-items: center; gap: 8px; }
.crumbs span, .crumbs a { color: var(--ink-3); }
.crumbs .last { color: var(--ink); font-weight: 500; }
.actions { display: flex; align-items: center; gap: 8px; }
.content { flex: 1; overflow: auto; padding: 20px; }
.content > * + * { margin-top: 20px; }

/* --- stavební kameny --------------------------------------------------- */
.row { display: flex; align-items: center; gap: 8px; }
.row.between { justify-content: space-between; }
.wrap { flex-wrap: wrap; }
.grid { display: grid; gap: 12px; }
.grid.kpi { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
.grid.two { grid-template-columns: 2fr 1fr; }
.grid.half { grid-template-columns: 1fr 1fr; }
@media (max-width: 1100px) { .grid.two, .grid.half { grid-template-columns: 1fr; } }

.card { border: 1px solid var(--stroke); border-radius: 12px; background: var(--surface); box-shadow: var(--shadow-card); }
.card > .head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--stroke); }
.card > .head .sub { font-size: 12px; color: var(--ink-2); }
.card > .body { padding: 16px; }
.card > .body.flush { padding: 0; }

.tile { padding: 14px 16px; }
.tile .label { font-size: 12px; color: var(--ink-2); }
.tile .value { margin-top: 4px; font-size: 22px; font-weight: 600; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.tile .value.hero { font-size: 48px; line-height: 1; margin-top: 8px; }
.tile .delta { margin-top: 4px; font-size: 12px; color: var(--ink-2); }
.tile .delta.up { color: var(--ok); }
.tile .delta.down { color: var(--bad); }
.tile .delta.cost.up { color: var(--bad); }
.tile .delta.cost.down { color: var(--ok); }
.tile .spark { margin-top: 8px; }

.chip { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 8px; border-radius: 6px; border: 1px solid var(--stroke); background: var(--surface); font-size: 12px; font-weight: 500; color: var(--ink-2); white-space: nowrap; }
.chip .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--ink-3); }
.chip.soft { border-color: transparent; background: var(--ink-6); }
.chip.ok { border-color: transparent; background: var(--ok-bg); color: #0b4d0b; }
.chip.ok .dot { background: var(--ok); }
.chip.bad { border-color: transparent; background: var(--bad-bg); color: #8a1f1f; }
.chip.bad .dot { background: var(--bad); }
.chip.warn { border-color: transparent; background: var(--warn-bg); color: #6d4a00; }
.chip.warn .dot { background: var(--warn); }
.chip.accent { border-color: transparent; background: rgba(246, 126, 227, 0.2); color: var(--ink); }
.chip.live .dot { background: var(--accent); box-shadow: 0 0 0 0 rgba(246, 126, 227, 0.6); animation: pulse 1.6s infinite; }
@keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(246, 126, 227, 0.6); } 100% { box-shadow: 0 0 0 6px rgba(246, 126, 227, 0); } }

.btn { display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 12px; border-radius: 8px; border: 1px solid var(--stroke); background: var(--surface); font: inherit; font-weight: 500; color: var(--ink); cursor: pointer; }
.btn:hover { background: rgba(69, 32, 83, 0.04); }
.btn.primary { background: var(--ink); border-color: var(--ink); color: #fff; }
select, input[type="text"], input[type="search"], input[type="number"] { height: 30px; padding: 0 10px; border-radius: 8px; border: 1px solid var(--stroke); background: var(--surface); font: inherit; color: var(--ink); }
select:focus, input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
input[type="number"] { width: 96px; font-variant-numeric: tabular-nums; }
input[readonly] { background: var(--canvas); color: var(--ink-2); }
input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--ink); }
.btn:disabled { opacity: 0.5; cursor: not-allowed; }

/* --- formuláře (Infrastruktura) ---------------------------------------- */
.form-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 14px 16px; align-items: start; }
.form-grid > label, fieldset.inline > label { display: flex; flex-direction: column; gap: 6px; font-size: 12px; color: var(--ink-2); }
.form-grid > label > span:first-child { font-weight: 500; color: var(--ink); }
fieldset.inline { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 10px 16px; align-items: flex-end; margin: 0; padding: 10px 12px 12px; border: 1px solid var(--stroke); border-radius: 10px; }
fieldset.inline[hidden] { display: none; }
fieldset.inline legend { padding: 0 4px; font-size: 12px; font-weight: 500; color: var(--ink); }
fieldset.inline > .sub { flex-basis: 100%; }
label.check { flex-direction: row !important; align-items: center; gap: 8px !important; color: var(--ink) !important; }
.form-foot { grid-column: 1 / -1; display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.form-foot .btn { flex-shrink: 0; white-space: nowrap; }
.card > .body.flush .form-foot { padding: 12px 16px; border-top: 1px solid var(--stroke); }
.form-table td { vertical-align: top; }
.notice { padding: 12px 16px; }
.notice.ok { border-color: transparent; background: var(--ok-bg); color: #0b4d0b; }
.notice.bad { border-color: transparent; background: var(--bad-bg); color: #8a1f1f; }
h2.section { margin-top: 28px; }
.filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.filters label { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ink-2); }

table { width: 100%; border-collapse: collapse; }
th, td { padding: 9px 12px; text-align: left; vertical-align: middle; border-bottom: 1px solid var(--stroke); white-space: nowrap; }
th { font-size: 11px; font-weight: 500; color: var(--ink-3); text-transform: uppercase; letter-spacing: 0.04em; }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; }
tr:last-child td { border-bottom: 0; }
tbody tr.link:hover { background: rgba(69, 32, 83, 0.03); cursor: pointer; }
td .sub, .sub { font-size: 12px; color: var(--ink-2); }
td.wrap { white-space: normal; }
.muted { color: var(--ink-2); }
.faint { color: var(--ink-3); }
.small { font-size: 12px; }
.table-scroll { overflow-x: auto; }

.note { display: flex; gap: 10px; align-items: flex-start; padding: 10px 14px; border-radius: 10px; border: 1px dashed var(--stroke); background: var(--canvas); font-size: 12px; color: var(--ink-2); }
.note b { color: var(--ink); font-weight: 500; }

.empty { padding: 32px; text-align: center; color: var(--ink-3); }

/* --- grafy ------------------------------------------------------------- */
.viz { position: relative; }
.viz svg { display: block; width: 100%; height: auto; overflow: visible; }
svg .grid-line { stroke: #ecebea; stroke-width: 1; }
svg .axis-text { font-size: 11px; fill: var(--ink-3); }
svg .val-text { font-size: 11px; fill: var(--ink-2); }
svg .bar { fill: var(--seq); }
svg .bar.dim { fill: var(--dim); }
svg .bar.current { fill: var(--accent); }
svg .line { fill: none; stroke: var(--seq); stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; }
svg .line.dim { stroke: var(--dim); }
svg .area { fill: var(--seq); opacity: 0.1; }
svg .end-dot { fill: var(--seq); stroke: var(--surface); stroke-width: 2; }
svg .hit { fill: transparent; }
.viz .hit:hover + .bar, .viz g:hover .bar { filter: brightness(0.92); }
.legend { display: flex; flex-wrap: wrap; gap: 14px; font-size: 12px; color: var(--ink-2); }
.legend .key { display: inline-flex; align-items: center; gap: 6px; }
.legend .sw { width: 10px; height: 10px; border-radius: 3px; }
.sw.s1 { background: var(--s1); } .sw.s2 { background: var(--s2); } .sw.s3 { background: var(--s3); } .sw.s4 { background: var(--s4); }
.seg.s1 { fill: var(--s1); } .seg.s2 { fill: var(--s2); } .seg.s3 { fill: var(--s3); } .seg.s4 { fill: var(--s4); }

.tip { position: fixed; z-index: 50; pointer-events: none; max-width: 280px; padding: 8px 10px; border-radius: 8px; background: var(--ink); color: #fff; font-size: 12px; line-height: 1.4; box-shadow: 0 8px 24px -8px rgba(69, 32, 83, 0.4); opacity: 0; transition: opacity 80ms; white-space: pre-line; }
.tip.show { opacity: 1; }

/* meter */
.meter { height: 8px; border-radius: 4px; background: var(--seq-track); overflow: hidden; }
.meter > span { display: block; height: 100%; border-radius: 4px; background: var(--seq); }
.meter.warn > span { background: var(--warn); }
.meter.bad > span { background: var(--bad); }

/* gantt fází */
.gantt { display: grid; grid-template-columns: 180px 1fr; row-gap: 6px; align-items: center; font-size: 12px; }
.gantt .lane { position: relative; height: 18px; background: var(--seq-track); border-radius: 4px; }
.gantt .lane > span { position: absolute; top: 0; height: 100%; border-radius: 4px; background: var(--seq); }
.gantt .lane > span.bad { background: var(--bad); }
.gantt .axis { grid-column: 2; display: flex; justify-content: space-between; font-size: 11px; color: var(--ink-3); }

/* log událostí */
.events { font-family: var(--mono); font-size: 12px; }
.events .ev { display: grid; grid-template-columns: 52px 76px 1fr; gap: 10px; padding: 3px 0; }
.events .t { color: var(--ink-3); }
.events .k { color: var(--ink-2); }
.events .ev.phase .k, .events .ev.phase .m { color: var(--ink); font-weight: 600; }
.events .ev.error .m { color: var(--bad); }
.events .ev.file .m { color: var(--ink-2); }

/* logy workerů */
.logs { font-family: var(--mono); font-size: 12px; }
.logs .l { display: grid; grid-template-columns: 62px 8px 150px 1fr 40px; gap: 10px; align-items: center; padding: 4px 16px; border-bottom: 1px solid #f0efee; }
.logs .lvl { width: 8px; height: 8px; border-radius: 50%; background: var(--ink-3); }
.logs .lvl.warn { background: var(--warn); }
.logs .lvl.error { background: var(--bad); }
.logs .s { color: var(--ink-2); }
.logs .st { text-align: right; color: var(--ink-3); }

/* --- status page (veřejná) -------------------------------------------- */
.status-page { max-width: 880px; margin: 0 auto; padding: 40px 20px 80px; }
.status-page header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 28px; }
.banner { display: flex; align-items: center; gap: 12px; padding: 18px 20px; border-radius: 12px; color: #fff; background: var(--ok); font-size: 16px; font-weight: 600; }
.banner.degraded { background: var(--warn); color: #3b2800; }
.banner.outage { background: var(--bad); }
.banner .sub { font-size: 13px; font-weight: 400; opacity: 0.9; }
.comp { padding: 14px 16px; border-bottom: 1px solid var(--stroke); }
.comp:last-child { border-bottom: 0; }
.comp .top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.comp .name { font-weight: 500; }
.comp .desc { font-size: 12px; color: var(--ink-2); }
.uptime { display: grid; grid-template-columns: repeat(90, 1fr); gap: 2px; height: 26px; }
.uptime > i { display: block; border-radius: 2px; background: var(--ok); }
.uptime > i.warn { background: var(--warn); }
.uptime > i.bad { background: var(--bad); }
.uptime > i.none { background: var(--stroke); }
.uptime-axis { display: flex; justify-content: space-between; margin-top: 6px; font-size: 11px; color: var(--ink-3); }
.incident { padding: 14px 16px; border-bottom: 1px solid var(--stroke); }
.incident:last-child { border-bottom: 0; }
.incident .title { font-weight: 600; }
.incident .upd { display: grid; grid-template-columns: 120px 1fr; gap: 12px; margin-top: 8px; font-size: 12px; }
.incident .upd .st { font-weight: 500; text-transform: capitalize; }
