:root{
  --over:#8250df;
  --bg:#f4f5f7;
  --panel:#ffffff;
  --panel2:#eef0f4;
  --sunken:#f7f8fa;
  --line:#dce0e7;
  --shadow:0 6px 22px rgb(16 22 34 / .13);
  --fg:#1c2129;
  --dim:#666f7d;
  --dimmer:#8b94a1;
  --strong:#0f141b;
  --acc:#0b5fa5;
  --on-acc:#ffffff;
  --ok:#1a7f37;
  --fail:#cf222e;
  --warn:#b4600f;
  --appbar-accent:var(--acc);
  --acc-ink:#ffffff;
  --acc-ink-70:rgb(255 255 255 / .78);
  --acc-ink-15:rgb(255 255 255 / .15);
  --t-red:248 81 73;        --t-red-fg:#a4231c;
  --t-green:63 185 80;      --t-green-fg:#1a7f37;
  --t-blue:86 138 220;
  --font:-apple-system,Segoe UI,Roboto,sans-serif;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --appbar-h:46px;
  color-scheme:light;
}
*{box-sizing:border-box}
html{scrollbar-gutter:stable}
body{margin:0;background:var(--bg);color:var(--fg);
  font:13.5px/1.5 var(--font);-webkit-font-smoothing:antialiased}
a{color:var(--acc);text-decoration:none}
a:hover{text-decoration:underline}
svg.sprite{position:absolute;width:0;height:0;overflow:hidden}
.topbar{position:sticky;top:0;z-index:900;display:flex;align-items:center;
  height:var(--appbar-h);padding:0 14px;gap:3px;
  background:var(--appbar-accent);color:var(--acc-ink)}
.topbar .brand{font-size:15px;font-weight:700;color:var(--acc-ink);
  margin-right:13px;white-space:nowrap;letter-spacing:.01em}
.topbar .brand:hover{text-decoration:none}
.topbar nav{display:flex;align-items:center;gap:3px;min-width:0}
.topbar nav a{display:flex;align-items:center;gap:7px;color:var(--acc-ink-70);
  font-size:13px;font-weight:600;padding:6px 10px;border-radius:7px;
  white-space:nowrap;
  transition:color .08s,background .08s}
.topbar nav a:hover{color:var(--acc-ink);background:var(--acc-ink-15);
  text-decoration:none}
.topbar nav a.cur{background:var(--acc-ink);color:var(--acc)}
.topbar nav a svg{width:15px;height:15px;flex:none}
.topbar .meta{margin-left:auto;display:flex;align-items:center;gap:11px;
  padding-left:16px;font-size:11.5px;color:var(--acc-ink-70);white-space:nowrap}
.topbar .meta .auditlink{display:flex;align-items:center;gap:7px;
  color:var(--acc-ink-70);font-size:13px;font-weight:600;padding:6px 10px;
  border-radius:7px;white-space:nowrap;
  transition:color .08s,background .08s}
.topbar .meta .auditlink:hover{color:var(--acc-ink);background:var(--acc-ink-15);
  text-decoration:none}
.topbar .meta .auditlink.cur{background:var(--acc-ink);color:var(--acc)}
.topbar .meta .auditlink svg{width:15px;height:15px;flex:none}
.topbar .signout{color:var(--acc-ink-70)}
.topbar .signout:hover{color:var(--acc-ink)}
main{max-width:1100px;margin:0 auto;padding:14px 16px 60px}
main.wide{max-width:1500px}
h1{font-size:19px;font-weight:700;color:var(--strong);margin:10px 0 2px}
h1 .count{font-size:12px;font-weight:400;color:var(--dim);margin-left:8px}
h2{font-size:15px;font-weight:650;color:var(--strong);margin:22px 0 6px}
.sub{margin:2px 0 16px;font-size:12.5px;color:var(--dim);max-width:70ch}
.card{background:var(--panel);border:1px solid var(--line);border-radius:10px;
  padding:12px 16px;margin:6px 0 14px}
.chip{display:inline-block;font-size:11px;line-height:1.6;padding:0 8px;
  border-radius:12px;background:var(--panel2);color:var(--dim);
  border:1px solid var(--line);white-space:nowrap}
.banner{background:rgb(var(--t-red) / .12);border:1px solid rgb(var(--t-red) / .38);
  color:var(--t-red-fg);border-radius:8px;padding:7px 12px;margin:8px 0;
  font-size:12.5px}
.banner.ok{background:rgb(var(--t-green) / .12);
  border-color:rgb(var(--t-green) / .38);color:var(--t-green-fg)}
.stub{background:var(--panel);border:1px solid var(--line);
  border-style:dashed;border-radius:10px;padding:26px 22px;text-align:center;
  color:var(--dim);margin-top:16px}
.input,input[type=text],input[type=password]{background:var(--sunken);
  border:1px solid var(--line);color:var(--fg);border-radius:7px;
  padding:7px 10px;font-size:13px;font-family:inherit;width:100%}
.input:focus,input:focus{outline:none;border-color:var(--acc);
  box-shadow:0 0 0 3px rgb(var(--t-blue) / .18)}
.btn{cursor:pointer;background:var(--acc);color:var(--on-acc);
  border:1px solid var(--acc);border-radius:7px;padding:7px 14px;
  font-size:13px;font-family:inherit;font-weight:600}
.btn:hover{filter:brightness(1.08)}
.pwform{max-width:320px}
.pwform label{display:block;font-size:10px;text-transform:uppercase;
  letter-spacing:.05em;color:var(--dimmer);margin:12px 0 4px}
.pwform .btn{margin-top:16px}
body.portal{display:flex;align-items:center;justify-content:center;
  min-height:100vh;padding:20px}
.portal .card{width:100%;max-width:340px;margin:0;padding:24px 22px;
  box-shadow:var(--shadow)}
