:root{
  --paper:#f4f6f9; --card:#ffffff; --ink:#1b2430; --soft:#5a6472;
  --line:#dbe1ea; --line-soft:#eef1f6; --accent:#1f5f8b; --accent-soft:#e7eef5;
  --ok:#2f7d43; --ok-soft:#e7f2e9; --warn:#b1710d; --warn-soft:#f6eddb;
  --err:#b23b3b; --err-soft:#f7e6e4;
  --mono:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;
  --sans:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
}
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:14px;display:flex;flex-direction:column}

.topbar{display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:12px 20px;background:var(--card);border-bottom:1px solid var(--line)}
.brand{display:flex;align-items:center;gap:12px}
.brand .dot{width:10px;height:10px;border-radius:3px;background:var(--accent)}
.brand .title{font-weight:700;font-size:15px}
.brand .sub{font-size:11.5px;color:var(--soft)}
.topbar-right{display:flex;align-items:center;gap:16px}
.bank-select{font-size:11.5px;color:var(--soft);display:flex;flex-direction:column;gap:3px}
.bank-select select{font-family:var(--sans);font-size:13px;padding:6px 8px;border:1px solid var(--line);
  border-radius:8px;background:var(--card);color:var(--ink)}
.counts{font-family:var(--mono);font-size:12px;color:var(--soft)}

.layout{flex:1;display:grid;grid-template-columns:minmax(280px,380px) 1fr;min-height:0}
.list-pane{border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0;background:var(--card)}
.search-wrap{padding:12px;border-bottom:1px solid var(--line-soft)}
#search{width:100%;padding:9px 12px;border:1px solid var(--line);border-radius:9px;font-size:13px;
  font-family:var(--sans);background:var(--paper)}
#search:focus{outline:2px solid var(--accent-soft);border-color:var(--accent)}
.list{overflow-y:auto;flex:1}
.row{padding:10px 14px;border-bottom:1px solid var(--line-soft);cursor:pointer;display:block;width:100%;text-align:left;
  background:none;border-left:3px solid transparent;font-family:inherit}
.row:hover{background:var(--paper)}
.row.active{background:var(--accent-soft);border-left-color:var(--accent)}
.row .rk{font-family:var(--mono);font-size:11.5px;color:var(--accent);font-weight:500;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.row .rv{font-size:12px;color:var(--soft);margin-top:3px;line-height:1.4;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.row.edited .rk::after{content:"●";color:var(--warn);margin-left:6px}

.editor-pane{overflow-y:auto;min-height:0}
.empty{max-width:520px;margin:14vh auto;text-align:center;color:var(--soft);padding:0 24px}
.empty .hint{font-size:12.5px;margin-top:14px;line-height:1.6}
code{font-family:var(--mono);background:var(--accent-soft);color:var(--accent);padding:1px 5px;border-radius:4px}

.editor{max-width:820px;margin:0 auto;padding:22px 24px 40px}
.editor-head{display:flex;align-items:center;gap:12px;margin-bottom:16px}
.editkey{font-size:13px;font-weight:600;word-break:break-all}
.dirty-badge{font-family:var(--mono);font-size:11px;color:var(--warn);background:var(--warn-soft);
  padding:2px 8px;border-radius:999px}
.tokens-row{display:flex;align-items:baseline;gap:12px;margin-bottom:10px;flex-wrap:wrap}
.tokens-label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--soft)}
.chips{display:flex;flex-wrap:wrap;gap:6px}
.chip{font-family:var(--mono);font-size:11.5px;padding:3px 9px;border-radius:999px;
  background:var(--accent-soft);color:var(--accent);border:1px solid transparent}
.chip.missing{background:var(--err-soft);color:var(--err);text-decoration:line-through}
.chip.added{background:var(--warn-soft);color:var(--warn)}

.value-area{width:100%;min-height:220px;resize:vertical;padding:14px 16px;border:1px solid var(--line);
  border-radius:12px;font-family:var(--sans);font-size:14px;line-height:1.6;color:var(--ink);background:var(--card)}
.value-area:focus{outline:2px solid var(--accent-soft);border-color:var(--accent)}

.validation{margin-top:12px;padding:11px 14px;border-radius:10px;font-size:13px;line-height:1.5}
.validation.err{background:var(--err-soft);color:var(--err)}
.validation.warn{background:var(--warn-soft);color:var(--warn)}
.validation.ok{background:var(--ok-soft);color:var(--ok)}

.editor-actions{display:flex;align-items:center;gap:14px;margin-top:18px}
.override{font-size:12.5px;color:var(--soft);display:flex;align-items:center;gap:6px;margin-left:auto}
.btn{font-family:var(--sans);font-size:13.5px;font-weight:600;padding:9px 18px;border-radius:9px;
  border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer}
.btn:hover{border-color:var(--accent)}
.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.btn.primary:disabled{opacity:.5;cursor:not-allowed}
.btn.ghost{color:var(--soft)}

.toast{position:fixed;bottom:22px;left:50%;transform:translateX(-50%);
  padding:11px 20px;border-radius:10px;font-size:13.5px;font-weight:500;color:#fff;
  background:var(--ink);box-shadow:0 8px 24px rgba(20,30,45,.22);z-index:20}
.toast.ok{background:var(--ok)} .toast.err{background:var(--err)}

@media (max-width:820px){
  .layout{grid-template-columns:1fr}
  .list-pane{max-height:38vh}
}

.live-state{font-size:12px;font-weight:600;padding:4px 10px;border-radius:999px}
.live-state.on{background:#e3f6ea;color:#14663a}
.live-state.off{background:#fdeceb;color:#9b2c24}
.login-dlg{border:1px solid #d6dbe3;border-radius:12px;padding:20px;min-width:320px}
.login-dlg::backdrop{background:rgba(15,23,42,.45)}
.login-dlg h3{margin:0 0 6px}
.login-dlg input{display:block;width:100%;box-sizing:border-box;margin:8px 0;padding:9px 10px;border:1px solid #cdd3dc;border-radius:8px;font:inherit}

.bank-status{padding:8px 20px;font-size:12.5px;border-bottom:1px solid var(--line);background:var(--card);color:var(--soft)}
.bank-status.ok{background:var(--ok-soft);color:var(--ok)}
.bank-status.warn{background:var(--warn-soft);color:var(--warn)}
.bank-status.err{background:var(--err-soft);color:var(--err)}
