/* CHRG — panel. Paleta i typografia z analizy architektury, ale bez szeryfow:
   to jest ekran do obslugi, nie dokument do czytania. */
:root{
  --bg:#F1F4F5; --surface:#FFFFFF; --surface-2:#E7ECEE; --sunk:#EAEFF0;
  --ink:#111819; --ink-2:#3C494C; --ink-3:#6B7A7E; --rule:#CCD7D9;
  --accent:#0B6B74; --accent-soft:#DAEBED;
  --amber:#8F5504; --amber-soft:#F6E7CD;
  --red:#9E2F26;   --red-soft:#F6DEDB;
  --green:#1F6B42; --green-soft:#D6EDDF;
  --shadow:0 1px 2px rgba(17,24,25,.06), 0 4px 14px rgba(17,24,25,.05);
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    --bg:#0C1113; --surface:#141B1E; --surface-2:#1B2427; --sunk:#101719;
    --ink:#E7EEEF; --ink-2:#B0C0C3; --ink-3:#7C8D91; --rule:#283538;
    --accent:#43BEC7; --accent-soft:#0E2E31;
    --amber:#E0A34C; --amber-soft:#2C2211;
    --red:#E8837A;   --red-soft:#2D1714;
    --green:#6EC391; --green-soft:#11281C;
    --shadow:0 1px 2px rgba(0,0,0,.4), 0 4px 16px rgba(0,0,0,.3);
  }
}
:root[data-theme="dark"]{
  --bg:#0C1113; --surface:#141B1E; --surface-2:#1B2427; --sunk:#101719;
  --ink:#E7EEEF; --ink-2:#B0C0C3; --ink-3:#7C8D91; --rule:#283538;
  --accent:#43BEC7; --accent-soft:#0E2E31;
  --amber:#E0A34C; --amber-soft:#2C2211;
  --red:#E8837A;   --red-soft:#2D1714;
  --green:#6EC391; --green-soft:#11281C;
}

*{box-sizing:border-box}
body{
  margin:0; background:var(--bg); color:var(--ink);
  font-family:Archivo,system-ui,-apple-system,"Segoe UI",sans-serif;
  font-size:15px; line-height:1.5; -webkit-font-smoothing:antialiased;
}
main{max-width:1240px; margin:0 auto; padding:28px 22px 72px}
h1{font-size:1.5rem; font-weight:700; letter-spacing:-.02em; margin:0}
h2{font-size:1.15rem; font-weight:600; margin:0 0 6px}
h3{font-size:1.02rem; font-weight:600; letter-spacing:-.01em; margin:0}
a{color:var(--accent)}
code,.mono{font-family:"IBM Plex Mono",ui-monospace,monospace; font-size:.86em}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
.muted{color:var(--ink-3)}
:focus-visible{outline:2px solid var(--accent); outline-offset:2px; border-radius:3px}

/* ---------------------------------------------------------------- topbar */
.topbar{
  display:flex; align-items:center; gap:26px; flex-wrap:wrap;
  padding:0 22px; height:56px; background:var(--surface);
  border-bottom:1px solid var(--rule); position:sticky; top:0; z-index:20;
}
.brand{font-weight:700; letter-spacing:-.03em; font-size:1.1rem; text-decoration:none; color:var(--ink)}
.brand span,.wordmark span{color:var(--accent)}
.tabs{display:flex; gap:4px; margin-right:auto; flex-wrap:wrap}
.tabs a{
  padding:7px 12px; border-radius:5px; text-decoration:none; color:var(--ink-2);
  font-size:.92rem; font-weight:500;
}
.tabs a:hover{background:var(--surface-2); color:var(--ink)}
.tabs a.on{background:var(--accent-soft); color:var(--accent); font-weight:600}
.who{display:flex; align-items:center; gap:11px; font-size:.86rem; color:var(--ink-3)}
.who .email{font-family:"IBM Plex Mono",monospace; font-size:.78rem}
.pill{
  font-family:"IBM Plex Mono",monospace; font-size:.66rem; letter-spacing:.09em;
  text-transform:uppercase; padding:3px 7px; border-radius:3px;
}
.pill-admin{background:var(--amber-soft); color:var(--amber); border:1px solid var(--amber)}
.linkish{
  background:none; border:0; color:var(--ink-3); cursor:pointer; font:inherit;
  font-size:.86rem; padding:0; text-decoration:underline; text-underline-offset:2px;
}
.linkish:hover{color:var(--ink)}