.portal h1{margin:0 0 2px;font-size:20px}
.portal label{display:block;font-size:10px;text-transform:uppercase;
  letter-spacing:.05em;color:var(--dimmer);margin:10px 0 4px}
.portal .btn{width:100%;margin-top:16px}
.portal .err{margin:12px 0 0;font-size:12.5px;color:var(--t-red-fg)}
.tablewrap{overflow-x:auto;border:1px solid var(--line);border-radius:9px;
  background:var(--panel)}
table.list{width:100%;border-collapse:collapse;font-size:13px}
table.list th{text-align:left;color:var(--dim);font-weight:600;font-size:10.5px;
  text-transform:uppercase;letter-spacing:.04em;padding:6px 12px;
  border-bottom:1px solid var(--line);background:var(--panel2)}
table.list td{padding:6px 12px;border-bottom:1px solid var(--line);
  vertical-align:middle}
table.list tbody tr:last-child td{border-bottom:none}
table.list tbody tr:hover{background:var(--panel2)}
table.list .c-date,table.list .c-id{font-family:var(--mono);font-size:12px;
  color:var(--dimmer);white-space:nowrap}
.empty{padding:22px;text-align:center;color:var(--dim);font-size:12.5px}
@media (max-width:1000px){
  .topbar nav a:not(.cur) .lbl{display:none}
  .topbar nav a{padding:6px 8px}
  .topbar .meta .auditlink:not(.cur) .lbl{display:none}
  .topbar .meta .auditlink{padding:6px 8px}
}
@media (max-width:640px){
  .topbar{padding:0 10px}
  .topbar .brand{margin-right:8px}
  .topbar .meta .who{display:none}
  main{padding:12px 12px 40px}
}
main.full{max-width:none}
.topbar .who{white-space:nowrap;color:var(--acc-ink-70)}.topbar .who:hover{color:var(--acc-ink)}
.mu{color:var(--dim)}
.back{margin:4px 0 0;font-size:12.5px}
/* agenda: 2026-10-21, the internal agenda's columns and tints (web/cre/agenda/agenda.py CSS), without its focus box */
.A{--rl:color-mix(in srgb,var(--dim) 45%,transparent)}
.A .ctl{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin:0 0 10px}
.A .ctl .find{flex:0 0 260px;width:260px}
.A .ctl .sel{width:auto;flex:0 0 auto;padding:6px 8px}
.A .ctl label.sc{display:inline-flex;align-items:center;gap:6px;font-size:13px;cursor:pointer;white-space:nowrap;min-height:32px}
.A .ctl label.sc input{width:18px;height:18px;margin:0}.A .ctl label.sc .n{color:var(--dim)}
.A .hd,.A .r>summary{display:grid;grid-template-columns:minmax(0,1fr) 56px 92px 130px 100px 170px 104px 80px 80px;gap:10px;align-items:baseline}
.A .hd{padding:5px 6px;border-bottom:2px solid var(--rl)}.A .hd[hidden]{display:none}
.A .hd button.sk{all:unset;cursor:pointer;font-size:9.5px;letter-spacing:.9px;font-weight:700;color:var(--dimmer);text-transform:uppercase;white-space:nowrap;padding:4px 0}
.A .hd button.sk:hover{color:var(--fg)}.A .hd button.sk:focus-visible{outline:1px solid var(--acc)}
.A .hd button.sk[aria-sort]{color:var(--acc)}
.A .hd button.sk[aria-sort=ascending]::after{content:" \25B2"}.A .hd button.sk[aria-sort=descending]::after{content:" \25BC"}
.A .r .la,.A .hd .la,.A .r .dn,.A .hd .dn{text-align:right}
.A .r{border-bottom:1px solid var(--rl);--tint:color-mix(in srgb,var(--acc) 7%,transparent);background:var(--tint)}
.A .r[hidden]{display:none}
.A .r[data-u=urgent]{--tint:color-mix(in srgb,var(--fail) 9%,transparent)}
.A .r[data-c="1"]{--tint:color-mix(in srgb,var(--ok) 10%,transparent)}
.A .r>summary{list-style:none;cursor:pointer;padding:7px 6px}
.A .r>summary::-webkit-details-marker{display:none}
.A .r>summary:hover,.A .r[open]>summary{background:color-mix(in srgb,var(--fg) 6%,transparent)}
.A .r .t{font-weight:600}.A .r .tg{font-weight:400;color:var(--dimmer);font-size:12px;margin-left:6px}
.A .r .rq{display:none}.A .nt{color:var(--dimmer);font-size:12px}
.A .r .c{color:var(--dim);white-space:nowrap}.A .r .rb{overflow:hidden;text-overflow:ellipsis}
.A .r .nw{white-space:normal;color:var(--fg)}
.A .r .st{display:inline-flex;align-items:center;align-self:center}
.A .sti{flex:none}.A .sti.done{color:var(--ok)}.A .sti.open{color:var(--acc)}
.A .r .ug{align-self:center}
.mark{display:inline-block;font-size:11px;line-height:18px;padding:0 7px;border-radius:999px;white-space:nowrap;color:var(--dim);background:color-mix(in srgb,var(--dim) 15%,transparent)}
.mark.bad{color:var(--fail);background:color-mix(in srgb,var(--fail) 15%,transparent)}
.mark.warn{color:var(--warn);background:color-mix(in srgb,var(--warn) 15%,transparent)}
.mark.acc{color:var(--acc);background:color-mix(in srgb,var(--acc) 15%,transparent)}
.A .r .pm{display:none}
.A .rc{padding:6px 10px 12px 18px;background:var(--panel2);border-left:2px solid var(--acc)}
.A .rc .want{margin:4px 0 2px;max-width:90ch}
.A .rc .who2{margin:0 0 4px;color:var(--dim);font-size:12px}
.A .rc .wx>summary{cursor:pointer;list-style:none}.A .rc .wx>summary::-webkit-details-marker{display:none}
.A .rc .wx>summary::after{content:" +";color:var(--acc);font-weight:700}.A .rc .wx[open]>summary::after{content:" \2212"}
.A .rc .want.wx p{margin:2px 0 4px}
.A .nm{color:var(--dim);margin:14px 0}
/* agenda, 2026-10-21 evening: the opened row as the internal page draws it (web/cre/agenda/agenda.py CSS), in this
   site's variables; its greys all var(--dim), which keeps 4.5:1 where the internal page's lighter grey would not.
   "Showing n of m" beside the filters; Done on only while completed rows show (.sd) */
