:root{--brand:#1c7a83;--brand-d:#14585f;--bg:#f4f6f8;--card:#fff;--ink:#1f2933;--mut:#667085;--line:#d9dee5;--warn:#b45309;--bad:#b42318;--good:#067647}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;font:16px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;color:var(--ink);background:var(--bg);min-height:100vh;display:flex;flex-direction:column}
main{flex:1;width:100%;max-width:72rem;margin:0 auto;padding:1rem}
h1{margin:.2rem 0 1rem;font-size:1.5rem;color:var(--brand-d)}
a{color:var(--brand)}
footer{padding:1rem;font-size:.8rem;color:var(--mut);text-align:center}
.envbar.sudo{background:var(--bad)}
.envbar{background:var(--warn);color:#fff;text-align:center;padding:.35rem 1rem;font-weight:600;font-size:.8rem}
.top{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem 1rem;background:var(--card);border-bottom:1px solid var(--line);padding:.5rem 1rem;position:sticky;top:0;z-index:5}
.brand{font-weight:800;font-size:1.25rem;color:var(--brand);text-decoration:none;letter-spacing:.04em}
.navtoggle{position:absolute;opacity:0;pointer-events:none}
.burger{display:none;font-size:1.6rem;cursor:pointer;padding:0 .4rem;margin-left:auto;min-width:44px;min-height:44px;text-align:center;line-height:44px}
.mainnav{display:flex;flex-wrap:wrap;gap:.25rem;flex:1}
.mainnav a{padding:.45rem .7rem;border-radius:.5rem;text-decoration:none;color:var(--ink);white-space:nowrap}
.mainnav a:hover{background:#e8f3f4}
.mainnav a.disabled,.tile.disabled{color:#9aa3af;cursor:not-allowed;pointer-events:none}
.usermenu{display:flex;align-items:center;gap:.6rem}
.usermenu form{margin:0}
.langs{display:flex;gap:.3rem;font-size:.8rem}
.langs a{padding:.15rem .4rem;border-radius:.3rem;text-decoration:none;color:var(--mut)}
.langs a.cur{background:var(--brand);color:#fff}
button.link{background:none;border:0;color:var(--brand);cursor:pointer;font:inherit;padding:.4rem;min-height:44px}
.card{background:var(--card);border:1px solid var(--line);border-radius:.75rem;padding:1.25rem}
.narrow{max-width:26rem;margin:2rem auto}
label{display:block;margin:.8rem 0;font-weight:600;font-size:.9rem}
input{display:block;width:100%;margin-top:.25rem;padding:.7rem .8rem;font:inherit;border:1px solid var(--line);border-radius:.5rem;background:#fff;min-height:44px}
input:focus{outline:2px solid var(--brand);outline-offset:1px}
.btn{display:inline-block;padding:.7rem 1.1rem;border:1px solid var(--line);border-radius:.5rem;background:#fff;color:var(--ink);font:inherit;font-weight:600;text-decoration:none;cursor:pointer;min-height:44px;text-align:center}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff;width:100%;margin-top:.5rem}
.btn.primary:hover{background:var(--brand-d)}
.narrow .btn:not(.primary){width:100%;margin-top:.5rem}
.sep{display:flex;align-items:center;gap:.6rem;color:var(--mut);margin:1rem 0 .4rem;font-size:.85rem}
.sep:before,.sep:after{content:"";flex:1;border-top:1px solid var(--line)}
.alert{background:#fef3f2;border:1px solid #fecdca;color:var(--bad);padding:.6rem .8rem;border-radius:.5rem}
.ok{color:var(--good);font-weight:600}
.muted{color:var(--mut);font-size:.85rem}
code{background:#eef1f4;padding:.1rem .35rem;border-radius:.25rem}
code.secret{word-break:break-all;font-size:1.05rem}
.codes{list-style:none;padding:0;display:grid;grid-template-columns:repeat(2,1fr);gap:.4rem}
.codes code{display:block;text-align:center;padding:.4rem;font-size:1rem}
dl{display:grid;grid-template-columns:max-content 1fr;gap:.4rem 1rem}dt{color:var(--mut)}dd{margin:0}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:.8rem}
.tile{display:flex;flex-direction:column;gap:.3rem;align-items:flex-start;padding:1rem;border:1px solid var(--line);border-radius:.75rem;background:var(--card);color:var(--ink);text-decoration:none;min-height:6rem}
.tile:hover{border-color:var(--brand)}
.tile .ico{font-size:1.5rem;color:var(--brand)}
.tile.disabled{background:#f1f3f5}.tile.disabled .ico{color:#b4bcc6}
@media (max-width:48rem){
  .burger{display:block}
  .mainnav,.usermenu{display:none;width:100%;flex-direction:column}
  .navtoggle:checked ~ .mainnav,.navtoggle:checked ~ .usermenu{display:flex}
  .mainnav a{padding:.8rem .6rem;border-bottom:1px solid var(--line);border-radius:0}
  .langs{order:3}
  .narrow{margin:1rem auto}
}
@media (prefers-color-scheme:dark){
  :root{--bg:#10151a;--card:#1a2128;--ink:#e6eaee;--mut:#9aa6b2;--line:#2f3a45;--brand:#4fb3bd;--brand-d:#7fd0d8}
  input,.btn{background:#10151a;color:var(--ink)}
  .mainnav a:hover{background:#22303a}
  .alert{background:#3a1713;border-color:#6b2a22}
  code{background:#26303a}
  .tile.disabled{background:#161c22}
}
/* ---- Factory ---- */
body.factory .brand{color:var(--brand-d)}
.mainnav a.cur{background:#e8f3f4;font-weight:600}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(18rem,1fr));gap:1rem;margin-bottom:1rem}
.card.step,.card+.card,main>.card{margin-bottom:1rem}
.prodcard{border-color:var(--bad);border-width:2px}
h2{font-size:1.1rem;margin:.2rem 0 .6rem}h3{font-size:.95rem;margin:.8rem 0 .3rem}
.tablewrap{overflow-x:auto;margin:.5rem 0 1rem}
table{width:100%;border-collapse:collapse;background:var(--card);border:1px solid var(--line);border-radius:.5rem}
th,td{padding:.5rem .7rem;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
th{font-size:.8rem;color:var(--mut);white-space:nowrap}td.num,th.num{text-align:right}
table.dense td,table.dense th{padding:.3rem .5rem;font-size:.85rem;max-width:22rem;overflow-wrap:anywhere}
.badge{display:inline-block;padding:.05rem .5rem;border-radius:1rem;font-size:.75rem;font-weight:600;background:#eef1f4;color:var(--ink)}
.badge.good{background:#d1fadf;color:#05603a}.badge.bad{background:#fee4e2;color:#912018}.badge.warn{background:#fef0c7;color:#93370d}.badge.mut{background:#eef1f4;color:var(--mut)}
.notice{background:#ecfdf3;border:1px solid #abefc6;color:#05603a;padding:.6rem .8rem;border-radius:.5rem}
.tabs{display:flex;gap:.3rem;margin:.5rem 0 1rem;flex-wrap:wrap}.tabs a{padding:.4rem .9rem;border:1px solid var(--line);border-radius:.5rem;text-decoration:none;color:var(--ink);background:var(--card)}
.tabs a.cur{background:var(--brand);color:#fff;border-color:var(--brand)}.tabs a.prod.cur{background:var(--bad);border-color:var(--bad)}
.btn.inline,.btn.primary.inline,.btn.danger.inline{width:auto;margin-top:.4rem}
.btn.danger{background:var(--bad);border-color:var(--bad);color:#fff}
.btn[disabled]{opacity:.45;cursor:not-allowed}
.row{display:flex;flex-wrap:wrap;gap:.6rem;align-items:end}.row label{margin:0}
form.inline{display:inline}
label.check{display:flex;gap:.5rem;align-items:center;font-weight:400}label.check input{width:auto;min-height:0;margin:0}
input.short{width:7rem}select,textarea{display:block;width:100%;margin-top:.25rem;padding:.6rem .7rem;font:inherit;border:1px solid var(--line);border-radius:.5rem;background:#fff;color:inherit}
textarea{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.9rem}
ul.log{list-style:none;padding:0;margin:0;font-size:.9rem}ul.log li{padding:.25rem 0;border-bottom:1px solid var(--line)}
details summary{cursor:pointer;color:var(--brand)}
.pager{display:flex;gap:.6rem}
@media (prefers-color-scheme:dark){select,textarea{background:#10151a}.badge{background:#26303a}.badge.good{background:#073d2a;color:#75e0a7}.badge.bad{background:#55160c;color:#fda29b}.badge.warn{background:#4e2a07;color:#fec84b}.notice{background:#073d2a;border-color:#085d3a;color:#75e0a7}.mainnav a.cur{background:#22303a}}
/* ---- Administration (L1) ---- */
.head{display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap}
.head h1{margin-bottom:.5rem}
.cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));gap:.1rem 1rem}
.permgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(19rem,1fr));gap:.2rem 1rem}
.permgrid label.check{align-items:flex-start;margin:.3rem 0}.permgrid label.check input{margin-top:.35rem}
.tabs a.disabled{color:#9aa3af;cursor:not-allowed;pointer-events:none;background:#f1f3f5}
fieldset{border:1px solid var(--line);border-radius:.5rem;margin:.8rem 0;padding:.4rem .8rem}legend{font-weight:600;font-size:.9rem;padding:0 .3rem}
.inline-block{margin-top:.6rem}
table input,table select{margin:0;min-height:36px;padding:.35rem .5rem}
input[type=checkbox],input[type=radio]{accent-color:var(--brand)}
section.card{margin-bottom:1rem}
@media (prefers-color-scheme:dark){.tabs a.disabled{background:#161c22}}

/* Factory : scripts SQL */
pre.sql, textarea.sql { font: 13px/1.45 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
pre.sql { background: #eef1f4; border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; overflow: auto; max-height: 420px; white-space: pre; tab-size: 4; }
pre.sql .ln { display: inline-block; min-width: 2.6em; margin-right: 10px; text-align: right; color: var(--mut); user-select: none; }
details > summary { cursor: pointer; padding: 4px 0; }
details > summary code { word-break: break-all; }
@media (prefers-color-scheme:dark){pre.sql{background:#10151a}}
