:root{
  --ink:#16202b; --ink-2:#1e2c3a; --paper:#f5f6f4; --card:#ffffff;
  --line:#e6e9e4; --line-2:#eef1ec; --text:#222d38; --muted:#737e8a;
  --accent:#bf6a2a; --accent-ink:#8f4d1c;
  --ok:#2f8f5b; --warn:#b07d12; --err:#c0392b;
  --mono:ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace;
  --sans:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --radius:7px;
}
*{box-sizing:border-box}
html,body{margin:0}
body{
  font-family:var(--sans); color:var(--text); background:var(--paper);
  font-size:13.5px; line-height:1.45; -webkit-font-smoothing:antialiased;
}
a{color:var(--accent-ink); text-decoration:none}
a:hover{text-decoration:underline}

/* ---- layout: vaste, doorlopende zijbalk ---- */
.shell{min-height:100vh}
.side{
  position:fixed; top:0; left:0; bottom:0; width:202px; z-index:20;
  background:var(--ink); color:#c7d2dd; padding:16px 11px;
  display:flex; flex-direction:column; gap:3px;
}
.brand{color:#fff; font-weight:700; letter-spacing:.03em; font-size:13.5px; padding:4px 9px 12px}
.brand small{display:block; color:#7e8e9d; font-weight:500; letter-spacing:.11em; text-transform:uppercase; font-size:9px; margin-top:3px}
.nav{flex:1 1 auto; overflow-y:auto; min-height:0; display:flex; flex-direction:column; gap:1px}
.nav a{display:block; color:#a7b6c6; padding:6px 10px; border-radius:6px; font-size:12.5px; letter-spacing:.005em}
.nav a:hover{background:var(--ink-2); text-decoration:none; color:#fff}
.nav a.on{background:var(--accent); color:#fff}
.side .spacer{display:none}
.side .who{flex:0 0 auto; font-size:11px; color:#8090a0; padding:9px 10px 2px; border-top:1px solid #283643; line-height:1.5}
.side .who a{color:#9fb0c1; font-weight:600}

.main{margin-left:202px; padding:20px 26px; max-width:1120px}
.page-h{display:flex; align-items:baseline; justify-content:space-between; gap:16px; margin:0 0 16px}
.page-h h1{font-size:18px; margin:0; letter-spacing:-.01em; font-weight:700}
.page-h p{margin:2px 0 0; color:var(--muted); font-size:12px}

/* ---- pipeline signature ---- */
.pipe{display:flex; align-items:center; gap:0; background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); padding:10px 16px; margin-bottom:18px}
.pipe .node{display:flex; align-items:center; gap:8px; font-weight:600; font-size:12px}
.pipe .dot{width:8px; height:8px; border-radius:50%; background:var(--muted); box-shadow:0 0 0 3px rgba(0,0,0,.035)}
.pipe .dot.ok{background:var(--ok)} .pipe .dot.bad{background:var(--err)}
.pipe .link{flex:1; height:2px; background:repeating-linear-gradient(90deg,var(--line) 0 6px,transparent 6px 11px); margin:0 13px}
.pipe .node small{display:block; color:var(--muted); font-weight:500; font-size:10px; font-family:var(--mono)}

/* ---- cards / tables ---- */
.card{background:var(--card); border:1px solid var(--line); border-radius:var(--radius); padding:14px 16px; margin-bottom:14px}
.card h2{font-size:13px; margin:0 0 10px; font-weight:700; letter-spacing:.005em}
.grid{display:grid; gap:14px}
.grid.cols-4{grid-template-columns:repeat(4,1fr)}
.grid.cols-2{grid-template-columns:repeat(2,1fr)}
.stat{background:var(--card); border:1px solid var(--line); border-radius:var(--radius); padding:12px 15px}
.stat .n{font-size:21px; font-weight:700; font-family:var(--mono); letter-spacing:-.02em}
.stat .l{color:var(--muted); font-size:10.5px; text-transform:uppercase; letter-spacing:.06em; margin-top:2px}

table{width:100%; border-collapse:collapse; font-size:12.5px}
th,td{text-align:left; padding:7px 10px; border-bottom:1px solid var(--line-2); vertical-align:top}
th{font-size:10px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); font-weight:600}
td.mono,.mono{font-family:var(--mono)}
td.num{text-align:right; font-family:var(--mono)}
tr:hover td{background:#fafbfa}

/* ---- pills ---- */
.pill{display:inline-block; font-size:10.5px; font-weight:600; padding:2px 7px; border-radius:20px; letter-spacing:.02em}
.pill.created{background:#e7f3ec; color:var(--ok)}
.pill.updated{background:#eef3fb; color:#2b5fa3}
.pill.pending{background:#f3f1ec; color:#8a7b56}
.pill.error{background:#fbeceb; color:var(--err)}
.pill.skipped{background:#eef0ee; color:var(--muted)}

/* ---- forms / buttons ---- */
label{display:block; font-size:11px; color:var(--muted); margin:0 0 4px; font-weight:600}
input[type=text],input[type=email],input[type=password],input[type=number],select{
  width:100%; padding:7px 10px; border:1px solid var(--line); border-radius:6px; font:inherit; font-size:13px; background:#fff}
input:focus,select:focus{outline:2px solid var(--accent); outline-offset:0; border-color:var(--accent)}
.field{margin-bottom:11px}
.row{display:flex; gap:11px; flex-wrap:wrap}
.row .field{flex:1; min-width:150px}
.btn{display:inline-block; background:var(--accent); color:#fff; border:0; padding:7px 14px;
  border-radius:6px; font:inherit; font-size:13px; font-weight:600; cursor:pointer; line-height:1.4}
.btn:hover{background:var(--accent-ink); text-decoration:none}
.btn.ghost{background:transparent; color:var(--text); border:1px solid var(--line)}
.btn.ghost:hover{background:#f0f1ef}
.btn.sm{padding:4px 9px; font-size:11.5px}
.btn.danger{background:var(--err)}

.flash{padding:9px 13px; border-radius:7px; margin-bottom:14px; font-size:12.5px}
.flash.ok{background:#e7f3ec; color:#1d6b42}
.flash.err{background:#fbeceb; color:#a02a22}
.flash.info{background:#eef3fb; color:#2b5fa3}

.muted{color:var(--muted)}
.right{text-align:right}
.help{font-size:11px; color:var(--muted); margin-top:4px; line-height:1.5}

/* ---- login ---- */
.login-wrap{display:flex; align-items:center; justify-content:center; min-height:100vh; padding:20px}
.login-card{width:330px; background:var(--card); border:1px solid var(--line); border-radius:var(--radius); padding:24px}

/* ---- responsive: zijbalk wordt bovenbalk ---- */
@media(max-width:820px){
  .side{position:static; width:auto; inset:auto; flex-direction:row; flex-wrap:wrap; align-items:center; gap:4px; padding:10px 12px}
  .side .brand{padding:4px 8px}
  .side .spacer{display:none}
  .side .who{border-top:none; padding:4px 8px; margin-left:auto}
  .main{margin-left:0; padding:16px}
  .grid.cols-4{grid-template-columns:repeat(2,1fr)}
  .grid.cols-2{grid-template-columns:1fr}
}
@media(prefers-reduced-motion:reduce){*{transition:none!important}}

/* ---- voortgangsbalk ---- */
.progress-wrap{background:#eef0ee; border:1px solid var(--line); border-radius:999px; height:28px; overflow:hidden; position:relative; margin:6px 0 4px}
.progress-bar{height:100%; background:linear-gradient(90deg,var(--accent-ink),var(--accent)); width:0; transition:width .6s ease; display:flex; align-items:center; justify-content:flex-end; color:#fff; font-weight:700; font-size:12px; padding-right:11px; white-space:nowrap; min-width:2px}
.progress-bar.indet{width:34% !important; border-radius:999px; position:absolute; animation:indet 1.3s ease-in-out infinite}
@keyframes indet{0%{left:-34%}100%{left:100%}}
.progress-meta{display:flex; justify-content:space-between; color:var(--muted); font-size:12px; font-family:var(--mono)}
.done-badge{display:inline-block; background:#e7f3ec; color:var(--ok); font-weight:700; padding:4px 11px; border-radius:20px; font-size:12px}

/* ---- filtereditor ---- */
.filter-row td{border-top:none; background:#fafbfa}
.filter-row details{margin:0 0 6px}
.filter-row summary{cursor:pointer; color:var(--accent-ink); font-size:12px; font-weight:600; padding:4px 0}
.filter-form{padding:8px 0 2px}