.A .ctl .shn{color:var(--dim);font-size:12.5px;white-space:nowrap}
.A:not(.sd) .hd .dn,.A:not(.sd) .r .dn{display:none}   /* above .A .hd button.sk's all:unset */
@media (min-width:1181px){.A:not(.sd) .hd,.A:not(.sd) .r>summary{grid-template-columns:minmax(0,1fr) 56px 92px 130px 100px 170px 104px 80px}}
.A .r .tg,.A .nt{color:var(--dim)}
.A .rc .work{margin:2px 0 4px}
.A .rc .lb{display:block;margin:8px 0 3px;font-size:9.5px;letter-spacing:.9px;font-weight:700;color:var(--dim);text-transform:uppercase}
.A .rc ul{margin:0;padding-left:0;list-style:none}
.A .rc .tl li{padding:2px 0;display:grid;grid-template-columns:68px 84px minmax(0,1fr);gap:6px;align-items:baseline}
.A .rc .tl .d{color:var(--dim)}
.A .rc .tl.wd li{grid-template-columns:62px minmax(0,1fr);column-gap:8px}
.A .rc .tl.wd .d{font-variant-numeric:tabular-nums;white-space:nowrap}
.A .rc .tl.wd li>span:last-child,.A .rc .tl.wd li>details:last-child{grid-column:2;padding-bottom:0}
.A .rc .k{justify-self:start;font-size:10.5px;line-height:16px;padding:0 7px;border-radius:999px;white-space:nowrap;color:var(--dim);background:color-mix(in srgb,var(--dim) 15%,transparent)}
.A .rc .k.ok{color:var(--ok);background:color-mix(in srgb,var(--ok) 15%,transparent)}
.A .rc .k.acc{color:var(--acc);background:color-mix(in srgb,var(--acc) 15%,transparent)}
.A .rc .k.warn{color:var(--warn);background:color-mix(in srgb,var(--warn) 15%,transparent)}
.A .cm{color:var(--dim);font-size:12px}
.A .rc .sj{color:var(--dim)}
.A .rc .lt{color:var(--dim);font-size:11.5px;font-style:italic}
.A .rc details.early>summary{cursor:pointer;color:var(--dim);font-size:12px;padding:2px 0}
.A .rc .cq{margin:2px 0 6px;font-weight:600}
.A .rc .lw{margin:0 0 6px;color:var(--dim);font-size:13px}
.A .rc .lw b{color:var(--fg)}.A .rc .lw .nd{color:var(--dim)}.A .rc .lw .nd.old{color:var(--warn)}
.A .rc .stg{margin:2px 0 2px}
.A .rc .wx p{margin:3px 0 4px;color:var(--dim);font-size:13px}
.A .rc .want.wx p{color:inherit;font-size:inherit}
.A .rc .ch{margin:0 0 8px}.A .rc .ch .cq{margin:2px 0 1px}.A .rc .cq .cs{font-weight:400;font-size:13px;color:var(--dim)}
.A .rc .todo{margin:0 0 2px}.A .rc .todo b{color:var(--warn)}
.A .rc .sides{margin:2px 0 0;padding-left:18px;font-size:13px;color:var(--dim)}.A .rc .sides .rc1{color:inherit;font-weight:600}
.A .rc .pts li{padding:4px 0;border-top:1px solid var(--line)}.A .rc .pts li:first-child{border-top:0}
.A .rc .pts .pq{margin:0 0 2px}.A .rc .pts .lw{margin:0}
@media (max-width:760px){
 .A .ctl .shn{flex-basis:100%}
 .A .rc .lb{font-size:12px}
 .A .rc .tl li{grid-template-columns:60px minmax(0,1fr)}
}
/* below 1180px the three Requested/Done columns would push the row sideways: one small line under the title says them */
@media (max-width:1180px){
 .A .hd,.A .r>summary{grid-template-columns:minmax(0,1fr) 56px 92px 170px 104px 80px}
 .A .hd .sk.rb,.A .hd .sk.ro,.A .hd .sk.dn,.A .r .c.rb,.A .r .c.ro,.A .r .c.dn{display:none}
 .A .r .rq{display:block;font-weight:400;font-size:12px;color:var(--dim);margin-top:2px}
}
@media (max-width:760px){
 /* one stacked block per line: the title full width, one small line under it for status, Now, Last step and the
    parts count (.pm), and Urgency and On under the block */
 .A .ctl .find{flex:1 1 100%;width:100%}
 .A .hd{display:flex;gap:18px;align-items:center}
 .A .hd .sk.st,.A .hd .sk.on,.A .hd .sk.ug{display:none}
 .A .r>summary{grid-template-columns:auto minmax(0,1fr);gap:4px 8px;align-items:start;padding:9px 6px}
 .A .r>summary>.t{grid-row:1;grid-column:1/-1}
 .A .r>summary>.st,.A .r>summary>.nw,.A .r>summary>.la,.A .r .np{display:none}
 .A .r .ug{grid-row:2;grid-column:1}.A .r .on{grid-row:2;grid-column:2}
 .A .r .pm{display:flex;flex-wrap:wrap;align-items:center;gap:2px 12px;margin-top:3px;font-weight:400;font-size:12.5px;color:var(--dim)}
 .A .r .pm .pst{display:inline-flex}.A .r .pm .pnw{color:var(--fg);font-weight:600}
 .A .hd button.sk{padding:8px 0}
 .A .rc{padding:6px 8px 12px 12px}
}
/* changelog: as the internal page (web/cre/changelog/ui.py CSS, 2026-10-21 evening), in this site's variables: one
   line per change that opens on its status, In plain words and its Agenda and Technical links; a Where column with
   one tag per server; three switches; the technical page of one change */