/* ---------------------------------------------------------------- naglowek */
.head{display:flex; align-items:center; gap:14px; margin-bottom:22px}
.live{
  font-family:"IBM Plex Mono",monospace; font-size:.7rem; letter-spacing:.1em;
  text-transform:uppercase; color:var(--ink-3); display:inline-flex;
  align-items:center; gap:6px;
}
.live::before{
  content:""; width:7px; height:7px; border-radius:50%; background:var(--ink-3);
}
.live.ok{color:var(--green)}
.live.ok::before{background:var(--green); box-shadow:0 0 0 3px var(--green-soft)}

/* ---------------------------------------------------------------- kafelki */
.grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(316px,1fr)); gap:16px}
.tile{
  background:var(--surface); border:1px solid var(--rule); border-radius:9px;
  padding:16px 17px 14px; box-shadow:var(--shadow);
  border-left:3px solid var(--ink-3);
  display:flex; flex-direction:column; gap:12px;
}
.t-charging{border-left-color:var(--green)}
.t-wait{border-left-color:var(--amber)}
.t-fault{border-left-color:var(--red)}
.t-idle{border-left-color:var(--accent)}
.t-off{border-left-color:var(--rule); opacity:.66}

.tile-head{display:flex; align-items:flex-start; justify-content:space-between; gap:10px}
.tile-id h3{line-height:1.25}
.sn{
  margin:3px 0 0; font-family:"IBM Plex Mono",monospace; font-size:.73rem;
  color:var(--ink-3); word-break:break-all;
}
.icon{
  background:none; border:1px solid transparent; color:var(--ink-3); cursor:pointer;
  padding:5px; border-radius:6px; display:grid; place-items:center; flex:0 0 auto;
}
.icon:hover{background:var(--surface-2); color:var(--accent); border-color:var(--rule)}

.state{
  margin:0; font-size:.79rem; font-weight:600; letter-spacing:.02em;
  display:flex; align-items:center; gap:7px; text-transform:lowercase;
}
.state .dot{width:8px; height:8px; border-radius:50%; background:var(--ink-3); flex:0 0 auto}
.t-charging .state{color:var(--green)} .t-charging .dot{background:var(--green)}
.t-wait .state{color:var(--amber)}     .t-wait .dot{background:var(--amber)}
.t-fault .state{color:var(--red)}      .t-fault .dot{background:var(--red)}
.t-idle .state{color:var(--ink-2)}     .t-idle .dot{background:var(--accent)}
.t-off .state{color:var(--ink-3)}
.t-charging .dot{animation:pulse 2.4s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:1} 50%{opacity:.35}}
@media (prefers-reduced-motion:reduce){.t-charging .dot{animation:none}}

.readout{
  display:grid; grid-template-columns:1fr 1fr; gap:1px;
  background:var(--rule); border:1px solid var(--rule); border-radius:7px;
  overflow:hidden;
}
.metric{background:var(--sunk); padding:9px 11px; display:flex; flex-direction:column; gap:2px}
.metric .k{
  font-family:"IBM Plex Mono",monospace; font-size:.66rem; letter-spacing:.08em;
  text-transform:uppercase; color:var(--ink-3);
}
.metric .v{
  font-family:"IBM Plex Mono",monospace; font-size:1.12rem; font-weight:500;
  font-variant-numeric:tabular-nums; color:var(--ink); line-height:1.15;
}
.metric .v em{font-style:normal; font-size:.68rem; color:var(--ink-3); margin-left:3px}