.feed{border:1px solid var(--line);border-radius:9px;background:var(--panel);overflow:hidden}
.feed details{border-bottom:1px solid var(--line)}
.feed details:last-child{border-bottom:none}
.feed .ln[hidden],.CL .empty[hidden]{display:none}
.feed summary{list-style:none;cursor:pointer;padding:7px 12px;display:grid;
  grid-template-columns:12px 76px 140px 104px minmax(0,1fr) 170px;gap:10px;align-items:baseline}
.feed summary::-webkit-details-marker{display:none}
.feed summary:hover,.feed details[open] summary{background:var(--panel2)}
.feed .caret{color:var(--dimmer);font-size:10px}
.feed details[open] .caret{color:var(--dim)}
.feed .date{font-family:var(--mono);font-size:11.5px;color:var(--dim)}
.feed .line{color:var(--fg);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.feed details[open] .line{white-space:normal;overflow:visible}
.feed .by{color:var(--dimmer);font-size:11px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.feed .by b{color:var(--fg);font-weight:600}
.feed .where{display:flex;flex-wrap:nowrap;gap:3px}
.CL .ctl{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:0 0 10px}
.CL .ctl .lbl{color:var(--dim);font-size:12.5px}
.CL .sw,.PT .sw{--k:var(--dim);font:inherit;font-size:12.5px;min-height:30px;padding:0 12px;border-radius:999px;cursor:pointer;
  border:1px solid var(--line);background:var(--panel);color:var(--dimmer)}
.CL .sw.bad{--k:var(--fail)}.CL .sw.warn{--k:var(--warn)}.CL .sw.acc{--k:var(--acc)}
.CL .sw[aria-pressed=true],.PT .sw[aria-pressed=true]{color:var(--k);border-color:color-mix(in srgb,var(--k) 50%,transparent);background:color-mix(in srgb,var(--k) 14%,transparent);font-weight:600}
.chip.k-new-feature{--k:var(--ok)}.chip.k-improvement{--k:#39c5cf}.chip.k-bugfix{--k:var(--warn)}
.chip.k-permissions{--k:#b083f0}.chip.k-config{--k:var(--dim)}.chip.k-translation{--k:#db61a2}
.chip.k-data-cleaning{--k:#f47067}.chip.k-incident{--k:var(--fail);font-weight:600}
.chip[class*=" k-"]{line-height:17px;border-radius:999px;color:color-mix(in srgb,var(--k) 50%,var(--fg));
  border-color:color-mix(in srgb,var(--k) 50%,transparent);background:color-mix(in srgb,var(--k) 14%,transparent)}
.feed .detail{padding:2px 14px 12px 116px;font-size:12.5px;color:var(--fg);max-width:900px}
.feed .detail p{margin:0 0 8px}
.feed .detail .state{color:var(--dimmer);font-size:11px;margin:0 0 6px;text-transform:uppercase;letter-spacing:.04em}
.feed .detail .nodetail{color:var(--dimmer);font-style:italic}
.feed .objs{margin-top:10px;padding-top:8px;border-top:1px solid var(--line);display:grid;
  grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;align-items:baseline}
.feed .objs .ok{color:var(--dimmer);font-size:10px;text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;text-align:right}
.feed .objs .ov{display:flex;flex-wrap:wrap;gap:4px 6px;min-width:0;font-size:12px}
.why{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:5px 12px;align-items:baseline;
  margin:0 0 6px;font-size:12.5px;max-width:900px}
.one .why{margin:0 0 14px}
.why .wl{color:var(--dimmer);font-size:10px;text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;text-align:right}
.why .wt{min-width:0;overflow-wrap:anywhere;color:var(--fg)}
.why .part{grid-column:1/-1;color:var(--dim);font-size:10.5px;font-weight:650;text-transform:uppercase;letter-spacing:.05em}
@media (max-width:900px){.feed .detail{padding-left:14px}
  .feed summary{grid-template-columns:12px 76px minmax(0,1fr);row-gap:3px}
  .feed .where{grid-column:3}
  .feed .kind,.feed .line{grid-column:2/4}
  .feed .by{grid-column:2/4;text-align:left}}
@media (max-width:600px){.why{grid-template-columns:minmax(0,1fr);gap:1px 0}
  .why .wl{text-align:left;margin-top:5px}}
.one .back{font-size:12px;margin:0 0 10px;display:inline-block}
.one h2{font-size:15px;margin:0 0 8px;font-weight:650;line-height:1.35}
.one .rwhen{color:var(--dim);font-size:12px;margin:0 0 12px}
.one .rwhen .mark+.mark{margin-left:3px}
.tech{max-width:1000px}
.tech table.tsum{border-collapse:collapse;font-size:12.5px;margin:4px 0 14px}
.tech table.tsum th,.tech table.tsum td{padding:4px 14px 4px 0;text-align:left;border-bottom:1px solid var(--line)}
.tech table.tsum th{color:var(--dimmer);font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em}
.tech table.tsum td+td{font-family:var(--mono);text-align:right}
.tech h3.tsrv{font-size:13px;margin:18px 0 8px;padding-top:10px;border-top:1px solid var(--line)}
.tech .twr{font-size:12px;color:var(--dim);margin:12px 0 6px}
.tech .twr .when{font-family:var(--mono);color:var(--fg);margin-right:4px}
.tech .trec{border:1px solid var(--line);border-radius:8px;background:var(--panel);margin:0 0 10px;overflow:hidden}
.tech .trh{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:7px 10px;background:var(--panel2);
  border-bottom:1px solid var(--line);font-size:12.5px}
.tech .trh code{font-family:var(--mono);font-size:11.5px;color:var(--dim)}
.tech .trh .xid{color:var(--dimmer)}
.tech .trh code,.tech .trh b{min-width:0;overflow-wrap:anywhere}
.tech .tk{color:var(--dim);font-size:11px;text-transform:uppercase;letter-spacing:.04em}
.tech .op{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:0 7px;border-radius:999px;
  line-height:17px;border:1px solid}
.tech .op.add{color:var(--ok);border-color:color-mix(in srgb,var(--ok) 50%,transparent);background:color-mix(in srgb,var(--ok) 12%,transparent)}
.tech .op.chg{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 50%,transparent);background:color-mix(in srgb,var(--warn) 12%,transparent)}
.tech .op.del{color:var(--fail);border-color:color-mix(in srgb,var(--fail) 50%,transparent);background:color-mix(in srgb,var(--fail) 12%,transparent)}
.tech table.tf{border-collapse:collapse;width:100%;font-size:12px}
.tech table.tf th{color:var(--dimmer);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;text-align:left;
  padding:5px 10px;border-bottom:1px solid var(--line)}
.tech table.tf td{padding:4px 10px;border-bottom:1px solid var(--line);vertical-align:top;overflow-wrap:anywhere}
.tech table.tf tr:last-child td{border-bottom:none}
.tech table.tf td:first-child{font-family:var(--mono);color:var(--dim);width:22%}
.tech table.tf td.b{width:39%;color:var(--dim)}
.tech table.tf td.b:not(:empty){background:color-mix(in srgb,var(--fail) 8%,transparent)}
.tech table.tf td.a{width:39%}
.tech table.tf td.a:not(:empty){background:color-mix(in srgb,var(--ok) 8%,transparent)}
.tech .tnote{font-size:12px;color:var(--dim);margin:-2px 0 8px}
.tech .tnote.rn{margin:0;padding:5px 10px;border-bottom:1px solid var(--line)}
.tech .tby{font-family:inherit;font-size:10px;color:var(--dimmer);margin-left:4px}
.tech .diffv{margin:8px 10px 10px}
.one .tnone{color:var(--dimmer);font-style:italic;font-size:12.5px}
@media (max-width:600px){.tech table.tf td:first-child{width:auto}}
/* a diff, as the internal pages draw one (web/meta/chrome.py DIFF_CSS) */
.diffv .dfile{border:1px solid var(--line);border-radius:.5rem;margin:0 0 1rem;overflow:hidden}
.diffv .dfh{display:flex;flex-wrap:wrap;align-items:baseline;gap:.2rem .7rem;padding:.45rem .7rem;
  background:var(--panel2);border-bottom:1px solid var(--line);font-size:.82rem}
.diffv .dfh b{font-family:var(--mono);font-size:.8rem;overflow-wrap:anywhere}
.diffv details.dfile>summary{cursor:pointer;list-style:none}
.diffv details.dfile>summary::-webkit-details-marker{display:none}
.diffv .dn-a{color:var(--ok);font-family:var(--mono);font-size:.76rem}
.diffv .dn-r{color:var(--fail);font-family:var(--mono);font-size:.76rem}
.diffv .dhunk{padding:.25rem .7rem;background:color-mix(in srgb,var(--acc) 10%,var(--panel));
  color:var(--dim);font-size:.74rem;border-top:1px solid var(--line)}
.diffv .dhunk:first-child{border-top:0}
.diffv .dhunk code{font-family:var(--mono);color:var(--fg)}
.diffv .dl{display:grid;grid-template-columns:3.2em 3.2em 1.3em 1fr;font-family:var(--mono);font-size:.76rem;line-height:1.5}
.diffv .dl>span{padding:0 .3rem}
.diffv .dl .o,.diffv .dl .n{color:var(--dimmer);text-align:right;user-select:none}
.diffv .dl .m{color:var(--dimmer);user-select:none;text-align:center}
.diffv .dl .t{white-space:pre-wrap;overflow-wrap:anywhere;min-width:0}
.diffv .dl.a{background:color-mix(in srgb,var(--ok) 15%,transparent)}
.diffv .dl.r{background:color-mix(in srgb,var(--fail) 15%,transparent)}
.diffv .dl.a .m{color:var(--ok)} .diffv .dl.r .m{color:var(--fail)}
.diffv .dl.x .t{color:var(--dim);font-style:italic}
@media (max-width:700px){
  .diffv .dl{grid-template-columns:2.6em 1.1em 1fr;font-size:.72rem}
  .diffv .dl .o{display:none}
  .diffv .dl.r .o{display:block} .diffv .dl.r .n{display:none}
}
/* production tracker */
.PT h1{margin-bottom:4px}
.PT .box{border-left:3px solid var(--acc);background:color-mix(in srgb,var(--acc) 8%,transparent);padding:8px 12px;margin:10px 0;border-radius:4px}
.PT table{border-collapse:collapse;width:100%;font-size:13px}
.PT th{text-align:left;font-weight:600;color:var(--dim);border-bottom:1px solid var(--line);padding:5px 7px;white-space:nowrap;position:sticky;top:var(--appbar-h);z-index:1;background:var(--bg)}
.PT td{border-bottom:1px solid color-mix(in srgb,var(--dim) 30%,transparent);padding:5px 7px;vertical-align:top}
.PT .n{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.PT tbody tr:hover{background:color-mix(in srgb,var(--fg) 5%,transparent)}
.PT .ov td{white-space:nowrap}.PT .nw{white-space:nowrap}
/* 2026-10-14 evening, the internal tracker's list: fits 1280 wide, one line a row, no live sheet greyed, bags as rows */
.PT table.ov{font-size:12.5px;margin:8px 0 14px}.PT table.ov th{white-space:normal;vertical-align:bottom}
.PT table.ov th,.PT table.ov td{padding-left:4px;padding-right:4px}
.PT table.ov tr.nos td{opacity:.45}.PT .tg0{visibility:hidden}
.PT table.ov td.od b{display:inline-block;max-width:5em;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}
.PT table.ov code{font-size:12px}
.PT table.dt{font-size:12.5px;line-height:1.25}
.PT table.dt th{padding:3px 6px}.PT table.dt td{padding:3px 6px;vertical-align:middle;white-space:nowrap}
.PT .tg{background:none;border:0;padding:0;color:var(--acc);font:inherit;cursor:pointer}
.PT tr.sub>td,.PT tr.sub>th{white-space:nowrap;padding:1px 4px;background:color-mix(in srgb,var(--acc) 5%,transparent);font-size:12px}
.PT tr.sub>:first-child{padding-left:18px}.PT tr.sh>th{position:static;white-space:normal;vertical-align:bottom;font-size:11px;font-weight:400;padding-left:2px;padding-right:2px}
.PT tr.sh>th:first-child{padding-left:18px}
/* 2026-10-28: a bag's whole name, wrapping inside its cell, at desk and phone width (it was cut, and hidden on phones) */
.PT tr.sub>td.bnw{white-space:normal}
.PT tr.sub b{display:inline-block;padding:0 5px;border-radius:9px;font-size:12px;line-height:1.35}
.PT tr.sub b.k{color:var(--ok);background:color-mix(in srgb,var(--ok) 15%,transparent)}
.PT tr.sub b.w{color:var(--warn);background:color-mix(in srgb,var(--warn) 15%,transparent)}
.PT tr.sub b.s{color:var(--fail);background:color-mix(in srgb,var(--fail) 15%,transparent)}
@media (max-width:480px){.topbar .brand{display:none}}
/* The bag page (2026-10-14): material table, pills, late dates, notes and the "i" that opens on a tap */
/* 2026-10-14 evening: one line a row; a cell of several lines shows the first and a "+N", the first note cut */
.PT table.ct{margin:8px 0 14px}.PT table.ct td{overflow:hidden;text-overflow:ellipsis;height:23px}
.PT table.ct .cn{display:inline-block;max-width:22em;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}
.PT table.dt .pill{padding:0 5px;font-size:12px;line-height:1.2}.PT code{white-space:nowrap}
.PT tr.gh td{font-weight:600;background:color-mix(in srgb,var(--acc) 7%,transparent);color:var(--fg)}
.PT .pill{display:inline-block;padding:0 6px;border-radius:9px;font-variant-numeric:tabular-nums}
.PT .p-ok{color:var(--ok);background:color-mix(in srgb,var(--ok) 15%,transparent)}
.PT .p-warn{color:var(--warn);background:color-mix(in srgb,var(--warn) 15%,transparent)}
.PT .p-stop{color:var(--fail);background:color-mix(in srgb,var(--fail) 15%,transparent)}
.PT .p-star{color:var(--acc);background:color-mix(in srgb,var(--acc) 15%,transparent)}
.PT .p-over{color:var(--over);background:color-mix(in srgb,var(--over) 15%,transparent)}
.PT .late{color:var(--warn);font-weight:600}.PT code.chg{color:var(--warn)}
.PT .old{font-size:11px;color:var(--warn)}.PT .lk{font-size:11px;color:var(--dim);font-style:italic}
/* 2026-10-14 evening: 'as <code>', material found under another code (the internal tracker's rule) */
.PT .oc{color:var(--acc);font-size:11px;font-weight:600;border:1px dashed color-mix(in srgb,var(--acc) 70%,transparent);border-radius:3px;padding:0 3px}
.PT .nty{font-weight:600}
/* 2026-10-26: a work cost line, not bought through the normal channel: greyed, out of the counts (the internal tracker's rule) */
.PT table.ct tr.wk td{opacity:.6;filter:grayscale(1)}.PT .q.wkl{font-style:italic;color:var(--dim);border-style:dashed;white-space:nowrap}
/* 2026-10-26, as the internal tracker since 2026-10-20: a lettered tile per material group at each step (green all,
   amber some, red none, dashed none to follow), the bag page's group table, the copy line and the BOM and PURS line,
   links into Odoo, a click on a bag table heading sorts, its right edge drags. 2026-10-26 evening, as the internal
   tracker: Materials in and its bars are gone, and so is the fading of the groups it left out; Not followed stays grey */
.PT td.ts{white-space:nowrap;line-height:1}
.PT td.ts i{display:inline-block;box-sizing:border-box;width:15px;height:16px;line-height:16px;text-align:center;border-radius:3px;
  font:normal 600 10.5px system-ui,sans-serif;margin-right:1px;cursor:help;vertical-align:middle}
.PT td.ts i.k{background:var(--ok);color:var(--bg)}
.PT td.ts i.w{color:color-mix(in srgb,var(--warn) 60%,var(--fg));background:color-mix(in srgb,var(--warn) 32%,transparent)}
.PT td.ts i.s{color:color-mix(in srgb,var(--fail) 65%,var(--fg));background:color-mix(in srgb,var(--fail) 26%,transparent)}
.PT td.ts i.z{line-height:14px;color:color-mix(in srgb,var(--dim) 70%,transparent);border:1px dashed color-mix(in srgb,var(--dim) 50%,transparent);cursor:default}
.PT td.ts i[aria-expanded=true]{outline:2px solid var(--acc);outline-offset:1px}
.PT .gs b{display:inline-block;padding:0 5px;border-radius:9px;font-size:12px;line-height:1.35;cursor:help}
.PT .gs b.k{color:color-mix(in srgb,var(--ok) 65%,var(--fg));background:color-mix(in srgb,var(--ok) 15%,transparent)}
.PT .gs b.w{color:color-mix(in srgb,var(--warn) 60%,var(--fg));background:color-mix(in srgb,var(--warn) 15%,transparent)}
.PT .gs b.s{color:color-mix(in srgb,var(--fail) 65%,var(--fg));background:color-mix(in srgb,var(--fail) 15%,transparent)}
.PT table.gs{width:auto;margin:8px 0 12px}.PT table.gs td{padding:2px 10px 2px 6px}.PT .gs small{color:var(--dim);font-size:11px}
.PT .gs tr.gf td{opacity:.6}
@media(max-width:600px){.PT .gs small{display:none}
  .PT table.gs th,.PT table.gs td{white-space:normal;padding:2px 4px}.PT table.gs .gm{display:none}}
.PT .src{margin:0 0 6px;color:var(--dim);font-size:12.5px}
.PT .refl{margin:4px 0;font-size:13px;line-height:1.6}
.PT a{color:var(--acc)}.PT .arch{color:var(--warn)}.PT a.arch{text-decoration:line-through dotted}.PT small.arch{font-size:11px}
.ptpop a{color:var(--acc)}
.PT table.ct th{cursor:pointer;user-select:none;overflow:hidden;white-space:normal;vertical-align:bottom;padding-right:10px}
.PT table.ct th[data-s=a]::after{content:' ▲';font-size:9px}.PT table.ct th[data-s=d]::after{content:' ▼';font-size:9px}
.PT table.ct .rz{position:absolute;top:0;right:0;width:7px;height:100%;cursor:col-resize;border-right:2px solid color-mix(in srgb,var(--dim) 35%,transparent)}
/* 2026-10-28: the material table scrolls inside its own box, so the page no longer slides sideways (2,591 px on a
   1,280 px screen); the box is lower than the screen under the top bar by more than the page's space below it
   (114 px), so the page scrolled to its end still shows the box's headings, held at its top. On a screen wider than
   600 px the first two columns (Type, BOM Costing) stay in place while the rest scrolls; on a phone they would fill
   the screen, so nothing is held there. --c1 is the Type column's width, set by site.js. */
.PT .ctw{overflow:auto;max-height:calc(100vh - var(--appbar-h) - 130px);max-height:calc(100dvh - var(--appbar-h) - 130px);margin:8px 0 14px}
.PT .ctw table.ct{margin:0}.PT .ctw table.ct th{top:0;z-index:2}.PT .ctw tr.gh td{overflow:visible}.PT .ctw tr.gh .ghl{position:sticky;left:7px}
@media (min-width:601px){
.PT .ctw table.ct tr:not(.gh)>:nth-child(-n+2){position:sticky;left:0;z-index:1;background:var(--bg)}
.PT .ctw table.ct tr:not(.gh)>:nth-child(2){left:var(--c1,0px);box-shadow:inset -1px 0 0 var(--line)}
.PT .ctw table.ct thead tr:not(.gh)>th:nth-child(-n+2){z-index:3}
.PT .ctw table.ct tr.wk>td:nth-child(-n+2){opacity:1;color:var(--dim)}
}
/* the one pop-up (site.js) and its triggers, as the internal tracker's */
.PT .q,.CL .q{position:relative;display:inline-block;min-width:14px;height:14px;padding:0 3px;margin:0 0 0 4px;border-radius:7px;
  border:1px solid color-mix(in srgb,var(--dim) 55%,transparent);background:none;color:var(--dim);font:600 10px/12px var(--font);
  cursor:help;vertical-align:1px;text-align:center;white-space:nowrap}
.PT .q::after,.CL .q::after{content:'';position:absolute;inset:-7px}
.PT .q[aria-expanded=true],.CL .q[aria-expanded=true]{color:var(--acc);border-color:var(--acc)}
.PT .q.ov{color:var(--over);border-color:color-mix(in srgb,var(--over) 60%,transparent)}
.PT table.ct .q.ntx{display:inline-block;min-width:0;max-width:26em;height:auto;margin:0;padding:0;border:0;border-radius:0;font:inherit;color:inherit;
  text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom;cursor:pointer}
.PT table.ct .q.ntx::after{content:none}.PT table.ct .q.ntx[aria-expanded=true]{color:inherit;text-decoration:underline dotted}
.ptpop{position:fixed;z-index:1000;display:none;background:var(--panel);color:var(--fg);border:1px solid var(--line);border-radius:6px;
  padding:6px 9px;font-size:12.5px;line-height:1.4;box-shadow:var(--shadow);white-space:normal;text-align:left}
.ptpop.on{display:block}.ptpop.pre{white-space:pre-line}
.ptpop .ptl{white-space:nowrap;line-height:1.6;font-size:12.5px}.ptpop .ptl code{font-size:12px}
.A details.r{scroll-margin-top:calc(var(--appbar-h) + 8px)}
/* 2026-10-26 audit, as the internal tracker: at phone width the list keeps Order, Ships and the three steps (hp hides,
   sp shows), bigger tiles that wrap; the ship date red within 14 days and amber within 30; the gap rows "Past their
   ship date" and "No ship date"; the search box over the list */
.PT .sp{display:none}
@media(max-width:600px){.PT table.ov .hp{display:none}.PT table.ov .sp{display:table-cell}
  .PT td.ts i{width:21px;height:21px;line-height:21px;font-size:11.5px}.PT td.ts i.z{line-height:19px}.PT table.ov td.ts{white-space:normal;min-width:69px}
  .PT table.ov td.shp{white-space:normal}.PT table.ov td.shp span{display:block}}
.PT .sbad{color:var(--fail);font-weight:600}.PT .swarn{color:var(--warn);font-weight:600}
.PT table.ov tr.gap td{font-weight:600;color:var(--dim);padding-top:14px;border-bottom:1px solid var(--line)}
.PT .fnd{margin:4px 0 6px}.PT .fnd input{font:inherit;font-size:14px;padding:5px 8px;width:min(22em,100%);box-sizing:border-box;
  color:var(--fg);background:var(--bg);border:1px solid var(--line);border-radius:5px}
/* 2026-10-28: Sort by Ship date or Order number, beside the search box; under it when the line is too narrow */
.PT .fnd{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px}
.PT .srt{display:flex;align-items:center;gap:6px}.PT .srt .lbl{color:var(--dim);font-size:12.5px}
/* 2026-10-28: "Past their ship date" and "No ship date" folded, each heading a button with its count and, while
   searching, how many it holds */
.PT button.fd{background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;text-align:left}
.PT button.fd .count,.PT button.fd .fm{font-weight:400;color:var(--dim)}.PT button.fd .fm{font-size:12.5px}
/* Ask page (2026-10-27): conversations on the left, the open one on the right. */
.K{display:grid;grid-template-columns:240px 1fr;gap:18px;align-items:start}
.K-side{position:sticky;top:calc(var(--appbar-h) + 10px);max-height:calc(100vh - var(--appbar-h) - 30px);overflow-y:auto}
.K-new{display:block;text-align:center;margin-bottom:10px}
.K-h{font-size:10.5px;text-transform:uppercase;color:var(--dim);font-weight:600;margin:8px 0 4px}
.K-c{display:block;padding:6px 8px;border-radius:6px;color:var(--fg);font-size:12.5px}
.K-c:hover{background:var(--panel2)}.K-c.cur{background:var(--panel);box-shadow:inset 3px 0 0 var(--acc)}
.K-c .K-t{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.K-c .mu{font-size:11px}
.K-main{min-width:0}
.K-turn{margin:0 0 18px}
.K-q{background:var(--panel2);border-radius:9px;padding:8px 12px;white-space:pre-wrap;max-width:70ch;margin-left:auto;width:fit-content}
.K-a{background:var(--panel);border:1px solid var(--line);border-radius:9px;padding:10px 14px;margin-top:8px;white-space:pre-wrap;max-width:80ch}
.K-w{margin-top:8px;max-width:80ch}
.K-r{margin-top:6px}.K-r summary{cursor:pointer;color:var(--acc);font-size:12.5px}
.K-res{margin:8px 0 12px;padding-left:10px;border-left:2px solid var(--line)}
.K-tool{font-weight:600;margin:4px 0}.K-tool .mu{font-weight:400;font-family:var(--mono);font-size:11.5px}
.K-sum{display:grid;grid-template-columns:max-content 1fr;gap:2px 12px;margin:4px 0 6px;font-size:12.5px}
.K-sum dt{color:var(--dim)}.K-sum dd{margin:0;font-family:var(--mono);font-size:12px;word-break:break-word}
.K-note{font-size:12px;margin:2px 0}
.K-cost{font-size:11px;margin:4px 0 0}
.K-pics{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px;justify-content:flex-end}
.K-pics a{display:block;line-height:0}
.K-pics img{max-width:14rem;max-height:11rem;border-radius:6px;border:1px solid var(--line);display:block}
/* The message box (2026-10-28), the console's: one box holding the pictures not yet sent, the words, and a row
   with the paperclip and Ask at its bottom right, so nothing moves under the hand as pictures are added. */
.K-form{margin-top:14px}
.K-box{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:8px 10px;box-shadow:var(--shadow)}
.K-box:focus-within{border-color:var(--acc)}
.K-box.over{border-color:var(--acc);background:var(--panel2)}
.K-box textarea{display:block;width:100%;box-sizing:border-box;font:inherit;font-size:14px;padding:2px;border:0;background:transparent;color:var(--fg);resize:none;min-height:4.6rem;max-height:44vh;overflow-y:auto}
.K-box textarea:focus{outline:none}
.K-row{display:flex;align-items:center;gap:8px;margin-top:6px}
.K-clip{flex:none;display:inline-flex;align-items:center;gap:5px;cursor:pointer;font-size:12.5px;color:var(--dim);padding:3px 7px;border-radius:6px}
.K-clip:hover{color:var(--fg);background:var(--panel2)}
.K-clip svg{width:16px;height:16px}
.K-clip input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.K-hint{flex:1 1 auto;min-width:0;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.K-row .btn{flex:none;margin-left:auto}
/* Pictures added and not yet sent, above the words; no strip at all until there is one. The tile shows the whole
   picture (contain), and its remove button is always drawn, never on hover only. */
.K-atts{display:flex;flex-wrap:wrap;gap:7px;margin:0 0 8px}.K-atts[hidden]{display:none}
.K-att{position:relative;width:7.5rem;height:5.6rem;border-radius:7px;overflow:hidden;border:1px solid var(--line);background:var(--panel2);flex:none}
.K-att img{width:100%;height:100%;object-fit:contain;display:block}
.K-att .x{position:absolute;top:2px;right:2px;width:1.35rem;height:1.35rem;padding:0;border-radius:50%;border:0;background:rgba(0,0,0,.62);color:#fff;font-size:.9rem;line-height:1.35rem;font-weight:700;cursor:pointer;text-align:center}
.K-att .x:hover{background:rgba(0,0,0,.85)}
.K-att .nm{position:absolute;left:0;right:0;bottom:0;padding:1px 4px;font-size:10px;color:#fff;background:rgba(0,0,0,.55);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.K-use{display:block;margin-top:5px;font-size:11.5px}
@media (max-width:800px){.K{grid-template-columns:1fr}.K-side{position:static;max-height:none}}
@media (max-width:640px){.K-atts{max-height:12rem;overflow-y:auto;overscroll-behavior:contain}}