.tile-foot{display:flex; align-items:center; justify-content:space-between; gap:10px}
.tag{
  font-family:"IBM Plex Mono",monospace; font-size:.75rem; color:var(--ink-2);
  display:inline-flex; align-items:center; gap:6px; min-width:0;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.tag-dot{width:6px;height:6px;border-radius:50%;background:var(--accent);flex:0 0 auto}
.nodata{margin:0; font-size:.84rem; color:var(--ink-3)}

/* ---------------------------------------------------------------- kontrolki */
.btn{
  font:inherit; font-size:.83rem; font-weight:600; padding:7px 14px; cursor:pointer;
  border-radius:6px; border:1px solid var(--rule); background:var(--surface-2);
  color:var(--ink); white-space:nowrap;
}
.btn:hover:not(:disabled){border-color:var(--ink-3)}
.btn:disabled{opacity:.42; cursor:not-allowed}
/* Napis na tle akcentu: w jasnym motywie akcent jest ciemny (bialy tekst),
   w ciemnym akcent jest jasny — bialy tekst mialby wtedy zly kontrast. */
:root{--on-accent:#FFFFFF}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--on-accent:#07191B}}
:root[data-theme="dark"]{--on-accent:#07191B}
.btn-start{background:var(--accent); border-color:var(--accent); color:var(--on-accent)}
.btn-stop{background:var(--red-soft); border-color:var(--red); color:var(--red)}
.primary{
  font:inherit; font-weight:600; font-size:.92rem; padding:10px 16px; cursor:pointer;
  border-radius:6px; border:1px solid var(--accent); background:var(--accent);
  color:var(--on-accent);
}
.ghost{
  font:inherit; font-size:.92rem; padding:10px 16px; cursor:pointer; border-radius:6px;
  border:1px solid var(--rule); background:transparent; color:var(--ink-2);
}
.row{display:flex; gap:9px; margin-top:4px}
.htmx-request .btn,.htmx-request.btn{opacity:.5; pointer-events:none}

label{display:block; font-size:.83rem; font-weight:600; color:var(--ink-2); margin-bottom:12px}
input[type=text],input[type=email],input[type=password],input[type=number],
.tile input{
  display:block; width:100%; margin-top:5px; padding:9px 11px; font:inherit;
  font-size:.94rem; background:var(--surface); color:var(--ink);
  border:1px solid var(--rule); border-radius:6px;
}
input:focus{outline:2px solid var(--accent); outline-offset:0; border-color:var(--accent)}
label small{
  display:block; margin-top:5px; font-weight:400; font-size:.74rem; color:var(--ink-3);
  line-height:1.45;
}
.editing{border-left-color:var(--accent)}
.editing h3{margin-bottom:12px}
.meta-line{
  font-size:.75rem; color:var(--ink-3); margin:0 0 10px;
  padding-top:9px; border-top:1px solid var(--rule);
}

/* ---------------------------------------------------------------- logowanie */
.centered{min-height:100dvh; display:grid; place-items:center; padding:26px}
.card{
  background:var(--surface); border:1px solid var(--rule); border-radius:11px;
  padding:30px 30px 26px; box-shadow:var(--shadow);
}
.auth{width:min(400px,100%)}
.wordmark{font-size:1.7rem; letter-spacing:-.035em; margin:0}
.auth h1{margin-bottom:4px}
.lead{color:var(--ink-3); font-size:.88rem; margin:0 0 22px}
.auth .primary{width:100%; margin-top:6px}
.alert{
  background:var(--red-soft); color:var(--red); border:1px solid var(--red);
  border-radius:6px; padding:9px 12px; font-size:.85rem; margin:0 0 16px;
}
.empty{text-align:center; padding:48px 30px; color:var(--ink-3)}
.empty h2{color:var(--ink)}
.hint{font-size:.83rem; margin-top:14px}
.hint code{background:var(--sunk); border:1px solid var(--rule); padding:2px 6px; border-radius:4px}

@media (max-width:640px){
  .topbar{height:auto; padding:10px 16px; gap:12px}
  .tabs{order:3; width:100%}
  main{padding:20px 16px 60px}
  .grid{grid-template-columns:1fr}
}

/* ================================================================ panel admina */

/* Pasek kontekstu. Ma byc niemozliwy do przeoczenia — bez niego predzej czy pozniej
   zmienisz ustawienia nie temu klientowi, co trzeba. */
.context{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:9px 22px; background:var(--amber-soft); color:var(--amber);
  border-bottom:2px solid var(--amber); font-size:.87rem;
}
.context strong{font-size:.95rem; color:var(--ink)}
.ctx-label{
  font-family:"IBM Plex Mono",monospace; font-size:.68rem; letter-spacing:.1em;
  text-transform:uppercase;
}
.ctx-note{color:var(--ink-3); font-size:.8rem; margin-right:auto}
.ctx-exit{
  font:inherit; font-size:.82rem; font-weight:600; cursor:pointer; padding:5px 13px;
  border-radius:5px; border:1px solid var(--amber); background:transparent; color:var(--amber);
}
.ctx-exit:hover{background:var(--amber); color:var(--bg)}
.tabs a.adm{color:var(--amber)}
.tabs a.adm.on{background:var(--amber-soft); color:var(--amber)}
a.pill-admin{text-decoration:none}
.badge-adm{
  font-family:"IBM Plex Mono",monospace; font-size:.66rem; letter-spacing:.09em;
  text-transform:uppercase; padding:3px 8px; border-radius:3px;
  background:var(--amber-soft); color:var(--amber); border:1px solid var(--amber);
}
.count{
  font-family:"IBM Plex Mono",monospace; font-size:.8rem; color:var(--ink-3);
  background:var(--surface-2); padding:2px 9px; border-radius:10px; margin-right:auto;
}
.head .primary.sm,.btn.sm{font-size:.82rem; padding:6px 13px}
.back{font-size:.85rem; text-decoration:none; margin-right:4px}
.sub-h{margin:32px 0 4px; font-size:1.05rem}

/* ---------------------------------------------------------------- tabele */
.tablewrap{padding:0; overflow-x:auto}
table.data{border-collapse:collapse; width:100%; font-size:.88rem}
table.data th,table.data td{
  padding:10px 14px; text-align:left; border-bottom:1px solid var(--rule);
  vertical-align:middle;
}
table.data thead th{
  font-size:.66rem; letter-spacing:.09em; text-transform:uppercase; font-weight:600;
  color:var(--ink-3); background:var(--surface-2); white-space:nowrap;
}
table.data tbody tr:last-child td{border-bottom:0}
table.data tbody tr:hover{background:var(--sunk)}
td.r,th.r{text-align:right}
td.num{font-family:"IBM Plex Mono",monospace; font-variant-numeric:tabular-nums}
td.strong{font-weight:600}
td.dim,.dim{color:var(--ink-3)}
.sm{font-size:.8rem} .xs{font-size:.72rem}
.nowrap{white-space:nowrap}
.ok-txt{color:var(--green); font-weight:600}
.warn-txt{color:var(--amber); font-weight:600}
.tag-inline{
  font-family:"IBM Plex Mono",monospace; font-size:.64rem; margin-left:7px;
  background:var(--amber-soft); color:var(--amber); padding:2px 6px; border-radius:3px;
}

/* ---------------------------------------------------------------- formularze */
.inline-form{
  display:flex; gap:16px; align-items:flex-end; flex-wrap:wrap;
  margin-bottom:18px; padding:18px 20px;
}
.inline-form label{margin-bottom:0; flex:1 1 210px}
.inline-form button{flex:0 0 auto}
select{
  display:block; width:100%; margin-top:5px; padding:9px 11px; font:inherit;
  font-size:.94rem; background:var(--surface); color:var(--ink);
  border:1px solid var(--rule); border-radius:6px;
}
.hidden{display:none}
.tile-tools{display:flex; gap:2px; flex:0 0 auto}
a.icon{text-decoration:none}
.btn-warn{background:var(--amber-soft); border-color:var(--amber); color:var(--amber)}

/* ---------------------------------------------------------------- komunikaty */
.flash{border-radius:8px; padding:14px 18px; margin-bottom:18px; font-size:.9rem}
.flash-ok{background:var(--green-soft); color:var(--green); border:1px solid var(--green)}
.flash-secret{background:var(--accent-soft); border:1px solid var(--accent)}
.flash-secret h3{margin:0 0 8px; color:var(--ink)}
.flash-secret .k{
  font-family:"IBM Plex Mono",monospace; font-size:.66rem; letter-spacing:.09em;
  text-transform:uppercase; color:var(--ink-3); margin:0;
}
.secret-value{
  font-family:"IBM Plex Mono",monospace; font-size:1.02rem; font-weight:500;
  color:var(--ink); background:var(--surface); border:1px solid var(--rule);
  border-radius:5px; padding:8px 12px; margin:4px 0 0; user-select:all; word-break:break-all;
}
.flash .note{font-size:.8rem; color:var(--ink-3); margin:10px 0 0}
.flash .note.warn{color:var(--amber); font-weight:500}
dl.creds{display:grid; grid-template-columns:auto 1fr; gap:6px 14px; margin:12px 0 0}
dl.creds dt{
  font-family:"IBM Plex Mono",monospace; font-size:.7rem; letter-spacing:.06em;
  text-transform:uppercase; color:var(--ink-3); align-self:center;
}
dl.creds dd{margin:0; font-family:"IBM Plex Mono",monospace; font-size:.84rem;
  word-break:break-all; align-self:center}

/* ---------------------------------------------------------------- log ramek */
.meta-grid{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr));
  gap:14px 22px; margin-bottom:18px;
}
.meta-grid .k{
  display:block; font-family:"IBM Plex Mono",monospace; font-size:.66rem;
  letter-spacing:.09em; text-transform:uppercase; color:var(--ink-3);
}
.meta-grid .v{display:block; margin-top:3px; font-size:.92rem; word-break:break-all}
.meta-grid .wide{grid-column:1/-1}
.filters{display:flex; gap:6px; flex-wrap:wrap; margin-bottom:14px}
.chip{
  font-family:"IBM Plex Mono",monospace; font-size:.72rem; padding:4px 10px;
  border-radius:12px; text-decoration:none; color:var(--ink-2);
  background:var(--surface-2); border:1px solid var(--rule);
}
.chip:hover{border-color:var(--ink-3)}
.chip.on{background:var(--accent-soft); color:var(--accent); border-color:var(--accent)}
table.log td{padding:6px 12px; border-bottom:1px solid var(--rule)}
table.log .arrow{font-size:1rem; text-align:center; width:22px}
.dir-in .arrow{color:var(--accent)}
.dir-out .arrow{color:var(--ink-3)}
.payload{color:var(--ink-2); max-width:640px; word-break:break-all; line-height:1.4}

/* ================================================================ sesje */
.filterbar{
  display:flex; gap:14px; align-items:flex-end; flex-wrap:wrap;
  padding:16px 20px; margin-bottom:16px;
}
.filterbar label{margin-bottom:0; flex:0 1 148px; font-size:.78rem}
.filterbar label:nth-child(5){flex:1 1 190px}
.filterbar input,.filterbar select{font-size:.88rem; padding:7px 10px}
.filter-actions{display:flex; gap:8px; align-items:center; margin-left:auto}
.filter-actions .primary{padding:8px 18px; font-size:.88rem}
.ghost.sm{padding:8px 14px; font-size:.85rem; text-decoration:none}

.summary{
  display:flex; gap:1px; background:var(--rule); border:1px solid var(--rule);
  border-radius:8px; overflow:hidden; margin-bottom:16px; flex-wrap:wrap;
}
.summary > div{background:var(--surface); padding:11px 20px; flex:1 1 150px}
.summary .k{
  display:block; font-family:"IBM Plex Mono",monospace; font-size:.65rem;
  letter-spacing:.09em; text-transform:uppercase; color:var(--ink-3);
}
.summary .v{
  display:block; margin-top:3px; font-family:"IBM Plex Mono",monospace;
  font-size:1.16rem; font-weight:500; font-variant-numeric:tabular-nums;
}
.summary .v em{font-style:normal; font-size:.66rem; color:var(--ink-3); margin-left:4px}

a.sort{text-decoration:none; color:inherit; display:inline-flex; gap:4px; align-items:center}
a.sort:hover{color:var(--accent)}
a.sort.on{color:var(--accent)}
a.sort .car{opacity:.45; font-size:.9em}
a.sort.on .car{opacity:1}
.pager{display:flex; gap:14px; align-items:center; justify-content:center; margin-top:18px}
a.btn{text-decoration:none; display:inline-block}

/* ================================================================ tagi */
.chip-s{
  display:inline-block; font-size:.72rem; padding:2px 8px; border-radius:10px;
  background:var(--accent-soft); color:var(--accent); margin:1px 3px 1px 0;
}
.st-bad{color:var(--red); font-weight:600}
.editing-row > td{background:var(--sunk); padding:16px 18px}
.tag-form-top{display:flex; gap:16px; flex-wrap:wrap; align-items:flex-end}
.tag-form-top label{margin-bottom:0; flex:0 1 190px}
label.chk{
  display:inline-flex; align-items:center; gap:7px; font-weight:400; font-size:.86rem;
  margin-bottom:0; color:var(--ink);
}
label.chk input{width:auto; margin:0; display:inline-block}
.scope{
  border:1px solid var(--rule); border-radius:7px; padding:12px 15px; margin:16px 0 0;
  background:var(--surface);
}
.scope legend{
  font-family:"IBM Plex Mono",monospace; font-size:.66rem; letter-spacing:.09em;
  text-transform:uppercase; color:var(--ink-3); padding:0 6px;
}
.scope .hint{margin:0 0 9px}
.scope-list{display:flex; gap:8px 20px; flex-wrap:wrap}
.push-right{margin-left:auto}
.tag-form .row{align-items:center}

/* stan komendy w toku — bez tego uzytkownik klika "Uruchom" kilka razy pod rzad */
.busy{
  font-family:"IBM Plex Mono",monospace; font-size:.68rem; color:var(--amber);
  margin-left:8px; font-weight:400;
}
.free{
  font-family:"IBM Plex Mono",monospace; font-size:.62rem; letter-spacing:.06em;
  text-transform:uppercase; color:var(--accent); background:var(--accent-soft);
  padding:2px 6px; border-radius:3px; margin-left:auto; font-weight:500;
}
label.chk.swap{margin:14px 0 0}
small.under{
  display:block; margin-top:6px; font-size:.73rem; color:var(--ink-3); line-height:1.45;
}
.filterbar label small,.inline-form label small{
  display:block; margin-top:5px; font-weight:400; font-size:.72rem; color:var(--ink-3);
  line-height:1.4;
}
